use tauri::{ Manager, menu::{MenuBuilder, MenuItemBuilder}, tray::{MouseButton, MouseButtonState, TrayIconBuilder, TrayIconEvent}, }; pub fn create_tray(app: &tauri::App) -> Result<(), Box> { let show = MenuItemBuilder::with_id("show", "显示主窗口").build(app)?; let quit = MenuItemBuilder::with_id("quit", "退出").build(app)?; let menu = MenuBuilder::new(app) .item(&show) .separator() .item(&quit) .build()?; let mut tray_builder = TrayIconBuilder::new() .menu(&menu) .tooltip("Fischer AgentKit"); if let Some(icon) = app.default_window_icon() { tray_builder = tray_builder.icon(icon.clone()); } let _tray = tray_builder .on_menu_event(|app, event| match event.id().as_ref() { "show" => { if let Some(window) = app.get_webview_window("main") { let _ = window.show(); let _ = window.set_focus(); } } "quit" => { // Stop backend before exiting let state = app.state::(); // Cancel listener task if let Some(token) = state.cancel_token.lock().unwrap().take() { token.cancel(); } // Kill the child process if let Some(child) = state.child.lock().unwrap().take() { let _ = child.kill(); } *state.port.lock().unwrap() = None; app.exit(0); } _ => {} }) .on_tray_icon_event(|tray, event| { if let TrayIconEvent::Click { button: MouseButton::Left, button_state: MouseButtonState::Up, .. } = event { let app = tray.app_handle(); if let Some(window) = app.get_webview_window("main") { let _ = window.show(); let _ = window.set_focus(); } } }) .build(app)?; Ok(()) }