Skip to content

[Bug] Desktop: 点击 Windows 通知恢复窗口后丢失最大化状态 #35444

Description

@Start-Gao

描述

opencode Desktop 在 Windows 11 上,窗口处于最大化状态时切换到后台,任务完成后点击系统通知恢复窗口,最大化状态丢失,窗口变为普通大小。

复现步骤

  1. 将 opencode Desktop 窗口最大化(点击 Windows 右上角中间的最大化按钮)
  2. 输入一条指令让 agent 执行
  3. 切换到其他软件,opencode 进入后台
  4. 等待任务完成,Windows 系统通知弹出
  5. 点击通知,窗口被带回前台,但最大化状态丢失,变为非最大化的普通窗口

预期行为

点击通知后,窗口应恢复到之前的最大化状态

根因分析

涉及两个因素的叠加:

1. electron-window-state 的已知局限性

\packages/desktop/src/main/windows.ts\ 中使用 \�lectron-window-state\ 管理窗口状态:

\\ ypescript
const state = windowStateKeeper({ ... })
state.manage(win)
\\

\manage()\ 在 \win.show()\ 触发 restore 时,会应用保存的普通窗口尺寸(width/height),而不是保持 isMaximized 状态。

2. 通知点击未做最大化兜底补偿

\packages/desktop/src/main/ipc.ts\ 中的 IPC 处理:

\\ ypescript
ipcMain.handle('show-window', (event) => {
const win = BrowserWindow.fromWebContents(event.sender)
win?.show()
})

ipcMain.handle('set-window-focus', (event) => {
const win = BrowserWindow.fromWebContents(event.sender)
win?.focus()
})
\\

通知点击后只调用了 \show()\ 和 \ ocus()\,*没有检查 \win.isMaximized()* 并在 show 后主动调用 \win.maximize()\ 做兜底。

渲染进程通知点击代码(\packages/desktop/src/renderer/index.tsx\):

\\ ypescript
notification.onclick = () => {
void window.api.showWindow()
void window.api.setWindowFocus()
handleNotificationClick(href)
notification.close()
}
\\

建议修复方案

在 \show-window\ IPC 处理中,show 后检查 \win.isMaximized()\,如果为 true 则重新 \win.maximize()\,或者使用 \win.restore()\ + \win.maximize()\ 来确保最大化状态被正确恢复。

相关参考

环境

  • Windows 11
  • opencode Desktop 最新版

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions