From 124934b0128e402821735e1dc14c52f2c779d27f Mon Sep 17 00:00:00 2001 From: Mimi Date: Thu, 13 Mar 2025 09:48:49 +0800 Subject: [PATCH] feat: additional macos tray event handling option for menu display (#2958) --- src-tauri/src/core/tray/mod.rs | 39 ++++++++++--------- src-tauri/src/feat/config.rs | 10 +++++ .../setting/setting-verge-basic.tsx | 1 + src/locales/en.json | 1 + src/locales/zh.json | 1 + src/services/types.d.ts | 7 +++- 6 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src-tauri/src/core/tray/mod.rs b/src-tauri/src/core/tray/mod.rs index a691b1a7..d0f99da9 100644 --- a/src-tauri/src/core/tray/mod.rs +++ b/src-tauri/src/core/tray/mod.rs @@ -66,12 +66,18 @@ impl Tray { } pub fn create_systray(&self, app: &App) -> Result<()> { - let builder = TrayIconBuilder::with_id("main") + let mut builder = TrayIconBuilder::with_id("main") .icon(app.default_window_icon().unwrap().clone()) .icon_as_template(false); #[cfg(any(target_os = "macos", target_os = "windows"))] - let builder = builder.show_menu_on_left_click(false); + { + let tray_event = { Config::verge().latest().tray_event.clone() }; + let tray_event: String = tray_event.unwrap_or("main_window".into()); + if tray_event.as_str() != "tray_menu" { + builder = builder.show_menu_on_left_click(false); + } + } let tray = builder.build(app)?; @@ -79,22 +85,6 @@ impl Tray { let tray_event = { Config::verge().latest().tray_event.clone() }; let tray_event: String = tray_event.unwrap_or("main_window".into()); - #[cfg(target_os = "macos")] - if let TrayIconEvent::Click { - button: MouseButton::Left, - button_state: MouseButtonState::Down, - .. - } = event - { - match tray_event.as_str() { - "system_proxy" => feat::toggle_system_proxy(), - "tun_mode" => feat::toggle_tun_mode(None), - "main_window" => resolve::create_window(), - _ => {} - } - } - - #[cfg(not(target_os = "macos"))] if let TrayIconEvent::Click { button: MouseButton::Left, button_state: MouseButtonState::Down, @@ -113,6 +103,19 @@ impl Tray { Ok(()) } + /// 更新托盘点击行为 + pub fn update_click_behavior(&self) -> Result<()> { + let app_handle = handle::Handle::global().app_handle().unwrap(); + let tray_event = { Config::verge().latest().tray_event.clone() }; + let tray_event: String = tray_event.unwrap_or("main_window".into()); + let tray = app_handle.tray_by_id("main").unwrap(); + match tray_event.as_str() { + "tray_menu" => tray.set_show_menu_on_left_click(true)?, + _ => tray.set_show_menu_on_left_click(false)?, + } + Ok(()) + } + /// 更新托盘菜单 pub fn update_menu(&self) -> Result<()> { let app_handle = handle::Handle::global().app_handle().unwrap(); diff --git a/src-tauri/src/feat/config.rs b/src-tauri/src/feat/config.rs index f2cb8e48..0a236463 100644 --- a/src-tauri/src/feat/config.rs +++ b/src-tauri/src/feat/config.rs @@ -73,6 +73,7 @@ pub async fn patch_verge(patch: IVerge, not_save_file: bool) -> Result<()> { let http_port = patch.verge_port; let enable_tray_speed = patch.enable_tray_speed; let enable_global_hotkey = patch.enable_global_hotkey; + let tray_event = patch.tray_event; let res: std::result::Result<(), anyhow::Error> = { let mut should_restart_core = false; @@ -84,6 +85,7 @@ pub async fn patch_verge(patch: IVerge, not_save_file: bool) -> Result<()> { let mut should_update_hotkey = false; let mut should_update_systray_menu = false; let mut should_update_systray_tooltip = false; + let mut should_update_systray_click_behavior = false; if tun_mode.is_some() { should_update_clash_config = true; @@ -145,6 +147,10 @@ pub async fn patch_verge(patch: IVerge, not_save_file: bool) -> Result<()> { should_update_systray_icon = true; } + if tray_event.is_some() { + should_update_systray_click_behavior = true; + } + if should_restart_core { CoreManager::global().restart_core().await?; } @@ -180,6 +186,10 @@ pub async fn patch_verge(patch: IVerge, not_save_file: bool) -> Result<()> { tray::Tray::global().update_tooltip()?; } + if should_update_systray_click_behavior { + tray::Tray::global().update_click_behavior()?; + } + // 处理轻量模式切换 if lite_mode.is_some() { if let Some(window) = handle::Handle::global().get_window() { diff --git a/src/components/setting/setting-verge-basic.tsx b/src/components/setting/setting-verge-basic.tsx index 4e562bf0..7666e9c8 100644 --- a/src/components/setting/setting-verge-basic.tsx +++ b/src/components/setting/setting-verge-basic.tsx @@ -119,6 +119,7 @@ const SettingVergeBasic = ({ onError }: Props) => { >