muda is a Menu Utilities library for Desktop Applications.
Create the menu and add your items
```rs let menu = Menu::new(); let menuitem2 = MenuItem::new("Menu item #2", false, None); let submenu = Submenu::withitems("Submenu Outer", true,&[ &MenuItem::new("Menu item #1", true, Some(Accelerator::new(Some(Modifiers::ALT), Code::KeyD))), &PredefinedMenuItem::separator(), &menuitem2, &MenuItem::new("Menu item #3", true, None), &PredefinedMenuItem::separator(), &Submenu::withitems("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
```rs // --snip--
menu.initforhwnd(window.hwnd() as isize);
menu.initforgtkwindow(>kwindow);
menu.initfornsapp(); ```
You can also use a [Menu
] or a [Submenu
] show a context menu.
```rs // --snip-- let x = 100; let y = 120;
menu.showcontextmenuforhwnd(window.hwnd() as isize, x, y);
menu.showcontextmenuforgtkwindow(>kwindow, x, y);
menu.showcontextmenufornsview(nsview, x, y); ```
You can use menu_event_receiver
to get a reference to the MenuEventReceiver
which you can use to listen to events when a menu item is activated
rs
if let Ok(event) = menu_event_receiver().try_recv() {
match event.id {
_ if event.id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}
Accelerators don't work unless the win32 message loop calls
TranslateAcceleratorW
See Menu::init_for_hwnd
for more details
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:
sh
pacman -S xdotool
Debian / Ubuntu:
sh
sudo apt install libxdo-dev
Apache-2.0/MIT