pc_keyboard/layouts/
colemak.rs

1//! The Colemak keyboard support
2
3use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
4
5/// A Colemak 101-key (or 104-key including Windows keys) keyboard.
6///
7/// Has a 1-row high Enter key, with Oem5 above (ANSI layout).
8pub struct Colemak;
9
10impl KeyboardLayout for Colemak {
11    fn map_keycode(
12        &self,
13        keycode: KeyCode,
14        modifiers: &Modifiers,
15        handle_ctrl: HandleControl,
16    ) -> DecodedKey {
17        let map_to_unicode = handle_ctrl == HandleControl::MapLettersToUnicode;
18        match keycode {
19            KeyCode::Oem8 => {
20                if modifiers.is_shifted() {
21                    DecodedKey::Unicode('~')
22                } else {
23                    DecodedKey::Unicode('`')
24                }
25            }
26            KeyCode::Escape => DecodedKey::Unicode(0x1B.into()),
27            KeyCode::Key1 => {
28                if modifiers.is_shifted() {
29                    DecodedKey::Unicode('!')
30                } else {
31                    DecodedKey::Unicode('1')
32                }
33            }
34            KeyCode::Key2 => {
35                if modifiers.is_shifted() {
36                    DecodedKey::Unicode('@')
37                } else {
38                    DecodedKey::Unicode('2')
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_shifted() {
50                    DecodedKey::Unicode('$')
51                } else {
52                    DecodedKey::Unicode('4')
53                }
54            }
55            KeyCode::Key5 => {
56                if modifiers.is_shifted() {
57                    DecodedKey::Unicode('%')
58                } else {
59                    DecodedKey::Unicode('5')
60                }
61            }
62            KeyCode::Key6 => {
63                if modifiers.is_shifted() {
64                    DecodedKey::Unicode('^')
65                } else {
66                    DecodedKey::Unicode('6')
67                }
68            }
69            KeyCode::Key7 => {
70                if modifiers.is_shifted() {
71                    DecodedKey::Unicode('&')
72                } else {
73                    DecodedKey::Unicode('7')
74                }
75            }
76            KeyCode::Key8 => {
77                if modifiers.is_shifted() {
78                    DecodedKey::Unicode('*')
79                } else {
80                    DecodedKey::Unicode('8')
81                }
82            }
83            KeyCode::Key9 => {
84                if modifiers.is_shifted() {
85                    DecodedKey::Unicode('(')
86                } else {
87                    DecodedKey::Unicode('9')
88                }
89            }
90            KeyCode::Key0 => {
91                if modifiers.is_shifted() {
92                    DecodedKey::Unicode(')')
93                } else {
94                    DecodedKey::Unicode('0')
95                }
96            }
97            KeyCode::OemMinus => {
98                if modifiers.is_shifted() {
99                    DecodedKey::Unicode('_')
100                } else {
101                    DecodedKey::Unicode('-')
102                }
103            }
104            KeyCode::OemPlus => {
105                if modifiers.is_shifted() {
106                    DecodedKey::Unicode('+')
107                } else {
108                    DecodedKey::Unicode('=')
109                }
110            }
111            KeyCode::Backspace => DecodedKey::Unicode(0x08.into()),
112            KeyCode::Tab => DecodedKey::Unicode(0x09.into()),
113            KeyCode::Q => {
114                if map_to_unicode && modifiers.is_ctrl() {
115                    DecodedKey::Unicode('\u{0011}')
116                } else if modifiers.is_caps() {
117                    DecodedKey::Unicode('Q')
118                } else {
119                    DecodedKey::Unicode('q')
120                }
121            }
122            KeyCode::W => {
123                if map_to_unicode && modifiers.is_ctrl() {
124                    DecodedKey::Unicode('\u{0017}')
125                } else if modifiers.is_caps() {
126                    DecodedKey::Unicode('W')
127                } else {
128                    DecodedKey::Unicode('w')
129                }
130            }
131            KeyCode::E => {
132                if map_to_unicode && modifiers.is_ctrl() {
133                    DecodedKey::Unicode('\u{0006}')
134                } else if modifiers.is_caps() {
135                    DecodedKey::Unicode('F')
136                } else {
137                    DecodedKey::Unicode('f')
138                }
139            }
140            KeyCode::R => {
141                if map_to_unicode && modifiers.is_ctrl() {
142                    DecodedKey::Unicode('\u{0012}')
143                } else if modifiers.is_caps() {
144                    DecodedKey::Unicode('P')
145                } else {
146                    DecodedKey::Unicode('p')
147                }
148            }
149            KeyCode::T => {
150                if map_to_unicode && modifiers.is_ctrl() {
151                    DecodedKey::Unicode('\u{0007}')
152                } else if modifiers.is_caps() {
153                    DecodedKey::Unicode('G')
154                } else {
155                    DecodedKey::Unicode('g')
156                }
157            }
158            KeyCode::Y => {
159                if map_to_unicode && modifiers.is_ctrl() {
160                    DecodedKey::Unicode('\u{000A}')
161                } else if modifiers.is_caps() {
162                    DecodedKey::Unicode('J')
163                } else {
164                    DecodedKey::Unicode('j')
165                }
166            }
167            KeyCode::U => {
168                if map_to_unicode && modifiers.is_ctrl() {
169                    DecodedKey::Unicode('\u{000C}')
170                } else if modifiers.is_caps() {
171                    DecodedKey::Unicode('L')
172                } else {
173                    DecodedKey::Unicode('l')
174                }
175            }
176            KeyCode::I => {
177                if map_to_unicode && modifiers.is_ctrl() {
178                    DecodedKey::Unicode('\u{0015}')
179                } else if modifiers.is_caps() {
180                    DecodedKey::Unicode('U')
181                } else {
182                    DecodedKey::Unicode('u')
183                }
184            }
185            KeyCode::O => {
186                if map_to_unicode && modifiers.is_ctrl() {
187                    DecodedKey::Unicode('\u{0019}')
188                } else if modifiers.is_caps() {
189                    DecodedKey::Unicode('Y')
190                } else {
191                    DecodedKey::Unicode('y')
192                }
193            }
194            KeyCode::P => {
195                if modifiers.is_caps() {
196                    DecodedKey::Unicode(':')
197                } else {
198                    DecodedKey::Unicode(';')
199                }
200            }
201            KeyCode::Oem4 => {
202                if modifiers.is_shifted() {
203                    DecodedKey::Unicode('{')
204                } else {
205                    DecodedKey::Unicode('[')
206                }
207            }
208            KeyCode::Oem6 => {
209                if modifiers.is_shifted() {
210                    DecodedKey::Unicode('}')
211                } else {
212                    DecodedKey::Unicode(']')
213                }
214            }
215            KeyCode::Oem7 => {
216                if modifiers.is_shifted() {
217                    DecodedKey::Unicode('|')
218                } else {
219                    DecodedKey::Unicode('\\')
220                }
221            }
222            KeyCode::A => {
223                if map_to_unicode && modifiers.is_ctrl() {
224                    DecodedKey::Unicode('\u{0001}')
225                } else if modifiers.is_caps() {
226                    DecodedKey::Unicode('A')
227                } else {
228                    DecodedKey::Unicode('a')
229                }
230            }
231            KeyCode::S => {
232                if map_to_unicode && modifiers.is_ctrl() {
233                    DecodedKey::Unicode('\u{0012}')
234                } else if modifiers.is_caps() {
235                    DecodedKey::Unicode('R')
236                } else {
237                    DecodedKey::Unicode('r')
238                }
239            }
240            KeyCode::D => {
241                if map_to_unicode && modifiers.is_ctrl() {
242                    DecodedKey::Unicode('\u{0013}')
243                } else if modifiers.is_caps() {
244                    DecodedKey::Unicode('S')
245                } else {
246                    DecodedKey::Unicode('s')
247                }
248            }
249            KeyCode::F => {
250                if map_to_unicode && modifiers.is_ctrl() {
251                    DecodedKey::Unicode('\u{0014}')
252                } else if modifiers.is_caps() {
253                    DecodedKey::Unicode('T')
254                } else {
255                    DecodedKey::Unicode('t')
256                }
257            }
258            KeyCode::G => {
259                if map_to_unicode && modifiers.is_ctrl() {
260                    DecodedKey::Unicode('\u{0004}')
261                } else if modifiers.is_caps() {
262                    DecodedKey::Unicode('D')
263                } else {
264                    DecodedKey::Unicode('d')
265                }
266            }
267            KeyCode::H => {
268                if map_to_unicode && modifiers.is_ctrl() {
269                    DecodedKey::Unicode('\u{0008}')
270                } else if modifiers.is_caps() {
271                    DecodedKey::Unicode('H')
272                } else {
273                    DecodedKey::Unicode('h')
274                }
275            }
276            KeyCode::J => {
277                if map_to_unicode && modifiers.is_ctrl() {
278                    DecodedKey::Unicode('\u{000E}')
279                } else if modifiers.is_caps() {
280                    DecodedKey::Unicode('N')
281                } else {
282                    DecodedKey::Unicode('n')
283                }
284            }
285            KeyCode::K => {
286                if map_to_unicode && modifiers.is_ctrl() {
287                    DecodedKey::Unicode('\u{0005}')
288                } else if modifiers.is_caps() {
289                    DecodedKey::Unicode('E')
290                } else {
291                    DecodedKey::Unicode('e')
292                }
293            }
294            KeyCode::L => {
295                if map_to_unicode && modifiers.is_ctrl() {
296                    DecodedKey::Unicode('\u{0009}')
297                } else if modifiers.is_caps() {
298                    DecodedKey::Unicode('I')
299                } else {
300                    DecodedKey::Unicode('i')
301                }
302            }
303            KeyCode::Oem1 => {
304                if map_to_unicode && modifiers.is_ctrl() {
305                    DecodedKey::Unicode('\u{000F}')
306                } else if modifiers.is_shifted() {
307                    DecodedKey::Unicode('O')
308                } else {
309                    DecodedKey::Unicode('o')
310                }
311            }
312            KeyCode::Oem3 => {
313                if modifiers.is_shifted() {
314                    DecodedKey::Unicode('"')
315                } else {
316                    DecodedKey::Unicode('\'')
317                }
318            }
319            // Enter gives LF, not CRLF or CR
320            KeyCode::Return => DecodedKey::Unicode(10.into()),
321            KeyCode::Z => {
322                if map_to_unicode && modifiers.is_ctrl() {
323                    DecodedKey::Unicode('\u{001A}')
324                } else if modifiers.is_caps() {
325                    DecodedKey::Unicode('Z')
326                } else {
327                    DecodedKey::Unicode('z')
328                }
329            }
330            KeyCode::X => {
331                if map_to_unicode && modifiers.is_ctrl() {
332                    DecodedKey::Unicode('\u{0018}')
333                } else if modifiers.is_caps() {
334                    DecodedKey::Unicode('X')
335                } else {
336                    DecodedKey::Unicode('x')
337                }
338            }
339            KeyCode::C => {
340                if map_to_unicode && modifiers.is_ctrl() {
341                    DecodedKey::Unicode('\u{0003}')
342                } else if modifiers.is_caps() {
343                    DecodedKey::Unicode('C')
344                } else {
345                    DecodedKey::Unicode('c')
346                }
347            }
348            KeyCode::V => {
349                if map_to_unicode && modifiers.is_ctrl() {
350                    DecodedKey::Unicode('\u{0016}')
351                } else if modifiers.is_caps() {
352                    DecodedKey::Unicode('V')
353                } else {
354                    DecodedKey::Unicode('v')
355                }
356            }
357            KeyCode::B => {
358                if map_to_unicode && modifiers.is_ctrl() {
359                    DecodedKey::Unicode('\u{0002}')
360                } else if modifiers.is_caps() {
361                    DecodedKey::Unicode('B')
362                } else {
363                    DecodedKey::Unicode('b')
364                }
365            }
366            KeyCode::N => {
367                if map_to_unicode && modifiers.is_ctrl() {
368                    DecodedKey::Unicode('\u{000B}')
369                } else if modifiers.is_caps() {
370                    DecodedKey::Unicode('K')
371                } else {
372                    DecodedKey::Unicode('k')
373                }
374            }
375            KeyCode::M => {
376                if map_to_unicode && modifiers.is_ctrl() {
377                    DecodedKey::Unicode('\u{000D}')
378                } else if modifiers.is_caps() {
379                    DecodedKey::Unicode('M')
380                } else {
381                    DecodedKey::Unicode('m')
382                }
383            }
384            KeyCode::OemComma => {
385                if modifiers.is_shifted() {
386                    DecodedKey::Unicode('<')
387                } else {
388                    DecodedKey::Unicode(',')
389                }
390            }
391            KeyCode::OemPeriod => {
392                if modifiers.is_shifted() {
393                    DecodedKey::Unicode('>')
394                } else {
395                    DecodedKey::Unicode('.')
396                }
397            }
398            KeyCode::Oem2 => {
399                if modifiers.is_shifted() {
400                    DecodedKey::Unicode('?')
401                } else {
402                    DecodedKey::Unicode('/')
403                }
404            }
405            KeyCode::Spacebar => DecodedKey::Unicode(' '),
406            KeyCode::Delete => DecodedKey::Unicode(127.into()),
407            KeyCode::NumpadDivide => DecodedKey::Unicode('/'),
408            KeyCode::NumpadMultiply => DecodedKey::Unicode('*'),
409            KeyCode::NumpadSubtract => DecodedKey::Unicode('-'),
410            KeyCode::Numpad7 => {
411                if modifiers.numlock {
412                    DecodedKey::Unicode('7')
413                } else {
414                    DecodedKey::RawKey(KeyCode::Home)
415                }
416            }
417            KeyCode::Numpad8 => {
418                if modifiers.numlock {
419                    DecodedKey::Unicode('8')
420                } else {
421                    DecodedKey::RawKey(KeyCode::ArrowUp)
422                }
423            }
424            KeyCode::Numpad9 => {
425                if modifiers.numlock {
426                    DecodedKey::Unicode('9')
427                } else {
428                    DecodedKey::RawKey(KeyCode::PageUp)
429                }
430            }
431            KeyCode::NumpadAdd => DecodedKey::Unicode('+'),
432            KeyCode::Numpad4 => {
433                if modifiers.numlock {
434                    DecodedKey::Unicode('4')
435                } else {
436                    DecodedKey::RawKey(KeyCode::ArrowLeft)
437                }
438            }
439            KeyCode::Numpad5 => DecodedKey::Unicode('5'),
440            KeyCode::Numpad6 => {
441                if modifiers.numlock {
442                    DecodedKey::Unicode('6')
443                } else {
444                    DecodedKey::RawKey(KeyCode::ArrowRight)
445                }
446            }
447            KeyCode::Numpad1 => {
448                if modifiers.numlock {
449                    DecodedKey::Unicode('1')
450                } else {
451                    DecodedKey::RawKey(KeyCode::End)
452                }
453            }
454            KeyCode::Numpad2 => {
455                if modifiers.numlock {
456                    DecodedKey::Unicode('2')
457                } else {
458                    DecodedKey::RawKey(KeyCode::ArrowDown)
459                }
460            }
461            KeyCode::Numpad3 => {
462                if modifiers.numlock {
463                    DecodedKey::Unicode('3')
464                } else {
465                    DecodedKey::RawKey(KeyCode::PageDown)
466                }
467            }
468            KeyCode::Numpad0 => {
469                if modifiers.numlock {
470                    DecodedKey::Unicode('0')
471                } else {
472                    DecodedKey::RawKey(KeyCode::Insert)
473                }
474            }
475            KeyCode::NumpadPeriod => {
476                if modifiers.numlock {
477                    DecodedKey::Unicode('.')
478                } else {
479                    DecodedKey::Unicode(127.into())
480                }
481            }
482            KeyCode::NumpadEnter => DecodedKey::Unicode(10.into()),
483            k => DecodedKey::RawKey(k),
484        }
485    }
486}