#[macro_use] mod err; mod pack; pub use err::*; use libappindicator::*; use gtk::prelude::*; use pack::*; use std::time::{Duration, Instant}; fn init_indicator(icon_pack: &IconPack) -> AppIndicator { let mut indicator = AppIndicator::new("parrotd", ""); indicator.set_icon_theme_path(icon_pack.pack_path()); indicator.set_status(AppIndicatorStatus::Active); let mut m = gtk::Menu::new(); let mi = gtk::CheckMenuItem::with_label("I'm a parrot"); mi.connect_activate(|_| { gtk::main_quit(); }); m.append(&mi); indicator.set_menu(&mut m); m.show_all(); return indicator; } fn main() { gtk::init().unwrap(); let mut icon_pack = IconPack::new("./res", "parrot", PackVariant::Dark).unwrap(); let mut indicator = init_indicator(&icon_pack); // Animation task let mut last_update = Instant::now(); glib::timeout_add_local(Duration::from_millis(1000 / 60) /* maximum 60Hz */, move || { let now = Instant::now(); if now - last_update >= Duration::from_millis(100) { indicator.set_icon(icon_pack.next_icon_path()); last_update = now; } Continue(true) }); gtk::main(); }