pc_keyboard/layouts/
uk105.rs

1//! United Kingdom keyboard support
2
3use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
4
5/// A standard United Kingdom 102-key (or 105-key including Windows keys) keyboard.
6///
7/// Has a 2-row high Enter key, with Oem5 next to the left shift (ISO format).
8pub struct Uk105Key;
9
10impl KeyboardLayout for Uk105Key {
11    fn map_keycode(
12        &self,
13        keycode: KeyCode,
14        modifiers: &Modifiers,
15        handle_ctrl: HandleControl,
16    ) -> DecodedKey {
17        match keycode {
18            KeyCode::Oem8 => {
19                if modifiers.is_altgr() {
20                    DecodedKey::Unicode('|')
21                } else if modifiers.is_shifted() {
22                    DecodedKey::Unicode('¬')
23                } else {
24                    DecodedKey::Unicode('`')
25                }
26            }
27            KeyCode::Key2 => {
28                if modifiers.is_shifted() {
29                    DecodedKey::Unicode('"')
30                } else {
31                    DecodedKey::Unicode('2')
32                }
33            }
34            KeyCode::Oem3 => {
35                if modifiers.is_shifted() {
36                    DecodedKey::Unicode('@')
37                } else {
38                    DecodedKey::Unicode('\'')
39                }
40            }
41            KeyCode::Key3 => {
42                if modifiers.is_shifted() {
43                    DecodedKey::Unicode('£')
44                } else {
45                    DecodedKey::Unicode('3')
46                }
47            }
48            KeyCode::Key4 => {
49                if modifiers.is_altgr() {
50                    DecodedKey::Unicode('€')
51                } else if modifiers.is_shifted() {
52                    DecodedKey::Unicode('$')
53                } else {
54                    DecodedKey::Unicode('4')
55                }
56            }
57            KeyCode::Oem7 => {
58                if modifiers.is_shifted() {
59                    DecodedKey::Unicode('~')
60                } else {
61                    DecodedKey::Unicode('#')
62                }
63            }
64            KeyCode::Oem5 => {
65                if modifiers.is_shifted() {
66                    DecodedKey::Unicode('|')
67                } else {
68                    DecodedKey::Unicode('\\')
69                }
70            }
71            e => {
72                let us = super::Us104Key;
73                us.map_keycode(e, modifiers, handle_ctrl)
74            }
75        }
76    }
77}
78
79#[cfg(test)]
80mod test {
81    use super::*;
82    use crate::{EventDecoder, HandleControl, Keyboard, ScancodeSet, ScancodeSet1, ScancodeSet2};
83
84    #[test]
85    fn layout() {
86        // Codes taken from https://kbdlayout.info/kbduk/overview+scancodes?arrangement=ISO105
87        let mut s = ScancodeSet1::new();
88        let mut dec = EventDecoder::new(Uk105Key, HandleControl::Ignore);
89        let data = [
90            (0x29, '`'),
91            (0x02, '1'),
92            (0x03, '2'),
93            (0x04, '3'),
94            (0x05, '4'),
95            (0x06, '5'),
96            (0x07, '6'),
97            (0x08, '7'),
98            (0x09, '8'),
99            (0x0a, '9'),
100            (0x0b, '0'),
101            (0x0c, '-'),
102            (0x0d, '='),
103            (0x0f, '\t'),
104            (0x10, 'q'),
105            (0x11, 'w'),
106            (0x12, 'e'),
107            (0x13, 'r'),
108            (0x14, 't'),
109            (0x15, 'y'),
110            (0x16, 'u'),
111            (0x17, 'i'),
112            (0x18, 'o'),
113            (0x19, 'p'),
114            (0x1a, '['),
115            (0x1b, ']'),
116            (0x1e, 'a'),
117            (0x1f, 's'),
118            (0x20, 'd'),
119            (0x21, 'f'),
120            (0x22, 'g'),
121            (0x23, 'h'),
122            (0x24, 'j'),
123            (0x25, 'k'),
124            (0x26, 'l'),
125            (0x27, ';'),
126            (0x28, '\''),
127            (0x2B, '#'),
128            (0x1c, '\n'),
129            (0x56, '\\'),
130            (0x2c, 'z'),
131            (0x2d, 'x'),
132            (0x2e, 'c'),
133            (0x2f, 'v'),
134            (0x30, 'b'),
135            (0x31, 'n'),
136            (0x32, 'm'),
137            (0x33, ','),
138            (0x34, '.'),
139            (0x35, '/'),
140        ];
141        for (code, unicode) in data {
142            let ev = s.advance_state(code).unwrap().unwrap();
143            assert_eq!(Some(DecodedKey::Unicode(unicode)), dec.process_keyevent(ev));
144        }
145    }
146
147    #[test]
148    fn test_hash() {
149        let mut k = Keyboard::new(
150            ScancodeSet2::new(),
151            Uk105Key,
152            HandleControl::MapLettersToUnicode,
153        );
154        // As seen on a UK 105 key Dell PS/2 keyboard when pressing `~#`
155        let ev = k.add_byte(0x5D).unwrap().unwrap();
156        let decoded_key = k.process_keyevent(ev);
157        assert_eq!(decoded_key, Some(DecodedKey::Unicode('#')));
158    }
159
160    #[test]
161    fn test_backslash() {
162        let mut k = Keyboard::new(
163            ScancodeSet2::new(),
164            Uk105Key,
165            HandleControl::MapLettersToUnicode,
166        );
167        // As seen on a UK 105 key Dell PS/2 keyboard when pressing `|\`
168        let ev = k.add_byte(0x61).unwrap().unwrap();
169        let decoded_key = k.process_keyevent(ev);
170        assert_eq!(decoded_key, Some(DecodedKey::Unicode('\\')));
171    }
172
173    #[test]
174    fn test_tilde() {
175        let mut k = Keyboard::new(
176            ScancodeSet2::new(),
177            Uk105Key,
178            HandleControl::MapLettersToUnicode,
179        );
180        // As seen on a UK 105 key Dell PS/2 keyboard when pressing Shift and `~#`
181        let ev = k.add_byte(0x12).unwrap().unwrap();
182        let _ = k.process_keyevent(ev);
183        let ev = k.add_byte(0x5D).unwrap().unwrap();
184        let decoded_key = k.process_keyevent(ev);
185        assert_eq!(decoded_key, Some(DecodedKey::Unicode('~')));
186    }
187
188    #[test]
189    fn test_pipe() {
190        let mut k = Keyboard::new(
191            ScancodeSet2::new(),
192            Uk105Key,
193            HandleControl::MapLettersToUnicode,
194        );
195        // As seen on a UK 105 key Dell PS/2 keyboard when pressing Shift and `|\`
196        let ev = k.add_byte(0x12).unwrap().unwrap();
197        let _ = k.process_keyevent(ev);
198        let ev = k.add_byte(0x61).unwrap().unwrap();
199        let decoded_key = k.process_keyevent(ev);
200        assert_eq!(decoded_key, Some(DecodedKey::Unicode('|')));
201    }
202}