From 51ceba72b02090659ea318730202b9393cf43e08 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Tue, 7 Jan 2025 11:53:00 +0100 Subject: [PATCH] keyboard: use kbvm::Components --- Cargo.lock | 71 +++++++++++++++++++ Cargo.toml | 1 + src/ei/ei_ifs/ei_keyboard.rs | 8 +-- src/ifs/jay_seat_events.rs | 7 +- src/ifs/wl_seat/event_handling.rs | 2 +- .../zwp_input_method_keyboard_grab_v2.rs | 8 +-- src/ifs/wl_seat/wl_keyboard.rs | 13 ++-- src/ifs/wl_seat/zwp_virtual_keyboard_v1.rs | 10 +-- src/keyboard.rs | 12 +--- src/xkbcommon.rs | 18 +++-- 10 files changed, 106 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73e3d2ed..5f5e585e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -298,6 +298,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "debug-fn" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24efe21bd9a78102d1225f10f0a41d9d5b43f4df7ae8235f39a9c79e4d476c1e" + [[package]] name = "deranged" version = "0.3.11" @@ -369,6 +375,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "futures-core" version = "0.3.31" @@ -466,6 +478,9 @@ name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] [[package]] name = "heck" @@ -564,6 +579,7 @@ dependencies = [ "jay-algorithms", "jay-config", "jay-toml-config", + "kbvm", "libloading", "linearize", "log", @@ -628,6 +644,40 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kbvm" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723f422224bcf2bcbf788f71bc022a269b5abf7f02c50b07f91cdc9dd67fa902" +dependencies = [ + "arrayvec", + "bstr", + "cfg-if", + "debug-fn", + "hashbrown", + "indexmap", + "isnt", + "kbvm-proc", + "linearize", + "log", + "pkg-config", + "secure-execution", + "smallvec", + "thiserror", + "unicode-width", +] + +[[package]] +name = "kbvm-proc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28067e7361c0069c3753795d131653f9ea5333aeb35a3855fb2de66447c48ac8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -874,6 +924,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + [[package]] name = "png" version = "0.17.16" @@ -1069,6 +1125,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "secure-execution" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23ceccce47e43305aa02a0d9182ad09364357d073447435d7ae2e219ce750e55" +dependencies = [ + "cfg-if", +] + [[package]] name = "serde" version = "1.0.217" @@ -1349,6 +1414,12 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + [[package]] name = "unsafe-libyaml" version = "0.2.11" diff --git a/Cargo.toml b/Cargo.toml index e48cf6eb..ed5087f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,6 +61,7 @@ linearize = { version = "0.1.3", features = ["derive"] } png = "0.17.13" rustc-demangle = { version = "0.1.24", optional = true } tracy-client-sys = { version = "0.24.1", features = ["ondemand", "manual-lifetime", "debuginfod"], optional = true } +kbvm = "0.1.2" [build-dependencies] repc = "0.1.1" diff --git a/src/ei/ei_ifs/ei_keyboard.rs b/src/ei/ei_ifs/ei_keyboard.rs index 6c2ab593..69e342db 100644 --- a/src/ei/ei_ifs/ei_keyboard.rs +++ b/src/ei/ei_ifs/ei_keyboard.rs @@ -45,10 +45,10 @@ impl EiKeyboard { self.client.event(Modifiers { self_id: self.id, serial: self.client.serial(), - depressed: state.mods.mods_depressed, - locked: state.mods.mods_locked, - latched: state.mods.mods_latched, - group: state.mods.group, + depressed: state.mods.mods_pressed.0, + locked: state.mods.mods_locked.0, + latched: state.mods.mods_latched.0, + group: state.mods.group.0, }); } diff --git a/src/ifs/jay_seat_events.rs b/src/ifs/jay_seat_events.rs index ad5c8545..bd9f5c6e 100644 --- a/src/ifs/jay_seat_events.rs +++ b/src/ifs/jay_seat_events.rs @@ -11,7 +11,6 @@ use { wl_pointer::PendingScroll, SeatId, }, - keyboard::ModifierState, leaks::Tracker, object::{Object, Version}, wire::{jay_seat_events::*, JaySeatEventsId}, @@ -26,12 +25,12 @@ pub struct JaySeatEvents { } impl JaySeatEvents { - pub fn send_modifiers(&self, seat: SeatId, mods: &ModifierState) { + pub fn send_modifiers(&self, seat: SeatId, mods: &kbvm::Components) { self.client.event(Modifiers { self_id: self.id, seat: seat.raw(), - modifiers: mods.mods_effective, - group: mods.group, + modifiers: mods.mods.0, + group: mods.group.0, }); } diff --git a/src/ifs/wl_seat/event_handling.rs b/src/ifs/wl_seat/event_handling.rs index d76ec13e..d5fd2944 100644 --- a/src/ifs/wl_seat/event_handling.rs +++ b/src/ifs/wl_seat/event_handling.rs @@ -818,7 +818,7 @@ impl WlSeatGlobal { let mut shortcuts = SmallVec::<[_; 1]>::new(); let new_mods; { - let mut mods = xkb_state.mods().mods_effective & !(CAPS.0 | NUM.0); + let mut mods = xkb_state.mods().mods.0 & !(CAPS.0 | NUM.0); if state == wl_keyboard::RELEASED { mods |= RELEASE.0; } diff --git a/src/ifs/wl_seat/text_input/zwp_input_method_keyboard_grab_v2.rs b/src/ifs/wl_seat/text_input/zwp_input_method_keyboard_grab_v2.rs index fde9df46..21935562 100644 --- a/src/ifs/wl_seat/text_input/zwp_input_method_keyboard_grab_v2.rs +++ b/src/ifs/wl_seat/text_input/zwp_input_method_keyboard_grab_v2.rs @@ -78,10 +78,10 @@ impl ZwpInputMethodKeyboardGrabV2 { self.client.event(Modifiers { self_id: self.id, serial: serial as _, - mods_depressed: kb_state.mods.mods_depressed, - mods_latched: kb_state.mods.mods_latched, - mods_locked: kb_state.mods.mods_locked, - group: kb_state.mods.group, + mods_depressed: kb_state.mods.mods_pressed.0, + mods_latched: kb_state.mods.mods_latched.0, + mods_locked: kb_state.mods.mods_locked.0, + group: kb_state.mods.group.0, }) } diff --git a/src/ifs/wl_seat/wl_keyboard.rs b/src/ifs/wl_seat/wl_keyboard.rs index f74355c6..08c206c7 100644 --- a/src/ifs/wl_seat/wl_keyboard.rs +++ b/src/ifs/wl_seat/wl_keyboard.rs @@ -2,13 +2,14 @@ use { crate::{ client::ClientError, ifs::wl_seat::WlSeat, - keyboard::{KeyboardState, KeyboardStateId, ModifierState}, + keyboard::{KeyboardState, KeyboardStateId}, leaks::Tracker, object::{Object, Version}, utils::errorfmt::ErrorFmt, wire::{wl_keyboard::*, WlKeyboardId, WlSurfaceId}, xkbcommon::XkbCommonError, }, + kbvm::Components, std::{cell::Cell, rc::Rc}, thiserror::Error, }; @@ -138,14 +139,14 @@ impl WlKeyboard { } } - fn send_modifiers(&self, serial: u64, mods: &ModifierState) { + fn send_modifiers(&self, serial: u64, mods: &Components) { self.seat.client.event(Modifiers { self_id: self.id, serial: serial as _, - mods_depressed: mods.mods_depressed, - mods_latched: mods.mods_latched, - mods_locked: mods.mods_locked, - group: mods.group, + mods_depressed: mods.mods_pressed.0, + mods_latched: mods.mods_latched.0, + mods_locked: mods.mods_locked.0, + group: mods.group.0, }) } diff --git a/src/ifs/wl_seat/zwp_virtual_keyboard_v1.rs b/src/ifs/wl_seat/zwp_virtual_keyboard_v1.rs index 2b5a9c86..5605cfe5 100644 --- a/src/ifs/wl_seat/zwp_virtual_keyboard_v1.rs +++ b/src/ifs/wl_seat/zwp_virtual_keyboard_v1.rs @@ -110,11 +110,11 @@ impl ZwpVirtualKeyboardV1RequestHandler for ZwpVirtualKeyboardV1 { fn modifiers(&self, req: Modifiers, _slf: &Rc) -> Result<(), Self::Error> { let kb_state = &mut *self.kb_state.borrow_mut(); - kb_state.mods.mods_depressed = req.mods_depressed; - kb_state.mods.mods_latched = req.mods_latched; - kb_state.mods.mods_locked = req.mods_locked; - kb_state.mods.mods_effective = req.mods_depressed | req.mods_latched | req.mods_locked; - kb_state.mods.group = req.group; + kb_state.mods.mods_pressed.0 = req.mods_depressed; + kb_state.mods.mods_latched.0 = req.mods_latched; + kb_state.mods.mods_locked.0 = req.mods_locked; + kb_state.mods.group_locked.0 = req.group; + kb_state.mods.update_effective(); self.for_each_kb(|serial, surface, kb| { kb.on_mods_changed(serial, surface.id, &kb_state); }); diff --git a/src/keyboard.rs b/src/keyboard.rs index 35b9823d..32484781 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -1,5 +1,6 @@ use { crate::utils::vecset::VecSet, + kbvm::Components, std::{ cell::{Ref, RefCell}, rc::Rc, @@ -7,15 +8,6 @@ use { uapi::OwnedFd, }; -#[derive(Copy, Clone, Debug, Default)] -pub struct ModifierState { - pub mods_depressed: u32, - pub mods_latched: u32, - pub mods_locked: u32, - pub mods_effective: u32, - pub group: u32, -} - linear_ids!(KeyboardStateIds, KeyboardStateId, u64); pub struct KeyboardState { @@ -23,7 +15,7 @@ pub struct KeyboardState { pub map: Rc, pub map_len: usize, pub pressed_keys: VecSet, - pub mods: ModifierState, + pub mods: Components, } pub trait DynKeyboardState { diff --git a/src/xkbcommon.rs b/src/xkbcommon.rs index 4804bda2..d56a2ab3 100644 --- a/src/xkbcommon.rs +++ b/src/xkbcommon.rs @@ -7,7 +7,7 @@ include!(concat!(env!("OUT_DIR"), "/xkbcommon_tys.rs")); pub use consts::*; use { crate::{ - keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId, ModifierState}, + keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId}, utils::{errorfmt::ErrorFmt, oserror::OsError, ptr_ext::PtrExt}, }, bstr::{BStr, ByteSlice}, @@ -288,24 +288,22 @@ impl KeyboardState { } impl XkbState { - pub fn mods(&self) -> ModifierState { + pub fn mods(&self) -> kbvm::Components { self.kb_state.mods } fn fetch(&mut self, changes: xkb_state_component) -> bool { unsafe { if changes != 0 { - self.kb_state.mods.mods_depressed = + self.kb_state.mods.mods_pressed.0 = xkb_state_serialize_mods(self.state, XKB_STATE_MODS_DEPRESSED.raw() as _); - self.kb_state.mods.mods_latched = + self.kb_state.mods.mods_latched.0 = xkb_state_serialize_mods(self.state, XKB_STATE_MODS_LATCHED.raw() as _); - self.kb_state.mods.mods_locked = + self.kb_state.mods.mods_locked.0 = xkb_state_serialize_mods(self.state, XKB_STATE_MODS_LOCKED.raw() as _); - self.kb_state.mods.mods_effective = self.kb_state.mods.mods_depressed - | self.kb_state.mods.mods_latched - | self.kb_state.mods.mods_locked; - self.kb_state.mods.group = + self.kb_state.mods.group_locked.0 = xkb_state_serialize_layout(self.state, XKB_STATE_LAYOUT_EFFECTIVE.raw() as _); + self.kb_state.mods.update_effective(); true } else { false @@ -359,7 +357,7 @@ impl XkbState { let num = xkb_keymap_key_get_syms_by_level( self.map.keymap, key + 8, - self.kb_state.mods.group, + self.kb_state.mods.group.0, 0, &mut res, );