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