Skip to content

v0.3.2

Latest

Choose a tag to compare

@github-actions github-actions released this 18 Oct 09:35
· 2 commits to main since this release

修了什么

0.3.1 里,点 × 收进托盘之后,左键点托盘图标(或菜单里的「显示窗口」)叫不回窗口——程序只能从任务管理器杀掉。

根因不是托盘,是窗口藏起来之后帧循环停了:

  • eframe 的每一帧都挂在 WindowEvent::RedrawRequested 上,而这个事件来自 WM_PAINT;
  • Windows 只给可见窗口派发 WM_PAINT;
  • 于是 Visible(false) 之后 egui 再也没跑过一帧(日志实测:藏起来之后 8 秒 0 帧);
  • 托盘点击其实收到了,只是堆在队列里没人取——没人跑帧,就没人取。

0.3.1 那个「心跳线程」发的是 request_repaint,对不可见窗口是空转,根本叫不醒。

怎么修的

  • 新增 taskbar::force_paint:藏起来时从外部线程 SendMessageW(WM_PAINT) 同步塞一帧进去。PostMessage(WM_PAINT) 和 RedrawWindow 都试过,对隐藏窗口全是 0 帧,只有 SendMessage 能叫醒。
  • 心跳线程改成事件驱动:每 120ms 只看一眼托盘事件队列空不空(只看不取,不能把事件消耗掉),真有事件才按可见性选路——可见走 request_repaint,藏起来走 force_paint。
  • 删掉隐藏期间的 1 秒定时重绘:对不可见窗口是纯空转。

副作用是好的:藏起来且没事件时零帧零 CPU,而 0.3.1 是无条件 8 帧/秒。

验证过什么

  • cargo test 64 passed(core 30 / cli 9 / gui 18 / 属性 7);cargo clippy --all-targets -- -D warnings、cargo fmt --check 干净。
  • 真机:debug 版点 × 藏起来 → 日志 3 秒零增长(确认真的没跑帧)→ 用 Win32 往进程的 tray_icon_app 窗口发一次左键 → 日志依次出现 图标事件 Click、翻译成 [Show]、处理托盘动作 Show,主窗口 IsWindowVisible 变回 true,帧号继续涨。
  • 托盘菜单的「退出」走同一条取事件的路,也能退(原来卡在同一个地方)。

下载

平台 文件
Windows(安装包,按用户装、不弹 UAC) ClipSift-setup.exe
Windows(免安装 zip) clipsift-windows-x86_64.zip
Linux x86_64 clipsift-linux-x86_64.tar.gz
macOS Apple Silicon clipsift-macos-aarch64.tar.gz

装过旧版的直接覆盖安装就行,规则配置会保留。

小提示:Win11 默认把新托盘图标塞进任务栏那个「⌃」溢出面板里,想让它常显,在「任务栏设置 → 其他系统托盘图标」里把 ClipSift 打开。


完整改动:v0.3.1...v0.3.2