dreg_core/
context.rs

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/// A button's scancode. Maps directly to the `evdev` scancodes.
70///
71/// A value of `0` is "reserved" (always invalid).
72///
73/// See https://github.com/emberian/evdev/blob/main/src/scancodes.rs#L26-L572 for reference.
74/// ```
75/// [1]   [59][60][61][62]   [63][64][65][66]   [67][68][87][88]
76/// [41][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11][12][13][  14  ]
77/// [ 15 ][16][17][18][19][20][21][22][23][24][25][26][27][ 43 ]
78/// [  58  ][30][31][32][33][34][35][36][37][38][39][40][  28  ]
79/// [   42   ][44][45][46][47][48][49][50][52][52][53][   54   ]
80/// [29][125][56][           57           ][100][0x1d0][139][97]
81/// ```
82#[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), // ???
183            ',' => (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}