fix(notify): M298 r1 —— toast 退场腿接上触发点,四条 nit 一并收
复审 P2-1:进场腿自己续帧所以能跑,但进场结束 view_dirty 回 false,
3.6s 后 remaining_ms 掉进 150ms 退场窗口时没有任何代码重新置脏 ⇒ 那一段
收缩从不发生,expire 一抹胶囊整块消失(复审探针:120 拍后 progress 仍 1.0)。
- update/clock.rs:expire 之后用无副作用的 ToastTracks::needs_frame 置脏,
落到既有的 if view_dirty { refresh_view() } 上采样;refresh_view 仍是门控,
没有变成每帧无条件调用(静止态判据不变)。
- state/toast.rs:进出两条腿改成**同一个时钟**(寿命 = 首次看见时的
remaining_ms,已活 = 寿命 - remaining),去掉 Instant 与节拍的二时钟错位;
新增 needs_frame;新增两条真节拍用例(退场腿必被抽到 / 到期后不再续帧)。
- N1:装配失败与 spawn 失败也用 publish_before_start 的返回值填 session。
- N2:m298 用例注释改准(它抓不住删守卫,那条由 a_report_from_another_session 守)。
- N3:before_start 文档不再把两种来源都说成「进程没起来」。
- N4:refresh_view 末尾的死赋值 view_dirty = false 删掉。
红灯原文(摘掉那 3 行触发点,其余为最终代码):
退场窗口内必须真的开始收(remaining=Some(40)ms, progress=1)
This commit is contained in:
1 parent
aa25583806
commit
3b4f8bb997
6 files changed
+190
-58
No files matched your search
@@ -37,6 +37,18 @@ impl App {
|
||||
self.state
|
||||
.toasts
|
||||
.expire(u64::try_from(elapsed.as_millis()).unwrap_or(u64::MAX));
|
||||
// M298 r1(复审 P2-1):toast **退场腿**的唯一触发点。
|
||||
//
|
||||
// 进场腿自己续帧(`observe` 返回 moving ⇒ `refresh_view` 末尾重新置脏),但进场走完
|
||||
// 之后 `view_dirty` 是假的;等 3.6 s 后 `remaining_ms` 掉进退场窗口时**没有任何代码**
|
||||
// 把它重新置脏 ⇒ 那 150 ms 的收缩从不发生,`expire` 一抹胶囊就整块消失。
|
||||
//
|
||||
// 判据无副作用(`ToastTracks::needs_frame` 只读),置脏之后落到下面**既有的**
|
||||
// `if self.view_dirty { refresh_view() }` 上采样 —— `refresh_view` 没有变成每帧无条件
|
||||
// 调用,静止态(无提示 / 提示都在位)本行为假,M192「空闲不烧帧」不受影响。
|
||||
if self.toast_tracks.needs_frame(self.state.toasts.items()) {
|
||||
self.view_dirty = true;
|
||||
}
|
||||
|
||||
// 设备码/授权码的倒计时(M114):等待态每秒都要重画一次,否则「剩 900s」永远不动,
|
||||
// 用户会以为卡死了——这正是任务里「不得只转圈」的那一条。
|
||||
|
||||
Reference in new issue
Block a user