1
0
Fork 0
forked from wry/wry

keyboard: use kbvm::Components

This commit is contained in:
Julian Orth 2025-01-07 11:53:00 +01:00
parent e7d5a23af3
commit 51ceba72b0
10 changed files with 106 additions and 44 deletions

71
Cargo.lock generated
View file

@ -298,6 +298,12 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[package]]
name = "debug-fn"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24efe21bd9a78102d1225f10f0a41d9d5b43f4df7ae8235f39a9c79e4d476c1e"
[[package]] [[package]]
name = "deranged" name = "deranged"
version = "0.3.11" version = "0.3.11"
@ -369,6 +375,12 @@ dependencies = [
"miniz_oxide", "miniz_oxide",
] ]
[[package]]
name = "foldhash"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.31" version = "0.3.31"
@ -466,6 +478,9 @@ name = "hashbrown"
version = "0.15.2" version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
dependencies = [
"foldhash",
]
[[package]] [[package]]
name = "heck" name = "heck"
@ -564,6 +579,7 @@ dependencies = [
"jay-algorithms", "jay-algorithms",
"jay-config", "jay-config",
"jay-toml-config", "jay-toml-config",
"kbvm",
"libloading", "libloading",
"linearize", "linearize",
"log", "log",
@ -628,6 +644,40 @@ dependencies = [
"wasm-bindgen", "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]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.5.0" version = "1.5.0"
@ -874,6 +924,12 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
[[package]] [[package]]
name = "png" name = "png"
version = "0.17.16" version = "0.17.16"
@ -1069,6 +1125,15 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 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]] [[package]]
name = "serde" name = "serde"
version = "1.0.217" version = "1.0.217"
@ -1349,6 +1414,12 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-width"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
[[package]] [[package]]
name = "unsafe-libyaml" name = "unsafe-libyaml"
version = "0.2.11" version = "0.2.11"

View file

@ -61,6 +61,7 @@ linearize = { version = "0.1.3", features = ["derive"] }
png = "0.17.13" png = "0.17.13"
rustc-demangle = { version = "0.1.24", optional = true } rustc-demangle = { version = "0.1.24", optional = true }
tracy-client-sys = { version = "0.24.1", features = ["ondemand", "manual-lifetime", "debuginfod"], optional = true } tracy-client-sys = { version = "0.24.1", features = ["ondemand", "manual-lifetime", "debuginfod"], optional = true }
kbvm = "0.1.2"
[build-dependencies] [build-dependencies]
repc = "0.1.1" repc = "0.1.1"

View file

@ -45,10 +45,10 @@ impl EiKeyboard {
self.client.event(Modifiers { self.client.event(Modifiers {
self_id: self.id, self_id: self.id,
serial: self.client.serial(), serial: self.client.serial(),
depressed: state.mods.mods_depressed, depressed: state.mods.mods_pressed.0,
locked: state.mods.mods_locked, locked: state.mods.mods_locked.0,
latched: state.mods.mods_latched, latched: state.mods.mods_latched.0,
group: state.mods.group, group: state.mods.group.0,
}); });
} }

View file

@ -11,7 +11,6 @@ use {
wl_pointer::PendingScroll, wl_pointer::PendingScroll,
SeatId, SeatId,
}, },
keyboard::ModifierState,
leaks::Tracker, leaks::Tracker,
object::{Object, Version}, object::{Object, Version},
wire::{jay_seat_events::*, JaySeatEventsId}, wire::{jay_seat_events::*, JaySeatEventsId},
@ -26,12 +25,12 @@ pub struct JaySeatEvents {
} }
impl 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.client.event(Modifiers {
self_id: self.id, self_id: self.id,
seat: seat.raw(), seat: seat.raw(),
modifiers: mods.mods_effective, modifiers: mods.mods.0,
group: mods.group, group: mods.group.0,
}); });
} }

View file

@ -818,7 +818,7 @@ impl WlSeatGlobal {
let mut shortcuts = SmallVec::<[_; 1]>::new(); let mut shortcuts = SmallVec::<[_; 1]>::new();
let new_mods; 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 { if state == wl_keyboard::RELEASED {
mods |= RELEASE.0; mods |= RELEASE.0;
} }

View file

@ -78,10 +78,10 @@ impl ZwpInputMethodKeyboardGrabV2 {
self.client.event(Modifiers { self.client.event(Modifiers {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
mods_depressed: kb_state.mods.mods_depressed, mods_depressed: kb_state.mods.mods_pressed.0,
mods_latched: kb_state.mods.mods_latched, mods_latched: kb_state.mods.mods_latched.0,
mods_locked: kb_state.mods.mods_locked, mods_locked: kb_state.mods.mods_locked.0,
group: kb_state.mods.group, group: kb_state.mods.group.0,
}) })
} }

View file

@ -2,13 +2,14 @@ use {
crate::{ crate::{
client::ClientError, client::ClientError,
ifs::wl_seat::WlSeat, ifs::wl_seat::WlSeat,
keyboard::{KeyboardState, KeyboardStateId, ModifierState}, keyboard::{KeyboardState, KeyboardStateId},
leaks::Tracker, leaks::Tracker,
object::{Object, Version}, object::{Object, Version},
utils::errorfmt::ErrorFmt, utils::errorfmt::ErrorFmt,
wire::{wl_keyboard::*, WlKeyboardId, WlSurfaceId}, wire::{wl_keyboard::*, WlKeyboardId, WlSurfaceId},
xkbcommon::XkbCommonError, xkbcommon::XkbCommonError,
}, },
kbvm::Components,
std::{cell::Cell, rc::Rc}, std::{cell::Cell, rc::Rc},
thiserror::Error, 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.seat.client.event(Modifiers {
self_id: self.id, self_id: self.id,
serial: serial as _, serial: serial as _,
mods_depressed: mods.mods_depressed, mods_depressed: mods.mods_pressed.0,
mods_latched: mods.mods_latched, mods_latched: mods.mods_latched.0,
mods_locked: mods.mods_locked, mods_locked: mods.mods_locked.0,
group: mods.group, group: mods.group.0,
}) })
} }

View file

@ -110,11 +110,11 @@ impl ZwpVirtualKeyboardV1RequestHandler for ZwpVirtualKeyboardV1 {
fn modifiers(&self, req: Modifiers, _slf: &Rc<Self>) -> Result<(), Self::Error> { fn modifiers(&self, req: Modifiers, _slf: &Rc<Self>) -> Result<(), Self::Error> {
let kb_state = &mut *self.kb_state.borrow_mut(); let kb_state = &mut *self.kb_state.borrow_mut();
kb_state.mods.mods_depressed = req.mods_depressed; kb_state.mods.mods_pressed.0 = req.mods_depressed;
kb_state.mods.mods_latched = req.mods_latched; kb_state.mods.mods_latched.0 = req.mods_latched;
kb_state.mods.mods_locked = req.mods_locked; kb_state.mods.mods_locked.0 = req.mods_locked;
kb_state.mods.mods_effective = req.mods_depressed | req.mods_latched | req.mods_locked; kb_state.mods.group_locked.0 = req.group;
kb_state.mods.group = req.group; kb_state.mods.update_effective();
self.for_each_kb(|serial, surface, kb| { self.for_each_kb(|serial, surface, kb| {
kb.on_mods_changed(serial, surface.id, &kb_state); kb.on_mods_changed(serial, surface.id, &kb_state);
}); });

View file

@ -1,5 +1,6 @@
use { use {
crate::utils::vecset::VecSet, crate::utils::vecset::VecSet,
kbvm::Components,
std::{ std::{
cell::{Ref, RefCell}, cell::{Ref, RefCell},
rc::Rc, rc::Rc,
@ -7,15 +8,6 @@ use {
uapi::OwnedFd, 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); linear_ids!(KeyboardStateIds, KeyboardStateId, u64);
pub struct KeyboardState { pub struct KeyboardState {
@ -23,7 +15,7 @@ pub struct KeyboardState {
pub map: Rc<OwnedFd>, pub map: Rc<OwnedFd>,
pub map_len: usize, pub map_len: usize,
pub pressed_keys: VecSet<u32>, pub pressed_keys: VecSet<u32>,
pub mods: ModifierState, pub mods: Components,
} }
pub trait DynKeyboardState { pub trait DynKeyboardState {

View file

@ -7,7 +7,7 @@ include!(concat!(env!("OUT_DIR"), "/xkbcommon_tys.rs"));
pub use consts::*; pub use consts::*;
use { use {
crate::{ crate::{
keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId, ModifierState}, keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId},
utils::{errorfmt::ErrorFmt, oserror::OsError, ptr_ext::PtrExt}, utils::{errorfmt::ErrorFmt, oserror::OsError, ptr_ext::PtrExt},
}, },
bstr::{BStr, ByteSlice}, bstr::{BStr, ByteSlice},
@ -288,24 +288,22 @@ impl KeyboardState {
} }
impl XkbState { impl XkbState {
pub fn mods(&self) -> ModifierState { pub fn mods(&self) -> kbvm::Components {
self.kb_state.mods self.kb_state.mods
} }
fn fetch(&mut self, changes: xkb_state_component) -> bool { fn fetch(&mut self, changes: xkb_state_component) -> bool {
unsafe { unsafe {
if changes != 0 { 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 _); 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 _); 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 _); 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.group_locked.0 =
| self.kb_state.mods.mods_latched
| self.kb_state.mods.mods_locked;
self.kb_state.mods.group =
xkb_state_serialize_layout(self.state, XKB_STATE_LAYOUT_EFFECTIVE.raw() as _); xkb_state_serialize_layout(self.state, XKB_STATE_LAYOUT_EFFECTIVE.raw() as _);
self.kb_state.mods.update_effective();
true true
} else { } else {
false false
@ -359,7 +357,7 @@ impl XkbState {
let num = xkb_keymap_key_get_syms_by_level( let num = xkb_keymap_key_get_syms_by_level(
self.map.keymap, self.map.keymap,
key + 8, key + 8,
self.kb_state.mods.group, self.kb_state.mods.group.0,
0, 0,
&mut res, &mut res,
); );