Go to file
Amr Bashir fb3d0aa303
chore(deps): bump gtk version 0.15 -> 0.16 (#38)
* chore(deps): bump gtk version 0.15 -> 0.16

* fix feature flags
2023-01-26 15:16:53 +02:00
.changes chore(deps): bump gtk version 0.15 -> 0.16 (#38) 2023-01-26 15:16:53 +02:00
.github/workflows chore: add license 2022-12-08 20:50:24 +02:00
examples refactor: allow changing the menu event sender (#35) 2023-01-03 04:07:07 +02:00
src refactor: allow changing the menu event sender (#35) 2023-01-03 04:07:07 +02:00
.gitignore chore: add license 2022-12-08 20:50:24 +02:00
Cargo.toml chore(deps): bump gtk version 0.15 -> 0.16 (#38) 2023-01-26 15:16:53 +02:00
CHANGELOG.md Apply Version Updates From Current Changes (#36) 2023-01-03 04:09:41 +02: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 refactor: allow changing the menu event sender (#35) 2023-01-03 04:07:07 +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.

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");
        },
        _ => {}
    }
}

Platform-specific notes:

Accelerators on Windows

Accelerators don't work unless the win32 message loop calls TranslateAcceleratorW

See Menu::init_for_hwnd for more details

Linux

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 xdotool

Debian / Ubuntu:

sudo apt install libxdo-dev

License

Apache-2.0/MIT