Expand description
muda is a Menu Utilities library for Desktop Applications.
§Platforms supported:
- Windows
- macOS
- Linux/BSD with GTK 3 or GTK 4
§Platform-specific notes:
-
On macOS, menus can only be used from the main thread, and most functionality will panic if you try to use it from any other thread.
-
On Windows, accelerators don’t work unless the win32 message loop calls
TranslateAcceleratorW. SeeMenu::init_for_hwndfor more details
§Cargo features
The Win32 and AppKit backends are always enabled on Windows and macOS, respectively.
gtk3: Enables the GTK 3 backend on Linux and BSD platforms. This is enabled by default.gtk4: Enables the GTK 4 backend on Linux and BSD platforms. Disable default features when enabling this feature because the defaults includegtk3.snapshot: Enables thread-safe menu snapshot types and methods, switching shared menu state to thread-safe synchronization.
When both gtk3 and gtk4 features are enabled, Muda uses the GTK 4 backend.
§Dependencies (Linux/BSD)
The gtk3 feature uses GTK 3 for menus. The gtk4 feature uses GTK 4 for menus. Be sure to
install the packages for the GTK backend you enabled before building:
§Arch Linux / Manjaro:
# GTK 3 backend
pacman -S gtk3
# GTK 4 backend
pacman -S gtk4§Debian / Ubuntu:
# GTK 3 backend
sudo apt install libgtk-3-dev
# GTK 4 backend
sudo apt install libgtk-4-dev§FreeBSD:
# GTK 3 backend
pkg install -y rust glib pkgconf gtk3
# GTK 4 backend
pkg install -y rust glib pkgconf gtk4§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(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,
],
).unwrap(),
],
);Then add your root menu to a window on Windows, GTK 3, or GTK 4 or use it as your global app menu on macOS
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
// --snip--
#[cfg(target_os = "windows")]
unsafe { menu.init_for_hwnd(window_hwnd) };
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
menu.init_for_gtk_window(>k_window, Some(&vertical_gtk_box));
#[cfg(target_os = "macos")]
menu.init_for_nsapp();§Context menus (Popup menus)
You can also use a Menu or a Submenu to show a context menu.
use muda::ContextMenu;
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
// --snip--
let position = muda::dpi::PhysicalPosition { x: 100., y: 120. };
#[cfg(target_os = "windows")]
unsafe { menu.show_context_menu_for_hwnd(window_hwnd, Some(position.into())) };
#[cfg(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd"
))]
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())) };§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 {
id if id == save_item.id() => {
println!("Save menu item activated");
},
_ => {}
}
}§Note for winit or tao users:
You should use MenuEvent::set_event_handler and forward
the menu events to the event loop by using EventLoopProxy
so that the event loop is awakened on each menu event.
enum UserEvent {
MenuEvent(muda::MenuEvent)
}
let event_loop = EventLoopBuilder::<UserEvent>::with_user_event().build();
let proxy = event_loop.create_proxy();
muda::MenuEvent::set_event_handler(Some(move |event| {
proxy.send_event(UserEvent::MenuEvent(event));
}));Re-exports§
pub use about_metadata::AboutMetadata;pub use crate::about_metadata::AboutMetadataBuilder;pub use crate::accelerator::AcceleratorParseError;pub use dpi;
Modules§
- about_
metadata - Types and functions to create
AboutMetadatafor thePredefinedMenuItem::aboutdialog. - accelerator
- Accelerators describe keyboard shortcuts for menu items.
Structs§
- Check
Menu Item - A check menu item inside a
MenuorSubmenuand usually contains a text and a check mark or a similar toggle that corresponds to a checked and unchecked states. - Check
Menu Item Builder - A builder type for
CheckMenuItem - Check
Menu Item Snapshot snapshot - A thread-safe read projection and activation callback for a
crate::CheckMenuItem. - Icon
- An icon used for the window titlebar, taskbar, etc.
- Icon
Menu Item - An icon menu item inside a
MenuorSubmenuand usually contains an icon and a text. - Icon
Menu Item Builder - A builder type for
IconMenuItem - Icon
Menu Item Snapshot snapshot - A thread-safe read projection and activation callback for an
crate::IconMenuItem. - Menu
- A root menu that can be added to a window on Windows, GTK 3, or GTK 4 and used as the app global menu on macOS.
- Menu
Change Event snapshot - Notification emitted after a menu or menu item changes.
- Menu
Event - Describes a menu event emitted when a menu item is activated
- MenuId
- An unique id that is associated with a menu or a menu item.
- Menu
Item - A menu item inside a
MenuorSubmenuand contains only text. - Menu
Item Builder - A builder type for
MenuItem - Menu
Item Snapshot snapshot - A thread-safe read projection and activation callback for a
crate::MenuItem. - Menu
Snapshot Handle snapshot - A thread-safe handle to a menu tree.
- Predefined
Menu Item - A predefined (native) menu item which has a predefined behavior by the OS or by this crate.
- Predefined
Menu Item Snapshot snapshot - A thread-safe handle to a read-only projection of a
crate::PredefinedMenuItem. - Submenu
- A menu that can be added to a
Menuor anotherSubmenu. - Submenu
Builder - A builder type for
Submenu - Submenu
Snapshot snapshot - A thread-safe handle to a read-only projection of a
crate::Submenu.
Enums§
- BadIcon
- An error produced when using
Icon::from_rgbawith invalid arguments. - Error
- Errors returned by muda.
- Menu
Item Kind - An enumeration of all available menu types, useful to match against
the items returned from
crate::Menu::itemsorSubmenu::items - Menu
Item Kind Snapshot snapshot - A thread-safe snapshot handle for any menu item kind.
- Native
Icon - A native icon to be used for menu items.
- Snapshot
Icon snapshot - An icon value that can be read from a menu snapshot on any thread.
Traits§
- Context
Menu - A trait that defines the behavior and interface for context menus across different platforms.
- IsMenu
Item - A trait that defines a generic item in a menu, which may be one of
MenuItemKind
Type Aliases§
- Menu
Change Event Receiver snapshot - A receiver for process-wide menu change notifications.
- Menu
Event Receiver - A receiver that could be used to listen to menu events.
- Result
- Convenient type alias of Result type for muda.