util.rs

 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)).then_some(key_utf8);
21
22        Keystroke {
23            modifiers,
24            key,
25            ime_key,
26        }
27    }
28}