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,
|
tablet: TabletSeatData,
|
||||||
ei_seats: CopyHashMap<(ClientId, EiSeatId), Rc<EiSeat>>,
|
ei_seats: CopyHashMap<(ClientId, EiSeatId), Rc<EiSeat>>,
|
||||||
ui_drag_highlight: Cell<Option<Rect>>,
|
ui_drag_highlight: Cell<Option<Rect>>,
|
||||||
|
keyboard_node_serial: Cell<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
const CHANGE_CURSOR_MOVED: u32 = 1 << 0;
|
const CHANGE_CURSOR_MOVED: u32 = 1 << 0;
|
||||||
|
|
@ -229,6 +230,7 @@ impl WlSeatGlobal {
|
||||||
pointer_stack_modified: Cell::new(false),
|
pointer_stack_modified: Cell::new(false),
|
||||||
found_tree: RefCell::new(vec![]),
|
found_tree: RefCell::new(vec![]),
|
||||||
keyboard_node: CloneCell::new(state.root.clone()),
|
keyboard_node: CloneCell::new(state.root.clone()),
|
||||||
|
keyboard_node_serial: Default::default(),
|
||||||
bindings: Default::default(),
|
bindings: Default::default(),
|
||||||
x_data_devices: Default::default(),
|
x_data_devices: Default::default(),
|
||||||
data_devices: RefCell::new(Default::default()),
|
data_devices: RefCell::new(Default::default()),
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,8 @@ impl NodeSeatState {
|
||||||
fn release_kb_focus2(&self, focus_last: bool) {
|
fn release_kb_focus2(&self, focus_last: bool) {
|
||||||
self.release_kb_grab();
|
self.release_kb_grab();
|
||||||
while let Some((_, seat)) = self.kb_foci.pop() {
|
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");
|
// log::info!("keyboard_node = root");
|
||||||
if focus_last {
|
if focus_last {
|
||||||
seat.get_output()
|
seat.get_output()
|
||||||
|
|
@ -935,7 +936,15 @@ impl WlSeatGlobal {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn focus_node(self: &Rc<Self>, node: Rc<dyn Node>) {
|
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)
|
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);
|
self.surface_pointer_frame(surface);
|
||||||
if pressed {
|
if pressed {
|
||||||
if let Some(node) = surface.get_focus_node(self.id) {
|
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)
|
t.send_down(serial, time, surface.id, id, x, y)
|
||||||
});
|
});
|
||||||
if let Some(node) = surface.get_focus_node(self.id) {
|
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)
|
self.owner.get().ungrab(seat)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) {
|
pub fn set_kb_node(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>, serial: u64) {
|
||||||
self.owner.get().set_kb_node(seat, node);
|
self.owner.get().set_kb_node(seat, node, serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clear(&self) {
|
pub fn clear(&self) {
|
||||||
|
|
@ -45,12 +45,13 @@ struct GrabKbOwner;
|
||||||
trait KbOwner {
|
trait KbOwner {
|
||||||
fn grab(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) -> bool;
|
fn grab(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) -> bool;
|
||||||
fn ungrab(&self, seat: &Rc<WlSeatGlobal>);
|
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 {
|
impl KbOwner for DefaultKbOwner {
|
||||||
fn grab(&self, seat: &Rc<WlSeatGlobal>, node: Rc<dyn Node>) -> bool {
|
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));
|
seat.kb_owner.owner.set(Rc::new(GrabKbOwner));
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
@ -59,7 +60,7 @@ impl KbOwner for DefaultKbOwner {
|
||||||
// nothing
|
// 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();
|
let old = seat.keyboard_node.get();
|
||||||
if old.node_id() == node.node_id() {
|
if old.node_id() == node.node_id() {
|
||||||
return;
|
return;
|
||||||
|
|
@ -78,6 +79,7 @@ impl KbOwner for DefaultKbOwner {
|
||||||
}
|
}
|
||||||
// log::info!("focus {}", node.node_id());
|
// log::info!("focus {}", node.node_id());
|
||||||
node.clone().node_on_focus(seat);
|
node.clone().node_on_focus(seat);
|
||||||
|
seat.keyboard_node_serial.set(serial);
|
||||||
seat.keyboard_node.set(node.clone());
|
seat.keyboard_node.set(node.clone());
|
||||||
seat.tablet_on_keyboard_node_change();
|
seat.tablet_on_keyboard_node_change();
|
||||||
}
|
}
|
||||||
|
|
@ -92,7 +94,7 @@ impl KbOwner for GrabKbOwner {
|
||||||
seat.kb_owner.owner.set(seat.kb_owner.default.clone());
|
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
|
// nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -212,7 +212,7 @@ impl TabletTool {
|
||||||
});
|
});
|
||||||
if state == ToolButtonState::Pressed {
|
if state == ToolButtonState::Pressed {
|
||||||
if let Some(node) = n.get_focus_node(self.tablet.seat.id) {
|
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 let Some(changes) = changes {
|
||||||
if changes.down == Some(true) {
|
if changes.down == Some(true) {
|
||||||
if let Some(node) = n.get_focus_node(self.tablet.seat.id) {
|
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) {
|
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