1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
pub struct DeadKeys {
    pub acute_accent_bits: Option<u16>,
    pub deadkey_accute_accent: Option<u16>,
    pub cedilla_bits: Option<u16>,
    pub deadkey_cedilla: Option<u16>,
    pub diaeresis_bits: Option<u16>,
    pub deadkey_diaeresis: Option<u16>,
    pub grave_accent_bits: Option<u16>,
    pub deadkey_grave_accent: Option<u16>,
    pub circumflex_bits: Option<u16>,
    pub deadkey_circumflex: Option<u16>,
    pub tilde_bits: Option<u16>,
    pub deadkey_tilde: Option<u16>,
}

pub struct Layout {
    pub shift_mask: u16,
    pub alt_mask: Option<u16>,
    pub ctrl_mask: Option<u16>,
    pub non_us: Option<u16>,
    pub dead_keys_mask: Option<u16>,
    pub keycode_mask: u16,
    pub keycodes: Box<[u16]>,
    pub deadkeys: DeadKeys,
}

impl DeadKeys {
    pub fn new(
        acute_accent_bits: Option<u16>,
        deadkey_accute_accent: Option<u16>,
        cedilla_bits: Option<u16>,
        deadkey_cedilla: Option<u16>,
        diaeresis_bits: Option<u16>,
        deadkey_diaeresis: Option<u16>,
        grave_accent_bits: Option<u16>,
        deadkey_grave_accent: Option<u16>,
        circumflex_bits: Option<u16>,
        deadkey_circumflex: Option<u16>,
        tilde_bits: Option<u16>,
        deadkey_tilde: Option<u16>,
    ) -> DeadKeys {
        DeadKeys {
            acute_accent_bits,
            deadkey_accute_accent,
            cedilla_bits,
            deadkey_cedilla,
            diaeresis_bits,
            deadkey_diaeresis,
            grave_accent_bits,
            deadkey_grave_accent,
            circumflex_bits,
            deadkey_circumflex,
            tilde_bits,
            deadkey_tilde,
        }
    }
}

impl Layout {
    pub fn new(
        shift_mask: u16,
        alt_mask: Option<u16>,
        ctrl_mask: Option<u16>,
        non_us: Option<u16>,
        dead_keys_mask: Option<u16>,
        keycode_mask: u16,
        keycodes: Vec<u16>,
        deadkeys: DeadKeys,
    ) -> Layout {
        let keycodes = keycodes.into_boxed_slice();
        Layout {
            shift_mask,
            alt_mask,
            ctrl_mask,
            non_us,
            dead_keys_mask,
            keycode_mask,
            keycodes,
            deadkeys,
        }
    }
}