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;
8pub use self::dvorak_programmer104::DVP104Key;
9
10mod dvorak104;
11pub use self::dvorak104::Dvorak104Key;
12
13mod us104;
14pub use self::us104::Us104Key;
15
16mod uk105;
17pub use self::uk105::Uk105Key;
18
19mod jis109;
20pub use self::jis109::Jis109Key;
21
22mod azerty;
23pub use self::azerty::Azerty;
24
25mod colemak;
26pub use self::colemak::Colemak;
27
28mod de105;
29pub use self::de105::De105Key;
30
31mod no105;
32pub use self::no105::No105Key;
33
34mod fi_se105;
35pub use self::fi_se105::FiSe105Key;
36
37/// A enum of all the supported keyboard layouts.
38pub enum AnyLayout {
39    DVP104Key(DVP104Key),
40    Dvorak104Key(Dvorak104Key),
41    Us104Key(Us104Key),
42    Uk105Key(Uk105Key),
43    Jis109Key(Jis109Key),
44    Azerty(Azerty),
45    Colemak(Colemak),
46    De105Key(De105Key),
47    No105Key(No105Key),
48    FiSe105Key(FiSe105Key),
49}
50
51impl super::KeyboardLayout for AnyLayout {
52    fn map_keycode(
53        &self,
54        keycode: super::KeyCode,
55        modifiers: &super::Modifiers,
56        handle_ctrl: super::HandleControl,
57    ) -> super::DecodedKey {
58        match self {
59            AnyLayout::DVP104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
60            AnyLayout::Dvorak104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
61            AnyLayout::Us104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
62            AnyLayout::Uk105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
63            AnyLayout::Jis109Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
64            AnyLayout::Azerty(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
65            AnyLayout::Colemak(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
66            AnyLayout::De105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
67            AnyLayout::No105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
68            AnyLayout::FiSe105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
69        }
70    }
71}
72
73impl super::KeyboardLayout for &AnyLayout {
74    fn map_keycode(
75        &self,
76        keycode: super::KeyCode,
77        modifiers: &super::Modifiers,
78        handle_ctrl: super::HandleControl,
79    ) -> super::DecodedKey {
80        match self {
81            AnyLayout::DVP104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
82            AnyLayout::Dvorak104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
83            AnyLayout::Us104Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
84            AnyLayout::Uk105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
85            AnyLayout::Jis109Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
86            AnyLayout::Azerty(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
87            AnyLayout::Colemak(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
88            AnyLayout::De105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
89            AnyLayout::No105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
90            AnyLayout::FiSe105Key(inner) => inner.map_keycode(keycode, modifiers, handle_ctrl),
91        }
92    }
93}
94
95#[cfg(test)]
96mod test {
97    use super::*;
98    use crate::*;
99
100    #[test]
101    fn test_any() {
102        let mut decoder = EventDecoder::new(AnyLayout::Uk105Key(Uk105Key), HandleControl::Ignore);
103        // Q gets you a 'q'
104        let decoded = decoder.process_keyevent(KeyEvent {
105            code: KeyCode::Q,
106            state: KeyState::Down,
107        });
108        assert_eq!(decoded, Some(DecodedKey::Unicode('q')));
109        // Swap the layout
110        decoder.change_layout(AnyLayout::Azerty(Azerty));
111        // Q gets you a 'a'
112        let decoded = decoder.process_keyevent(KeyEvent {
113            code: KeyCode::Q,
114            state: KeyState::Down,
115        });
116        assert_eq!(decoded, Some(DecodedKey::Unicode('a')));
117    }
118}