pc_keyboard/layouts/
dvorak_programmer104.rs1use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
4
5pub 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}