Added basic tray icon.

This commit is contained in:
lennard
2023-06-10 00:55:17 +02:00
parent 06d75c110c
commit 2e3beb2d9c
3 changed files with 68 additions and 0 deletions

View File

@@ -8,3 +8,4 @@ edition = "2021"
[dependencies]
hidapi = "2.3.3"
thiserror = "1.0.40"
ksni = "0.2.0"

45
src/battery_tray.rs Normal file
View File

@@ -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<MenuItem<Self>> {
vec![
StandardItem {
label: "Exit".into(),
icon_name: "application-exit".into(),
activate: Box::new(|_| std::process::exit(0)),
..Default::default()
}
.into(),
]
}
}

View File

@@ -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);
});
}
}