chore(capsule): #470 诊断 v2 — 暗点一次性日志(零行为改动)#593
Conversation
#470「Windows 语音输入看不到录音胶囊」根因仍未定(PR #471 已明说只加诊断、需真机 日志;byte92 报 macOS 也复现,疑跨平台)。本 PR 不改任何 show/hide/position 行为, 仅在几个静默路径补日志,把根因收敛到 A/B/C 单一分支,帮助拿日志定位: - coordinator.rs show_capsule_window_no_activate(Windows):两处 window_handle() / RawWindowHandle::Win32 取不到时此前静默 return false,补 warn(Win32 show 失败最可能的暗点)。 - coordinator.rs emit_capsule:get_webview_window("capsule") 取不到时此前静默 return, 补一次性 warn(暗点 A0:窗口压根没创建/已销毁)。沿用 AtomicBool 一次性门,避免 ~30Hz 刷屏。 - lib.rs position_capsule_bottom_center(Windows):定位只夹了上边(.max(mon.top)), 多显示器/负坐标/异常 DPI 下可能算到屏幕外却无观测,补显示器几何 + 最终落点 debug log。 - Capsule.tsx:webview 收到第一个 capsule:state 事件时打一次 console.info,区分 「后端没 emit」与「emit 了但窗口没显示/没渲染」。 注:Windows-cfg 部分本机无法交叉编译验证(ring 的 C 代码需 MSVC),依赖 Windows CI。
|
Claude finished @appergb's task in 3m 13s —— View job 审核 PR #593 — #470 诊断 v2
(1) Format 占位符 / 参数校验 ✅
两条均为纯字符串字面量,零占位符、零参数,不存在不匹配风险: log::warn!("[capsule] no_activate failed: window_handle() unavailable — Win32 show skipped");
log::warn!("[capsule] no_activate failed: non-Win32 RawWindowHandle — Win32 show skipped");
10 个占位符 = 10 个参数,类型全部匹配, (2)
|
| 文件 | 原行为 | 新行为 |
|---|---|---|
coordinator.rs show_capsule_window_no_activate |
return false |
新增 warn! 后仍 return false,控制流不变 |
coordinator.rs emit_capsule |
return (get_webview_window None) |
AtomicBool 门内打 log,return 不变 |
lib.rs position_capsule_bottom_center |
set_position(x, y.max(mon.top)) |
clamped_y = y.max(mon.top)(等价),仅新增 debug!,set_position 参数不变 |
Capsule.tsx |
setState 等调用无条件执行 |
console.info 条件分支不影响 setState/setLevel/setMessage,均在 if 块之外执行 |
确认:无任何 show/hide/position 行为改动。 ✅
总结
可以合并,有一处建议修复(非阻塞但推荐):
show_capsule_window_no_activate内两条warn!缺一次性门,与 PR 中CAPSULE_WINDOW_MISSING_LOGGED的设计意图不一致,若 HWND 持续不可用会产生 ~30 Hz 日志。建议补CAPSULE_NO_ACTIVATE_HWND_WARNED门后再合。
其余三个审核点(format 串、CAPSULE_WINDOW_MISSING_LOGGED 门、前端门)全部正确,零行为改动确认无误。
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
User description
refs #470(不 close:这是诊断手段,不是修复)
背景
#470「Windows 语音输入看不到录音胶囊」根因至今未定:PR #471 已白纸黑字说明「只加诊断 log、不是真修复、需要真机日志」;byte92 报告 macOS 也复现,疑为跨平台共性。任何不基于真机日志的「修复」极可能修错对象,因此本 PR 不改任何 show/hide/position 行为,只在几个静默路径补日志,把根因收敛到单一分支:
[capsule]日志 + 前端是否收到事件)show_capsule开关被关(既有suppressed by user toggle日志)改动(纯增量 log,零行为)
coordinator.rsshow_capsule_window_no_activate(Win)window_handle()/RawWindowHandle::Win32取不到 → 静默return falsewarn(Win32 show 失败最可能的暗点)coordinator.rsemit_capsuleget_webview_window("capsule")None → 静默returnwarn(暗点 A0),AtomicBool门避免 ~30Hz 刷屏lib.rsposition_capsule_bottom_center(Win).max(mon.top),无观测debuglog(证伪「定位到屏幕外」)Capsule.tsxcapsule:state事件时一次性console.info(区分「后端没 emit」vs「emit 了但没渲染/显示」)验证
cargo check(跨平台部分)+tsc --noEmit通过ring的 C 代码需 MSVC),依赖 Windows CI。已逐行核对:no_activate 两处仅含字符串字面量;几何 log 的 10 个占位符对 10 个作用域内参数。拿到真机含
[capsule]的日志后,再据 A/B/C/A0 单独开修复 PR。@claude 请审核(重点:一次性门是否正确、format 占位符/参数是否匹配、是否真的零行为改动)。
PR Type
Other
Description
Add one-time warning logs when capsule window handle retrieval fails
Add debug log for capsule positioning coordinates on Windows
Add console.info on first capsule:state event in webview for frontend diagnostics
Diagram Walkthrough
File Walkthrough
coordinator.rs
Add capsule handle missing warningsopenless-all/app/src-tauri/src/coordinator.rs
window_handle()orRawWindowHandle::Win32fails inshow_capsule_window_no_activateduring
emit_capsulelib.rs
Add capsule position debug logopenless-all/app/src-tauri/src/lib.rs
bounds on Windows
Capsule.tsx
Add first capsule event logopenless-all/app/src/components/Capsule.tsx
capsule:stateeventreceived in the webview