gedv/
keyboard.rs

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}