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