1use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
4
5pub 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 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 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 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 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 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}