From fcea0d83168f963f8c559c28aa961e34a82741c8 Mon Sep 17 00:00:00 2001 From: imsyy Date: Mon, 20 Apr 2026 10:00:50 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E9=99=90=E5=88=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=A0=8F=E6=AD=8C=E8=AF=8D=E4=BB=85=E6=94=AF=E6=8C=81=20Window?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/core/index.ts | 5 +++- electron/main/ipc/config.ts | 7 +++-- electron/main/ipc/window.ts | 22 ++++++++------ electron/main/services/tray.ts | 5 ++-- electron/main/window/index.ts | 3 +- src/layouts/components/NavHeader.vue | 43 +++++++++++++++++++++------- src/styles/global.css | 2 +- 7 files changed, 59 insertions(+), 28 deletions(-) diff --git a/electron/main/core/index.ts b/electron/main/core/index.ts index 82c52f3..79eb22d 100644 --- a/electron/main/core/index.ts +++ b/electron/main/core/index.ts @@ -13,6 +13,7 @@ import { initDatabase, closeDatabase } from "@main/database"; import { registerCacheScheme, handleCacheProtocol } from "@main/utils/protocol"; import { coreLog, initLogger } from "@main/utils/logger"; import { store } from "@main/store"; +import { isWin } from "@main/utils/config"; /** * 配置 Chromium 启动参数以优化内存占用 @@ -93,7 +94,9 @@ export const initApp = (): void => { // 快照歌词相关窗口的打开状态,供下次启动恢复 store.set("windowStates.desktopLyric.visible", !!getDesktopLyricWindow()); store.set("windowStates.dynamicIsland.visible", !!getDynamicIslandWindow()); - store.set("windowStates.taskbarLyric.visible", !!getTaskbarLyricWindow()); + if (isWin) { + store.set("windowStates.taskbarLyric.visible", !!getTaskbarLyricWindow()); + } shutdownMedia(); closeDatabase(); }); diff --git a/electron/main/ipc/config.ts b/electron/main/ipc/config.ts index fe04501..c1c2ce2 100644 --- a/electron/main/ipc/config.ts +++ b/electron/main/ipc/config.ts @@ -17,6 +17,7 @@ import { applyTaskbarLyricLayout, } from "@main/window"; import { broadcast } from "@main/utils/broadcast"; +import { isWin } from "@main/utils/config"; /** 配置写入后的副作用 */ const applyConfigChange = (keyPath: string, value: unknown): void => { @@ -53,7 +54,7 @@ const applyConfigChange = (keyPath: string, value: unknown): void => { case "taskbarLyric.position": case "taskbarLyric.autoMaxWidth": case "taskbarLyric.maxWidth": - applyTaskbarLyricLayout(); + if (isWin) applyTaskbarLyricLayout(); break; } // 桌面歌词配置变更广播到所有窗口 @@ -64,8 +65,8 @@ const applyConfigChange = (keyPath: string, value: unknown): void => { if (keyPath.startsWith("dynamicIsland.")) { broadcast("dynamicIsland:configChange", store.get("dynamicIsland")); } - // 任务栏歌词配置变更广播到所有窗口 - if (keyPath.startsWith("taskbarLyric.")) { + // 任务栏歌词配置变更广播到所有窗口(仅 Windows) + if (isWin && keyPath.startsWith("taskbarLyric.")) { broadcast("taskbarLyric:configChange", store.get("taskbarLyric")); } }; diff --git a/electron/main/ipc/window.ts b/electron/main/ipc/window.ts index 7a87ae0..ed3a36b 100644 --- a/electron/main/ipc/window.ts +++ b/electron/main/ipc/window.ts @@ -1,5 +1,6 @@ import { app, ipcMain } from "electron"; import { store } from "@main/store"; +import { isWin } from "@main/utils/config"; import { toggleDesktopLyricWindow, closeDesktopLyricWindow, @@ -90,14 +91,19 @@ export const registerWindowIpc = (): void => { return saved.mode === "floating" ? "floating" : "snapped"; }); - // 切换任务栏歌词窗口 - ipcMain.handle("window:toggleTaskbarLyric", () => toggleTaskbarLyricWindow()); - - // 关闭任务栏歌词窗口 - ipcMain.handle("window:closeTaskbarLyric", () => closeTaskbarLyricWindow()); - - // 查询任务栏歌词窗口是否打开 - ipcMain.handle("window:isTaskbarLyricOpen", () => !!getTaskbarLyricWindow()); + // 任务栏歌词仅在 Windows 注册 + if (isWin) { + // 切换任务栏歌词窗口 + ipcMain.handle("window:toggleTaskbarLyric", () => toggleTaskbarLyricWindow()); + // 关闭任务栏歌词窗口 + ipcMain.handle("window:closeTaskbarLyric", () => closeTaskbarLyricWindow()); + // 查询任务栏歌词窗口是否打开 + ipcMain.handle("window:isTaskbarLyricOpen", () => !!getTaskbarLyricWindow()); + } else { + ipcMain.handle("window:toggleTaskbarLyric", () => false); + ipcMain.handle("window:closeTaskbarLyric", () => undefined); + ipcMain.handle("window:isTaskbarLyricOpen", () => false); + } // 主窗口控制 ipcMain.on("window:minimize", () => minimizeMainWindow()); diff --git a/electron/main/services/tray.ts b/electron/main/services/tray.ts index f6cf905..5bfb679 100644 --- a/electron/main/services/tray.ts +++ b/electron/main/services/tray.ts @@ -119,13 +119,14 @@ const buildMenu = (): Menu => { icon: menuIcon("lyric"), click: () => toggleDynamicIslandWindow(), }, + // 任务栏歌词 ...(isWin ? [ { label: taskbarLyricOpen ? t("closeTaskbarLyric") : t("openTaskbarLyric"), icon: menuIcon("lyric"), click: () => toggleTaskbarLyricWindow(), - } as MenuItemConstructorOptions, + }, ] : []), { type: "separator" }, @@ -147,7 +148,6 @@ export const refreshTray = (): void => { /** 初始化系统托盘 */ export const initTray = (): void => { - const isWin = process.platform === "win32"; const isMac = process.platform === "darwin"; let icon: string | Electron.NativeImage; if (isWin) { @@ -214,6 +214,7 @@ export const setTrayDynamicIsland = (open: boolean): void => { /** 同步任务栏歌词窗口开关状态到托盘 */ export const setTrayTaskbarLyric = (open: boolean): void => { + if (!isWin) return; if (taskbarLyricOpen === open) return; taskbarLyricOpen = open; refreshTray(); diff --git a/electron/main/window/index.ts b/electron/main/window/index.ts index 0340c8d..f8dc3b6 100644 --- a/electron/main/window/index.ts +++ b/electron/main/window/index.ts @@ -1,8 +1,8 @@ import { store } from "@main/store"; +import { isWin } from "@main/utils/config"; import { createDesktopLyricWindow } from "./desktopLyric"; import { createDynamicIslandWindow } from "./dynamicIsland"; import { createTaskbarLyricWindow } from "./taskbarLyric"; -import { isWin } from "@main/utils/config"; export { createWindow } from "./create"; export { @@ -50,7 +50,6 @@ export { /** 恢复歌词相关窗口 */ export const restoreLyricWindows = (): void => { - if (!(store.get("system.rememberWindowState") ?? true)) return; if (store.get("windowStates.desktopLyric.visible")) createDesktopLyricWindow(); if (store.get("windowStates.dynamicIsland.visible")) createDynamicIslandWindow(); if (isWin && store.get("windowStates.taskbarLyric.visible")) { diff --git a/src/layouts/components/NavHeader.vue b/src/layouts/components/NavHeader.vue index a4aa217..341e68c 100644 --- a/src/layouts/components/NavHeader.vue +++ b/src/layouts/components/NavHeader.vue @@ -50,34 +50,55 @@ const onMenuSelect = (key: string): void => { - + diff --git a/src/styles/global.css b/src/styles/global.css index 3edb723..47bcc20 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -33,7 +33,7 @@ body { /* 滚动条 */ ::-webkit-scrollbar { - width: 5px; + width: 6px; } ::-webkit-scrollbar-track { From 05eaa48d1e7f911310cac39aebaea3b29af7a7a4 Mon Sep 17 00:00:00 2001 From: imsyy Date: Mon, 20 Apr 2026 18:22:34 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=BB=86=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 清理 NavHeader 与 core/index.ts 的冗余注释 - 全局禁用 a 标签的拖拽,消除 hover 时的拖影 Co-Authored-By: Claude Opus 4.7 (1M context) --- electron/main/core/index.ts | 6 +----- src/layouts/components/NavHeader.vue | 4 ++-- src/styles/global.css | 1 + 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/electron/main/core/index.ts b/electron/main/core/index.ts index 79eb22d..b2a23c8 100644 --- a/electron/main/core/index.ts +++ b/electron/main/core/index.ts @@ -26,11 +26,7 @@ const configureMemoryOptimizations = (): void => { // 禁用不需要的 Chromium 功能 app.commandLine.appendSwitch( "disable-features", - [ - "MediaRouter", // 不需要 Chromecast - "TranslateUI", // 不需要翻译 - "SpareRendererForSitePerProcess", // 不需要备用渲染进程 - ].join(","), + ["MediaRouter", "TranslateUI", "SpareRendererForSitePerProcess"].join(","), ); // 减少渲染进程内存分配器保留 app.commandLine.appendSwitch("renderer-process-limit", "1"); diff --git a/src/layouts/components/NavHeader.vue b/src/layouts/components/NavHeader.vue index 341e68c..7600b98 100644 --- a/src/layouts/components/NavHeader.vue +++ b/src/layouts/components/NavHeader.vue @@ -50,7 +50,7 @@ const onMenuSelect = (key: string): void => {