Skip to content

Latest commit

 

History

History
93 lines (71 loc) · 6.81 KB

File metadata and controls

93 lines (71 loc) · 6.81 KB

v0.12.6:采集浮窗显隐链路修复 + 锁定自解锁(全局快捷键)

状态:代码已交付(2026-08-23) 依据:用户对话 2026-08-23(① 浮窗在启动时自动出现——应只在用户选择时出现且出现后主页面隐藏; ② 锁定浮窗时无法从浮窗本身解锁,只能回主页面点"解锁浮窗";③ 浮窗界面两侧透明区 (最右侧滚条)——界面需要优化) 前置:v0.12.5(AI 精修线路修复)真机验收待执行

一句话

浮窗三条体验问题同版修复:预创建误传 visible=true(启动即显示抢焦点——用户报告"自动启动"); 浮窗出现 → 主窗隐藏(用户要求的专注模式,收起/停止/回主窗一律回显——绝不留在无可见窗口); 锁定自解锁(窗口级点击穿透无法分区接收点击,tauri 2.11 无 set_cursor_hit_test——引入 tauri-plugin-global-shortcut,Ctrl+Shift+F 全局快捷键:浮窗打开期间注册,任意焦点下可解锁/切换, ADR-025);浮窗窗口级 CSS 重置(body 8px margin + 100vh 溢出 → 左右透明条 + 滚条)。

范围

# 项目 类型 落点
1 浮窗启动自动显示 P0 修复 commands_window.rs(precreate_float 误传 precreated=false → visible(true)+抢焦点;改隐藏预创建)
2 浮窗出现 → 主窗隐藏 / 收起 → 主窗回显 P1 体验 commands_window.rs(float_open_core hide 主窗 / float_close_core + show_main_core 回显;回主窗/停止同路径)
3 锁定后浮窗自身解锁 P1 体验(ADR-025) tauri-plugin-global-shortcut + commands_window.rs(float_toggle_core 三态收拢:关→开 / 开未锁→收起 / 开已锁→解锁;注册窗口期=浮窗打开期)+ ClassroomPage.tsx(按钮/主窗键收敛到 float_toggle,防全局+主窗键双触发)
4 浮窗两侧透明区 + 滚条 P2 UI CaptureFloatPanel.tsx(挂载注入 html/body 重置:margin 0 / overflow hidden / 100%)+ 锁定提示("已锁定 · Ctrl+Shift+F")
5 版本号与文档 伴随 v0.12.6(三处版本号)+ ADR-025 + 本文档 + CHANGELOG + 索引 + 行数豁免登记

根因(M1:启动自动显示)

  • precreate_float 调用 build_float_window(app, false)——参数 precreated=false 使 .visible(true) + .focused(true):setup 预创建本意是隐藏常驻(P2-10 秒开), v0.12.3 交付时参数传反,浮窗启动即显示且抢焦点(症状与用户"自动启动"完全对应)。

根因(M2:两侧透明区 + 滚条)

  • 浮窗与其他窗口共用 index.html,但全项目无全局 CSS(App.css 无引用);body 浏览器默认 margin 8px + 面板 height: 100vh → 内容溢出视口 → 右侧滚动条; 透明窗口看不到 body 背景 → 左右各 8px 透明条(面板宽 = 视口 − 16px)。
  • 修复:浮窗组件挂载注入 html,body{margin:0;padding:0;width:100%;height:100%;overflow:hidden}。

决策(M3:锁定自解锁——ADR-025)

  • 约束:点击穿透是窗口级能力(set_ignore_cursor_events → WS_EX_TRANSPARENT), 锁定态浮窗收不到任何鼠标事件;tauri 2.11.5 / wry 0.55.1 无 set_cursor_hit_test(分区 点击穿透,源码检索确认缺失);解锁把手窗方案额外 40-80MB WebView2 + 位置同步复杂度。
  • 选定:全局快捷键 Ctrl+Shift+F(tauri-plugin-global-shortcut):浮窗打开期间注册、 收起期间注销(冲突面最小化);任意焦点(浮窗/主窗/视频播放器/第三方应用)下可解锁/切换; 解锁后 set_focus 浮窗(Esc 等恢复)。
  • 语义收拢:新增 float_toggle 命令 + float_toggle_core(三态纯状态机 next_action 可单测);主窗按钮与全局快捷键共用——原主窗 keydown 三态分支删除,仅保留浮窗关闭态的 打开快捷键(!floatSnap.open 门控),防主窗键 + 全局键双触发双翻转。

交付内容

M4 · 显隐链路(P0+P1)

  • 预创建修复(隐藏/不抢焦点,失败仍回落懒创建);
  • 打开:显示浮窗(应用 stored topmost)→ 隐藏主窗 → 聚焦浮窗;
  • 收起(toggle/停止采集/自动收起):隐藏浮窗 → 主窗回显(show+unminimize+focus);
  • ⏹ 停止 + ⌂ 主窗 路径不变(回主窗浮窗保留)。

M5 · 锁定态 UI

  • 锁定后面板头部/字幕条显示"🔒 已锁定"提示(tooltip:Ctrl+Shift+F 解锁);
  • 主窗按钮语义不变(浮窗化 ⇄ 收起 ⇄ 解锁浮窗——经 float_toggle 单一语义)。
  • 收起面板后主窗按钮/快捷键重新可开(全局快捷键已注销,无冲突)。

验证

  • Rust:cargo check 通过(新依赖 tauri-plugin-global-shortcut 编译成功);新增 float_next_action_machine 单测(三态状态机)——全量 cargo test(既有基线失败项与本版无关)。
  • 前端:tsc --noEmit 零错误;vitest 全绿(既有用例;浮窗 UI 提示为渲染层,随真机验收)。
  • 真机验收路径(待执行):启动应用 → 浮窗不显示不抢焦点;点「浮窗化」→ 浮窗出现 + 主窗隐藏; Ctrl+Shift+F(视频播放器焦点下)→ 收起 + 主窗回显;再按 → 打开 + 主窗隐藏;🔒 锁定 → 浮窗显示"已锁定" → Ctrl+Shift+F → 解锁 + 浮窗可交互(Esc/控制按钮);⏹ 停止 → 主窗回显; ⌂ 主窗 → 主窗回显、浮窗保留;浮窗无左右透明条/滚条(圆角卡片形态);重启后位置/透明度记忆。

已知问题与后续

  • 全局快捷键冲突:Ctrl+Shift+F 被系统/其他程序占用时注册失败——浮窗打开中止并展示错误 (主窗保持可见、可重试;绝不让用户陷入"浮窗已开但无法解锁"死局——2026-08-23 审查即修)。 冲突提示文案未做(记需求池)。
  • 快捷键占用全程:浮窗打开期间 Ctrl+Shift+F 为进程级热键(不区分焦点窗口)——语义即 "浮窗切换键",界面已明示;若用户反馈冲突面大,可改为仅采集中注册(记需求池)。
  • 主窗隐藏无独立指示:主窗随浮窗打开而隐藏——浮窗内已有 ⌂ 主窗出口;若用户误关浮窗 期望"回到主窗"则主窗已回显(close 必回显,无死角)。
  • 多通道并发观察:浮窗 toggle/按钮快速连按理论可交错(无动作级互斥锁)——各操作幂等 + 事件回流,最终状态一致(登记观察项,按反馈门控)。

关联

  • ADR:ADR-025(浮窗锁定自解锁——全局快捷键方案)。
  • 依据链路:用户三项反馈 → 源码证据链(precreate 参数传反 / body 默认 margin / 点击穿透 窗口级限制 + tauri 无 hit_test 检索)→ 修复 + 单一语义收拢。