描述
opencode Desktop 在 Windows 11 上,窗口处于最大化状态时切换到后台,任务完成后点击系统通知恢复窗口,最大化状态丢失,窗口变为普通大小。
复现步骤
- 将 opencode Desktop 窗口最大化(点击 Windows 右上角中间的最大化按钮)
- 输入一条指令让 agent 执行
- 切换到其他软件,opencode 进入后台
- 等待任务完成,Windows 系统通知弹出
- 点击通知,窗口被带回前台,但最大化状态丢失,变为非最大化的普通窗口
预期行为
点击通知后,窗口应恢复到之前的最大化状态。
根因分析
涉及两个因素的叠加:
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 最新版
描述
opencode Desktop 在 Windows 11 上,窗口处于最大化状态时切换到后台,任务完成后点击系统通知恢复窗口,最大化状态丢失,窗口变为普通大小。
复现步骤
预期行为
点击通知后,窗口应恢复到之前的最大化状态。
根因分析
涉及两个因素的叠加:
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()\ 来确保最大化状态被正确恢复。
相关参考
环境