1#[cfg(windows)]
2use windows::Win32::UI::Input::KeyboardAndMouse::*;
3
4#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum KeyState {
7 Pressed,
8 Released,
9}
10
11impl std::fmt::Display for KeyState {
12 #[inline]
13 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14 write!(f, "{:?}", self)
15 }
16}
17
18#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
19#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20pub enum VirtualKey {
21 Esc,
22 Tab,
23 CapsLock,
24 Shift,
25 Ctrl,
26 Alt,
27 BackSpace,
28 Enter,
29 Space,
30 PrintScreen,
31 ScrollLock,
32 Pause,
33 Insert,
34 Delete,
35 Home,
36 End,
37 PageUp,
38 PageDown,
39 Up,
40 Down,
41 Left,
42 Right,
43 Key1,
44 Key2,
45 Key3,
46 Key4,
47 Key5,
48 Key6,
49 Key7,
50 Key8,
51 Key9,
52 Key0,
53 A,
54 B,
55 C,
56 D,
57 E,
58 F,
59 G,
60 H,
61 I,
62 J,
63 K,
64 L,
65 M,
66 N,
67 O,
68 P,
69 Q,
70 R,
71 S,
72 T,
73 U,
74 V,
75 W,
76 X,
77 Y,
78 Z,
79 F1,
80 F2,
81 F3,
82 F4,
83 F5,
84 F6,
85 F7,
86 F8,
87 F9,
88 F10,
89 F11,
90 F12,
91 F13,
92 F14,
93 F15,
94 F16,
95 F17,
96 F18,
97 F19,
98 F20,
99 F21,
100 F22,
101 F23,
102 F24,
103 NumLock,
104 Num1,
105 Num2,
106 Num3,
107 Num4,
108 Num5,
109 Num6,
110 Num7,
111 Num8,
112 Num9,
113 Num0,
114 NumAdd,
115 NumSub,
116 NumMul,
117 NumDiv,
118 NumDecimal,
119 Other(u32),
120}
121
122impl std::fmt::Display for VirtualKey {
123 #[inline]
124 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
125 write!(f, "{:?}", self)
126 }
127}
128
129#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
130#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
131pub struct ScanCode(pub u32);
132
133impl std::fmt::Display for ScanCode {
134 #[inline]
135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
136 write!(f, "{}", self.0)
137 }
138}
139
140#[derive(Clone, Copy, Debug)]
141pub struct KeyCode {
142 pub vkey: VirtualKey,
143 pub scan_code: ScanCode,
144}
145
146impl KeyCode {
147 #[inline]
148 pub fn new(vkey: VirtualKey, scan_code: ScanCode) -> Self {
149 Self { vkey, scan_code }
150 }
151}
152
153impl PartialEq for KeyCode {
154 #[inline]
155 fn eq(&self, other: &Self) -> bool {
156 self.vkey == other.vkey
157 }
158}
159
160impl Eq for KeyCode {}
161
162#[cfg(windows)]
163impl From<VIRTUAL_KEY> for VirtualKey {
164 fn from(value: VIRTUAL_KEY) -> Self {
165 match value {
166 VK_1 => VirtualKey::Key1,
167 VK_2 => VirtualKey::Key2,
168 VK_3 => VirtualKey::Key3,
169 VK_4 => VirtualKey::Key4,
170 VK_5 => VirtualKey::Key5,
171 VK_6 => VirtualKey::Key6,
172 VK_7 => VirtualKey::Key7,
173 VK_8 => VirtualKey::Key8,
174 VK_9 => VirtualKey::Key9,
175 VK_0 => VirtualKey::Key0,
176 VK_A => VirtualKey::A,
177 VK_B => VirtualKey::B,
178 VK_C => VirtualKey::C,
179 VK_D => VirtualKey::D,
180 VK_E => VirtualKey::E,
181 VK_F => VirtualKey::F,
182 VK_G => VirtualKey::G,
183 VK_H => VirtualKey::H,
184 VK_I => VirtualKey::I,
185 VK_J => VirtualKey::J,
186 VK_K => VirtualKey::K,
187 VK_L => VirtualKey::L,
188 VK_M => VirtualKey::M,
189 VK_N => VirtualKey::N,
190 VK_O => VirtualKey::O,
191 VK_P => VirtualKey::P,
192 VK_Q => VirtualKey::Q,
193 VK_R => VirtualKey::R,
194 VK_S => VirtualKey::S,
195 VK_T => VirtualKey::T,
196 VK_U => VirtualKey::U,
197 VK_V => VirtualKey::V,
198 VK_W => VirtualKey::W,
199 VK_X => VirtualKey::X,
200 VK_Y => VirtualKey::Y,
201 VK_Z => VirtualKey::Z,
202 VK_NUMPAD1 => VirtualKey::Num1,
203 VK_NUMPAD2 => VirtualKey::Num2,
204 VK_NUMPAD3 => VirtualKey::Num3,
205 VK_NUMPAD4 => VirtualKey::Num4,
206 VK_NUMPAD5 => VirtualKey::Num5,
207 VK_NUMPAD6 => VirtualKey::Num6,
208 VK_NUMPAD7 => VirtualKey::Num7,
209 VK_NUMPAD8 => VirtualKey::Num8,
210 VK_NUMPAD9 => VirtualKey::Num9,
211 VK_NUMPAD0 => VirtualKey::Num0,
212 VK_ESCAPE => VirtualKey::Esc,
213 VK_TAB => VirtualKey::Tab,
214 VK_CAPITAL => VirtualKey::CapsLock,
215 VK_SHIFT => VirtualKey::Shift,
216 VK_CONTROL => VirtualKey::Ctrl,
217 VK_MENU => VirtualKey::Alt,
218 VK_BACK => VirtualKey::BackSpace,
219 VK_RETURN => VirtualKey::Enter,
220 VK_SPACE => VirtualKey::Space,
221 VK_SNAPSHOT => VirtualKey::PrintScreen,
222 VK_SCROLL => VirtualKey::ScrollLock,
223 VK_PAUSE => VirtualKey::Pause,
224 VK_INSERT => VirtualKey::Insert,
225 VK_DELETE => VirtualKey::Delete,
226 VK_HOME => VirtualKey::Home,
227 VK_END => VirtualKey::End,
228 VK_PRIOR => VirtualKey::PageUp,
229 VK_NEXT => VirtualKey::PageDown,
230 VK_UP => VirtualKey::Up,
231 VK_DOWN => VirtualKey::Down,
232 VK_LEFT => VirtualKey::Left,
233 VK_RIGHT => VirtualKey::Right,
234 VK_NUMLOCK => VirtualKey::NumLock,
235 VK_ADD => VirtualKey::NumAdd,
236 VK_SUBTRACT => VirtualKey::NumSub,
237 VK_MULTIPLY => VirtualKey::NumMul,
238 VK_DIVIDE => VirtualKey::NumDiv,
239 VK_DECIMAL => VirtualKey::NumDecimal,
240 VK_F1 => VirtualKey::F1,
241 VK_F2 => VirtualKey::F2,
242 VK_F3 => VirtualKey::F3,
243 VK_F4 => VirtualKey::F4,
244 VK_F5 => VirtualKey::F5,
245 VK_F6 => VirtualKey::F6,
246 VK_F7 => VirtualKey::F7,
247 VK_F8 => VirtualKey::F8,
248 VK_F9 => VirtualKey::F9,
249 VK_F10 => VirtualKey::F10,
250 VK_F11 => VirtualKey::F11,
251 VK_F12 => VirtualKey::F12,
252 VK_F13 => VirtualKey::F13,
253 VK_F14 => VirtualKey::F14,
254 VK_F15 => VirtualKey::F15,
255 VK_F16 => VirtualKey::F16,
256 VK_F17 => VirtualKey::F17,
257 VK_F18 => VirtualKey::F18,
258 VK_F19 => VirtualKey::F19,
259 VK_F20 => VirtualKey::F20,
260 VK_F21 => VirtualKey::F21,
261 VK_F22 => VirtualKey::F22,
262 VK_F23 => VirtualKey::F23,
263 VK_F24 => VirtualKey::F24,
264 _ => VirtualKey::Other(value.0 as _),
265 }
266 }
267}
268
269#[cfg(windows)]
270impl From<VirtualKey> for VIRTUAL_KEY {
271 fn from(value: VirtualKey) -> Self {
272 match value {
273 VirtualKey::Key1 => VK_1,
274 VirtualKey::Key2 => VK_2,
275 VirtualKey::Key3 => VK_3,
276 VirtualKey::Key4 => VK_4,
277 VirtualKey::Key5 => VK_5,
278 VirtualKey::Key6 => VK_6,
279 VirtualKey::Key7 => VK_7,
280 VirtualKey::Key8 => VK_8,
281 VirtualKey::Key9 => VK_9,
282 VirtualKey::Key0 => VK_0,
283 VirtualKey::A => VK_A,
284 VirtualKey::B => VK_B,
285 VirtualKey::C => VK_C,
286 VirtualKey::D => VK_D,
287 VirtualKey::E => VK_E,
288 VirtualKey::F => VK_F,
289 VirtualKey::G => VK_G,
290 VirtualKey::H => VK_H,
291 VirtualKey::I => VK_I,
292 VirtualKey::J => VK_J,
293 VirtualKey::K => VK_K,
294 VirtualKey::L => VK_L,
295 VirtualKey::M => VK_M,
296 VirtualKey::N => VK_N,
297 VirtualKey::O => VK_O,
298 VirtualKey::P => VK_P,
299 VirtualKey::Q => VK_Q,
300 VirtualKey::R => VK_R,
301 VirtualKey::S => VK_S,
302 VirtualKey::T => VK_T,
303 VirtualKey::U => VK_U,
304 VirtualKey::V => VK_V,
305 VirtualKey::W => VK_W,
306 VirtualKey::X => VK_X,
307 VirtualKey::Y => VK_Y,
308 VirtualKey::Z => VK_Z,
309 VirtualKey::Num1 => VK_NUMPAD1,
310 VirtualKey::Num2 => VK_NUMPAD2,
311 VirtualKey::Num3 => VK_NUMPAD3,
312 VirtualKey::Num4 => VK_NUMPAD4,
313 VirtualKey::Num5 => VK_NUMPAD5,
314 VirtualKey::Num6 => VK_NUMPAD6,
315 VirtualKey::Num7 => VK_NUMPAD7,
316 VirtualKey::Num8 => VK_NUMPAD8,
317 VirtualKey::Num9 => VK_NUMPAD9,
318 VirtualKey::Num0 => VK_NUMPAD0,
319 VirtualKey::Esc => VK_ESCAPE,
320 VirtualKey::Tab => VK_TAB,
321 VirtualKey::CapsLock => VK_CAPITAL,
322 VirtualKey::Shift => VK_SHIFT,
323 VirtualKey::Ctrl => VK_CONTROL,
324 VirtualKey::Alt => VK_MENU,
325 VirtualKey::BackSpace => VK_BACK,
326 VirtualKey::Enter => VK_RETURN,
327 VirtualKey::Space => VK_SPACE,
328 VirtualKey::PrintScreen => VK_SNAPSHOT,
329 VirtualKey::ScrollLock => VK_SCROLL,
330 VirtualKey::Pause => VK_PAUSE,
331 VirtualKey::Insert => VK_INSERT,
332 VirtualKey::Delete => VK_DELETE,
333 VirtualKey::Home => VK_HOME,
334 VirtualKey::End => VK_END,
335 VirtualKey::PageUp => VK_PRIOR,
336 VirtualKey::PageDown => VK_NEXT,
337 VirtualKey::Up => VK_UP,
338 VirtualKey::Down => VK_DOWN,
339 VirtualKey::Left => VK_LEFT,
340 VirtualKey::Right => VK_RIGHT,
341 VirtualKey::NumLock => VK_NUMLOCK,
342 VirtualKey::NumAdd => VK_ADD,
343 VirtualKey::NumSub => VK_SUBTRACT,
344 VirtualKey::NumMul => VK_MULTIPLY,
345 VirtualKey::NumDiv => VK_DIVIDE,
346 VirtualKey::NumDecimal => VK_DECIMAL,
347 VirtualKey::F1 => VK_F1,
348 VirtualKey::F2 => VK_F2,
349 VirtualKey::F3 => VK_F3,
350 VirtualKey::F4 => VK_F4,
351 VirtualKey::F5 => VK_F5,
352 VirtualKey::F6 => VK_F6,
353 VirtualKey::F7 => VK_F7,
354 VirtualKey::F8 => VK_F8,
355 VirtualKey::F9 => VK_F9,
356 VirtualKey::F10 => VK_F10,
357 VirtualKey::F11 => VK_F11,
358 VirtualKey::F12 => VK_F12,
359 VirtualKey::F13 => VK_F13,
360 VirtualKey::F14 => VK_F14,
361 VirtualKey::F15 => VK_F15,
362 VirtualKey::F16 => VK_F16,
363 VirtualKey::F17 => VK_F17,
364 VirtualKey::F18 => VK_F18,
365 VirtualKey::F19 => VK_F19,
366 VirtualKey::F20 => VK_F20,
367 VirtualKey::F21 => VK_F21,
368 VirtualKey::F22 => VK_F22,
369 VirtualKey::F23 => VK_F23,
370 VirtualKey::F24 => VK_F24,
371 VirtualKey::Other(v) => VIRTUAL_KEY(v as _),
372 }
373 }
374}
375
376#[cfg(windows)]
377impl From<VirtualKey> for KeyCode {
378 #[inline]
379 fn from(vkey: VirtualKey) -> Self {
380 unsafe {
381 let scan_code = MapVirtualKeyW(VIRTUAL_KEY::from(vkey).0 as u32, MAPVK_VK_TO_VSC);
382 Self {
383 vkey,
384 scan_code: ScanCode(scan_code),
385 }
386 }
387 }
388}
389
390#[cfg(windows)]
391impl From<ScanCode> for KeyCode {
392 #[inline]
393 fn from(scan_code: ScanCode) -> Self {
394 unsafe {
395 let vkey = VIRTUAL_KEY(MapVirtualKeyW(scan_code.0, MAPVK_VSC_TO_VK) as u16);
396 Self {
397 vkey: vkey.into(),
398 scan_code,
399 }
400 }
401 }
402}