ksni 0.0.0

A Rust implementation of the KDE/freedesktop StatusNotifierItem specification
Documentation
use ksni::{self, menu, tray};

fn main() {
    struct MyTray;
    impl ksni::Tray for MyTray {
        type Err = std::convert::Infallible;
        fn tray_properties() -> tray::Properties {
            tray::Properties {
                icon_name: "music".to_owned(),
                ..Default::default()
            }
        }
        fn menu() -> Vec<menu::MenuItem> {
            use menu::*;
            vec![
                SubMenu {
                    label: "a".into(),
                    submenu: vec![
                        SubMenu {
                            label: "a1".into(),
                            submenu: vec![
                                StandardItem {
                                    label: "a1.1".into(),
                                    ..Default::default()
                                }
                                .into(),
                                StandardItem {
                                    label: "a1.2".into(),
                                    ..Default::default()
                                }
                                .into(),
                            ],
                            ..Default::default()
                        }
                        .into(),
                        StandardItem {
                            label: "a2".into(),
                            ..Default::default()
                        }
                        .into(),
                    ],
                    ..Default::default()
                }
                .into(),
                MenuItem::Sepatator,
                RadioGroup {
                    select: Box::new(|prev, current| {
                        dbg!(prev, current);
                    }),
                    options: vec![
                        RadioItem {
                            label: "Option 0".into(),
                            ..Default::default()
                        },
                        RadioItem {
                            label: "Option 1".into(),
                            ..Default::default()
                        },
                        RadioItem {
                            label: "Option 2".into(),
                            ..Default::default()
                        },
                    ],
                    ..Default::default()
                }
                .into(),
                CheckmarkItem {
                    label: "Checkable".into(),
                    checked: true,
                    ..Default::default()
                }
                .into(),
                StandardItem {
                    label: "Exit".into(),
                    icon_name: "application-exit".into(),
                    activate: Box::new(|| std::process::exit(0)),
                    ..Default::default()
                }
                .into(),
            ]
        }
    }

    ksni::run(MyTray);
}