Go to file
github-actions[bot] 6e59ec71f6
Apply Version Updates From Current Changes (#65)
Co-authored-by: amrbashir <amrbashir@users.noreply.github.com>
2023-05-04 14:42:53 +03:00
.changes Apply Version Updates From Current Changes (#65) 2023-05-04 14:42:53 +03:00
.github/workflows chore: add license 2022-12-08 20:50:24 +02:00
examples feat: add set_accelerator (#64) 2023-05-04 14:40:58 +03:00
src feat: add set_accelerator (#64) 2023-05-04 14:40:58 +03:00
.gitignore chore: add license 2022-12-08 20:50:24 +02:00
Cargo.toml Apply Version Updates From Current Changes (#65) 2023-05-04 14:42:53 +03:00
CHANGELOG.md Apply Version Updates From Current Changes (#65) 2023-05-04 14:42:53 +03:00
LICENSE-APACHE chore: add license 2022-12-08 20:50:24 +02:00
LICENSE-MIT chore: add license 2022-12-08 20:50:24 +02:00
LICENSE.spdx chore: add license 2022-12-08 20:50:24 +02:00
README.md docs: update docs 2023-02-08 21:00:29 +02:00
renovate.json chore: remove trailing comma 2022-11-27 12:49:54 +02:00

muda is a Menu Utilities library for Desktop Applications.

Platforms supported:

  • Windows
  • macOS
  • Linux (gtk Only)

Platform-specific notes:

Dependencies (Linux Only)

gtk is used for menus and libxdo is used to make the predfined Copy, Cut, Paste and SelectAll menu items work. Be sure to install following packages before building:

Arch Linux / Manjaro:

pacman -S gtk3 xdotool

Debian / Ubuntu:

sudo apt install libgtk-3-dev libxdo-dev

Example

Create the menu and add your items

let menu = Menu::new();
let menu_item2 = MenuItem::new("Menu item #2", false, None);
let submenu = Submenu::with_items("Submenu Outer", true,&[
  &MenuItem::new("Menu item #1", true, Some(Accelerator::new(Some(Modifiers::ALT), Code::KeyD))),
  &PredefinedMenuItem::separator(),
  &menu_item2,
  &MenuItem::new("Menu item #3", true, None),
  &PredefinedMenuItem::separator(),
  &Submenu::with_items("Submenu Inner", true,&[
    &MenuItem::new("Submenu item #1", true, None),
    &PredefinedMenuItem::separator(),
    &menu_item2,
  ])
]);

Then Add your root menu to a Window on Windows and Linux Only or use it as your global app menu on macOS

// --snip--
#[cfg(target_os = "windows")]
menu.init_for_hwnd(window.hwnd() as isize);
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(&gtk_window);
#[cfg(target_os = "macos")]
menu.init_for_nsapp();

Context menus (Popup menus)

You can also use a [Menu] or a [Submenu] show a context menu.

// --snip--
let x = 100;
let y = 120;
#[cfg(target_os = "windows")]
menu.show_context_menu_for_hwnd(window.hwnd() as isize, x, y);
#[cfg(target_os = "linux")]
menu.show_context_menu_for_gtk_window(&gtk_window, x, y);
#[cfg(target_os = "macos")]
menu.show_context_menu_for_nsview(nsview, x, y);

Processing menu events

You can use MenuEvent::receiver to get a reference to the MenuEventReceiver which you can use to listen to events when a menu item is activated

if let Ok(event) = MenuEvent::receiver().try_recv() {
    match event.id {
        _ if event.id == save_item.id() => {
            println!("Save menu item activated");
        },
        _ => {}
    }
}

License

Apache-2.0/MIT