29 releases

0.4.0 Nov 19, 2024
0.3.5 Oct 16, 2024
0.3.1 Sep 27, 2024
0.2.3 Aug 22, 2024
0.1.6 Jun 24, 2024

#107 in GUI

Download history 336/week @ 2024-08-19 5/week @ 2024-08-26 330/week @ 2024-09-16 160/week @ 2024-09-23 323/week @ 2024-09-30 388/week @ 2024-10-07 177/week @ 2024-10-14 5/week @ 2024-10-21 147/week @ 2024-11-18 3/week @ 2024-11-25 15/week @ 2024-12-02

165 downloads per month

MIT license

190KB
4.5K SLoC

wcpopup   Latest Version Documentation

Rust context menu for Windows and Linux(Gtk3).
Supports dark/light theme and color/size configuration.

  • Colors
    • Text color
    • Background color
    • Border color
  • Size
    • Menu padding
    • Menu item padding
  • Font
    • Font family
    • Size and weight

samplesample

Usage

Use ManuBuilder to create a Menu with MenuItems.

fn example(window_handle: isize) {
    let mut builder = MenuBuilder::new(window_handle);
    // Using HWND
    // let mut builder = MenuBuilder::new_for_hwnd(hwnd);
    // Using gtk::ApplicationWindow or gkt::Window
    // let mut builder = MenuBuilder::new_for_window(window);

    builder.check("menu_item1", "Fit To Window", true, None);
    builder.separator();
    builder.text_with_accelerator("menu_item2", "Playlist", None, "Ctrl+P");
    builder.text_with_accelerator("menu_item3", "Toggle Fullscreen", None, "F11");
    builder.text("menu_item4", "Picture In Picture", None);
    builder.separator();
    builder.text_with_accelerator("menu_item5", "Capture", None, "Ctrl+S");
    builder.separator();

    let mut submenu = builder.submenu("submenu1", "Theme", None);
    submenu.radio("submenu_item1", "Light", "Theme", true, None);
    submenu.radio("submenu_item2", "Dark", "Theme", false, None);
    submenu.build().unwrap();

    let menu = builder.build().unwrap();

}

Call Menu.popup_at() to show Menu and receive the selected MenuItem using MenuEvent.

fn show_context_menu(x:i32, y:i32) {
    menu.popup_at(x, y);
}

if let Ok(event) = MenuEvent::receiver().try_recv() {
    let selected_menu_item = event.item;    
}

Or call Menu.popup_at_async() to show Menu and wait asynchronously for a selected MenuItem.

async fn show_context_menu(x:i32, y:i32) {
    let selected_menu_item = menu.popup_at(x, y).await;
}

Platform-specific notes

Windows

WebView2 may receive all keyboard input instead of its parent window(#1703).
Using WebView2, you may need to enable the feature flag.

--enable-features=msWebView2BrowserHitTransparent

Linux

Gtk3 is required.
MenuItem's text color is applied to SVG icon if the SVG file contains the "symbolic" term as the last component of the file name.

Accelerator

Accelerators are used only to display available shortcut keys by default.
Use "accelerator" feature to treat accelerators as commands.
With this feature, when a shortcut key is pressed, the corresponding MenuItem is returned as the result of Menu.popup_at().

features = ["accelerator"]

Dependencies

~4–47MB
~772K SLoC