use systray::Application;
use std::process;
use std::fmt;
use std::sync::atomic::{AtomicBool, Ordering};
static ICON_DATA: &[u8] = include_bytes!("../res/burncloud.ico");
#[derive(Debug)]
pub struct SimpleError(String);
impl fmt::Display for SimpleError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0)
}
}
impl std::error::Error for SimpleError {}
static SHOULD_SHOW: AtomicBool = AtomicBool::new(false);
static SHOULD_HIDE: AtomicBool = AtomicBool::new(false);
pub fn should_show_window() -> bool {
SHOULD_SHOW.swap(false, Ordering::Relaxed)
}
pub fn should_hide_window() -> bool {
SHOULD_HIDE.swap(false, Ordering::Relaxed)
}
pub fn start_tray() -> Result<(), Box<dyn std::error::Error>> {
let mut app = Application::new()?;
let temp_dir = std::env::temp_dir();
let temp_icon_path = temp_dir.join("burncloud_temp.ico");
match std::fs::write(&temp_icon_path, ICON_DATA) {
Ok(_) => {
match app.set_icon_from_file(&temp_icon_path.to_string_lossy()) {
Ok(_) => {
println!("Icon set successfully");
let _ = std::fs::remove_file(&temp_icon_path);
},
Err(e) => {
println!("Warning: Failed to set icon: {:?}", e);
let _ = std::fs::remove_file(&temp_icon_path);
}
}
},
Err(e) => {
println!("Warning: Failed to create temporary icon file: {:?}", e);
}
}
app.add_menu_item(&"显示界面".to_string(), move |_| -> Result<(), SimpleError> {
SHOULD_SHOW.store(true, Ordering::Relaxed);
Ok(())
})?;
app.add_menu_separator()?;
app.add_menu_item(&"退出程序".to_string(), |_| -> Result<(), SimpleError> {
process::exit(0);
})?;
app.wait_for_message()?;
Ok(())
}