From 1201992ab02cb374ba809414bc6859717c796c65 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 19 Jul 2026 11:20:00 +0000 Subject: [PATCH] fix(client): skip window-state save while minimized A minimized window reports placeholder coordinates (-32000 on Windows); the move event fired by minimize was persisting them, so quitting while minimized silently discarded the remembered position (the new off-screen validation then falls back to centered). Skip the save while minimized so the last real geometry survives. Follow-up to #124. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01LwtnpHAoSFr1ZibQgQkNQK --- .../tauri-client/src-tauri/capabilities/default.json | 1 + Client/tauri-client/src/lib/window-state.ts | 11 +++++++++++ .../tests/unit/window-state-restore.test.ts | 1 + 3 files changed, 13 insertions(+) diff --git a/Client/tauri-client/src-tauri/capabilities/default.json b/Client/tauri-client/src-tauri/capabilities/default.json index 4c0cd59b..d51d6c58 100644 --- a/Client/tauri-client/src-tauri/capabilities/default.json +++ b/Client/tauri-client/src-tauri/capabilities/default.json @@ -16,6 +16,7 @@ "core:window:allow-set-size", "core:window:allow-maximize", "core:window:allow-is-maximized", + "core:window:allow-is-minimized", "core:window:allow-outer-position", "core:window:allow-outer-size", "core:window:allow-available-monitors", diff --git a/Client/tauri-client/src/lib/window-state.ts b/Client/tauri-client/src/lib/window-state.ts index 6911c59b..d0573f5d 100644 --- a/Client/tauri-client/src/lib/window-state.ts +++ b/Client/tauri-client/src/lib/window-state.ts @@ -188,6 +188,17 @@ export async function initWindowState(): Promise<() => void> { saveTimer = setTimeout(() => { void (async () => { try { + // A minimized window reports placeholder coordinates (-32000 on + // Windows) — skip so the last real geometry survives a minimized + // exit. Checked separately so platforms without isMinimized still + // save normally. + let minimized = false; + try { + minimized = await win.isMinimized(); + } catch { + // Treat as not minimized + } + if (minimized) return; const pos = await win.outerPosition(); const size = await win.outerSize(); const maximized = await win.isMaximized(); diff --git a/Client/tauri-client/tests/unit/window-state-restore.test.ts b/Client/tauri-client/tests/unit/window-state-restore.test.ts index 77c3fa4a..8cf2f2ac 100644 --- a/Client/tauri-client/tests/unit/window-state-restore.test.ts +++ b/Client/tauri-client/tests/unit/window-state-restore.test.ts @@ -39,6 +39,7 @@ vi.mock("@tauri-apps/api/window", () => ({ outerPosition: vi.fn(), outerSize: vi.fn(), isMaximized: vi.fn().mockResolvedValue(false), + isMinimized: vi.fn().mockResolvedValue(false), }), availableMonitors: () => h.monitorsError !== null ? Promise.reject(h.monitorsError) : Promise.resolve(h.monitors),