From 754439f03ce588572cc5f601a82e46f8ea56e4c2 Mon Sep 17 00:00:00 2001 From: Joel Stodolski <57739515+wuhao1477@users.noreply.github.com> Date: Tue, 2 Sep 2025 17:32:18 +0800 Subject: [PATCH] feat(gui): add macOS dock icon visibility control (#1328) --- easytier-gui/src-tauri/src/lib.rs | 20 ++++++++++++++++++- easytier-gui/src/modules/dock_visibility.ts | 18 +++++++++++++++++ easytier-gui/src/pages/index.vue | 9 +++++++++ easytier-web/frontend-lib/src/locales/cn.yaml | 2 ++ easytier-web/frontend-lib/src/locales/en.yaml | 2 ++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 easytier-gui/src/modules/dock_visibility.ts diff --git a/easytier-gui/src-tauri/src/lib.rs b/easytier-gui/src-tauri/src/lib.rs index 1333fe8..7acf558 100644 --- a/easytier-gui/src-tauri/src/lib.rs +++ b/easytier-gui/src-tauri/src/lib.rs @@ -30,6 +30,23 @@ fn easytier_version() -> Result { Ok(easytier::VERSION.to_string()) } +#[tauri::command] +fn set_dock_visibility(app: tauri::AppHandle, visible: bool) -> Result<(), String> { + #[cfg(target_os = "macos")] + { + use tauri::ActivationPolicy; + app.set_activation_policy(if visible { + ActivationPolicy::Regular + } else { + ActivationPolicy::Accessory + }) + .map_err(|e| e.to_string())?; + } + #[cfg(not(target_os = "macos"))] + let _ = (app, visible); + Ok(()) +} + #[tauri::command] fn is_autostart() -> Result { let args: Vec = std::env::args().collect(); @@ -243,7 +260,8 @@ pub fn run() { set_logging_level, set_tun_fd, is_autostart, - easytier_version + easytier_version, + set_dock_visibility ]) .on_window_event(|_win, event| match event { #[cfg(not(target_os = "android"))] diff --git a/easytier-gui/src/modules/dock_visibility.ts b/easytier-gui/src/modules/dock_visibility.ts new file mode 100644 index 0000000..bcdf4cd --- /dev/null +++ b/easytier-gui/src/modules/dock_visibility.ts @@ -0,0 +1,18 @@ +import { invoke } from '@tauri-apps/api/core' + +export async function loadDockVisibilityAsync(visible: boolean): Promise { + try { + await invoke('set_dock_visibility', { visible }) + localStorage.setItem('dock_visibility', JSON.stringify(visible)) + return visible + } + catch (e) { + console.error('Failed to set dock visibility:', e) + return getDockVisibilityStatus() + } +} + +export function getDockVisibilityStatus(): boolean { + const stored = localStorage.getItem('dock_visibility') + return stored !== null ? JSON.parse(stored) : true +} diff --git a/easytier-gui/src/pages/index.vue b/easytier-gui/src/pages/index.vue index a61d28a..6501cc2 100644 --- a/easytier-gui/src/pages/index.vue +++ b/easytier-gui/src/pages/index.vue @@ -13,6 +13,7 @@ import { NetworkTypes, Config, Status, Utils, I18nUtils, ConfigEditDialog } from import { isAutostart, setLoggingLevel } from '~/composables/network' import { useTray } from '~/composables/tray' import { getAutoLaunchStatusAsync as getAutoLaunchStatus, loadAutoLaunchStatusAsync } from '~/modules/auto_launch' +import { getDockVisibilityStatus, loadDockVisibilityAsync } from '~/modules/dock_visibility' const { t, locale } = useI18n() const visible = ref(false) @@ -177,6 +178,14 @@ const setting_menu_items = ref([ await loadAutoLaunchStatusAsync(!getAutoLaunchStatus()) }, }, + { + label: () => getDockVisibilityStatus() ? t('hide_dock_icon') : t('show_dock_icon'), + icon: 'pi pi-eye-slash', + command: async () => { + await loadDockVisibilityAsync(!getDockVisibilityStatus()) + }, + visible: () => type() === 'macos', + }, { label: () => t('logging'), icon: 'pi pi-file', diff --git a/easytier-web/frontend-lib/src/locales/cn.yaml b/easytier-web/frontend-lib/src/locales/cn.yaml index 324ed58..ec9fc31 100644 --- a/easytier-web/frontend-lib/src/locales/cn.yaml +++ b/easytier-web/frontend-lib/src/locales/cn.yaml @@ -44,6 +44,8 @@ logging_open_dir: 打开日志目录 logging_copy_dir: 复制日志路径 disable_auto_launch: 关闭开机自启 enable_auto_launch: 开启开机自启 +hide_dock_icon: 隐藏 Dock 图标 +show_dock_icon: 显示 Dock 图标 exit: 退出 chips_placeholder: 例如: {0}, 输入后在下拉框中选择生效 hostname_placeholder: '留空默认为主机名: {0}' diff --git a/easytier-web/frontend-lib/src/locales/en.yaml b/easytier-web/frontend-lib/src/locales/en.yaml index e3fbfa1..8e18e79 100644 --- a/easytier-web/frontend-lib/src/locales/en.yaml +++ b/easytier-web/frontend-lib/src/locales/en.yaml @@ -44,6 +44,8 @@ logging_open_dir: Open Log Directory logging_copy_dir: Copy Log Path disable_auto_launch: Disable Launch on Reboot enable_auto_launch: Enable Launch on Reboot +hide_dock_icon: Hide Dock Icon +show_dock_icon: Show Dock Icon exit: Exit use_latency_first: Latency First Mode chips_placeholder: 'e.g: {0}, select from the dropdown after input'