From 2e3beb2d9cc6813b00516b1a44d0f35715331175 Mon Sep 17 00:00:00 2001 From: lennard Date: Sat, 10 Jun 2023 00:55:17 +0200 Subject: [PATCH] Added basic tray icon. --- Cargo.toml | 1 + src/battery_tray.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 22 ++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 src/battery_tray.rs diff --git a/Cargo.toml b/Cargo.toml index a1de77e..91f56c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,4 @@ edition = "2021" [dependencies] hidapi = "2.3.3" thiserror = "1.0.40" +ksni = "0.2.0" \ No newline at end of file diff --git a/src/battery_tray.rs b/src/battery_tray.rs new file mode 100644 index 0000000..92c6dc1 --- /dev/null +++ b/src/battery_tray.rs @@ -0,0 +1,45 @@ +use ksni::{Tray, MenuItem, menu::{StandardItem}}; + +#[derive(Debug)] +pub struct BatteryTray { + battery_level: u8, + charging: bool, +} + +impl BatteryTray { + pub fn new(battery_level: u8, charging: bool) -> Self { + BatteryTray { + battery_level, + charging, + } + } + + pub fn refresh(&mut self, battery_level: u8, charging: bool) { + self.battery_level = battery_level; + self.charging = charging; + } +} + +impl Tray for BatteryTray { + fn icon_name(&self) -> String { + "headset".into() + } + fn title(&self) -> String { + if self.charging { + format!("Battery level: {}%\nCharging", self.battery_level).to_string() + } else { + format!("Battery level: {}%\nNot charging", self.battery_level).to_string() + } + } + fn menu(&self) -> Vec> { + vec![ + StandardItem { + label: "Exit".into(), + icon_name: "application-exit".into(), + activate: Box::new(|_| std::process::exit(0)), + ..Default::default() + } + .into(), + ] + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e9b14be..f773492 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ use hyper_x_cloud_ii_wireless::Device; +use ksni::TrayService; +use battery_tray::BatteryTray; +mod battery_tray; fn main() { let device = match Device::new() { @@ -21,4 +24,23 @@ fn main() { } else { println!("Not charging"); } + + let service = TrayService::new(BatteryTray::new(battery_level, charging)); + let handle = service.handle(); + service.spawn(); + + // Run loop + loop { + std::thread::sleep(std::time::Duration::from_secs(1)); + let (battery_level, charging) = match device.get_battery_level() { + Ok(t) => t, + Err(error) => { + eprintln!("{error}"); + continue; + } + }; + handle.update(|tray: &mut BatteryTray| { + tray.refresh(battery_level, charging); + }); + } }