fix: problem unwrap in wl_pointer::Event (again)

I triggered the unwrap in the `Motion` case while using the color picker
in Krita. If you hold down the mouse such that the color comparison
pop-up opens and flick to it, you can sometimes enter and motion on a
stale surface. Somewhat inconsistent to trigger.

I also removed the unwrap in the `Button` event since it is logically
equivalent to the other unwrap. A few logging statements also got
changed to give wl_surface details.
This commit is contained in:
En-En 2025-11-22 02:22:58 +00:00 committed by Supreeeme
parent 5d23452874
commit 4ea4960f5e

View file

@ -634,7 +634,7 @@ impl Event for client::wl_pointer::Event {
.insert_one(target, CurrentSurface::Decoration(parent)) .insert_one(target, CurrentSurface::Decoration(parent))
.unwrap(); .unwrap();
} else { } else {
warn!("could not enter surface: stale surface"); warn!("could not enter surface {}: stale surface", surface.id());
} }
return; return;
@ -686,7 +686,7 @@ impl Event for client::wl_pointer::Event {
if !surface.is_alive() { if !surface.is_alive() {
return; return;
} }
debug!("leaving surface ({serial})"); debug!("leaving surface ({})", surface.id());
if let Ok(CurrentSurface::Decoration(parent)) = if let Ok(CurrentSurface::Decoration(parent)) =
state.world.remove_one::<CurrentSurface>(target) state.world.remove_one::<CurrentSurface>(target)
{ {
@ -716,7 +716,10 @@ impl Event for client::wl_pointer::Event {
return; return;
} }
{ {
let surface = state.world.get::<&CurrentSurface>(target).unwrap(); let Ok(surface) = state.world.get::<&CurrentSurface>(target) else {
warn!("could not motion on surface: stale surface");
return;
};
if let CurrentSurface::Decoration(parent) = &*surface { if let CurrentSurface::Decoration(parent) = &*surface {
decoration::handle_pointer_motion(state, *parent, surface_x, surface_y); decoration::handle_pointer_motion(state, *parent, surface_x, surface_y);
return; return;
@ -745,10 +748,16 @@ impl Event for client::wl_pointer::Event {
} }
let mut cmd = CommandBuffer::new(); let mut cmd = CommandBuffer::new();
let mut query = state let Ok(mut query) =
.world state
.query_one::<(&WlPointer, &client::wl_seat::WlSeat, &CurrentSurface)>(target) .world
.unwrap(); .query_one::<(&WlPointer, &client::wl_seat::WlSeat, &CurrentSurface)>(
target,
)
else {
warn!("could not click on surface: stale surface");
return;
};
let (server, seat, current_surface) = query.get().unwrap(); let (server, seat, current_surface) = query.get().unwrap();