auto-cpufreq 3.2.4

Automatic CPU speed & power optimizer for Linux
Documentation
use ksni::menu::StandardItem;
use ksni::{MenuItem, ToolTip, Tray};
use ksni::blocking::TrayMethods;
use std::process::Command;

fn get_icon_path() -> String {
    "/usr/local/share/auto-cpufreq/images/icon.png".to_string()
}

pub struct AutoCpufreqTray;
pub struct TrayApp;

impl Tray for AutoCpufreqTray {
    fn id(&self) -> String {
        "auto-cpufreq-tray".into()
    }

    fn icon_theme_path(&self) -> String {
        let icon_path = get_icon_path();
        let path = std::path::Path::new(&icon_path);
        path.parent()
            .unwrap_or_else(|| std::path::Path::new("/"))
            .to_string_lossy()
            .into()
    }

    fn icon_name(&self) -> String {
        "icon".into()
    }

    fn title(&self) -> String {
        "auto-cpufreq".into()
    }

    fn tool_tip(&self) -> ToolTip {
        ToolTip {
            title: "auto-cpufreq".into(),
            description: "CPU Power Management Tool".into(),
            icon_name: "icon".into(),
            icon_pixmap: Vec::new(),
        }
    }

    fn menu(&self) -> Vec<MenuItem<Self>> {
        use ksni::MenuItem::*;
        vec![
            Standard(StandardItem {
                label: "Open GUI".into(),
                activate: Box::new(|_| {
                    let _ = Command::new("auto-cpufreq-gtk").spawn();
                }),
                ..Default::default()
            }),
            Separator,
            Standard(StandardItem {
                label: "Quit".into(),
                activate: Box::new(|_| std::process::exit(0)),
                ..Default::default()
            }),
        ]
    }
}

impl TrayApp {
    pub fn run() {
        let _handle = AutoCpufreqTray.spawn().expect("Failed to start tray");
        println!("auto-cpufreq tray icon is running via D-Bus...");
        loop { std::thread::sleep(std::time::Duration::from_secs(60)); }
    }
}