git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commit3a552e3d504a734f806553ebc228d7208b0187e0
parent8b86dda4f2
authorLucas Galante <[email protected]>
date2026-06-15 15:25
fix: resolve crash during window resize by allowing configure in intermediate states

 src/server/window.rs       |  6 ++++--
 src/server/xdg_toplevel.rs | 26 +++++++++++++++++++-------
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/server/window.rs b/src/server/window.rs
index de2dee8..ccaf0a1 100644
--- a/src/server/window.rs
+++ b/src/server/window.rs
@@ -991,8 +991,10 @@ impl Window {
                 self.wm_scheduled.pointer_move_requested = std::ptr::null_mut();
 
                 if let Some(ref data) = self.wm_scheduled.pointer_resize_requested {
-                    if !(*data.seat).object.is_null() {
-                        ffi::wl_resource_post_event(window_v1, ffi::RIVER_WINDOW_V1_POINTER_RESIZE_REQUESTED, (*data.seat).object, data.edges); // sendPointerResizeRequested
+                    if let Some(seat) = unsafe { data.seat.as_ref() } {
+                        if !seat.object.is_null() {
+                            ffi::wl_resource_post_event(window_v1, ffi::RIVER_WINDOW_V1_POINTER_RESIZE_REQUESTED, seat.object, data.edges); // sendPointerResizeRequested
+                        }
                     }
                 }
                 self.wm_scheduled.pointer_resize_requested = None;
diff --git a/src/server/xdg_toplevel.rs b/src/server/xdg_toplevel.rs
index a8a5ea5..ba9323e 100644
--- a/src/server/xdg_toplevel.rs
+++ b/src/server/xdg_toplevel.rs
@@ -179,8 +179,12 @@ impl XdgToplevel {
 
     pub unsafe fn configure(&mut self) -> bool {
         match self.configure_state {
-            ConfigureState::Idle | ConfigureState::TimedOut(..) | ConfigureState::TimedOutAcked => {}
-            _ => unreachable!(),
+            ConfigureState::Idle
+            | ConfigureState::Inflight(..)
+            | ConfigureState::Acked
+            | ConfigureState::Committed
+            | ConfigureState::TimedOut(..)
+            | ConfigureState::TimedOutAcked => {}
         }
 
         let scheduled = &(*self.window).configure_scheduled;
@@ -197,7 +201,9 @@ impl XdgToplevel {
                     self.configure_state = ConfigureState::Acked;
                     return true;
                 }
-                _ => unreachable!(),
+                ConfigureState::Inflight(..) | ConfigureState::Acked | ConfigureState::Committed => {
+                    return false;
+                }
             }
         }
 
@@ -236,8 +242,11 @@ impl XdgToplevel {
         } else {
             match self.configure_state {
                 ConfigureState::Idle => self.geometry.width as u32,
-                ConfigureState::TimedOut(..) | ConfigureState::TimedOutAcked => (*self.window).configure_sent.width.unwrap_or(0),
-                _ => unreachable!(),
+                ConfigureState::Inflight(..)
+                | ConfigureState::Acked
+                | ConfigureState::Committed
+                | ConfigureState::TimedOut(..)
+                | ConfigureState::TimedOutAcked => (*self.window).configure_sent.width.unwrap_or(0),
             }
         };
 
@@ -246,8 +255,11 @@ impl XdgToplevel {
         } else {
             match self.configure_state {
                 ConfigureState::Idle => self.geometry.height as u32,
-                ConfigureState::TimedOut(..) | ConfigureState::TimedOutAcked => (*self.window).configure_sent.height.unwrap_or(0),
-                _ => unreachable!(),
+                ConfigureState::Inflight(..)
+                | ConfigureState::Acked
+                | ConfigureState::Committed
+                | ConfigureState::TimedOut(..)
+                | ConfigureState::TimedOutAcked => (*self.window).configure_sent.height.unwrap_or(0),
             }
         };