pc_keyboard/layouts/no105.rs
1//! Norwegian keyboard support
2
3use crate::{
4 DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers, PhysicalKeyboard, QUO, SLS,
5};
6
7/// A standard Norwegian 102-key (or 105-key including Windows keys) keyboard.
8///
9/// Has a 2-row high Enter key, with Oem5 next to the left shift (ISO format).
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/// │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ \ │ 0008 │ │ │ │ │ │ │ / │ * │ - │
27/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
28/// │0009 │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ å │ ¨ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
29/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
30/// │ │ a │ s │ d │ f │ g │ h │ j │ k │ l │ ø │ æ │ ' │ │ │ 4 │ 5 │ 6 │ │
31/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
32/// │ │ < │ z │ x │ c │ v │ b │ n │ m │ , │ . │ - │ │ │ │ │ 1 │ 2 │ 3 │ │
33/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
34/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
35/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
36/// ```
37///
38/// ## Caps Lock
39///
40/// ```text
41/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
42/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
43/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
44///
45/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
46/// │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ \ │ 0008 │ │ │ │ │ │ │ / │ * │ - │
47/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
48/// │0009 │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Å │ ¨ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
49/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
50/// │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ø │ Æ │ ' │ │ │ 4 │ 5 │ 6 │ │
51/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
52/// │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │ │ │ │ 1 │ 2 │ 3 │ │
53/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
54/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
55/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
56/// ```
57///
58/// ## Shifted
59///
60/// ```text
61/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
62/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
63/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
64///
65/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
66/// │ § │ ! │ " │ # │ ¤ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ 0008 │ │ │ │ │ │ │ / │ * │ - │
67/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
68/// │0009 │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Å │ ^ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
69/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
70/// │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ø │ Æ │ * │ │ │ 4 │ 5 │ 6 │ │
71/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
72/// │ │ > │ Z │ X │ C │ V │ B │ N │ M │ ; │ : │ _ │ │ │ │ │ 1 │ 2 │ 3 │ │
73/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
74/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
75/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
76/// ```
77///
78/// ## Control
79///
80/// ```text
81/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
82/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
83/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
84///
85/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
86/// │ | │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ \ │ 0008 │ │ │ │ │ │ │ / │ * │ - │
87/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
88/// │0009 │0011│0017│0005│0012│0014│0019│0015│0009│000f│0010│ å │ ¨ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
89/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
90/// │ │0001│0013│0004│0006│0007│0008│000a│000b│000c│ ø │ æ │ ' │ │ │ 4 │ 5 │ 6 │ │
91/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
92/// │ │ < │001a│0018│0003│0016│0002│000e│000d│ , │ . │ - │ │ │ │ │ 1 │ 2 │ 3 │ │
93/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
94/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
95/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
96/// ```
97///
98/// ## AltGr
99///
100/// ```text
101/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
102/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
103/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
104///
105/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
106/// │ | │ 1 │ @ │ £ │ $ │ 5 │ 6 │ { │ [ │ ] │ } │ + │ ´ │ 0008 │ │ │ │ │ │ │ / │ * │ - │
107/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
108/// │0009 │ q │ w │ € │ r │ t │ y │ u │ i │ o │ p │ å │ ~ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
109/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
110/// │ │ a │ s │ d │ f │ g │ h │ j │ k │ l │ ø │ æ │ ' │ │ │ 4 │ 5 │ 6 │ │
111/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
112/// │ │ < │ z │ x │ c │ v │ b │ n │ µ │ , │ . │ - │ │ │ │ │ 1 │ 2 │ 3 │ │
113/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
114/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
115/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
116/// ```
117///
118/// ## Shift AltGr
119///
120/// ```text
121/// ┌────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┬────┐ ┌────┬────┬────┐
122/// │001b│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
123/// └────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┴────┘ └────┴────┴────┘
124///
125/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐ ┌────┬────┬────┐ ┌────┬────┬────┬────┐
126/// │ § │ ! │ @ │ £ │ $ │ % │ & │ { │ [ │ ] │ } │ ? │ ´ │ 0008 │ │ │ │ │ │ │ / │ * │ - │
127/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤ ├────┼────┼────┤ ├────┼────┼────┼────┤
128/// │0009 │ Q │ W │ € │ R │ T │ Y │ U │ I │ O │ P │ Å │ ~ │ 000a │ │007f│ │ │ │ 7 │ 8 │ 9 │ │
129/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │ └────┴────┴────┘ ├────┼────┼────┤ + │
130/// │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ø │ Æ │ * │ │ │ 4 │ 5 │ 6 │ │
131/// ├────┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────┴───────┤ ┌────┐ ├────┼────┼────┼────┤
132/// │ │ > │ Z │ X │ C │ V │ B │ N │ µ │ ; │ : │ _ │ │ │ │ │ 1 │ 2 │ 3 │ │
133/// ├────┴┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤ ┌────┼────┼────┐ ├────┴────┼────┤000a│
134/// │ │ │ │ 0020 │ │ │ │ │ │ │ │ │ │ 0 │ , │ │
135/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘ └────┴────┴────┘ └─────────┴────┴────┘
136/// ```
137pub struct No105Key;
138
139impl KeyboardLayout for No105Key {
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::Key2 => modifiers.handle_symbol3('2', '"', '@'),
151 KeyCode::Key3 => modifiers.handle_symbol3('3', '#', '£'),
152 KeyCode::Key4 => modifiers.handle_symbol3('4', '¤', '$'),
153 KeyCode::Key5 => modifiers.handle_symbol2('5', '%'),
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_symbol2('+', '?'),
160 KeyCode::OemPlus => modifiers.handle_symbol3(SLS, '`', '´'),
161 // ========= Row 3 (QWERTY) =========
162 KeyCode::E => modifiers.handle_ascii_3('E', '€', handle_ctrl),
163 KeyCode::Oem4 => modifiers.handle_letter2('å', 'Å'),
164 KeyCode::Oem6 => modifiers.handle_symbol3('¨', '^', '~'),
165 // ========= Row 4 (ASDF) =========
166 KeyCode::Oem7 => modifiers.handle_symbol2(QUO, '*'),
167 KeyCode::Oem1 => modifiers.handle_letter2('ø', 'Ø'),
168 KeyCode::Oem3 => modifiers.handle_letter2('æ', 'Æ'),
169 // ========= Row 5 (ZXCV) =========
170 KeyCode::Oem5 => modifiers.handle_symbol2('<', '>'),
171 KeyCode::M => modifiers.handle_ascii_3('M', 'µ', handle_ctrl),
172 KeyCode::OemComma => modifiers.handle_symbol2(',', ';'),
173 KeyCode::OemPeriod => modifiers.handle_symbol2('.', ':'),
174 KeyCode::Oem2 => modifiers.handle_symbol2('-', '_'),
175 // ========= Row 6 (modifers and space bar) =========
176 KeyCode::NumpadPeriod if modifiers.numlock => DecodedKey::Unicode(','),
177 // ========= Fallback =========
178 e => super::Us104Key.map_keycode(e, modifiers, handle_ctrl),
179 }
180 }
181
182 fn get_physical(&self) -> PhysicalKeyboard {
183 PhysicalKeyboard::Iso
184 }
185}