1
0
Fork 0
forked from wry/wry

Merge pull request #697 from mahkoh/jorth/keyboard-cleanup

wl_keyboard: cleanup
This commit is contained in:
mahkoh 2025-12-18 22:10:30 +01:00 committed by GitHub
commit 302a4fb7cd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 26 deletions

View file

@ -1,7 +1,7 @@
use { use {
crate::{ crate::{
backend::KeyState, backend::KeyState,
client::ClientError, client::{Client, ClientError},
ifs::wl_seat::WlSeat, ifs::wl_seat::WlSeat,
keyboard::{KeyboardError, KeyboardState, KeyboardStateId}, keyboard::{KeyboardError, KeyboardState, KeyboardStateId},
leaks::Tracker, leaks::Tracker,
@ -30,6 +30,8 @@ pub const REPEATED: u32 = 2;
pub struct WlKeyboard { pub struct WlKeyboard {
id: WlKeyboardId, id: WlKeyboardId,
client: Rc<Client>,
version: Version,
seat: Rc<WlSeat>, seat: Rc<WlSeat>,
kb_state_id: Cell<KeyboardStateId>, kb_state_id: Cell<KeyboardStateId>,
pressed_keys: RefCell<VecSet<u32>>, pressed_keys: RefCell<VecSet<u32>>,
@ -40,6 +42,8 @@ impl WlKeyboard {
pub fn new(id: WlKeyboardId, seat: &Rc<WlSeat>) -> Self { pub fn new(id: WlKeyboardId, seat: &Rc<WlSeat>) -> Self {
Self { Self {
id, id,
client: seat.client.clone(),
version: seat.version,
seat: seat.clone(), seat: seat.clone(),
kb_state_id: Cell::new(KeyboardStateId::from_raw(0)), kb_state_id: Cell::new(KeyboardStateId::from_raw(0)),
pressed_keys: Default::default(), pressed_keys: Default::default(),
@ -52,7 +56,7 @@ impl WlKeyboard {
} }
fn send_kb_state( fn send_kb_state(
&self, self: &Rc<Self>,
serial: u64, serial: u64,
kb_state: &KeyboardState, kb_state: &KeyboardState,
surface_id: WlSurfaceId, surface_id: WlSurfaceId,
@ -67,19 +71,19 @@ impl WlKeyboard {
self.send_modifiers(serial, &kb_state.mods); self.send_modifiers(serial, &kb_state.mods);
} }
fn send_keymap(&self, state: &KeyboardState) { fn send_keymap(self: &Rc<Self>, state: &KeyboardState) {
let fd = match self.seat.keymap_fd(state) { let fd = match self.seat.keymap_fd(state) {
Ok(fd) => fd, Ok(fd) => fd,
Err(e) => { Err(e) => {
log::error!( log::error!(
"Could not creat a file descriptor to transfer the keymap to client {}: {}", "Could not creat a file descriptor to transfer the keymap to client {}: {}",
self.seat.client.id, self.client.id,
ErrorFmt(e) ErrorFmt(e)
); );
return; return;
} }
}; };
self.seat.client.event(Keymap { self.client.event(Keymap {
self_id: self.id, self_id: self.id,
format: XKB_V1, format: XKB_V1,
fd: fd.map, fd: fd.map,
@ -87,7 +91,7 @@ impl WlKeyboard {
}); });
} }
pub fn enter(&self, serial: u64, surface: WlSurfaceId, kb_state: &KeyboardState) { pub fn enter(self: &Rc<Self>, serial: u64, surface: WlSurfaceId, kb_state: &KeyboardState) {
if kb_state.id != self.kb_state_id.get() { if kb_state.id != self.kb_state_id.get() {
self.send_kb_state(serial, kb_state, surface, false); self.send_kb_state(serial, kb_state, surface, false);
} else { } else {
@ -96,30 +100,30 @@ impl WlKeyboard {
} }
} }
fn send_enter(&self, serial: u64, surface: WlSurfaceId, keys: &[u32]) { fn send_enter(self: &Rc<Self>, serial: u64, surface: WlSurfaceId, keys: &[u32]) {
{ {
let pk = &mut self.pressed_keys.borrow_mut(); let pk = &mut self.pressed_keys.borrow_mut();
pk.clear(); pk.clear();
pk.extend(keys); pk.extend(keys);
} }
self.seat.client.event(Enter { self.client.event(Enter {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
surface, surface,
keys, keys,
}) });
} }
pub fn send_leave(&self, serial: u64, surface: WlSurfaceId) { pub fn send_leave(self: &Rc<Self>, serial: u64, surface: WlSurfaceId) {
self.seat.client.event(Leave { self.client.event(Leave {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
surface, surface,
}) });
} }
pub fn on_key( pub fn on_key(
&self, self: &Rc<Self>,
serial: u64, serial: u64,
time: u32, time: u32,
key: u32, key: u32,
@ -133,8 +137,8 @@ impl WlKeyboard {
self.send_key(serial, time, key, state); self.send_key(serial, time, key, state);
} }
fn send_key(&self, serial: u64, time: u32, key: u32, state: KeyState) { fn send_key(self: &Rc<Self>, serial: u64, time: u32, key: u32, state: KeyState) {
if state == KeyState::Repeated && self.seat.version < REPEATED_SINCE { if state == KeyState::Repeated && self.version < REPEATED_SINCE {
return; return;
} }
{ {
@ -157,7 +161,7 @@ impl WlKeyboard {
} }
} }
} }
self.seat.client.event(Key { self.client.event(Key {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
time, time,
@ -167,10 +171,15 @@ impl WlKeyboard {
KeyState::Pressed => PRESSED, KeyState::Pressed => PRESSED,
KeyState::Repeated => REPEATED, KeyState::Repeated => REPEATED,
}, },
}) });
} }
pub fn on_mods_changed(&self, serial: u64, surface: WlSurfaceId, kb_state: &KeyboardState) { pub fn on_mods_changed(
self: &Rc<Self>,
serial: u64,
surface: WlSurfaceId,
kb_state: &KeyboardState,
) {
if self.kb_state_id.get() != kb_state.id { if self.kb_state_id.get() != kb_state.id {
self.send_kb_state(serial, kb_state, surface, true); self.send_kb_state(serial, kb_state, surface, true);
} else { } else {
@ -178,27 +187,27 @@ impl WlKeyboard {
} }
} }
fn send_modifiers(&self, serial: u64, mods: &Components) { fn send_modifiers(self: &Rc<Self>, serial: u64, mods: &Components) {
self.seat.client.event(Modifiers { self.client.event(Modifiers {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
mods_depressed: mods.mods_pressed.0, mods_depressed: mods.mods_pressed.0,
mods_latched: mods.mods_latched.0, mods_latched: mods.mods_latched.0,
mods_locked: mods.mods_locked.0, mods_locked: mods.mods_locked.0,
group: mods.group.0, group: mods.group.0,
}) });
} }
pub fn send_repeat_info(self: &Rc<Self>, mut rate: i32, mut delay: i32) { pub fn send_repeat_info(self: &Rc<Self>, mut rate: i32, mut delay: i32) {
if self.seat.version >= REPEATED_SINCE { if self.version >= REPEATED_SINCE {
rate = 0; rate = 0;
delay = 0; delay = 0;
} }
self.seat.client.event(RepeatInfo { self.client.event(RepeatInfo {
self_id: self.id, self_id: self.id,
rate, rate,
delay, delay,
}) });
} }
} }
@ -214,7 +223,7 @@ impl WlKeyboardRequestHandler for WlKeyboard {
object_base! { object_base! {
self = WlKeyboard; self = WlKeyboard;
version = self.seat.version; version = self.version;
} }
impl Object for WlKeyboard {} impl Object for WlKeyboard {}

View file

@ -32,7 +32,7 @@ pub struct ZwpVirtualKeyboardV1 {
impl ZwpVirtualKeyboardV1 { impl ZwpVirtualKeyboardV1 {
fn for_each_kb<F>(&self, mut f: F) fn for_each_kb<F>(&self, mut f: F)
where where
F: FnMut(u64, &WlSurface, &WlKeyboard), F: FnMut(u64, &WlSurface, &Rc<WlKeyboard>),
{ {
let Some(surface) = self.seat.keyboard_node.get().node_into_surface() else { let Some(surface) = self.seat.keyboard_node.get().node_into_surface() else {
return; return;