Repository navigation
MAGI v2.2.1
MAGI v2.2.1 — 把「视频没法看」修掉
2.2.0 有一个能把视频彻底变废的回归:鼠标指针在画面上划过就快进/倒退,靠左竖滑还会一路改亮度。 这一版修掉它,另外补了两处相关的东西。
根因
两个播放器(libVLC 覆盖层 VideoOverlay、libVLC 不可用时的内置 <video> 回退层 VideoPlayer)都犯同一个错:手势处理里没有判断「鼠标是否按下」。
React 的 onPointerMove 挂的是 pointermove,指针只是划过、没有任何按键时也会连续触发。而手势状态里 x0 / y0 初始值是 0,于是 dx = clientX - 0 直接等于屏幕横坐标——鼠标随便挪一下就是几百像素的「位移」,一超过 14px 阈值就被判成「拖动进度」。竖向同理,左侧三分之一的竖滑被判成调亮度。
更糟的是 pointerup 只在真正按下后才来,所以这个错误的 seek 模式会一直挂着,直到你点一下鼠标才把累积的 dx 一次性提交——就是你看到的「视频自己跳走」。
修法
- 手势判定抽成纯模块
src/video/gestureCore.ts,两个播放器共用。第一条规则就写在函数第一行:if (!g.down) return { type: 'ignore' }。没按下 = 什么都不许改。 - 起判阈值 8px,防手抖误触。
- 方向判定改对:原来是「谁的位移先超过 14px 谁赢」,斜着划一下就被判成 seek;现在要求横向幅度 大于纵向的 1.2 倍 才算拖动进度。
- 状态复位统一走
gestureUp(),pointerup/pointercancel都覆盖,手势不会残留到下一次。 - 删掉
onDoubleClick:它和pointerup里的双击分区逻辑重复,双击一次会跳两次。 - 新增
npm run test:gesture:28 条断言,纯 node 跑(--experimental-strip-types),不需要 Electron 也不需要浏览器。CI 已接入,回归会当场变红。
顺带
- 内核降级不再静默:libVLC 加载失败时会退回内置
<video>播放器(画面、手势都不同),以前一点提示都没有,用户只会觉得播放器坏了。现在右下角有角标「未加载 libVLC · 已退回内置播放器」,悬停能看到该检查哪个路径。 - 自己遇到这个问题时先看一眼:如果视频是内置播放器(能看到左上角标题栏是网页样式、底部控制条也不一样),说明
resources/vlc/libvlc.dll或开发期的vendor/vlc/不在。跑一次node scripts/fetch-vlc.mjs就回来了。
现在的鼠标行为
| 操作 | 结果 |
|---|---|
| 不按键,随便划过 | 什么都不发生(只会把控制条唤出来) |
| 按下 + 横向拖 | 拖动进度,松手提交 |
| 按下 + 竖向拖(右侧) | 音量 |
| 按下 + 竖向拖(左侧三分区) | 亮度(仅内置播放器,libVLC 层没有这一项) |
| 单击 | 显示 / 隐藏控制条 |
| 双击左 / 右三分区 | −10s / +10s |
| 双击中间 | 全屏切换 |
| 按住不动 600ms | 2x 快进,松开恢复 |
验证
npm run test:gesture→ 28 / 28 通过npx tsc --noEmit→ 0 errorvite build→ 通过- 未做:Electron 内的端到端手势验收(本机沙箱里 GPU 进程起不来,CDP 连上后 renderer 立刻崩)。
scripts/probe-gesture.mjs已经写好,在有桌面会话的机器上npm run probe:gesture可以直接跑那套 AI 验收。