Repository navigation
[Bug][Desktop][macOS] 全屏下「检查更新…」确认后黑屏 / 窗口消失 —— 已定位到 vibrancy + 透明覆盖层(汇总 #8224、#9035) #9312
Replies: 3 comments
|
我也出现了一样的问题,在全屏下点击更新的覆盖层被销毁之后,屏幕上显示的是桌面壁纸;而窗口本体的变量还在渲染 —— isVisible() === true、document.visibilityState === 'hidden'、onscreen === false,且不会自行恢复。Chromium 也一直在正常渲染:capturePage() 在销毁前 / 中 / 后返回的帧逐字节完全相同。 触发条件:update-overlay.ts 创建覆盖层时没有设 fullscreenable,于是取默认值 true → NSWindowCollectionBehaviorFullScreenPrimary → macOS 确实把覆盖层自己全屏化了(child.isFullScreen === true),从而强制发生一次 Space 过渡,并把 App 的主窗口留在原来的 Space 上。 修法 —— apps/desktop/src/update-overlay.ts:28 加一行: diff
已在官方 0.2.0-rc.2 构建上验证:全屏 → 「检查更新…」→ 点确认 → 窗口正常保留。main.ts 里 PolicyAuth 那个登录窗口是同样的「带 parent 的子窗口」形状,建议一并补。这与 Electron 自己针对 electron#39614 / #39620 的回归测试断言一致。同一条修法预计也能覆盖本条报告的「黑屏」表现,不过我只确定性复现出了「窗口整个消失」的问题。 |
|
确认 +1,补一个数据点:
|
|
同环境复现 +1,并补一份本机打包件的复核结论。 环境
复现(与楼主步骤一致,100% 必现)
表现更接近 #9035:不是「黑屏但点击仍有反应」,而是整个窗口回不来,所以支持楼主「同一根因、不同表现」的判断。 本机打包件复核(0.2.0-rc.2 官方构建,非源码分支) 直接解包
上游仍未修(补充验证)
规避方式 全屏下不要点「检查更新…」和「关于 DeepSeek Harness」(两者共用 支持 @JuniorSNy 在楼上给出的 |
Uh oh!
There was an error while loading. Please reload this page.
影响面
macOS 桌面端,窗口处于原生全屏时:菜单栏 →「检查更新…」→ 结果弹窗点「确认」→ 主窗口整屏变黑或整个消失,都必须退出进程重开才能恢复。按步骤必现。
同一个弹窗路径也被「关于 DeepSeek Harness」使用(
showAbout→ordinaryMessageBox→updateDialog.show),所以那一项同样会触发。环境(三个数据点)
复现步骤
关键观察
黑屏之后窗口仍然响应点击(按钮、拖选都有反应),说明渲染进程活着、主进程没有 hang,坏掉的是合成 / 重绘这一层,而不是进程卡死。这大概也解释了三条报告为什么表现不同:画面还在但全黑,或窗口整个不显示 —— 区别只在于当时所处的全屏 / Space 状态,根因是同一个。
根因线索(公开源码,行号按 master;
dsh-v0.2.1-alpha.2相同)apps/desktop/src/main.ts:224vibrancy: 'sidebar'、:228backgroundColor: '#00000000'。apps/desktop/src/main.ts:262-275的applyBackdrop()——minimize/hide时setVibrancy(null)+setBackgroundColor(chromeFallbackFill())(不透明兜底色),restore/show时切回setVibrancy('sidebar')+setBackgroundColor('#00000000')(全透明)。apps/desktop/src/update-overlay.ts:27(transparent: true,调用处nativeModal=false)。它只跟随父窗口的 move / resize,没有全屏相关处理。apps/desktop/src/update-dialog.ts先向渲染进程发changed: null隐藏卡片,150 ms 后destroy()该窗口。invalidate之类的调用)。「毛玻璃父窗口 + 全透明背景 + 运行期反复 setVibrancy / setBackgroundColor + 销毁一个透明子窗口」这套组合在 macOS 上很容易让父窗口的 surface 丢掉重绘。
可能的修法方向(供维护者判断)
null再设回,或用极小的 bounds 抖动触发重排;nativeModal = true),或让覆盖层不再transparent;未修复确认
dsh-v0.2.1-alpha.2(2026-10-09,官方最新发布)中的apps/desktop/src/main.ts、update-overlay.ts、update-dialog.ts与 master 逐字节一致;update-overlay.ts最后改动 2026-09-23、update-dialog.ts最后改动 2026-09-24,均早于首条报告(2026-09-29)。升级到最新版无法规避。修复前的规避方式
全屏下不要点「检查更新…」和「关于 DeepSeek Harness」。后台自动更新检查不走这套弹窗(
updateSchedule.check不创建覆盖层),不受影响。相关报告:#8224 #9035
All reactions