Skip to main content

pc_keyboard/layouts/
dvorak104.rs

1//! Dvorak keyboard support
2
3use crate::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers, PhysicalKeyboard, QUO};
4
5/// A Dvorak 101-key (or 104-key including Windows keys) keyboard.
6///
7/// Has a 1-row high Enter key, with Oem5 above (ANSI layout).
8///
9/// These diagrams illustrate the conversion from [`KeyCode`] to Unicode. We
10/// show either a Unicode glyph, or a hex number if the glyph isn't a
11/// printable character. Blank spaces are passed through as
12/// [`DecodedKey::RawKey`].
13///
14/// Run the `print_keyboard` example to re-generate these images.
15///
16/// ## Unmodified
17///
18/// ```text
19/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
20/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
21/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
22///
23/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
24/// │ `  │ 1  │ 2  │ 3  │ 4  │ 5  │ 6  │ 7  │ 8  │ 9  │ 0  │ [  │ ]  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
25/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
26/// │0009 │ '  │ ,  │ .  │ p  │ y  │ f  │ g  │ c  │ r  │ l  │ /  │ =  │   \    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
27/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
28/// │      │ a  │ o  │ e  │ u  │ i  │ d  │ h  │ t  │ n  │ s  │ -  │   000a     │                    │ 4  │ 5  │ 6  │    │
29/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
30/// │         │ ;  │ q  │ j  │ k  │ x  │ b  │ m  │ w  │ v  │ z  │              │       │    │       │ 1  │ 2  │ 3  │    │
31/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
32/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
33/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
34/// ```
35///
36/// ## Caps Lock
37///
38/// ```text
39/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
40/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
41/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
42///
43/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
44/// │ `  │ 1  │ 2  │ 3  │ 4  │ 5  │ 6  │ 7  │ 8  │ 9  │ 0  │ [  │ ]  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
45/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
46/// │0009 │ '  │ ,  │ .  │ P  │ Y  │ F  │ G  │ C  │ R  │ L  │ /  │ =  │   \    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
47/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
48/// │      │ A  │ O  │ E  │ U  │ I  │ D  │ H  │ T  │ N  │ S  │ -  │   000a     │                    │ 4  │ 5  │ 6  │    │
49/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
50/// │         │ ;  │ Q  │ J  │ K  │ X  │ B  │ M  │ W  │ V  │ Z  │              │       │    │       │ 1  │ 2  │ 3  │    │
51/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
52/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
53/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
54/// ```
55///
56/// ## Shifted
57///
58/// ```text
59/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
60/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
61/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
62///
63/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
64/// │ ~  │ !  │ @  │ #  │ $  │ %  │ ^  │ &  │ *  │ (  │ )  │ {  │ }  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
65/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
66/// │0009 │ "  │ <  │ >  │ P  │ Y  │ F  │ G  │ C  │ R  │ L  │ ?  │ +  │   |    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
67/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
68/// │      │ A  │ O  │ E  │ U  │ I  │ D  │ H  │ T  │ N  │ S  │ _  │   000a     │                    │ 4  │ 5  │ 6  │    │
69/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
70/// │         │ :  │ Q  │ J  │ K  │ X  │ B  │ M  │ W  │ V  │ Z  │              │       │    │       │ 1  │ 2  │ 3  │    │
71/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
72/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
73/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
74/// ```
75///
76/// ## Control
77///
78/// ```text
79/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
80/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
81/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
82///
83/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
84/// │ `  │ 1  │ 2  │ 3  │ 4  │ 5  │ 6  │ 7  │ 8  │ 9  │ 0  │ [  │ ]  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
85/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
86/// │0009 │ '  │ ,  │ .  │0010│0019│0006│0007│0003│0012│000c│ /  │ =  │   \    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
87/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
88/// │      │0001│000f│0005│0015│0009│0004│0008│0014│000e│0013│ -  │   000a     │                    │ 4  │ 5  │ 6  │    │
89/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
90/// │         │ ;  │0011│000a│000b│0018│0002│000d│0017│0016│001a│              │       │    │       │ 1  │ 2  │ 3  │    │
91/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
92/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
93/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
94/// ```
95///
96/// ## AltGr
97///
98/// ```text
99/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
100/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
101/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
102///
103/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
104/// │ `  │ 1  │ 2  │ 3  │ 4  │ 5  │ 6  │ 7  │ 8  │ 9  │ 0  │ [  │ ]  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
105/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
106/// │0009 │ '  │ ,  │ .  │ p  │ y  │ f  │ g  │ c  │ r  │ l  │ /  │ =  │   \    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
107/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
108/// │      │ a  │ o  │ e  │ u  │ i  │ d  │ h  │ t  │ n  │ s  │ -  │   000a     │                    │ 4  │ 5  │ 6  │    │
109/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
110/// │         │ ;  │ q  │ j  │ k  │ x  │ b  │ m  │ w  │ v  │ z  │              │       │    │       │ 1  │ 2  │ 3  │    │
111/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
112/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
113/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
114/// ```
115///
116/// ## Shift AltGr
117///
118/// ```text
119/// ┌────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐  ┌────┬────┬────┬────┐   ┌────┬────┬────┐
120/// │001b│  │    │    │    │    │  │    │    │    │    │  │    │    │    │    │   │    │    │    │
121/// └────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘  └────┴────┴────┴────┘   └────┴────┴────┘
122///
123/// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬─────────┐  ┌────┬────┬────┐  ┌────┬────┬────┬────┐
124/// │ ~  │ !  │ @  │ #  │ $  │ %  │ ^  │ &  │ *  │ (  │ )  │ {  │ }  │  0008   │  │    │    │    │  │    │ /  │ *  │ -  │
125/// ├────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬────────┤  ├────┼────┼────┤  ├────┼────┼────┼────┤
126/// │0009 │ "  │ <  │ >  │ P  │ Y  │ F  │ G  │ C  │ R  │ L  │ ?  │ +  │   |    │  │007f│    │    │  │ 7  │ 8  │ 9  │    │
127/// ├─────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴────────┤  └────┴────┴────┘  ├────┼────┼────┤ +  │
128/// │      │ A  │ O  │ E  │ U  │ I  │ D  │ H  │ T  │ N  │ S  │ _  │   000a     │                    │ 4  │ 5  │ 6  │    │
129/// ├──────┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴────────────┤       ┌────┐       ├────┼────┼────┼────┤
130/// │         │ :  │ Q  │ J  │ K  │ X  │ B  │ M  │ W  │ V  │ Z  │              │       │    │       │ 1  │ 2  │ 3  │    │
131/// ├─────┬───┴─┬──┴──┬─┴────┴────┴────┴────┴────┴───┬┴────┼────┴┬──────┬──────┤  ┌────┼────┼────┐  ├────┴────┼────┤000a│
132/// │     │     │     │             0020             │     │     │      │      │  │    │    │    │  │ 0       │ .  │    │
133/// └─────┴─────┴─────┴──────────────────────────────┴─────┴─────┴──────┴──────┘  └────┴────┴────┘  └─────────┴────┴────┘
134/// ```
135pub struct Dvorak104Key;
136
137impl KeyboardLayout for Dvorak104Key {
138    #[rustfmt::skip]
139    fn map_keycode(
140        &self,
141        keycode: KeyCode,
142        modifiers: &Modifiers,
143        handle_ctrl: HandleControl,
144    ) -> DecodedKey {
145        match keycode {
146            // ========= Row 2 (the numbers) =========
147            KeyCode::OemMinus  => modifiers.handle_symbol2('[', '{'),
148            KeyCode::OemPlus   => modifiers.handle_symbol2(']', '}'),
149            // ========= Row 3 (QWERTY) =========
150            KeyCode::Q         => modifiers.handle_symbol2(QUO, '"'),
151            KeyCode::W         => modifiers.handle_symbol2(',', '<'),
152            KeyCode::E         => modifiers.handle_symbol2('.', '>'),
153            KeyCode::R         => modifiers.handle_ascii_2('P', handle_ctrl),
154            KeyCode::T         => modifiers.handle_ascii_2('Y', handle_ctrl),
155            KeyCode::Y         => modifiers.handle_ascii_2('F', handle_ctrl),
156            KeyCode::U         => modifiers.handle_ascii_2('G', handle_ctrl),
157            KeyCode::I         => modifiers.handle_ascii_2('C', handle_ctrl),
158            KeyCode::O         => modifiers.handle_ascii_2('R', handle_ctrl),
159            KeyCode::P         => modifiers.handle_ascii_2('L', handle_ctrl),
160            KeyCode::Oem4      => modifiers.handle_symbol2('/', '?'),
161            KeyCode::Oem6      => modifiers.handle_symbol2('=', '+'),
162            // ========= Row 4 (ASDFG) =========
163            KeyCode::S         => modifiers.handle_ascii_2('O', handle_ctrl),
164            KeyCode::D         => modifiers.handle_ascii_2('E', handle_ctrl),
165            KeyCode::F         => modifiers.handle_ascii_2('U', handle_ctrl),
166            KeyCode::G         => modifiers.handle_ascii_2('I', handle_ctrl),
167            KeyCode::H         => modifiers.handle_ascii_2('D', handle_ctrl),
168            KeyCode::J         => modifiers.handle_ascii_2('H', handle_ctrl),
169            KeyCode::K         => modifiers.handle_ascii_2('T', handle_ctrl),
170            KeyCode::L         => modifiers.handle_ascii_2('N', handle_ctrl),
171            KeyCode::Oem1      => modifiers.handle_ascii_2('S', handle_ctrl),
172            KeyCode::Oem3      => modifiers.handle_symbol2('-', '_'),
173            // ========= Row 5 (ZXCVB) =========
174            KeyCode::Z         => modifiers.handle_symbol2(';', ':'),
175            KeyCode::X         => modifiers.handle_ascii_2('Q', handle_ctrl),
176            KeyCode::C         => modifiers.handle_ascii_2('J', handle_ctrl),
177            KeyCode::V         => modifiers.handle_ascii_2('K', handle_ctrl),
178            KeyCode::B         => modifiers.handle_ascii_2('X', handle_ctrl),
179            KeyCode::N         => modifiers.handle_ascii_2('B', handle_ctrl),
180            KeyCode::OemComma  => modifiers.handle_ascii_2('W', handle_ctrl),
181            KeyCode::OemPeriod => modifiers.handle_ascii_2('V', handle_ctrl),
182            KeyCode::Oem2      => modifiers.handle_ascii_2('Z', handle_ctrl),
183            // ========= Fallback =========
184            e => super::Us104Key.map_keycode(e, modifiers, handle_ctrl),
185        }
186    }
187
188    fn get_physical(&self) -> PhysicalKeyboard {
189        PhysicalKeyboard::Ansi
190    }
191}