46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
#[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();
|
|
}
|