seat: release buttons when reverting from grab owner
This commit is contained in:
parent
298a430177
commit
93db2d8fb3
1 changed files with 18 additions and 2 deletions
|
|
@ -14,6 +14,7 @@ use {
|
||||||
xdg_toplevel_drag_v1::XdgToplevelDragV1,
|
xdg_toplevel_drag_v1::XdgToplevelDragV1,
|
||||||
},
|
},
|
||||||
rect::Rect,
|
rect::Rect,
|
||||||
|
time::Time,
|
||||||
tree::{
|
tree::{
|
||||||
ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node,
|
ContainerNode, ContainerSplit, ContainingNode, FindTreeUsecase, FoundNode, Node,
|
||||||
PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode,
|
PlaceholderNode, TddType, ToplevelNode, WorkspaceDragDestination, WorkspaceNode,
|
||||||
|
|
@ -437,7 +438,9 @@ impl<T: SimplePointerOwnerUsecase> PointerOwner for SimpleGrabPointerOwner<T> {
|
||||||
fn button(&self, seat: &Rc<WlSeatGlobal>, time_usec: u64, button: u32, state: KeyState) {
|
fn button(&self, seat: &Rc<WlSeatGlobal>, time_usec: u64, button: u32, state: KeyState) {
|
||||||
match state {
|
match state {
|
||||||
KeyState::Released => {
|
KeyState::Released => {
|
||||||
self.buttons.remove(&button);
|
if self.buttons.remove(&button).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if self.buttons.is_empty() {
|
if self.buttons.is_empty() {
|
||||||
self.node.node_seat_state().remove_pointer_grab(seat);
|
self.node.node_seat_state().remove_pointer_grab(seat);
|
||||||
// log::info!("button");
|
// log::info!("button");
|
||||||
|
|
@ -446,7 +449,9 @@ impl<T: SimplePointerOwnerUsecase> PointerOwner for SimpleGrabPointerOwner<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
KeyState::Pressed => {
|
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());
|
let serial = seat.state.next_serial(self.node.node_client().as_deref());
|
||||||
|
|
@ -480,6 +485,17 @@ impl<T: SimplePointerOwnerUsecase> PointerOwner for SimpleGrabPointerOwner<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn revert_to_default(&self, seat: &Rc<WlSeatGlobal>) {
|
fn revert_to_default(&self, seat: &Rc<WlSeatGlobal>) {
|
||||||
|
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);
|
self.node.node_seat_state().remove_pointer_grab(seat);
|
||||||
seat.pointer_owner.set_default_pointer_owner(seat);
|
seat.pointer_owner.set_default_pointer_owner(seat);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue