pc_keyboard/layouts/
de105.rs

1//! German keyboard support
2
3use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
4
5/// A standard German 102-key (or 105-key including Windows keys) keyboard.
6///
7/// The top row spells `QWERTZ`.
8///
9/// Has a 2-row high Enter key, with Oem5 next to the left shift (ISO format).
10pub struct De105Key;
11
12impl KeyboardLayout for De105Key {
13    fn map_keycode(
14        &self,
15        keycode: KeyCode,
16        modifiers: &Modifiers,
17        handle_ctrl: HandleControl,
18    ) -> DecodedKey {
19        let map_to_unicode = handle_ctrl == HandleControl::MapLettersToUnicode;
20        match keycode {
21            KeyCode::Escape => DecodedKey::Unicode(0x1B.into()),
22            KeyCode::Oem8 => {
23                if modifiers.is_shifted() {
24                    DecodedKey::Unicode('°')
25                } else {
26                    DecodedKey::Unicode('^')
27                }
28            }
29            KeyCode::Key1 => {
30                if modifiers.is_shifted() {
31                    DecodedKey::Unicode('!')
32                } else {
33                    DecodedKey::Unicode('1')
34                }
35            }
36            KeyCode::Key2 => {
37                if modifiers.is_shifted() {
38                    DecodedKey::Unicode('"')
39                } else {
40                    DecodedKey::Unicode('2')
41                }
42            }
43            KeyCode::Key3 => {
44                if modifiers.is_shifted() {
45                    DecodedKey::Unicode('§')
46                } else {
47                    DecodedKey::Unicode('3')
48                }
49            }
50            KeyCode::Key4 => {
51                if modifiers.is_shifted() {
52                    DecodedKey::Unicode('$')
53                } else {
54                    DecodedKey::Unicode('4')
55                }
56            }
57            KeyCode::Key5 => {
58                if modifiers.is_shifted() {
59                    DecodedKey::Unicode('%')
60                } else {
61                    DecodedKey::Unicode('5')
62                }
63            }
64            KeyCode::Key6 => {
65                if modifiers.is_shifted() {
66                    DecodedKey::Unicode('&')
67                } else {
68                    DecodedKey::Unicode('6')
69                }
70            }
71            KeyCode::Key7 => {
72                if modifiers.is_shifted() {
73                    DecodedKey::Unicode('/')
74                } else {
75                    DecodedKey::Unicode('7')
76                }
77            }
78            KeyCode::Key8 => {
79                if modifiers.is_shifted() {
80                    DecodedKey::Unicode('(')
81                } else {
82                    DecodedKey::Unicode('8')
83                }
84            }
85            KeyCode::Key9 => {
86                if modifiers.is_shifted() {
87                    DecodedKey::Unicode(')')
88                } else {
89                    DecodedKey::Unicode('9')
90                }
91            }
92            KeyCode::Key0 => {
93                if modifiers.is_shifted() {
94                    DecodedKey::Unicode('=')
95                } else {
96                    DecodedKey::Unicode('0')
97                }
98            }
99            KeyCode::OemMinus => {
100                if modifiers.is_shifted() {
101                    DecodedKey::Unicode('?')
102                } else {
103                    DecodedKey::Unicode('ß')
104                }
105            }
106            KeyCode::OemPlus => {
107                if modifiers.is_shifted() {
108                    DecodedKey::Unicode('`')
109                } else {
110                    DecodedKey::Unicode('´')
111                }
112            }
113            KeyCode::Backspace => DecodedKey::Unicode(0x08.into()),
114            KeyCode::Tab => DecodedKey::Unicode(0x09.into()),
115            KeyCode::Q => {
116                if map_to_unicode && modifiers.is_ctrl() {
117                    DecodedKey::Unicode('\u{0011}')
118                } else if modifiers.is_altgr() {
119                    DecodedKey::Unicode('@')
120                } else if modifiers.is_caps() {
121                    DecodedKey::Unicode('Q')
122                } else {
123                    DecodedKey::Unicode('q')
124                }
125            }
126            KeyCode::E => {
127                if map_to_unicode && modifiers.is_ctrl() {
128                    DecodedKey::Unicode('\u{0005}')
129                } else if modifiers.is_altgr() {
130                    DecodedKey::Unicode('€')
131                } else if modifiers.is_caps() {
132                    DecodedKey::Unicode('E')
133                } else {
134                    DecodedKey::Unicode('e')
135                }
136            }
137            KeyCode::Y => {
138                if map_to_unicode && modifiers.is_ctrl() {
139                    DecodedKey::Unicode('\u{0014}')
140                } else if modifiers.is_caps() {
141                    DecodedKey::Unicode('Z')
142                } else {
143                    DecodedKey::Unicode('z')
144                }
145            }
146            KeyCode::Oem4 => {
147                if modifiers.is_caps() {
148                    DecodedKey::Unicode('Ü')
149                } else {
150                    DecodedKey::Unicode('ü')
151                }
152            }
153            KeyCode::Oem6 => {
154                if modifiers.is_altgr() {
155                    DecodedKey::Unicode('~')
156                } else if modifiers.is_caps() {
157                    DecodedKey::Unicode('*')
158                } else {
159                    DecodedKey::Unicode('+')
160                }
161            }
162            KeyCode::Return => DecodedKey::Unicode(10.into()),
163            KeyCode::Oem7 => {
164                if modifiers.is_shifted() {
165                    DecodedKey::Unicode('\'')
166                } else {
167                    DecodedKey::Unicode('#')
168                }
169            }
170            KeyCode::Oem1 => {
171                if modifiers.is_shifted() {
172                    DecodedKey::Unicode('Ö')
173                } else {
174                    DecodedKey::Unicode('ö')
175                }
176            }
177            KeyCode::Oem3 => {
178                if modifiers.is_shifted() {
179                    DecodedKey::Unicode('Ä')
180                } else {
181                    DecodedKey::Unicode('ä')
182                }
183            }
184            KeyCode::Z => {
185                if map_to_unicode && modifiers.is_ctrl() {
186                    DecodedKey::Unicode('\u{001A}')
187                } else if modifiers.is_caps() {
188                    DecodedKey::Unicode('Y')
189                } else {
190                    DecodedKey::Unicode('y')
191                }
192            }
193            KeyCode::OemComma => {
194                if modifiers.is_shifted() {
195                    DecodedKey::Unicode(';')
196                } else {
197                    DecodedKey::Unicode(',')
198                }
199            }
200            KeyCode::OemPeriod => {
201                if modifiers.is_shifted() {
202                    DecodedKey::Unicode(':')
203                } else {
204                    DecodedKey::Unicode('.')
205                }
206            }
207            KeyCode::Oem2 => {
208                if modifiers.is_shifted() {
209                    DecodedKey::Unicode('_')
210                } else {
211                    DecodedKey::Unicode('-')
212                }
213            }
214            KeyCode::Oem5 => {
215                if modifiers.is_shifted() {
216                    DecodedKey::Unicode('>')
217                } else if modifiers.is_altgr() {
218                    DecodedKey::Unicode('|')
219                } else {
220                    DecodedKey::Unicode('<')
221                }
222            }
223            e => {
224                let us = super::Us104Key;
225                us.map_keycode(e, modifiers, handle_ctrl)
226            }
227        }
228    }
229}