seat: keep track of focus serials
This commit is contained in:
parent
eff490a653
commit
324540c41e
5 changed files with 26 additions and 13 deletions
|
|
@ -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()),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue