pc_keyboard/layouts/
no105.rs

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