Skip to main content

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}