From d4f0eb7eca416b60128508ced088e5563a143da9 Mon Sep 17 00:00:00 2001 From: showen Date: Fri, 13 Mar 2026 13:08:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A6=E5=8F=91=E5=99=A8=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E4=BC=98=E5=8C=96=20=E2=80=94=20pending=20trigger=20?= =?UTF-8?q?=E5=9C=A8=E5=BD=93=E5=89=8Dstep=E7=BB=93=E6=9D=9F=E5=90=8E?= =?UTF-8?q?=E7=AB=8B=E5=8D=B3=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复网页触发器点击后无响应的问题。原因是 defer_triggers 模式下, pending trigger 必须等待整个 sequence 播完才触发,当 step 有 random_loop_range [2,15] 时用户可能要等几分钟。 现在改为当前 step 循环结束后立即检查并执行 pending trigger。 同时添加 systemd service 脚本。 Co-Authored-By: Claude Opus 4.6 --- scripts/showen_v2.service | 19 +++++++++++++++++++ src/plugins/video/state_machine.rs | 17 +++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 scripts/showen_v2.service diff --git a/scripts/showen_v2.service b/scripts/showen_v2.service new file mode 100644 index 0000000..1a7d60c --- /dev/null +++ b/scripts/showen_v2.service @@ -0,0 +1,19 @@ +[Unit] +Description=ShowenV2 — 数字生命窗口平台 +After=network.target dbus.service +Wants=network.target + +[Service] +Type=simple +User=showen +Environment=DISPLAY=:0 +Environment=XAUTHORITY=/home/showen/.Xauthority +WorkingDirectory=/home/showen/Showen/ShowenV2 +ExecStart=/home/showen/Showen/ShowenV2/target/release/showen_v2 --config /home/showen/Showen/ShowenV2/configs/dog_state_machine.json +Restart=on-failure +RestartSec=3 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=graphical.target diff --git a/src/plugins/video/state_machine.rs b/src/plugins/video/state_machine.rs index 73baea9..062d929 100644 --- a/src/plugins/video/state_machine.rs +++ b/src/plugins/video/state_machine.rs @@ -50,6 +50,13 @@ impl StateMachine { return Ok(false); } + // 有待执行的触发器时,跳过 sequence 剩余 step,立即切换状态 + if self.pending_trigger_target.is_some() { + let target_state = self.pending_trigger_target.take().unwrap(); + self.transition_to_state(&target_state)?; + return Ok(self.current_state != old_state); + } + let sequence_len = self .current_state_config() .ok_or_else(|| anyhow::anyhow!("当前状态不存在: {}", self.current_state))? @@ -410,16 +417,10 @@ mod tests { assert_eq!(machine.current_state, "idle"); assert_eq!(machine.current_loop_remaining, 1); - assert!(!machine - .on_video_completed() - .expect("should advance within same state")); - assert_eq!(machine.current_sequence_index, 1); - assert_eq!(machine.current_loop_remaining, 1); - assert_eq!(machine.current_video_id().as_deref(), Some("tail")); - + // 当前 step 播完后,有 pending trigger 应立即跳转,跳过后续 step assert!(machine .on_video_completed() - .expect("pending trigger should fire at sequence end")); + .expect("pending trigger should fire after current step ends")); assert_eq!(machine.current_state, "called"); assert_eq!(machine.current_video_id().as_deref(), Some("called")); assert!(!machine.has_pending_trigger());