feat: add swap tray click option in settings

This commit is contained in:
Memory 2025-11-24 19:26:17 +08:00 committed by GitHub
parent 3670f23a1c
commit 4b8ae4063d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 60 additions and 18 deletions

View File

@ -331,7 +331,7 @@ export const buildContextMenu = async (): Promise<Menu> => {
} }
export async function createTray(): Promise<void> { export async function createTray(): Promise<void> {
const { useDockIcon = true } = await getAppConfig() const { useDockIcon = true, swapTrayClick = false } = await getAppConfig()
if (process.platform === 'linux') { if (process.platform === 'linux') {
tray = new Tray(pngIcon) tray = new Tray(pngIcon)
const menu = await buildContextMenu() const menu = await buildContextMenu()
@ -359,24 +359,45 @@ export async function createTray(): Promise<void> {
image.setTemplateImage(true) image.setTemplateImage(true)
tray?.setImage(image) tray?.setImage(image)
}) })
// macOS 默认行为: 左键显示窗口, 右键显示菜单
tray?.addListener('click', async () => { tray?.addListener('click', async () => {
if (swapTrayClick) {
await updateTrayMenu()
} else {
triggerMainWindow() triggerMainWindow()
}
}) })
tray?.addListener('right-click', async () => { tray?.addListener('right-click', async () => {
if (swapTrayClick) {
triggerMainWindow()
} else {
await updateTrayMenu() await updateTrayMenu()
}
}) })
} }
if (process.platform === 'win32') { if (process.platform === 'win32') {
tray?.addListener('click', () => { tray?.addListener('click', async () => {
if (swapTrayClick) {
await updateTrayMenu()
} else {
triggerMainWindow() triggerMainWindow()
}
}) })
tray?.addListener('right-click', async () => { tray?.addListener('right-click', async () => {
if (swapTrayClick) {
triggerMainWindow()
} else {
await updateTrayMenu() await updateTrayMenu()
}
}) })
} }
if (process.platform === 'linux') { if (process.platform === 'linux') {
tray?.addListener('click', () => { tray?.addListener('click', async () => {
if (swapTrayClick) {
await updateTrayMenu()
} else {
triggerMainWindow() triggerMainWindow()
}
}) })
ipcMain.on('updateTrayMenu', async () => { ipcMain.on('updateTrayMenu', async () => {
await updateTrayMenu() await updateTrayMenu()

View File

@ -51,6 +51,7 @@ const GeneralConfig: React.FC = () => {
proxyInTray = true, proxyInTray = true,
showCurrentProxyInTray = false, showCurrentProxyInTray = false,
disableTray = false, disableTray = false,
swapTrayClick = false,
disableTrayIconColor = false, disableTrayIconColor = false,
disableAnimations = false, disableAnimations = false,
showFloatingWindow: showFloating = false, showFloatingWindow: showFloating = false,
@ -321,6 +322,20 @@ const GeneralConfig: React.FC = () => {
/> />
</SettingItem> </SettingItem>
{!disableTray && ( {!disableTray && (
<>
<SettingItem title={t('settings.swapTrayClick')} divider>
<Switch
size="sm"
isSelected={swapTrayClick}
onValueChange={async (v) => {
await patchAppConfig({ swapTrayClick: v })
closeTrayIcon()
setTimeout(() => {
showTrayIcon()
}, 100)
}}
/>
</SettingItem>
<SettingItem title={t('settings.disableTrayIconColor')} divider> <SettingItem title={t('settings.disableTrayIconColor')} divider>
<Switch <Switch
size="sm" size="sm"
@ -331,6 +346,7 @@ const GeneralConfig: React.FC = () => {
}} }}
/> />
</SettingItem> </SettingItem>
</>
)} )}
{platform !== 'linux' && ( {platform !== 'linux' && (
<> <>

View File

@ -64,6 +64,7 @@
"settings.floatingWindowCompatMode": "Floating Window Compatibility Mode (Recommended)", "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.floatingWindowCompatModeTooltip": "Disables transparency effects to prevent crashes on some Windows systems. Recommended to keep enabled for stability",
"settings.disableTray": "Disable Tray Icon", "settings.disableTray": "Disable Tray Icon",
"settings.swapTrayClick": "Swap Tray Left/Right Click",
"settings.proxyInTray": "Show Proxy Info in Tray Menu", "settings.proxyInTray": "Show Proxy Info in Tray Menu",
"settings.showCurrentProxyInTray": "Show Current Proxy in Tray Menu", "settings.showCurrentProxyInTray": "Show Current Proxy in Tray Menu",
"settings.disableTrayIconColor": "Disable Tray Icon Color Changes", "settings.disableTrayIconColor": "Disable Tray Icon Color Changes",

View File

@ -60,6 +60,7 @@
"settings.showFloatingWindow": "نمایش پنجره شناور", "settings.showFloatingWindow": "نمایش پنجره شناور",
"settings.spinFloatingIcon": "چرخش آیکون شناور بر اساس سرعت شبکه", "settings.spinFloatingIcon": "چرخش آیکون شناور بر اساس سرعت شبکه",
"settings.disableTray": "غیرفعال کردن آیکون سیستم‌تری", "settings.disableTray": "غیرفعال کردن آیکون سیستم‌تری",
"settings.swapTrayClick": "تعویض کلیک چپ/راست تری",
"settings.proxyInTray": "نمایش اطلاعات پراکسی در منوی سیستم‌تری", "settings.proxyInTray": "نمایش اطلاعات پراکسی در منوی سیستم‌تری",
"settings.disableTrayIconColor": "غیرفعال کردن تغییر رنگ آیکون تری", "settings.disableTrayIconColor": "غیرفعال کردن تغییر رنگ آیکون تری",
"settings.disableAnimations": "غیرفعال کردن جلوه‌های انیمیشن", "settings.disableAnimations": "غیرفعال کردن جلوه‌های انیمیشن",

View File

@ -60,6 +60,7 @@
"settings.showFloatingWindow": "Показывать плавающее окно", "settings.showFloatingWindow": "Показывать плавающее окно",
"settings.spinFloatingIcon": "Анимация иконки при активности сети", "settings.spinFloatingIcon": "Анимация иконки при активности сети",
"settings.disableTray": "Отключить значок в трее", "settings.disableTray": "Отключить значок в трее",
"settings.swapTrayClick": "Поменять местами левый/правый клик в трее",
"settings.proxyInTray": "Показывать информацию о прокси в трее", "settings.proxyInTray": "Показывать информацию о прокси в трее",
"settings.disableTrayIconColor": "Отключить смену цвета значка в трее", "settings.disableTrayIconColor": "Отключить смену цвета значка в трее",
"settings.disableAnimations": "Отключить анимационные эффекты", "settings.disableAnimations": "Отключить анимационные эффекты",

View File

@ -64,6 +64,7 @@
"settings.floatingWindowCompatMode": "悬浮窗兼容模式(推荐开启)", "settings.floatingWindowCompatMode": "悬浮窗兼容模式(推荐开启)",
"settings.floatingWindowCompatModeTooltip": "禁用透明效果以避免在某些 Windows 系统上崩溃,建议保持开启以确保稳定性", "settings.floatingWindowCompatModeTooltip": "禁用透明效果以避免在某些 Windows 系统上崩溃,建议保持开启以确保稳定性",
"settings.disableTray": "禁用托盘图标", "settings.disableTray": "禁用托盘图标",
"settings.swapTrayClick": "交换托盘左右键功能",
"settings.proxyInTray": "在托盘菜单显示代理信息", "settings.proxyInTray": "在托盘菜单显示代理信息",
"settings.showCurrentProxyInTray": "托盘菜单显示当前代理", "settings.showCurrentProxyInTray": "托盘菜单显示当前代理",
"settings.disableTrayIconColor": "禁用托盘图标颜色变化", "settings.disableTrayIconColor": "禁用托盘图标颜色变化",

View File

@ -238,6 +238,7 @@ interface IAppConfig {
connectionTableSortDirection?: 'asc' | 'desc' connectionTableSortDirection?: 'asc' | 'desc'
spinFloatingIcon?: boolean spinFloatingIcon?: boolean
disableTray?: boolean disableTray?: boolean
swapTrayClick?: boolean
showFloatingWindow?: boolean showFloatingWindow?: boolean
floatingWindowCompatMode?: boolean floatingWindowCompatMode?: boolean
disableHardwareAcceleration?: boolean disableHardwareAcceleration?: boolean