1
0
Fork 0
forked from wry/wry

seat: keep track of focus serials

This commit is contained in:
Julian Orth 2024-10-17 15:48:47 +02:00
parent eff490a653
commit 324540c41e
5 changed files with 26 additions and 13 deletions

View file

@ -200,6 +200,7 @@ pub struct WlSeatGlobal {
tablet: TabletSeatData,
ei_seats: CopyHashMap<(ClientId, EiSeatId), Rc<EiSeat>>,
ui_drag_highlight: Cell<Option<Rect>>,
keyboard_node_serial: Cell<u64>,
}
const CHANGE_CURSOR_MOVED: u32 = 1 << 0;
@ -229,6 +230,7 @@ impl WlSeatGlobal {
pointer_stack_modified: Cell::new(false),
found_tree: RefCell::new(vec![]),
keyboard_node: CloneCell::new(state.root.clone()),
keyboard_node_serial: Default::default(),
bindings: Default::default(),
x_data_devices: Default::default(),
data_devices: RefCell::new(Default::default()),

View file

@ -159,7 +159,8 @@ impl NodeSeatState {
fn release_kb_focus2(&self, focus_last: bool) {
self.release_kb_grab();
while let Some((_, seat)) = self.kb_foci.pop() {
seat.kb_owner.set_kb_node(&seat, seat.state.root.clone());
seat.kb_owner
.set_kb_node(&seat, seat.state.root.clone(), seat.state.next_serial(None));
// log::info!("keyboard_node = root");
if focus_last {
seat.get_output()
@ -935,7 +936,15 @@ impl WlSeatGlobal {
}
pub fn focus_node(self: &Rc<Self>, node: Rc<dyn Node>) {
self.kb_owner.set_kb_node(self, node);
if self.keyboard_node.get().node_id() == node.node_id() {
return;
}
let serial = self.state.next_serial(node.node_client().as_deref());
self.focus_node_with_serial(node, serial);
}
pub fn focus_node_with_serial(self: &Rc<Self>, node: Rc<dyn Node>, serial: u64) {
self.kb_owner.set_kb_node(self, node, serial);
}
pub(super) fn for_each_seat<C>(&self, ver: Version, client: ClientId, mut f: C)
@ -1150,7 +1159,7 @@ impl WlSeatGlobal {
self.surface_pointer_frame(surface);
if pressed {
if let Some(node) = surface.get_focus_node(self.id) {
self.focus_node(node);
self.focus_node_with_serial(node, serial);
}
}
}
@ -1368,7 +1377,7 @@ impl WlSeatGlobal {
t.send_down(serial, time, surface.id, id, x, y)
});
if let Some(node) = surface.get_focus_node(self.id) {
self.focus_node(node);
self.focus_node_with_serial(node, serial);
}
}

View file

@ -29,8 +29,8 @@ impl KbOwnerHolder {
self.owner.get().ungrab(seat)
}
pub fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) {
self.owner.get().set_kb_node(seat, node);
pub fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>, serial: u64) {
self.owner.get().set_kb_node(seat, node, serial);
}
pub fn clear(&self) {
@ -45,12 +45,13 @@ struct GrabKbOwner;
trait KbOwner {
fn grab(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) -> bool;
fn ungrab(&self, seat: &Rc<WlSeatGlobal>);
fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>);
fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>, serial: u64);
}
impl KbOwner for DefaultKbOwner {
fn grab(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) -> bool {
self.set_kb_node(seat, node);
let serial = seat.state.next_serial(node.node_client().as_deref());
self.set_kb_node(seat, node, serial);
seat.kb_owner.owner.set(Rc::new(GrabKbOwner));
true
}
@ -59,7 +60,7 @@ impl KbOwner for DefaultKbOwner {
// nothing
}
fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) {
fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>, serial: u64) {
let old = seat.keyboard_node.get();
if old.node_id() == node.node_id() {
return;
@ -78,6 +79,7 @@ impl KbOwner for DefaultKbOwner {
}
// log::info!("focus {}", node.node_id());
node.clone().node_on_focus(seat);
seat.keyboard_node_serial.set(serial);
seat.keyboard_node.set(node.clone());
seat.tablet_on_keyboard_node_change();
}
@ -92,7 +94,7 @@ impl KbOwner for GrabKbOwner {
seat.kb_owner.owner.set(seat.kb_owner.default.clone());
}
fn set_kb_node(&self, _seat: &Rc<WlSeatGlobal>, _node: Rc<dyn Node>) {
fn set_kb_node(&self, _seat: &Rc<WlSeatGlobal>, _node: Rc<dyn Node>, _serial: u64) {
// nothing
}
}

View file

@ -212,7 +212,7 @@ impl TabletTool {
});
if state == ToolButtonState::Pressed {
if let Some(node) = n.get_focus_node(self.tablet.seat.id) {
self.tablet.seat.focus_node(node);
self.tablet.seat.focus_node_with_serial(node, serial.get());
}
}
}
@ -260,7 +260,7 @@ impl TabletTool {
if let Some(changes) = changes {
if changes.down == Some(true) {
if let Some(node) = n.get_focus_node(self.tablet.seat.id) {
self.tablet.seat.focus_node(node);
self.tablet.seat.focus_node_with_serial(node, serial.get());
}
}
}

View file

@ -134,7 +134,7 @@ impl Node for ExtSessionLockSurfaceV1 {
}
fn node_on_pointer_enter(self: Rc<Self>, seat: &Rc<WlSeatGlobal>, _x: Fixed, _y: Fixed) {
seat.focus_node(self.surface.clone());
seat.focus_node_with_serial(self.surface.clone(), self.client.next_serial());
}
}