muda
Menu Utilities library for Desktop Applications.
Platforms supported:
- Windows
- macOS
- Linux/BSD with GTK 3 or GTK 4
Platform-specific notes:
- 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 or BSD platforms. This is enabled by default.gtk4: Enables the GTK 4 backend on Linux or BSD platforms. Usedefault-features = falsewhen enabling this feature because the default features includegtk3.common-controls-v6: UseTaskDialogIndirectAPI fromComCtl32.dllv6 on Windows for showing the predefinedAboutmenu item dialog.libxdo: Enables linking tolibxdofor the GTK 3 backend. This is used by the predefinedCopy,Cut,PasteandSelectAllmenu items, and is enabled by default. It is not used by GTK 4.snapshot: Enables thread-safe menu snapshot types and methods, switching shared menu state to thread-safe synchronization.serde: Enables de/serializing the dpi types.
When both gtk3 and gtk4 are enabled, Muda uses the GTK 4 backend and emits a Cargo warning.
Dependencies (Linux/BSD)
The gtk3 feature uses GTK 3 for menus. The gtk4 feature uses GTK 4 for menus. libxdo is only used by the GTK 3 backend to make the predefined Copy, Cut, Paste and SelectAll menu items work when the libxdo feature is enabled.
Be sure to install the packages for the GTK backend you enabled before building:
Arch Linux / Manjaro:
# GTK 3 backend
# GTK 4 backend
Debian / Ubuntu:
# GTK 3 backend
# GTK 4 backend
Dependencies in FreeBSD
Install these dependencies in order to compile muda. Instructions using pkg:
# GTK 3 backend
# GTK 4 backend
Example
Create the menu and add your items
let menu = new;
let menu_item2 = new;
let submenu = with_items;
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
// --snip--
unsafe ;
menu.init_for_gtk_window;
menu.init_for_nsapp;
Context menus (Popup menus)
You can also use a [Menu] or a [Submenu] to show a context menu.
// --snip--
let position = PhysicalPosition ;
unsafe ;
menu.show_context_menu_for_gtk_window;
unsafe ;
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 = receiver.try_recv
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.
let event_loop = with_user_event.build.unwrap;
let proxy = event_loop.create_proxy;
set_event_handler;
License
Apache-2.0/MIT