From 4b8ae4063d50e8de7481b6ad721e874f09358966 Mon Sep 17 00:00:00 2001 From: Memory <134070804+Memory2314@users.noreply.github.com> Date: Mon, 24 Nov 2025 19:26:17 +0800 Subject: [PATCH] feat: add swap tray click option in settings --- src/main/resolve/tray.ts | 37 +++++++++++++++---- .../components/settings/general-config.tsx | 36 +++++++++++++----- src/renderer/src/locales/en-US.json | 1 + src/renderer/src/locales/fa-IR.json | 1 + src/renderer/src/locales/ru-RU.json | 1 + src/renderer/src/locales/zh-CN.json | 1 + src/shared/types.d.ts | 1 + 7 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/main/resolve/tray.ts b/src/main/resolve/tray.ts index e8751c2..a35f4d5 100644 --- a/src/main/resolve/tray.ts +++ b/src/main/resolve/tray.ts @@ -331,7 +331,7 @@ export const buildContextMenu = async (): Promise => { } export async function createTray(): Promise { - const { useDockIcon = true } = await getAppConfig() + const { useDockIcon = true, swapTrayClick = false } = await getAppConfig() if (process.platform === 'linux') { tray = new Tray(pngIcon) const menu = await buildContextMenu() @@ -359,24 +359,45 @@ export async function createTray(): Promise { image.setTemplateImage(true) tray?.setImage(image) }) + // macOS 默认行为: 左键显示窗口, 右键显示菜单 tray?.addListener('click', async () => { - triggerMainWindow() + if (swapTrayClick) { + await updateTrayMenu() + } else { + triggerMainWindow() + } }) tray?.addListener('right-click', async () => { - await updateTrayMenu() + if (swapTrayClick) { + triggerMainWindow() + } else { + await updateTrayMenu() + } }) } if (process.platform === 'win32') { - tray?.addListener('click', () => { - triggerMainWindow() + tray?.addListener('click', async () => { + if (swapTrayClick) { + await updateTrayMenu() + } else { + triggerMainWindow() + } }) tray?.addListener('right-click', async () => { - await updateTrayMenu() + if (swapTrayClick) { + triggerMainWindow() + } else { + await updateTrayMenu() + } }) } if (process.platform === 'linux') { - tray?.addListener('click', () => { - triggerMainWindow() + tray?.addListener('click', async () => { + if (swapTrayClick) { + await updateTrayMenu() + } else { + triggerMainWindow() + } }) ipcMain.on('updateTrayMenu', async () => { await updateTrayMenu() diff --git a/src/renderer/src/components/settings/general-config.tsx b/src/renderer/src/components/settings/general-config.tsx index 773c157..dfc193e 100644 --- a/src/renderer/src/components/settings/general-config.tsx +++ b/src/renderer/src/components/settings/general-config.tsx @@ -51,6 +51,7 @@ const GeneralConfig: React.FC = () => { proxyInTray = true, showCurrentProxyInTray = false, disableTray = false, + swapTrayClick = false, disableTrayIconColor = false, disableAnimations = false, showFloatingWindow: showFloating = false, @@ -321,16 +322,31 @@ const GeneralConfig: React.FC = () => { /> {!disableTray && ( - - { - await patchAppConfig({ disableTrayIconColor: v }) - await updateTrayIcon() - }} - /> - + <> + + { + await patchAppConfig({ swapTrayClick: v }) + closeTrayIcon() + setTimeout(() => { + showTrayIcon() + }, 100) + }} + /> + + + { + await patchAppConfig({ disableTrayIconColor: v }) + await updateTrayIcon() + }} + /> + + )} {platform !== 'linux' && ( <> diff --git a/src/renderer/src/locales/en-US.json b/src/renderer/src/locales/en-US.json index d5fa607..ebcbdcb 100644 --- a/src/renderer/src/locales/en-US.json +++ b/src/renderer/src/locales/en-US.json @@ -64,6 +64,7 @@ "settings.floatingWindowCompatMode": "Floating Window Compatibility Mode (Recommended)", "settings.floatingWindowCompatModeTooltip": "Disables transparency effects to prevent crashes on some Windows systems. Recommended to keep enabled for stability", "settings.disableTray": "Disable Tray Icon", + "settings.swapTrayClick": "Swap Tray Left/Right Click", "settings.proxyInTray": "Show Proxy Info in Tray Menu", "settings.showCurrentProxyInTray": "Show Current Proxy in Tray Menu", "settings.disableTrayIconColor": "Disable Tray Icon Color Changes", diff --git a/src/renderer/src/locales/fa-IR.json b/src/renderer/src/locales/fa-IR.json index 68dbd41..69adc7c 100644 --- a/src/renderer/src/locales/fa-IR.json +++ b/src/renderer/src/locales/fa-IR.json @@ -60,6 +60,7 @@ "settings.showFloatingWindow": "نمایش پنجره شناور", "settings.spinFloatingIcon": "چرخش آیکون شناور بر اساس سرعت شبکه", "settings.disableTray": "غیرفعال کردن آیکون سیستم‌تری", + "settings.swapTrayClick": "تعویض کلیک چپ/راست تری", "settings.proxyInTray": "نمایش اطلاعات پراکسی در منوی سیستم‌تری", "settings.disableTrayIconColor": "غیرفعال کردن تغییر رنگ آیکون تری", "settings.disableAnimations": "غیرفعال کردن جلوه‌های انیمیشن", diff --git a/src/renderer/src/locales/ru-RU.json b/src/renderer/src/locales/ru-RU.json index 15e4469..5d6755c 100644 --- a/src/renderer/src/locales/ru-RU.json +++ b/src/renderer/src/locales/ru-RU.json @@ -60,6 +60,7 @@ "settings.showFloatingWindow": "Показывать плавающее окно", "settings.spinFloatingIcon": "Анимация иконки при активности сети", "settings.disableTray": "Отключить значок в трее", + "settings.swapTrayClick": "Поменять местами левый/правый клик в трее", "settings.proxyInTray": "Показывать информацию о прокси в трее", "settings.disableTrayIconColor": "Отключить смену цвета значка в трее", "settings.disableAnimations": "Отключить анимационные эффекты", diff --git a/src/renderer/src/locales/zh-CN.json b/src/renderer/src/locales/zh-CN.json index c3d46e4..a46053b 100644 --- a/src/renderer/src/locales/zh-CN.json +++ b/src/renderer/src/locales/zh-CN.json @@ -64,6 +64,7 @@ "settings.floatingWindowCompatMode": "悬浮窗兼容模式(推荐开启)", "settings.floatingWindowCompatModeTooltip": "禁用透明效果以避免在某些 Windows 系统上崩溃,建议保持开启以确保稳定性", "settings.disableTray": "禁用托盘图标", + "settings.swapTrayClick": "交换托盘左右键功能", "settings.proxyInTray": "在托盘菜单显示代理信息", "settings.showCurrentProxyInTray": "托盘菜单显示当前代理", "settings.disableTrayIconColor": "禁用托盘图标颜色变化", diff --git a/src/shared/types.d.ts b/src/shared/types.d.ts index 3901603..e7e975d 100644 --- a/src/shared/types.d.ts +++ b/src/shared/types.d.ts @@ -238,6 +238,7 @@ interface IAppConfig { connectionTableSortDirection?: 'asc' | 'desc' spinFloatingIcon?: boolean disableTray?: boolean + swapTrayClick?: boolean showFloatingWindow?: boolean floatingWindowCompatMode?: boolean disableHardwareAcceleration?: boolean