Skip to main content

pc_keyboard/layouts/
mod.rs

1//! Implements the various keyboard layouts.
2//!
3//! We have one layout per file, but where two layouts are similar, you can
4//! handle all the 'different' keys first, and then jump to another handler -
5//! see [`Uk105Key`] and [`Us104Key`] as an example of that.
6
7mod dvorak_programmer104;
8use crate::PhysicalKeyboard;
9
10pub use self::dvorak_programmer104::DVP104Key;
11
12mod dvorak104;
13pub use self::dvorak104::Dvorak104Key;
14
15mod us104;
16pub use self::us104::Us104Key;
17
18mod uk105;
19pub use self::uk105::Uk105Key;
20
21mod jis109;
22pub use self::jis109::Jis109Key;
23
24mod azerty;
25pub use self::azerty::Azerty;
26
27mod colemak;
28pub use self::colemak::Colemak;
29
30mod de105;
31pub use self::de105::De105Key;
32
33mod no105;
34pub use self::no105::No105Key;
35
36mod fi_se105;
37pub use self::fi_se105::FiSe105Key;
38
39/// A enum of all the supported keyboard layouts.
40pub enum AnyLayout {
41    DVP104Key(DVP104Key),
42    Dvorak104Key(Dvorak104Key),
43    Us104Key(Us104Key),
44    Uk105Key(Uk105Key),
45    Jis109Key(Jis109Key),
46    Azerty(Azerty),
47    Colemak(Colemak),
48    De105Key(De105Key),
49    No105Key(No105Key),
50    FiSe105Key(FiSe105Key),
51}
52
53impl super::KeyboardLayout for AnyLayout {
54    fn map_keycode(
55        &self,
56        keycode: super::KeyCode,
57        modifiers: &super::Modifiers,
58        handle_ctrl: super::HandleControl,
59    ) -> super::DecodedKey {
60        match self {
61            AnyLayout::DVP104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
62            AnyLayout::Dvorak104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
63            AnyLayout::Us104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
64            AnyLayout::Uk105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
65            AnyLayout::Jis109Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
66            AnyLayout::Azerty(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
67            AnyLayout::Colemak(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
68            AnyLayout::De105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
69            AnyLayout::No105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
70            AnyLayout::FiSe105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
71        }
72    }
73
74    fn get_physical(&self) -> PhysicalKeyboard {
75        match self {
76            AnyLayout::DVP104Key(inner) => inner.get_physical(),
77            AnyLayout::Dvorak104Key(inner) => inner.get_physical(),
78            AnyLayout::Us104Key(inner) => inner.get_physical(),
79            AnyLayout::Uk105Key(inner) => inner.get_physical(),
80            AnyLayout::Jis109Key(inner) => inner.get_physical(),
81            AnyLayout::Azerty(inner) => inner.get_physical(),
82            AnyLayout::Colemak(inner) => inner.get_physical(),
83            AnyLayout::De105Key(inner) => inner.get_physical(),
84            AnyLayout::No105Key(inner) => inner.get_physical(),
85            AnyLayout::FiSe105Key(inner) => inner.get_physical(),
86        }
87    }
88}
89
90impl super::KeyboardLayout for &AnyLayout {
91    fn map_keycode(
92        &self,
93        keycode: super::KeyCode,
94        modifiers: &super::Modifiers,
95        handle_ctrl: super::HandleControl,
96    ) -> super::DecodedKey {
97        match self {
98            AnyLayout::DVP104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
99            AnyLayout::Dvorak104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
100            AnyLayout::Us104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
101            AnyLayout::Uk105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
102            AnyLayout::Jis109Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
103            AnyLayout::Azerty(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
104            AnyLayout::Colemak(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
105            AnyLayout::De105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
106            AnyLayout::No105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
107            AnyLayout::FiSe105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
108        }
109    }
110
111    fn get_physical(&self) -> PhysicalKeyboard {
112        match self {
113            AnyLayout::DVP104Key(inner) => inner.get_physical(),
114            AnyLayout::Dvorak104Key(inner) => inner.get_physical(),
115            AnyLayout::Us104Key(inner) => inner.get_physical(),
116            AnyLayout::Uk105Key(inner) => inner.get_physical(),
117            AnyLayout::Jis109Key(inner) => inner.get_physical(),
118            AnyLayout::Azerty(inner) => inner.get_physical(),
119            AnyLayout::Colemak(inner) => inner.get_physical(),
120            AnyLayout::De105Key(inner) => inner.get_physical(),
121            AnyLayout::No105Key(inner) => inner.get_physical(),
122            AnyLayout::FiSe105Key(inner) => inner.get_physical(),
123        }
124    }
125}
126
127#[cfg(test)]
128mod test {
129    use super::*;
130    use crate::*;
131
132    #[test]
133    fn test_any() {
134        let mut decoder = EventDecoder::new(AnyLayout::Uk105Key(Uk105Key), HandleControl::Ignore);
135        // Q gets you a 'q'
136        let decoded = decoder.process_keyevent(KeyEvent {
137            code: KeyCode::Q,
138            state: KeyState::Down,
139        });
140        assert_eq!(decoded, Some(DecodedKey::Unicode('q')));
141        // Swap the layout
142        decoder.change_layout(AnyLayout::Azerty(Azerty));
143        // Q gets you a 'a'
144        let decoded = decoder.process_keyevent(KeyEvent {
145            code: KeyCode::Q,
146            state: KeyState::Down,
147        });
148        assert_eq!(decoded, Some(DecodedKey::Unicode('a')));
149    }
150}