1use xkbcommon::xkb::{self, Keycode, Keysym, State};
2
3use crate::{Keystroke, Modifiers};
4
5impl Keystroke {
6 pub(super) fn from_xkb(state: &State, modifiers: Modifiers, keycode: Keycode) -> Self {
7 let key_utf32 = state.key_get_utf32(keycode);
8 let key_utf8 = state.key_get_utf8(keycode);
9 let key_sym = state.key_get_one_sym(keycode);
10
11 let key = match key_sym {
12 Keysym::Return => "enter".to_owned(),
13 Keysym::Prior => "pageup".to_owned(),
14 Keysym::Next => "pagedown".to_owned(),
15 _ => xkb::keysym_get_name(key_sym).to_lowercase(),
16 };
17
18 // Ignore control characters (and DEL) for the purposes of ime_key,
19 // but if key_utf32 is 0 then assume it isn't one
20 let ime_key = ((key_utf32 == 0 || (key_utf32 >= 32 && key_utf32 != 127))
21 && !key_utf8.is_empty())
22 .then_some(key_utf8);
23
24 Keystroke {
25 modifiers,
26 key,
27 ime_key,
28 }
29 }
30}