From 08038e6be0f90aae81e219987d53c69fd14cf64f Mon Sep 17 00:00:00 2001 From: zinface Date: Tue, 18 Aug 2026 11:35:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?style(titleBar):=20=E4=BD=BF=E7=94=A8=20Fon?= =?UTF-8?q?t=20Awesome=20=E5=9B=BE=E6=A0=87=E9=9B=86=E6=9B=BF=E4=BB=A3?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E5=BD=A2=E5=BC=8F=E7=AA=97=E5=8F=A3=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/WindowTitleBar.vue | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/WindowTitleBar.vue b/src/components/WindowTitleBar.vue index b1c90d88..0f4fb408 100644 --- a/src/components/WindowTitleBar.vue +++ b/src/components/WindowTitleBar.vue @@ -75,30 +75,28 @@
@@ -110,6 +108,7 @@ import ThemeToggle from "./ThemeToggle.vue"; defineProps<{ searchQuery: string; themeMode: "light" | "dark" | "auto"; + isMaximized: boolean }>(); const emit = defineEmits<{ From f2aa1573fa0c69ef4ef84062dcb5c84f6e448ebb Mon Sep 17 00:00:00 2001 From: zinface Date: Tue, 18 Aug 2026 11:36:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?electron(titleBar):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=E7=8A=B6=E6=80=81IPC=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E4=B8=8E=E6=A1=A5=E6=8E=A5=E5=99=A8=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main/index.ts | 8 ++++++++ electron/preload/index.ts | 2 ++ 2 files changed, 10 insertions(+) diff --git a/electron/main/index.ts b/electron/main/index.ts index 6b514806..b84443b3 100644 --- a/electron/main/index.ts +++ b/electron/main/index.ts @@ -843,6 +843,14 @@ app.whenReady().then(() => { }); }); +ipcMain.handle('window:state', () => { + const win = BrowserWindow.getFocusedWindow() + if (!win) return 'normal' + if (win.isMaximized()) return 'maximized' + if (win.isMinimized()) return 'minimized' + return 'normal' +}) + // New window example arg: new windows url // ipcMain.handle('open-win', (_, arg) => { // const childWindow = new BrowserWindow({ diff --git a/electron/preload/index.ts b/electron/preload/index.ts index da219272..27f490b5 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -51,6 +51,7 @@ type WindowControlBridge = { minimize: () => void; toggleMaximize: () => void; close: () => void; + state: () => Promise<| 'normal' | 'maximized' | 'minimized'>; }; type UpdateCenterStateListener = (snapshot: UpdateCenterSnapshot) => void; @@ -110,6 +111,7 @@ contextBridge.exposeInMainWorld("windowControls", { minimize: () => ipcRenderer.send("window-control-minimize"), toggleMaximize: () => ipcRenderer.send("window-control-toggle-maximize"), close: () => ipcRenderer.send("window-control-close"), + state: () => ipcRenderer.invoke("window:state"), } satisfies WindowControlBridge); contextBridge.exposeInMainWorld("updateCenter", { From fdc8455640095a94f2c3604acd94f80570079ff8 Mon Sep 17 00:00:00 2001 From: zinface Date: Tue, 18 Aug 2026 11:40:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(titleBar):=20=E6=A0=B9=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=BB=B4=E6=8A=A4=E5=B9=B6=E4=BC=A0=E5=85=A5=20isMaxi?= =?UTF-8?q?mized=20=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 8 ++++++++ src/vite-env.d.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/src/App.vue b/src/App.vue index abd3b205..b89d8d90 100644 --- a/src/App.vue +++ b/src/App.vue @@ -14,6 +14,7 @@ @toggle-theme="toggleTheme" @toggle-sidebar="isSidebarOpen = !isSidebarOpen" @spk-link="handleSpkLink" + :is-maximized="isMaximized" />
@@ -545,6 +546,11 @@ const isDarkTheme = computed(() => { return themeMode.value === "dark"; }); +const isMaximized = ref(false) +const updateIsMaximizedState = async () => { + const state = await window.windowControls.state() + isMaximized.value = state === 'maximized' +} const isSubmitterView = ref(false); // 启动参数 --no-apm => 仅 Spark;--no-spark => 仅 APM;由主进程 IPC 提供 @@ -922,6 +928,8 @@ const handleWindowResize = () => { saveBoundsTimer = window.setTimeout(() => { void window.ipcRenderer.invoke("save-window-bounds"); }, 400); + + updateIsMaximizedState() }; // —— 以下为可复用的事件/IPC 监听处理器(命名函数,便于 onUnmounted 统一移除)—— diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index e4409466..09878e28 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -39,6 +39,7 @@ interface WindowControlBridge { minimize: () => void; toggleMaximize: () => void; close: () => void; + state: () => Promise<| 'normal' | 'maximized' | 'minimized'> } // IPC channel type definitions