keyboard: Update to xkbcommon 0.8

This commit is contained in:
Kenny Levinsen
2025-02-27 16:38:52 +01:00
parent 9fd054fc2c
commit 7e112ddd1f
4 changed files with 42 additions and 17 deletions
Generated
+11 -4
View File
@@ -474,9 +474,9 @@ dependencies = [
[[package]] [[package]]
name = "memmap2" name = "memmap2"
version = "0.7.1" version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@@ -1307,14 +1307,21 @@ dependencies = [
[[package]] [[package]]
name = "xkbcommon" name = "xkbcommon"
version = "0.5.1" version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52db25b599e92bf6e3904134618728eeb7b49a5a4f38f107f92399bb9c496b88" checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9"
dependencies = [ dependencies = [
"libc", "libc",
"memmap2", "memmap2",
"xkeysym",
] ]
[[package]]
name = "xkeysym"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56"
[[package]] [[package]]
name = "yeslogic-fontconfig-sys" name = "yeslogic-fontconfig-sys"
version = "5.0.0" version = "5.0.0"
+1 -1
View File
@@ -26,7 +26,7 @@ unicode-segmentation = "1.10"
fuzzy-matcher = "0.3" fuzzy-matcher = "0.3"
shlex = "1.3" shlex = "1.3"
xkbcommon = { version = "0.5", features = ["wayland"] } # update breaks xkbcommon = { version = "0.8", features = ["wayland"] }
rcalc_lib = "1.0" rcalc_lib = "1.0"
+23 -7
View File
@@ -39,23 +39,40 @@ pub struct KeyEvent {
pub repeats: bool, pub repeats: bool,
} }
pub struct KeymapDescription {
fd: OwnedFd,
size: u32,
}
impl KeymapDescription {
fn new(fd: OwnedFd, size: u32) -> KeymapDescription {
KeymapDescription { fd: fd, size: size }
}
}
impl Clone for KeymapDescription {
fn clone(&self) -> Self {
KeymapDescription::new(self.fd.try_clone().expect("unable to clone fd"), self.size)
}
}
pub struct Keyboard { pub struct Keyboard {
state: Option<KbState>, state: Option<KbState>,
fd: Option<(OwnedFd, u32)>, desc: Option<KeymapDescription>,
} }
impl Keyboard { impl Keyboard {
pub fn new() -> Keyboard { pub fn new() -> Keyboard {
Keyboard { Keyboard {
state: None, state: None,
fd: None, desc: None,
} }
} }
pub fn keymap(&mut self, format: WEnum<wl_keyboard::KeymapFormat>, fd: OwnedFd, size: u32) { pub fn keymap(&mut self, format: WEnum<wl_keyboard::KeymapFormat>, fd: OwnedFd, size: u32) {
match format { match format {
WEnum::Value(wl_keyboard::KeymapFormat::XkbV1) => { WEnum::Value(wl_keyboard::KeymapFormat::XkbV1) => {
self.fd = Some((fd, size)); self.desc = Some(KeymapDescription::new(fd, size));
} }
WEnum::Value(wl_keyboard::KeymapFormat::NoKeymap) => { WEnum::Value(wl_keyboard::KeymapFormat::NoKeymap) => {
// TODO: how to handle this (hopefully never occuring) case? // TODO: how to handle this (hopefully never occuring) case?
@@ -69,10 +86,9 @@ impl Keyboard {
return; return;
} }
if let Some((fd, size)) = &self.fd { if let Some(desc) = self.desc.take() {
self.state = Some( self.state = Some(
KbState::new_from_fd(fd.as_raw_fd(), *size as usize) KbState::new_from_fd(desc.fd, desc.size as usize).expect("unable to load keymap"),
.expect("unable to load keymap"),
); );
} }
} }
@@ -107,7 +123,7 @@ impl Keyboard {
} else { } else {
None None
}; };
let repeats = state.key_repeats(key + 8); let repeats = state.key_repeats(xkb::Keycode::new(key + 8));
(sym, utf8, repeats) (sym, utf8, repeats)
}; };
KeyEvent { KeyEvent {
+7 -5
View File
@@ -1,4 +1,4 @@
use std::{env, os::unix::io::RawFd}; use std::{env, os::unix::io::OwnedFd};
use xkbcommon::xkb; use xkbcommon::xkb;
@@ -71,16 +71,18 @@ impl KbState {
} }
pub(crate) fn get_one_sym_raw(&mut self, keycode: u32) -> u32 { pub(crate) fn get_one_sym_raw(&mut self, keycode: u32) -> u32 {
self.xkb_state.key_get_one_sym(keycode + 8) self.xkb_state
.key_get_one_sym(xkb::Keycode::new(keycode + 8))
.raw()
} }
pub(crate) fn get_utf8_raw(&mut self, keycode: u32) -> Option<String> { pub(crate) fn get_utf8_raw(&mut self, keycode: u32) -> Option<String> {
Some(self.xkb_state.key_get_utf8(keycode + 8)) Some(self.xkb_state.key_get_utf8(xkb::Keycode::new(keycode + 8)))
} }
pub(crate) fn compose_feed(&mut self, keysym: u32) -> Option<xkb::compose::FeedResult> { pub(crate) fn compose_feed(&mut self, keysym: u32) -> Option<xkb::compose::FeedResult> {
match &mut self.xkb_compose_state { match &mut self.xkb_compose_state {
Some(compose_state) => Some(compose_state.feed(keysym)), Some(compose_state) => Some(compose_state.feed(xkb::Keysym::new(keysym))),
None => None, None => None,
} }
} }
@@ -99,7 +101,7 @@ impl KbState {
} }
} }
pub(crate) fn new_from_fd(fd: RawFd, size: usize) -> Result<KbState, std::io::Error> { pub(crate) fn new_from_fd(fd: OwnedFd, size: usize) -> Result<KbState, std::io::Error> {
let xkb_context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS); let xkb_context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS);
let xkb_keymap = unsafe { let xkb_keymap = unsafe {
xkb::Keymap::new_from_fd( xkb::Keymap::new_from_fd(