1mod 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
39pub 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 let decoded = decoder.process_keyevent(KeyEvent {
137 code: KeyCode::Q,
138 state: KeyState::Down,
139 });
140 assert_eq!(decoded, Some(DecodedKey::Unicode('q')));
141 decoder.change_layout(AnyLayout::Azerty(Azerty));
143 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}