From 93db2d8fb3e66e12ae2a1191b2d350de301d28b6 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Thu, 8 May 2025 23:22:20 +0200 Subject: [PATCH] seat: release buttons when reverting from grab owner --- src/ifs/wl_seat/pointer_owner.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ifs/wl_seat/pointer_owner.rs b/src/ifs/wl_seat/pointer_owner.rs index 3db8e89b..3de37e08 100644 --- a/src/ifs/wl_seat/pointer_owner.rs +++ b/src/ifs/wl_seat/pointer_owner.rs @@ -14,6 +14,7 @@ use { xdg_toplevel_drag_v1::XdgToplevelDragV1, }, rect::Rect, + time::Time, tree::{ ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node, PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode, @@ -437,7 +438,9 @@ impl PointerOwner for SimpleGrabPointerOwner { fn button(&self, seat: &Rc, time_usec: u64, button: u32, state: KeyState) { match state { KeyState::Released => { - self.buttons.remove(&button); + if self.buttons.remove(&button).is_none() { + return; + } if self.buttons.is_empty() { self.node.node_seat_state().remove_pointer_grab(seat); // log::info!("button"); @@ -446,7 +449,9 @@ impl PointerOwner for SimpleGrabPointerOwner { } } KeyState::Pressed => { - self.buttons.insert(button, ()); + if self.buttons.insert(button, ()).is_some() { + return; + } } } let serial = seat.state.next_serial(self.node.node_client().as_deref()); @@ -480,6 +485,17 @@ impl PointerOwner for SimpleGrabPointerOwner { } fn revert_to_default(&self, seat: &Rc) { + let serial = seat.state.next_serial(self.node.node_client().as_deref()); + let time_usec = Time::now_unchecked().usec(); + for (button, _) in &self.buttons { + seat.handle_node_button( + self.node.clone(), + time_usec, + button, + KeyState::Released, + serial, + ); + } self.node.node_seat_state().remove_pointer_grab(seat); seat.pointer_owner.set_default_pointer_owner(seat); }