#484·eSearch

Wayland 下开启「保留截屏窗口」后,第二次截屏起完全无响应(截屏窗口 reload 后渲染进程消失)

Author: easysoftwaresniperCreated Jul 19, 2026Updated Aug 28, 2026

环境

  • eSearch 15.3.3(官方 deb 安装,Electron 40.8.5)
  • Ubuntu 26.04 LTS,GNOME,Wayland 会话
  • 双显示器
  • 由于 Electron globalShortcut 在 Wayland 下无法注册(electron#15863,wontfix), 触发方式为系统快捷键绑定命令 e-search -c(second-instance 转发), 与托盘触发走的是同一个 截屏搜索 处理函数

现象

「保留截屏窗口」开启(默认)时:

  1. 应用启动后第一次触发截屏:正常,弹出选区界面;
  2. 按 Esc 关闭选区界面;
  3. 之后所有截屏触发全部无声无息:不弹界面、无快门声、无任何报错, 直到重启 eSearch 才恢复(恢复后也只有一次机会,循环往复)。

把设置里的「保留截屏窗口」关闭后,每次截屏都正常,问题完全消失。

诊断证据

失效状态下逐层排查的结果:

  • 系统快捷键绑定正常触发,second-instance 进程每次都有启动 (journal 中每次按键都有 eSearch 15.3.3 启动 的转发进程记录);
  • 主进程存活,未崩溃;
  • 但主进程没有发起任何截屏:xdg-desktop-portal 只在第一次截屏时收到请求, 之后再无 portal 记录(正常每次截屏应产生每屏一次的 portal 截图请求);
  • 此时 ps 观察:应用一个 renderer 进程都不剩(截屏窗口的渲染进程已消失), Crashpad 目录无新增 dump(属静默消失,非崩溃上报)。

根因分析(对照 out/main/main.js)

选区界面关闭时的处理(对应源码 Rt()):

javascript
if (保留截屏窗口) { B?.setSimpleFullScreen(false); B?.hide(); try { B?.reload() } catch {} }
else { B?.close(); B = null; ... }

保留分支执行 hide() + reload() 后,在 Wayland 环境下该窗口的渲染进程会随之消失, 但 B 仍然非空。于是下一次截屏走到 se()

javascript
W((await zt())?.webContents, "clip_init", [...])

zt()B 存在直接返回,clip_init 被发往一个已经死掉的 webContents—— 静默丢弃,连 portal 请求都不会发生,与观察到的「完全无声无息」一致。

建议修复方向

  • 监听截屏窗口的 render-process-gone / webContents.on('destroyed'), 触发时将 B 置空,让下次 zt() 重建窗口;或
  • zt() 返回前校验 B.webContents 是否可用(isDestroyed()/isCrashed()),不可用则重建;或
  • Wayland 会话下默认不走「保留截屏窗口」的 reload 复用路径。

临时解决方法(供遇到同样问题的用户)

设置 → 关闭「保留截屏窗口」。