1
2
3use std::collections::HashSet;
4
5
6
7pub struct Context {
8 keys_down: HashSet<Scancode>,
9 last_mouse_pos: Option<(u16, u16)>,
10}
11
12impl Default for Context {
13 fn default() -> Self {
14 Self {
15 keys_down: HashSet::new(),
16 last_mouse_pos: None,
17 }
18 }
19}
20
21impl Context {
22 pub fn handle_input(&mut self, input: Input) {
23 match input {
24 Input::KeyDown(code) => {
25 let _repeat = self.handle_key_down(code);
26 }
27 Input::KeyUp(code) => {
28 let _valid_keypress = self.handle_key_up(&code);
29 }
30 Input::MouseMove(x, y) => {
31 self.last_mouse_pos = Some((x, y));
32 }
33 _ => {}
34 }
35 }
36
37 pub fn handle_key_down(&mut self, code: Scancode) -> bool {
38 self.keys_down.insert(code)
39 }
40
41 pub fn handle_key_up(&mut self, code: &Scancode) -> bool {
42 self.keys_down.remove(&code)
43 }
44
45 pub fn keys_down(&self) -> &HashSet<Scancode> {
46 &self.keys_down
47 }
48
49 pub fn last_mouse_pos(&self) -> Option<(u16, u16)> {
50 self.last_mouse_pos
51 }
52}
53
54
55
56#[derive(Clone, Copy)]
57pub enum Input {
58 KeyDown(Scancode),
59 KeyUp(Scancode),
60 MouseMove(u16, u16),
61
62 FocusChange(bool),
63 Resize(u16, u16),
64
65 Null,
66}
67
68
69#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
83pub struct Scancode(pub u16);
84
85impl From<u16> for Scancode {
86 fn from(value: u16) -> Self {
87 Self(value)
88 }
89}
90
91impl Scancode {
92 pub fn from_char(c: char) -> (Option<Self>, Self) {
93 match c {
94 'a' => (None, Self::A),
95 'A' => (Some(Self::L_SHIFT), Self::A),
96 'b' => (None, Self::B),
97 'B' => (Some(Self::L_SHIFT), Self::B),
98 'c' => (None, Self::C),
99 'C' => (Some(Self::L_SHIFT), Self::C),
100 'd' => (None, Self::D),
101 'D' => (Some(Self::L_SHIFT), Self::D),
102 'e' => (None, Self::E),
103 'E' => (Some(Self::L_SHIFT), Self::E),
104 'f' => (None, Self::F),
105 'F' => (Some(Self::L_SHIFT), Self::F),
106 'g' => (None, Self::G),
107 'G' => (Some(Self::L_SHIFT), Self::G),
108 'h' => (None, Self::H),
109 'H' => (Some(Self::L_SHIFT), Self::H),
110 'i' => (None, Self::I),
111 'I' => (Some(Self::L_SHIFT), Self::I),
112 'j' => (None, Self::J),
113 'J' => (Some(Self::L_SHIFT), Self::J),
114 'k' => (None, Self::K),
115 'K' => (Some(Self::L_SHIFT), Self::K),
116 'l' => (None, Self::L),
117 'L' => (Some(Self::L_SHIFT), Self::L),
118 'm' => (None, Self::M),
119 'M' => (Some(Self::L_SHIFT), Self::M),
120 'n' => (None, Self::N),
121 'N' => (Some(Self::L_SHIFT), Self::N),
122 'o' => (None, Self::O),
123 'O' => (Some(Self::L_SHIFT), Self::O),
124 'p' => (None, Self::P),
125 'P' => (Some(Self::L_SHIFT), Self::P),
126 'q' => (None, Self::Q),
127 'Q' => (Some(Self::L_SHIFT), Self::Q),
128 'r' => (None, Self::R),
129 'R' => (Some(Self::L_SHIFT), Self::R),
130 's' => (None, Self::S),
131 'S' => (Some(Self::L_SHIFT), Self::S),
132 't' => (None, Self::T),
133 'T' => (Some(Self::L_SHIFT), Self::T),
134 'u' => (None, Self::U),
135 'U' => (Some(Self::L_SHIFT), Self::U),
136 'v' => (None, Self::V),
137 'V' => (Some(Self::L_SHIFT), Self::V),
138 'w' => (None, Self::W),
139 'W' => (Some(Self::L_SHIFT), Self::W),
140 'x' => (None, Self::X),
141 'X' => (Some(Self::L_SHIFT), Self::X),
142 'y' => (None, Self::Y),
143 'Y' => (Some(Self::L_SHIFT), Self::Y),
144
145 '1' => (None, Self::K_1),
146 '!' => (Some(Self::L_SHIFT), Self::K_1),
147 '2' => (None, Self::K_2),
148 '@' => (Some(Self::L_SHIFT), Self::K_2),
149 '3' => (None, Self::K_3),
150 '#' => (Some(Self::L_SHIFT), Self::K_3),
151 '4' => (None, Self::K_4),
152 '$' => (Some(Self::L_SHIFT), Self::K_4),
153 '5' => (None, Self::K_5),
154 '%' => (Some(Self::L_SHIFT), Self::K_5),
155 '6' => (None, Self::K_6),
156 '^' => (Some(Self::L_SHIFT), Self::K_6),
157 '7' => (None, Self::K_7),
158 '&' => (Some(Self::L_SHIFT), Self::K_7),
159 '8' => (None, Self::K_8),
160 '*' => (Some(Self::L_SHIFT), Self::K_8),
161 '9' => (None, Self::K_9),
162 '(' => (Some(Self::L_SHIFT), Self::K_9),
163 '0' => (None, Self::K_0),
164 ')' => (Some(Self::L_SHIFT), Self::K_0),
165
166 '`' => (None, Self::GRAVE),
167 '~' => (Some(Self::L_SHIFT), Self::GRAVE),
168 '-' => (None, Self::MINUS),
169 '_' => (Some(Self::L_SHIFT), Self::MINUS),
170 '=' => (None, Self::EQUAL),
171 '+' => (Some(Self::L_SHIFT), Self::EQUAL),
172 '[' => (None, Self::L_BRACE),
173 '{' => (Some(Self::L_SHIFT), Self::L_BRACE),
174 ']' => (None, Self::R_BRACE),
175 '}' => (Some(Self::L_SHIFT), Self::R_BRACE),
176 '\\' => (None, Self::BACKSLASH),
177 '|' => (Some(Self::L_SHIFT), Self::BACKSLASH),
178 ';' => (None, Self::SEMICOLON),
179 ':' => (Some(Self::L_SHIFT), Self::SEMICOLON),
180 '\'' => (None, Self::APOSTROPHE),
181 '"' => (Some(Self::L_SHIFT), Self::APOSTROPHE),
182 '\n' => (None, Self::ENTER), ',' => (None, Self::COMMA),
184 '<' => (Some(Self::L_SHIFT), Self::COMMA),
185 '.' => (None, Self::DOT),
186 '>' => (Some(Self::L_SHIFT), Self::DOT),
187 '/' => (None, Self::SLASH),
188 '?' => (Some(Self::L_SHIFT), Self::SLASH),
189
190 _ => (None, Self(0)),
191 }
192 }
193}
194
195impl Scancode {
196 pub const NULL: Self = Self(0);
197
198 pub const ESC: Self = Self(1);
199 pub const K_1: Self = Self(2);
200 pub const K_2: Self = Self(3);
201 pub const K_3: Self = Self(4);
202 pub const K_4: Self = Self(5);
203 pub const K_5: Self = Self(6);
204 pub const K_6: Self = Self(7);
205 pub const K_7: Self = Self(8);
206 pub const K_8: Self = Self(9);
207 pub const K_9: Self = Self(10);
208 pub const K_0: Self = Self(11);
209 pub const MINUS: Self = Self(12);
210 pub const EQUAL: Self = Self(13);
211 pub const BACKSPACE: Self = Self(14);
212 pub const TAB: Self = Self(15);
213 pub const Q: Self = Self(16);
214 pub const W: Self = Self(17);
215 pub const E: Self = Self(18);
216 pub const R: Self = Self(19);
217 pub const T: Self = Self(20);
218 pub const Y: Self = Self(21);
219 pub const U: Self = Self(22);
220 pub const I: Self = Self(23);
221 pub const O: Self = Self(24);
222 pub const P: Self = Self(25);
223 pub const L_BRACE: Self = Self(26);
224 pub const R_BRACE: Self = Self(27);
225 pub const ENTER: Self = Self(28);
226 pub const L_CTRL: Self = Self(29);
227 pub const A: Self = Self(30);
228 pub const S: Self = Self(31);
229 pub const D: Self = Self(32);
230 pub const F: Self = Self(33);
231 pub const G: Self = Self(34);
232 pub const H: Self = Self(35);
233 pub const J: Self = Self(36);
234 pub const K: Self = Self(37);
235 pub const L: Self = Self(38);
236 pub const SEMICOLON: Self = Self(39);
237 pub const APOSTROPHE: Self = Self(40);
238 pub const GRAVE: Self = Self(41);
239 pub const L_SHIFT: Self = Self(42);
240 pub const BACKSLASH: Self = Self(43);
241 pub const Z: Self = Self(44);
242 pub const X: Self = Self(45);
243 pub const C: Self = Self(46);
244 pub const V: Self = Self(47);
245 pub const B: Self = Self(48);
246 pub const N: Self = Self(49);
247 pub const M: Self = Self(50);
248 pub const COMMA: Self = Self(51);
249 pub const DOT: Self = Self(52);
250 pub const SLASH: Self = Self(53);
251 pub const R_SHIFT: Self = Self(54);
252 pub const KP_ASTERISK: Self = Self(55);
253 pub const L_ALT: Self = Self(56);
254 pub const SPACE: Self = Self(57);
255 pub const CAPSLOCK: Self = Self(58);
256 pub const F1: Self = Self(59);
257 pub const F2: Self = Self(60);
258 pub const F3: Self = Self(61);
259 pub const F4: Self = Self(62);
260 pub const F5: Self = Self(63);
261 pub const F6: Self = Self(64);
262 pub const F7: Self = Self(65);
263 pub const F8: Self = Self(66);
264 pub const F9: Self = Self(67);
265 pub const F10: Self = Self(68);
266
267 pub const R_CTRL: Self = Self(97);
268 pub const R_ALT: Self = Self(100);
269
270 pub const HOME: Self = Self(102);
271 pub const UP: Self = Self(103);
272 pub const PAGEUP: Self = Self(104);
273 pub const LEFT: Self = Self(105);
274 pub const RIGHT: Self = Self(106);
275 pub const END: Self = Self(107);
276 pub const DOWN: Self = Self(108);
277 pub const PAGEDOWN: Self = Self(109);
278 pub const INSERT: Self = Self(110);
279 pub const DELETE: Self = Self(111);
280
281 pub const SCROLLUP: Self = Self(177);
282 pub const SCROLLDOWN: Self = Self(178);
283 pub const LMB: Self = Self(0x110);
284 pub const RMB: Self = Self(0x111);
285 pub const MMB: Self = Self(0x112);
286}