From c45c2ed990912c26e6aed0f47bfddb03993d7999 Mon Sep 17 00:00:00 2001 From: En-En <39373446+En-En-Code@users.noreply.github.com> Date: Thu, 5 Dec 2024 23:40:53 +0000 Subject: [PATCH] fix: add Event::Move check preventing infinite recursion caused by stale surfaces --- src/server/event.rs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/server/event.rs b/src/server/event.rs index 79f4779..367b82d 100644 --- a/src/server/event.rs +++ b/src/server/event.rs @@ -346,7 +346,6 @@ impl HandleEvent for Pointer { // destroy the menu if this occurs within a 500 ms interval (which it always does with // Niri). Other compositors do not run into this problem because they appear to not send // wl_pointer.enter until the user actually moves the mouse in the popup. - let mut process_event = Vec::new(); match event { client::wl_pointer::Event::Enter { serial, @@ -423,14 +422,20 @@ impl HandleEvent for Pointer { else { unreachable!(); }; - process_event.push(client::wl_pointer::Event::Enter { - serial: *serial, - surface: surface.clone(), - surface_x: *surface_x, - surface_y: *surface_y, - }); - process_event.push(event); - trace!("resending enter ({serial}) before motion"); + let surface_key: ObjectKey = surface.data().copied().unwrap(); + if state.objects.get(surface_key).is_some() { + trace!("resending enter ({serial}) before motion"); + let enter_event = client::wl_pointer::Event::Enter { + serial: *serial, + surface: surface.clone(), + surface_x: *surface_x, + surface_y: *surface_y, + }; + self.handle_event(enter_event, state); + self.handle_event(event, state); + } else { + warn!("could not move pointer to surface ({serial}): stale surface"); + } } else { self.server.motion(time, surface_x, surface_y); } @@ -496,10 +501,6 @@ impl HandleEvent for Pointer { ] }, } - - for event in process_event { - self.handle_event(event, state); - } } }