Skip to content

nobane/tray-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tray

Cross-platform system tray for Rust.

Crate crates.io
tray crates.io
tray-menu crates.io

Install

cargo add tray-menu --features gtk   # Linux (includes tray)
cargo add tray-menu                   # Windows/macOS (includes tray)
cargo add tray                        # Just the icon, no menus

Usage

use tray_menu::{
    CheckEntry, Divider, Icon, MouseButton, MouseButtonState,
    PopupMenu, SubMenu, TextEntry, TrayIconBuilder, TrayIconEvent,
};

fn main() {
    let icon = Icon::from_rgba(vec![0u8; 32 * 32 * 4], 32, 32).unwrap();

    let _tray = TrayIconBuilder::new()
        .with_icon(icon)
        .with_tooltip("My App")
        .build()
        .unwrap();

    loop {
        if let Ok(TrayIconEvent::Click {
            button: MouseButton::Right,
            button_state: MouseButtonState::Up,
            position,
            ..
        }) = TrayIconEvent::receiver().try_recv()
        {
            let mut menu = PopupMenu::new();
            menu.add(&TextEntry::of("open", "Open"));
            menu.add(&CheckEntry::of("notify", "Notifications", true));
            menu.add(&Divider);

            let mut help = SubMenu::of("Help");
            help.add(&TextEntry::of("about", "About"));
            menu.add(&help);

            menu.add(&Divider);
            menu.add(&TextEntry::of("quit", "Quit"));

            if let Some(id) = menu.popup(position) {
                if id.0 == "quit" {
                    break;
                }
            }
        }
        std::thread::sleep(std::time::Duration::from_millis(16));
    }
}

Examples

cargo run -p tray-menu --features gtk --example simple-menu            # right-click menu
cargo run -p tray-menu --features gtk --example simple-menu -- left    # left-click menu
cargo run -p tray-menu --features gtk --example simple-menu -- enter   # hover to open
cargo run -p tray --example simple-tray                                # icon only, no menu

See the justfile for more commands.

Platform Support

Platform Tray Icon Popup Menu
Linux X11 system tray GTK or Qt
Windows Shell_NotifyIconW TrackPopupMenu
macOS NSStatusItem NSMenu

Architecture

graph TD
    A[tray-menu] -->|uses| B[tray]
    B -->|Linux| C[X11 system tray protocol]
    B -->|Windows| D[Shell_NotifyIconW]
    B -->|macOS| E[NSStatusItem]
    A -->|Linux GTK| F[GtkMenu]
    A -->|Linux Qt| G[QMenu]
    A -->|Windows| H[TrackPopupMenu]
    A -->|macOS| I[NSMenu]
Loading

tray - Thread-safe tray icon with mouse events (click, double-click, hover). No menus.

tray-menu - Popup menus with text items, checkboxes, submenus, dividers. Re-exports tray.

License

MIT

About

Cross-platform system tray icon, with menu builder and support for egui and iced 🦀

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published