From f40c6dcbd4d18efa4bb03838131616f1752b3958 Mon Sep 17 00:00:00 2001 From: Nova Date: Sun, 14 Sep 2025 00:55:26 -0700 Subject: [PATCH] fix(wayland/surface): keep frame callback order --- src/wayland/core/surface.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/wayland/core/surface.rs b/src/wayland/core/surface.rs index b76dae1..b5b503e 100644 --- a/src/wayland/core/surface.rs +++ b/src/wayland/core/surface.rs @@ -57,7 +57,7 @@ pub struct SurfaceState { pub geometry: Option, pub min_size: Option>, pub max_size: Option>, - frame_callbacks: Registry, + frame_callbacks: Vec>, } impl Default for SurfaceState { fn default() -> Self { @@ -67,7 +67,7 @@ impl Default for SurfaceState { geometry: None, min_size: None, max_size: None, - frame_callbacks: Registry::new(), + frame_callbacks: Vec::new(), } } } @@ -90,7 +90,7 @@ pub struct Surface { pub role: OnceLock, pub panel_item: Mutex>>, on_commit_handlers: Mutex>, - frame_callbacks: Registry, + frame_callbacks: Mutex>>, material: OnceLock>, pending_material_applications: Registry, presentation_feedback: Mutex>>, @@ -123,7 +123,7 @@ impl Surface { role: OnceLock::new(), panel_item: Mutex::new(Weak::default()), on_commit_handlers: Mutex::new(Vec::new()), - frame_callbacks: Registry::new(), + frame_callbacks: Mutex::new(Vec::new()), material: OnceLock::new(), pending_material_applications: Registry::new(), presentation_feedback: Mutex::default(), @@ -234,7 +234,7 @@ impl Surface { } #[tracing::instrument(level = "debug", skip_all)] pub fn frame_event(&self) { - let callbacks = self.frame_callbacks.take_valid_contents(); + let callbacks = std::mem::take(&mut *self.frame_callbacks.lock()); if !callbacks.is_empty() { let _ = self.message_sink.send(Message::Frame(callbacks)); } @@ -369,7 +369,7 @@ impl WlSurface for Surface { callback_id: ObjectId, ) -> Result<()> { let callback = client.insert(callback_id, Callback(callback_id)); - self.state.lock().pending.frame_callbacks.add_raw(&callback); + self.state.lock().pending.frame_callbacks.push(callback); Ok(()) } @@ -413,10 +413,12 @@ impl WlSurface for Surface { .unwrap(); } self.state.lock().apply(); - for callback in self.current_state().frame_callbacks.get_valid_contents() { - self.frame_callbacks.add_raw(&callback) - } + + self.state.lock().pending.frame_callbacks.clear(); let current_state = self.current_state(); + self.frame_callbacks + .lock() + .extend(current_state.frame_callbacks.iter().cloned()); let mut handlers = self.on_commit_handlers.lock(); handlers.retain(|f| (f)(self, ¤t_state)); Ok(())