1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
use crate::public::{
    KeybdKey::{self, *},
    MouseButton::{self, *},
};

impl From<KeybdKey> for u64 {
    // https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
    fn from(key: KeybdKey) -> u64 {
        match key {
            BackspaceKey => 0x08,
            TabKey => 0x09,
            EnterKey => 0x0D,
            EscapeKey => 0x1B,
            SpaceKey => 0x20,
            PageUpKey => 0x21,
            PageDownKey => 0x22,
            EndKey => 0x23,
            HomeKey => 0x24,
            LeftKey => 0x25,
            UpKey => 0x26,
            RightKey => 0x27,
            DownKey => 0x28,
            InsertKey => 0x2D,
            DeleteKey => 0x2E,
            Numrow0Key => 0x30,
            Numrow1Key => 0x31,
            Numrow2Key => 0x32,
            Numrow3Key => 0x33,
            Numrow4Key => 0x34,
            Numrow5Key => 0x35,
            Numrow6Key => 0x36,
            Numrow7Key => 0x37,
            Numrow8Key => 0x38,
            Numrow9Key => 0x39,
            AKey => 0x41,
            BKey => 0x42,
            CKey => 0x43,
            DKey => 0x44,
            EKey => 0x45,
            FKey => 0x46,
            GKey => 0x47,
            HKey => 0x48,
            IKey => 0x49,
            JKey => 0x4A,
            KKey => 0x4B,
            LKey => 0x4C,
            MKey => 0x4D,
            NKey => 0x4E,
            OKey => 0x4F,
            PKey => 0x50,
            QKey => 0x51,
            RKey => 0x52,
            SKey => 0x53,
            TKey => 0x54,
            UKey => 0x55,
            VKey => 0x56,
            WKey => 0x57,
            XKey => 0x58,
            YKey => 0x59,
            ZKey => 0x5A,
            LSuper => 0x5B,
            RSuper => 0x5C,
            Numpad0Key => 0x60,
            Numpad1Key => 0x61,
            Numpad2Key => 0x62,
            Numpad3Key => 0x63,
            Numpad4Key => 0x64,
            Numpad5Key => 0x65,
            Numpad6Key => 0x66,
            Numpad7Key => 0x67,
            Numpad8Key => 0x68,
            Numpad9Key => 0x69,
            F1Key => 0x70,
            F2Key => 0x71,
            F3Key => 0x72,
            F4Key => 0x73,
            F5Key => 0x74,
            F6Key => 0x75,
            F7Key => 0x76,
            F8Key => 0x77,
            F9Key => 0x78,
            F10Key => 0x79,
            F11Key => 0x7A,
            F12Key => 0x7B,
            F13Key => 0x7C,
            F14Key => 0x7D,
            F15Key => 0x7E,
            F16Key => 0x7F,
            F17Key => 0x80,
            F18Key => 0x81,
            F19Key => 0x82,
            F20Key => 0x83,
            F21Key => 0x84,
            F22Key => 0x85,
            F23Key => 0x86,
            F24Key => 0x87,
            NumLockKey => 0x90,
            ScrollLockKey => 0x91,
            CapsLockKey => 0x14,
            LShiftKey => 0xA0,
            RShiftKey => 0xA1,
            LControlKey => 0xA2,
            RControlKey => 0xA3,
            LAltKey => 0xA4,
            RAltKey => 0xA5,
            BrowserBackKey => 0xA6,
            BrowserForwardKey => 0xA7,
            BrowserRefreshKey => 0xA8,
            VolumeMuteKey => 0xAD,
            VolumeDownKey => 0xAE,
            VolumeUpKey => 0xAF,
            MediaNextTrackKey => 0xB0,
            MediaPrevTrackKey => 0xB1,
            MediaStopKey => 0xB2,
            MediaPlayPauseKey => 0xB3,
            BackquoteKey => 0xC0,
            SlashKey => 0xBF,
            BackslashKey => 0xDC,
            CommaKey => 0xBC,
            PeriodKey => 0xBE,
            MinusKey => 0xBD,
            QuoteKey => 0xDE,
            SemicolonKey => 0xBA,
            LBracketKey => 0xDB,
            RBracketKey => 0xDD,
            EqualKey => 0xBB,
            OtherKey(code) => code,
        }
    }
}

impl From<u64> for KeybdKey {
    // https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes?redirectedfrom=MSDN
    fn from(code: u64) -> KeybdKey {
        match code {
            0x08 => BackspaceKey,
            0x09 => TabKey,
            0x0D => EnterKey,
            0x1B => EscapeKey,
            0x20 => SpaceKey,
            0x21 => PageUpKey,
            0x22 => PageDownKey,
            0x23 => EndKey,
            0x24 => HomeKey,
            0x25 => LeftKey,
            0x26 => UpKey,
            0x27 => RightKey,
            0x28 => DownKey,
            0x2D => InsertKey,
            0x2E => DeleteKey,
            0x30 => Numrow0Key,
            0x31 => Numrow1Key,
            0x32 => Numrow2Key,
            0x33 => Numrow3Key,
            0x34 => Numrow4Key,
            0x35 => Numrow5Key,
            0x36 => Numrow6Key,
            0x37 => Numrow7Key,
            0x38 => Numrow8Key,
            0x39 => Numrow9Key,
            0x41 => AKey,
            0x42 => BKey,
            0x43 => CKey,
            0x44 => DKey,
            0x45 => EKey,
            0x46 => FKey,
            0x47 => GKey,
            0x48 => HKey,
            0x49 => IKey,
            0x4A => JKey,
            0x4B => KKey,
            0x4C => LKey,
            0x4D => MKey,
            0x4E => NKey,
            0x4F => OKey,
            0x50 => PKey,
            0x51 => QKey,
            0x52 => RKey,
            0x53 => SKey,
            0x54 => TKey,
            0x55 => UKey,
            0x56 => VKey,
            0x57 => WKey,
            0x58 => XKey,
            0x59 => YKey,
            0x5A => ZKey,
            0x5B => LSuper,
            0x5C => RSuper,
            0x60 => Numpad0Key,
            0x61 => Numpad1Key,
            0x62 => Numpad2Key,
            0x63 => Numpad3Key,
            0x64 => Numpad4Key,
            0x65 => Numpad5Key,
            0x66 => Numpad6Key,
            0x67 => Numpad7Key,
            0x68 => Numpad8Key,
            0x69 => Numpad9Key,
            0x70 => F1Key,
            0x71 => F2Key,
            0x72 => F3Key,
            0x73 => F4Key,
            0x74 => F5Key,
            0x75 => F6Key,
            0x76 => F7Key,
            0x77 => F8Key,
            0x78 => F9Key,
            0x79 => F10Key,
            0x7A => F11Key,
            0x7B => F12Key,
            0x7C => F13Key,
            0x7D => F14Key,
            0x7E => F15Key,
            0x7F => F16Key,
            0x80 => F17Key,
            0x81 => F18Key,
            0x82 => F19Key,
            0x83 => F20Key,
            0x84 => F21Key,
            0x85 => F22Key,
            0x86 => F23Key,
            0x87 => F24Key,
            0x90 => NumLockKey,
            0x91 => ScrollLockKey,
            0x14 => CapsLockKey,
            0xA0 => LShiftKey,
            0xA1 => RShiftKey,
            0xA2 => LControlKey,
            0xA3 => RControlKey,
            0xA4 => LAltKey,
            0xA5 => RAltKey,
            0xA6 => BrowserBackKey,
            0xA7 => BrowserForwardKey,
            0xA8 => BrowserRefreshKey,
            0xAD => VolumeMuteKey,
            0xAE => VolumeDownKey,
            0xAF => VolumeUpKey,
            0xB0 => MediaNextTrackKey,
            0xB1 => MediaPrevTrackKey,
            0xB2 => MediaStopKey,
            0xB3 => MediaPlayPauseKey,
            0xC0 => BackquoteKey,
            0xBF => SlashKey,
            0xDC => BackslashKey,
            0xBC => CommaKey,
            0xBE => PeriodKey,
            0xBD => MinusKey,
            0xDE => QuoteKey,
            0xBA => SemicolonKey,
            0xDB => LBracketKey,
            0xDD => RBracketKey,
            0xBB => EqualKey,
            _ => OtherKey(code),
        }
    }
}

impl From<MouseButton> for u32 {
    fn from(button: MouseButton) -> u32 {
        match button {
            LeftButton => 0x01,
            RightButton => 0x02,
            MiddleButton => 0x04,
            X1Button => 0x05,
            X2Button => 0x06,
            OtherButton(code) => code,
        }
    }
}