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