kanata_parser/
sequences.rs

1use kanata_keyberon::key_code::KeyCode;
2
3pub const MASK_KEYCODES: u16 = 0x03FF;
4pub const MASK_MODDED: u16 = 0xFC00;
5pub const KEY_OVERLAP: KeyCode = KeyCode::ErrorRollOver;
6pub const KEY_OVERLAP_MARKER: u16 = 0x0400;
7
8pub fn mod_mask_for_keycode(kc: KeyCode) -> u16 {
9    use KeyCode::*;
10    match kc {
11        LShift | RShift => 0x8000,
12        LCtrl | RCtrl => 0x4000,
13        LAlt => 0x2000,
14        RAlt => 0x1000,
15        LGui | RGui => 0x0800,
16        // This is not real... this is a marker to help signify that key presses should be
17        // overlapping. The way this will look in the chord sequence is as such:
18        //
19        //   [ (0x0400 | X), (0x0400 | Y), (0x0400) ]
20        ErrorRollOver => KEY_OVERLAP_MARKER,
21        _ => 0,
22    }
23}
24
25#[test]
26fn keys_fit_within_mask() {
27    use crate::keys::OsCode;
28    assert!(MASK_KEYCODES >= u16::from(OsCode::KEY_MAX));
29}