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