Skip to content

feat: 记住并恢复上次的窗口大小/位置#15

Merged
rrbe merged 1 commit into
masterfrom
feat/restore-window-size
Jun 18, 2026
Merged

feat: 记住并恢复上次的窗口大小/位置#15
rrbe merged 1 commit into
masterfrom
feat/restore-window-size

Conversation

@rrbe

@rrbe rrbe commented Jun 18, 2026

Copy link
Copy Markdown
Owner

这是什么

启动应用时恢复上次 resize 后的窗口尺寸与位置,而不是每次都用默认 1440×920。最大化态与原生全屏态也一并记忆、下次启动还原。

改动

文件 作用
src/main/store/windowStateCore.ts(新) 纯函数 resolveWindowBounds——把保存的几何与当前接的显示器对账
src/main/store/windowStateStore.ts(新) 持久化到 window-state.json(userData,ADR-0006 纯 JSON)
src/main/index.ts(改) createWindow 读取并恢复;监听 resize/move/maximize/fullscreen 持久化
test/unit/main/windowStateCore.test.ts(新) 纯核心 9 条单测

设计要点

  • 独立 window-state.json,不塞进 settings.json:窗口尺寸是纯主进程关注点,每次拖拽都变、永不过 IPC;混进面向渲染层的 settings 会让那个文件频繁抖动。
  • getNormalBounds()(还原态尺寸)+ isMaximized / isFullScreen 标志:最大化/全屏态下退出,下次先恢复合理尺寸,再最大化或进全屏(二者互斥,全屏优先)。
  • 离屏安全(windowStateCore 的核心):拔了外接显示器 / 改了分辨率导致窗口落到屏幕外时,保留尺寸、丢坐标让系统居中;尺寸 clamp 到 [最小值, 最大显示器];只有非法值(NaN/Infinity/≤0/缺失)才回退默认。
  • 写入防抖 400ms(拖拽 resize/move 连发),close 时同步 flush;写盘失败静默兜底,绝不因窗口状态崩溃或阻塞退出。

验证

  • pnpm typecheck
  • pnpm test:unit ✅(352 passed,含新增 9 条)
  • 手动:拖动改尺寸 / 最大化 / 进全屏 → 关闭 → 重开,恢复到上次状态

启动时恢复上次 resize 后的窗口尺寸与位置,而非每次都用默认大小。

- windowStateCore.ts:纯函数 resolveWindowBounds,把保存的几何与
  当前显示器对账——离屏(拔显示器/改分辨率)时保留尺寸、丢坐标让
  系统居中;尺寸 clamp 到 [最小值, 最大显示器];非法值回退默认。
- windowStateStore.ts:持久化到 window-state.json(独立于 settings.json,
  纯主进程、不过 IPC,避免频繁抖动渲染层配置)。存 getNormalBounds()
  + isMaximized,最大化态退出下次先恢复合理尺寸再最大化。
- index.ts:createWindow 读取并恢复;resize/move/maximize 防抖 400ms
  持久化,close 同步 flush;写盘失败静默兜底。
- 配套 windowStateCore 单测 9 条。
@rrbe rrbe merged commit 8b0d76c into master Jun 18, 2026
2 checks passed
@rrbe rrbe deleted the feat/restore-window-size branch June 18, 2026 06:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant