Use set_looping from iced_video instead of EOS signal

This commit is contained in:
norepro 2025-11-30 20:58:28 -08:00
parent 42b1f6e5e8
commit a83951f1ba

View file

@ -431,6 +431,7 @@ impl App {
}
self.inhibit_idle();
self.set_looping_from_repeat_state();
self.update_flags();
self.update_mpris_meta();
self.update_title()
@ -819,6 +820,12 @@ impl App {
#[cfg(feature = "xdg-portal")]
let _ = self.inhibit.send(true);
}
fn set_looping_from_repeat_state(&mut self) {
if let Some(video) = &mut self.video_opt {
video.set_looping(self.flags.config_state.player_state.repeat == RepeatState::Track);
}
}
}
/// Implement [`cosmic::Application`] to integrate with COSMIC.
@ -1228,6 +1235,7 @@ impl Application for App {
}
Message::RepeatToggled(state) => {
self.flags.config_state.player_state.repeat = state;
self.set_looping_from_repeat_state();
self.update_controls(true);
self.save_config_state();
}
@ -1313,19 +1321,10 @@ impl Application for App {
}
}
Message::EndOfStream => {
let repeat_state = &self.flags.config_state.player_state.repeat;
println!("end of stream, repeat={:?}", repeat_state);
if matches!(repeat_state, RepeatState::Track) {
if let Some(video) = &mut self.video_opt {
// Workaround: Explicitly seeking to the start before `restart_stream`.
// This prevents its internal `pause(false)` from triggering a second EndOfStream message
// that breaks RepeatState::Once. This results in a double seek but avoids single repeat
// not working at all. `restart_stream` is still required to set internal `is_eos` value.
video.seek(0, false).expect("seek");
video.restart_stream().expect("restart_stream");
}
}
println!(
"end of stream, repeat={:?}",
self.flags.config_state.player_state.repeat
);
}
Message::MissingPlugin(element) => {
if let Some(video) = &mut self.video_opt {