Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
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),
}
};