Skip to main content

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}