pc_keyboard/layouts/
dvorak_programmer104.rs

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