2022-11-24 03:29:52 +11:00
muda is a Menu Utilities library for Desktop Applications.
2022-05-07 06:57:58 +10:00
## Example
2022-11-24 03:29:52 +11:00
Create the menu and add your items
2022-05-07 06:57:58 +10:00
```rs
2022-11-24 03:29:52 +11:00
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,
])
]);
2022-05-07 06:57:58 +10:00
2022-11-24 03:29:52 +11:00
```
2022-05-07 06:57:58 +10:00
2022-11-24 03:29:52 +11:00
Then Add your root menu to a Window on Windows and Linux Only or use it
as your global app menu on macOS
2022-05-07 06:57:58 +10:00
2022-11-24 03:29:52 +11:00
```rs
// --snip--
2022-05-07 06:57:58 +10:00
#[cfg(target_os = "windows")]
menu.init_for_hwnd(window.hwnd() as isize);
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(>k_window);
2022-05-08 16:32:31 +10:00
#[cfg(target_os = "macos")]
menu.init_for_nsapp();
2022-05-07 06:57:58 +10:00
```
2022-11-24 03:29:52 +11:00
## Context menus (Popup menus)
You can also use a [`Menu`] or a [`Submenu`] show a context menu.
```rs
// --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 [`menu_event_receiver` ](https://docs.rs/muda/latest/muda/fn.menu_event_receiver.html ) to get a reference to the [`MenuEventReceiver` ](https://docs.rs/muda/latest/muda/type.MenuEventReceiver.html )
which you can use to listen to events when a menu item is activated
2022-05-07 06:57:58 +10:00
```rs
if let Ok(event) = menu_event_receiver().try_recv() {
match event.id {
_ if event.id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}
2022-05-07 08:52:41 +10:00
```
2022-11-24 03:29:52 +11:00
## Platform-specific notes:
### Accelerators on Windows
Accelerators don't work unless the win32 message loop calls
[`TranslateAcceleratorW` ](https://docs.rs/windows-sys/latest/windows_sys/Win32/UI/WindowsAndMessaging/fn.TranslateAcceleratorW.html )
See [`Menu::init_for_hwnd` ](https://docs.rs/muda/latest/muda/struct.Menu.html#method.init_for_hwnd ) for more details
### Linux
2022-11-24 03:41:26 +11:00
`libxdo` is used to make the predfined `Copy` , `Cut` , `Paste` and `SelectAll` menu items work. Be sure to install following packages before building:
2022-11-24 03:29:52 +11:00
Arch Linux / Manjaro:
```sh
pacman -S xdotool
```
Debian / Ubuntu:
```sh
sudo apt install libxdo-dev
```