Crates.io | muda |
lib.rs | muda |
version | 0.15.3 |
source | src |
created_at | 2022-05-07 09:15:48.021744 |
updated_at | 2024-11-05 01:19:02.029227 |
description | Menu Utilities for Desktop Applications |
homepage | |
repository | https://github.com/amrbashir/muda |
max_upload_size | |
id | 582031 |
size | 472,029 |
Menu Utilities library for Desktop Applications.
TranslateAcceleratorW
.
See Menu::init_for_hwnd
for more detailscommon-controls-v6
: Use TaskDialogIndirect
API from ComCtl32.dll
v6 on Windows for showing the predefined About
menu item dialog.libxdo
: Enables linking to libxdo
on Linux which is used for the predfined Copy
, Cut
, Paste
and SelectAll
menu item.serde
: Enables de/serializing the dpi types.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:
pacman -S gtk3 xdotool
sudo apt install libgtk-3-dev libxdo-dev
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 or use it as your global app menu on macOS
// --snip--
#[cfg(target_os = "windows")]
unsafe { menu.init_for_hwnd(window.hwnd() as isize) };
#[cfg(target_os = "linux")]
menu.init_for_gtk_window(>k_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();
You can also use a [Menu
] or a [Submenu
] show a context menu.
// --snip--
let position = muda::PhysicalPosition { x: 100., y: 120. };
#[cfg(target_os = "windows")]
unsafe { menu.show_context_menu_for_hwnd(window.hwnd() as isize, Some(position.into())) };
#[cfg(target_os = "linux")]
menu.show_context_menu_for_gtk_window(>k_window, Some(position.into()));
#[cfg(target_os = "macos")]
unsafe { menu.show_context_menu_for_nsview(nsview, Some(position.into())) };
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");
},
_ => {}
}
}
Apache-2.0/MIT