pc_keyboard/layouts/dvorak104.rs
1//! Dvorak keyboard support
2
3use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers, PhysicalKeyboard, QUO};
4
5/// A Dvorak 101-key (or 104-key including Windows keys) keyboard.
6///
7/// Has a 1-row high Enter key, with Oem5 above (ANSI layout).
8///
9/// These diagrams illustrate the conversion from [`KeyCode`] to Unicode. We
10/// show either a Unicode glyph, or a hex number if the glyph isn't a
11/// printable character. Blank spaces are passed through as
12/// [`DecodedKey::RawKey`].
13///
14/// Run the `print_keyboard` example to re-generate these images.
15///
16/// ## Unmodified
17///
18/// ```text
19/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
20/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
21/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
22///
23/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
24/// │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ [ │ ] │ 0008 │ │ │ │ │ │ │ / │ * │ - │
25/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
26/// │0009 │ ' │ , │ . │ p │ y │ f │ g │ c │ r │ l │ / │ = │ \ │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
27/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
28/// │ │ a │ o │ e │ u │ i │ d │ h │ t │ n │ s │ - │ 000a │ │ 4 │ 5 │ 6 │ │
29/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
30/// │ │ ; │ q │ j │ k │ x │ b │ m │ w │ v │ z │ │ │ │ │ 1 │ 2 │ 3 │ │
31/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
32/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
33/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
34/// ```
35///
36/// ## Caps Lock
37///
38/// ```text
39/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
40/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
41/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
42///
43/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
44/// │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ [ │ ] │ 0008 │ │ │ │ │ │ │ / │ * │ - │
45/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
46/// │0009 │ ' │ , │ . │ P │ Y │ F │ G │ C │ R │ L │ / │ = │ \ │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
47/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
48/// │ │ A │ O │ E │ U │ I │ D │ H │ T │ N │ S │ - │ 000a │ │ 4 │ 5 │ 6 │ │
49/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
50/// │ │ ; │ Q │ J │ K │ X │ B │ M │ W │ V │ Z │ │ │ │ │ 1 │ 2 │ 3 │ │
51/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
52/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
53/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
54/// ```
55///
56/// ## Shifted
57///
58/// ```text
59/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
60/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
61/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
62///
63/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
64/// │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ { │ } │ 0008 │ │ │ │ │ │ │ / │ * │ - │
65/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
66/// │0009 │ " │ < │ > │ P │ Y │ F │ G │ C │ R │ L │ ? │ + │ | │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
67/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
68/// │ │ A │ O │ E │ U │ I │ D │ H │ T │ N │ S │ _ │ 000a │ │ 4 │ 5 │ 6 │ │
69/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
70/// │ │ : │ Q │ J │ K │ X │ B │ M │ W │ V │ Z │ │ │ │ │ 1 │ 2 │ 3 │ │
71/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
72/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
73/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
74/// ```
75///
76/// ## Control
77///
78/// ```text
79/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
80/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
81/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
82///
83/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
84/// │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ [ │ ] │ 0008 │ │ │ │ │ │ │ / │ * │ - │
85/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
86/// │0009 │ ' │ , │ . │0010│0019│0006│0007│0003│0012│000c│ / │ = │ \ │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
87/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
88/// │ │0001│000f│0005│0015│0009│0004│0008│0014│000e│0013│ - │ 000a │ │ 4 │ 5 │ 6 │ │
89/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
90/// │ │ ; │0011│000a│000b│0018│0002│000d│0017│0016│001a│ │ │ │ │ 1 │ 2 │ 3 │ │
91/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
92/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
93/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
94/// ```
95///
96/// ## AltGr
97///
98/// ```text
99/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
100/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
101/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
102///
103/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
104/// │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ [ │ ] │ 0008 │ │ │ │ │ │ │ / │ * │ - │
105/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
106/// │0009 │ ' │ , │ . │ p │ y │ f │ g │ c │ r │ l │ / │ = │ \ │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
107/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
108/// │ │ a │ o │ e │ u │ i │ d │ h │ t │ n │ s │ - │ 000a │ │ 4 │ 5 │ 6 │ │
109/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
110/// │ │ ; │ q │ j │ k │ x │ b │ m │ w │ v │ z │ │ │ │ │ 1 │ 2 │ 3 │ │
111/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
112/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
113/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
114/// ```
115///
116/// ## Shift AltGr
117///
118/// ```text
119/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
120/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
121/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
122///
123/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
124/// │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ { │ } │ 0008 │ │ │ │ │ │ │ / │ * │ - │
125/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
126/// │0009 │ " │ < │ > │ P │ Y │ F │ G │ C │ R │ L │ ? │ + │ | │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
127/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤ └────┴────┴────┘ ├────┼────┼────┤ + │
128/// │ │ A │ O │ E │ U │ I │ D │ H │ T │ N │ S │ _ │ 000a │ │ 4 │ 5 │ 6 │ │
129/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤ ┌────┐ ├────┼────┼────┼────┤
130/// │ │ : │ Q │ J │ K │ X │ B │ M │ W │ V │ Z │ │ │ │ │ 1 │ 2 │ 3 │ │
131/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
132/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ . │ │
133/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
134/// ```
135pub struct Dvorak104Key;
136
137impl KeyboardLayout for Dvorak104Key {
138 #[rustfmt::skip]
139 fn map_keycode(
140 &self,
141 keycode: KeyCode,
142 modifiers: &Modifiers,
143 handle_ctrl: HandleControl,
144 ) -> DecodedKey {
145 match keycode {
146 // ========= Row 2 (the numbers) =========
147 KeyCode::OemMinus => modifiers.handle_symbol2('[', '{'),
148 KeyCode::OemPlus => modifiers.handle_symbol2(']', '}'),
149 // ========= Row 3 (QWERTY) =========
150 KeyCode::Q => modifiers.handle_symbol2(QUO, '"'),
151 KeyCode::W => modifiers.handle_symbol2(',', '<'),
152 KeyCode::E => modifiers.handle_symbol2('.', '>'),
153 KeyCode::R => modifiers.handle_ascii_2('P', handle_ctrl),
154 KeyCode::T => modifiers.handle_ascii_2('Y', handle_ctrl),
155 KeyCode::Y => modifiers.handle_ascii_2('F', handle_ctrl),
156 KeyCode::U => modifiers.handle_ascii_2('G', handle_ctrl),
157 KeyCode::I => modifiers.handle_ascii_2('C', handle_ctrl),
158 KeyCode::O => modifiers.handle_ascii_2('R', handle_ctrl),
159 KeyCode::P => modifiers.handle_ascii_2('L', handle_ctrl),
160 KeyCode::Oem4 => modifiers.handle_symbol2('/', '?'),
161 KeyCode::Oem6 => modifiers.handle_symbol2('=', '+'),
162 // ========= Row 4 (ASDFG) =========
163 KeyCode::S => modifiers.handle_ascii_2('O', handle_ctrl),
164 KeyCode::D => modifiers.handle_ascii_2('E', handle_ctrl),
165 KeyCode::F => modifiers.handle_ascii_2('U', handle_ctrl),
166 KeyCode::G => modifiers.handle_ascii_2('I', handle_ctrl),
167 KeyCode::H => modifiers.handle_ascii_2('D', handle_ctrl),
168 KeyCode::J => modifiers.handle_ascii_2('H', handle_ctrl),
169 KeyCode::K => modifiers.handle_ascii_2('T', handle_ctrl),
170 KeyCode::L => modifiers.handle_ascii_2('N', handle_ctrl),
171 KeyCode::Oem1 => modifiers.handle_ascii_2('S', handle_ctrl),
172 KeyCode::Oem3 => modifiers.handle_symbol2('-', '_'),
173 // ========= Row 5 (ZXCVB) =========
174 KeyCode::Z => modifiers.handle_symbol2(';', ':'),
175 KeyCode::X => modifiers.handle_ascii_2('Q', handle_ctrl),
176 KeyCode::C => modifiers.handle_ascii_2('J', handle_ctrl),
177 KeyCode::V => modifiers.handle_ascii_2('K', handle_ctrl),
178 KeyCode::B => modifiers.handle_ascii_2('X', handle_ctrl),
179 KeyCode::N => modifiers.handle_ascii_2('B', handle_ctrl),
180 KeyCode::OemComma => modifiers.handle_ascii_2('W', handle_ctrl),
181 KeyCode::OemPeriod => modifiers.handle_ascii_2('V', handle_ctrl),
182 KeyCode::Oem2 => modifiers.handle_ascii_2('Z', handle_ctrl),
183 // ========= Fallback =========
184 e => super::Us104Key.map_keycode(e, modifiers, handle_ctrl),
185 }
186 }
187
188 fn get_physical(&self) -> PhysicalKeyboard {
189 PhysicalKeyboard::Ansi
190 }
191}