Skip to main content

qsk_types/
events.rs

1use std::time::SystemTime;
2
3use num_derive::{FromPrimitive, ToPrimitive};
4use serde::{Deserialize, Serialize};
5use strum_macros::{EnumString, Display};
6
7/// InputEvent is a qsk-specific struct modeled in large part after evdev_rs::InputEvent.
8/// Although evdev_rs::InputEvent actually supports a large range of Linux-specific input events,
9/// we focus here on keyboard and synchronization events specifically since keyboard events are the
10/// primary concern of qsk initially and synchronization needs to be represented. Abstracting away
11/// from Linux-specific event handling in this way will enable us to support input event systems
12/// for other OSes in the future.
13#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
14pub struct InputEvent {
15    pub time: SystemTime,
16    pub code: EventCode,
17    pub state: KeyState,
18}
19
20#[derive(
21    Serialize, Deserialize, FromPrimitive, ToPrimitive, Clone, Copy, Debug, PartialEq, Eq, Hash,
22)]
23#[allow(dead_code)]
24pub enum KeyState {
25    Up = 0,
26    Down = 1,
27    Held = 2,
28    NotImplemented = 3,
29}
30
31#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash)]
32pub enum EventCode {
33    KeyCode(KeyCode),
34    SynCode(SynCode),
35}
36
37/// Copied and pasted from evdev-rs 0.3.1 with s/KEY_/KC_/ to align more closely with QMK naming
38/// key code naming conventions.
39#[allow(non_camel_case_types)]
40#[derive(
41    EnumString, Display, Serialize, Deserialize, FromPrimitive, ToPrimitive, Clone, Copy, Debug, PartialEq, Eq, Hash,
42)]
43#[allow(dead_code)]
44pub enum KeyCode {
45    KC_RESERVED = 0,
46    KC_ESC = 1,
47    KC_1 = 2,
48    KC_2 = 3,
49    KC_3 = 4,
50    KC_4 = 5,
51    KC_5 = 6,
52    KC_6 = 7,
53    KC_7 = 8,
54    KC_8 = 9,
55    KC_9 = 10,
56    KC_0 = 11,
57    KC_MINUS = 12,
58    KC_EQUAL = 13,
59    KC_BACKSPACE = 14,
60    KC_TAB = 15,
61    KC_Q = 16,
62    KC_W = 17,
63    KC_E = 18,
64    KC_R = 19,
65    KC_T = 20,
66    KC_Y = 21,
67    KC_U = 22,
68    KC_I = 23,
69    KC_O = 24,
70    KC_P = 25,
71    KC_LEFTBRACE = 26,
72    KC_RIGHTBRACE = 27,
73    KC_ENTER = 28,
74    KC_LEFTCTRL = 29,
75    KC_A = 30,
76    KC_S = 31,
77    KC_D = 32,
78    KC_F = 33,
79    KC_G = 34,
80    KC_H = 35,
81    KC_J = 36,
82    KC_K = 37,
83    KC_L = 38,
84    KC_SEMICOLON = 39,
85    KC_APOSTROPHE = 40,
86    KC_GRAVE = 41,
87    KC_LEFTSHIFT = 42,
88    KC_BACKSLASH = 43,
89    KC_Z = 44,
90    KC_X = 45,
91    KC_C = 46,
92    KC_V = 47,
93    KC_B = 48,
94    KC_N = 49,
95    KC_M = 50,
96    KC_COMMA = 51,
97    KC_DOT = 52,
98    KC_SLASH = 53,
99    KC_RIGHTSHIFT = 54,
100    KC_KPASTERISK = 55,
101    KC_LEFTALT = 56,
102    KC_SPACE = 57,
103    KC_CAPSLOCK = 58,
104    KC_F1 = 59,
105    KC_F2 = 60,
106    KC_F3 = 61,
107    KC_F4 = 62,
108    KC_F5 = 63,
109    KC_F6 = 64,
110    KC_F7 = 65,
111    KC_F8 = 66,
112    KC_F9 = 67,
113    KC_F10 = 68,
114    KC_NUMLOCK = 69,
115    KC_SCROLLLOCK = 70,
116    KC_KP7 = 71,
117    KC_KP8 = 72,
118    KC_KP9 = 73,
119    KC_KPMINUS = 74,
120    KC_KP4 = 75,
121    KC_KP5 = 76,
122    KC_KP6 = 77,
123    KC_KPPLUS = 78,
124    KC_KP1 = 79,
125    KC_KP2 = 80,
126    KC_KP3 = 81,
127    KC_KP0 = 82,
128    KC_KPDOT = 83,
129    KC_ZENKAKUHANKAKU = 85,
130    KC_102ND = 86,
131    KC_F11 = 87,
132    KC_F12 = 88,
133    KC_RO = 89,
134    KC_KATAKANA = 90,
135    KC_HIRAGANA = 91,
136    KC_HENKAN = 92,
137    KC_KATAKANAHIRAGANA = 93,
138    KC_MUHENKAN = 94,
139    KC_KPJPCOMMA = 95,
140    KC_KPENTER = 96,
141    KC_RIGHTCTRL = 97,
142    KC_KPSLASH = 98,
143    KC_SYSRQ = 99,
144    KC_RIGHTALT = 100,
145    KC_LINEFEED = 101,
146    KC_HOME = 102,
147    KC_UP = 103,
148    KC_PAGEUP = 104,
149    KC_LEFT = 105,
150    KC_RIGHT = 106,
151    KC_END = 107,
152    KC_DOWN = 108,
153    KC_PAGEDOWN = 109,
154    KC_INSERT = 110,
155    KC_DELETE = 111,
156    KC_MACRO = 112,
157    KC_MUTE = 113,
158    KC_VOLUMEDOWN = 114,
159    KC_VOLUMEUP = 115,
160    KC_POWER = 116,
161    KC_KPEQUAL = 117,
162    KC_KPPLUSMINUS = 118,
163    KC_PAUSE = 119,
164    KC_SCALE = 120,
165    KC_KPCOMMA = 121,
166    KC_HANGEUL = 122,
167    KC_HANJA = 123,
168    KC_YEN = 124,
169    KC_LEFTMETA = 125,
170    KC_RIGHTMETA = 126,
171    KC_COMPOSE = 127,
172    KC_STOP = 128,
173    KC_AGAIN = 129,
174    KC_PROPS = 130,
175    KC_UNDO = 131,
176    KC_FRONT = 132,
177    KC_COPY = 133,
178    KC_OPEN = 134,
179    KC_PASTE = 135,
180    KC_FIND = 136,
181    KC_CUT = 137,
182    KC_HELP = 138,
183    KC_MENU = 139,
184    KC_CALC = 140,
185    KC_SETUP = 141,
186    KC_SLEEP = 142,
187    KC_WAKEUP = 143,
188    KC_FILE = 144,
189    KC_SENDFILE = 145,
190    KC_DELETEFILE = 146,
191    KC_XFER = 147,
192    KC_PROG1 = 148,
193    KC_PROG2 = 149,
194    KC_WWW = 150,
195    KC_MSDOS = 151,
196    KC_COFFEE = 152,
197    KC_ROTATE_DISPLAY = 153,
198    KC_CYCLEWINDOWS = 154,
199    KC_MAIL = 155,
200    KC_BOOKMARKS = 156,
201    KC_COMPUTER = 157,
202    KC_BACK = 158,
203    KC_FORWARD = 159,
204    KC_CLOSECD = 160,
205    KC_EJECTCD = 161,
206    KC_EJECTCLOSECD = 162,
207    KC_NEXTSONG = 163,
208    KC_PLAYPAUSE = 164,
209    KC_PREVIOUSSONG = 165,
210    KC_STOPCD = 166,
211    KC_RECORD = 167,
212    KC_REWIND = 168,
213    KC_PHONE = 169,
214    KC_ISO = 170,
215    KC_CONFIG = 171,
216    KC_HOMEPAGE = 172,
217    KC_REFRESH = 173,
218    KC_EXIT = 174,
219    KC_MOVE = 175,
220    KC_EDIT = 176,
221    KC_SCROLLUP = 177,
222    KC_SCROLLDOWN = 178,
223    KC_KPLEFTPAREN = 179,
224    KC_KPRIGHTPAREN = 180,
225    KC_NEW = 181,
226    KC_REDO = 182,
227    KC_F13 = 183,
228    KC_F14 = 184,
229    KC_F15 = 185,
230    KC_F16 = 186,
231    KC_F17 = 187,
232    KC_F18 = 188,
233    KC_F19 = 189,
234    KC_F20 = 190,
235    KC_F21 = 191,
236    KC_F22 = 192,
237    KC_F23 = 193,
238    KC_F24 = 194,
239    KC_PLAYCD = 200,
240    KC_PAUSECD = 201,
241    KC_PROG3 = 202,
242    KC_PROG4 = 203,
243    KC_DASHBOARD = 204,
244    KC_SUSPEND = 205,
245    KC_CLOSE = 206,
246    KC_PLAY = 207,
247    KC_FASTFORWARD = 208,
248    KC_BASSBOOST = 209,
249    KC_PRINT = 210,
250    KC_HP = 211,
251    KC_CAMERA = 212,
252    KC_SOUND = 213,
253    KC_QUESTION = 214,
254    KC_EMAIL = 215,
255    KC_CHAT = 216,
256    KC_SEARCH = 217,
257    KC_CONNECT = 218,
258    KC_FINANCE = 219,
259    KC_SPORT = 220,
260    KC_SHOP = 221,
261    KC_ALTERASE = 222,
262    KC_CANCEL = 223,
263    KC_BRIGHTNESSDOWN = 224,
264    KC_BRIGHTNESSUP = 225,
265    KC_MEDIA = 226,
266    KC_SWITCHVIDEOMODE = 227,
267    KC_KBDILLUMTOGGLE = 228,
268    KC_KBDILLUMDOWN = 229,
269    KC_KBDILLUMUP = 230,
270    KC_SEND = 231,
271    KC_REPLY = 232,
272    KC_FORWARDMAIL = 233,
273    KC_SAVE = 234,
274    KC_DOCUMENTS = 235,
275    KC_BATTERY = 236,
276    KC_BLUETOOTH = 237,
277    KC_WLAN = 238,
278    KC_UWB = 239,
279    KC_UNKNOWN = 240,
280    KC_VIDEO_NEXT = 241,
281    KC_VIDEO_PREV = 242,
282    KC_BRIGHTNESS_CYCLE = 243,
283    KC_BRIGHTNESS_AUTO = 244,
284    KC_DISPLAY_OFF = 245,
285    KC_WWAN = 246,
286    KC_RFKILL = 247,
287    KC_MICMUTE = 248,
288    KC_OK = 352,
289    KC_SELECT = 353,
290    KC_GOTO = 354,
291    KC_CLEAR = 355,
292    KC_POWER2 = 356,
293    KC_OPTION = 357,
294    KC_INFO = 358,
295    KC_TIME = 359,
296    KC_VENDOR = 360,
297    KC_ARCHIVE = 361,
298    KC_PROGRAM = 362,
299    KC_CHANNEL = 363,
300    KC_FAVORITES = 364,
301    KC_EPG = 365,
302    KC_PVR = 366,
303    KC_MHP = 367,
304    KC_LANGUAGE = 368,
305    KC_TITLE = 369,
306    KC_SUBTITLE = 370,
307    KC_ANGLE = 371,
308    KC_FULL_SCREEN = 372,
309    KC_MODE = 373,
310    KC_KEYBOARD = 374,
311    KC_ASPECT_RATIO = 375,
312    KC_PC = 376,
313    KC_TV = 377,
314    KC_TV2 = 378,
315    KC_VCR = 379,
316    KC_VCR2 = 380,
317    KC_SAT = 381,
318    KC_SAT2 = 382,
319    KC_CD = 383,
320    KC_TAPE = 384,
321    KC_RADIO = 385,
322    KC_TUNER = 386,
323    KC_PLAYER = 387,
324    KC_TEXT = 388,
325    KC_DVD = 389,
326    KC_AUX = 390,
327    KC_MP3 = 391,
328    KC_AUDIO = 392,
329    KC_VIDEO = 393,
330    KC_DIRECTORY = 394,
331    KC_LIST = 395,
332    KC_MEMO = 396,
333    KC_CALENDAR = 397,
334    KC_RED = 398,
335    KC_GREEN = 399,
336    KC_YELLOW = 400,
337    KC_BLUE = 401,
338    KC_CHANNELUP = 402,
339    KC_CHANNELDOWN = 403,
340    KC_FIRST = 404,
341    KC_LAST = 405,
342    KC_AB = 406,
343    KC_NEXT = 407,
344    KC_RESTART = 408,
345    KC_SLOW = 409,
346    KC_SHUFFLE = 410,
347    KC_BREAK = 411,
348    KC_PREVIOUS = 412,
349    KC_DIGITS = 413,
350    KC_TEEN = 414,
351    KC_TWEN = 415,
352    KC_VIDEOPHONE = 416,
353    KC_GAMES = 417,
354    KC_ZOOMIN = 418,
355    KC_ZOOMOUT = 419,
356    KC_ZOOMRESET = 420,
357    KC_WORDPROCESSOR = 421,
358    KC_EDITOR = 422,
359    KC_SPREADSHEET = 423,
360    KC_GRAPHICSEDITOR = 424,
361    KC_PRESENTATION = 425,
362    KC_DATABASE = 426,
363    KC_NEWS = 427,
364    KC_VOICEMAIL = 428,
365    KC_ADDRESSBOOK = 429,
366    KC_MESSENGER = 430,
367    KC_DISPLAYTOGGLE = 431,
368    KC_SPELLCHECK = 432,
369    KC_LOGOFF = 433,
370    KC_DOLLAR = 434,
371    KC_EURO = 435,
372    KC_FRAMEBACK = 436,
373    KC_FRAMEFORWARD = 437,
374    KC_CONTEXT_MENU = 438,
375    KC_MEDIA_REPEAT = 439,
376    KC_10CHANNELSUP = 440,
377    KC_10CHANNELSDOWN = 441,
378    KC_IMAGES = 442,
379    KC_DEL_EOL = 448,
380    KC_DEL_EOS = 449,
381    KC_INS_LINE = 450,
382    KC_DEL_LINE = 451,
383    KC_FN = 464,
384    KC_FN_ESC = 465,
385    KC_FN_F1 = 466,
386    KC_FN_F2 = 467,
387    KC_FN_F3 = 468,
388    KC_FN_F4 = 469,
389    KC_FN_F5 = 470,
390    KC_FN_F6 = 471,
391    KC_FN_F7 = 472,
392    KC_FN_F8 = 473,
393    KC_FN_F9 = 474,
394    KC_FN_F10 = 475,
395    KC_FN_F11 = 476,
396    KC_FN_F12 = 477,
397    KC_FN_1 = 478,
398    KC_FN_2 = 479,
399    KC_FN_D = 480,
400    KC_FN_E = 481,
401    KC_FN_F = 482,
402    KC_FN_S = 483,
403    KC_FN_B = 484,
404    KC_BRL_DOT1 = 497,
405    KC_BRL_DOT2 = 498,
406    KC_BRL_DOT3 = 499,
407    KC_BRL_DOT4 = 500,
408    KC_BRL_DOT5 = 501,
409    KC_BRL_DOT6 = 502,
410    KC_BRL_DOT7 = 503,
411    KC_BRL_DOT8 = 504,
412    KC_BRL_DOT9 = 505,
413    KC_BRL_DOT10 = 506,
414    KC_NUMERIC_0 = 512,
415    KC_NUMERIC_1 = 513,
416    KC_NUMERIC_2 = 514,
417    KC_NUMERIC_3 = 515,
418    KC_NUMERIC_4 = 516,
419    KC_NUMERIC_5 = 517,
420    KC_NUMERIC_6 = 518,
421    KC_NUMERIC_7 = 519,
422    KC_NUMERIC_8 = 520,
423    KC_NUMERIC_9 = 521,
424    KC_NUMERIC_STAR = 522,
425    KC_NUMERIC_POUND = 523,
426    KC_NUMERIC_A = 524,
427    KC_NUMERIC_B = 525,
428    KC_NUMERIC_C = 526,
429    KC_NUMERIC_D = 527,
430    KC_CAMERA_FOCUS = 528,
431    KC_WPS_BUTTON = 529,
432    KC_TOUCHPAD_TOGGLE = 530,
433    KC_TOUCHPAD_ON = 531,
434    KC_TOUCHPAD_OFF = 532,
435    KC_CAMERA_ZOOMIN = 533,
436    KC_CAMERA_ZOOMOUT = 534,
437    KC_CAMERA_UP = 535,
438    KC_CAMERA_DOWN = 536,
439    KC_CAMERA_LEFT = 537,
440    KC_CAMERA_RIGHT = 538,
441    KC_ATTENDANT_ON = 539,
442    KC_ATTENDANT_OFF = 540,
443    KC_ATTENDANT_TOGGLE = 541,
444    KC_LIGHTS_TOGGLE = 542,
445    KC_ALS_TOGGLE = 560,
446    KC_ROTATE_LOCK_TOGGLE = 561,
447    KC_BUTTONCONFIG = 576,
448    KC_TASKMANAGER = 577,
449    KC_JOURNAL = 578,
450    KC_CONTROLPANEL = 579,
451    KC_APPSELECT = 580,
452    KC_SCREENSAVER = 581,
453    KC_VOICECOMMAND = 582,
454    KC_ASSISTANT = 583,
455    KC_BRIGHTNESS_MIN = 592,
456    KC_BRIGHTNESS_MAX = 593,
457    KC_KBDINPUTASSIST_PREV = 608,
458    KC_KBDINPUTASSIST_NEXT = 609,
459    KC_KBDINPUTASSIST_PREVGROUP = 610,
460    KC_KBDINPUTASSIST_NEXTGROUP = 611,
461    KC_KBDINPUTASSIST_ACCEPT = 612,
462    KC_KBDINPUTASSIST_CANCEL = 613,
463    KC_RIGHT_UP = 614,
464    KC_RIGHT_DOWN = 615,
465    KC_LEFT_UP = 616,
466    KC_LEFT_DOWN = 617,
467    KC_ROOT_MENU = 618,
468    KC_MEDIA_TOP_MENU = 619,
469    KC_NUMERIC_11 = 620,
470    KC_NUMERIC_12 = 621,
471    KC_AUDIO_DESC = 622,
472    KC_3D_MODE = 623,
473    KC_NEXT_FAVORITE = 624,
474    KC_STOP_RECORD = 625,
475    KC_PAUSE_RECORD = 626,
476    KC_VOD = 627,
477    KC_UNMUTE = 628,
478    KC_FASTREVERSE = 629,
479    KC_SLOWREVERSE = 630,
480    KC_DATA = 631,
481    KC_ONSCREEN_KEYBOARD = 632,
482    KC_MAX = 767,
483    NotImplemented = 768,
484}
485
486#[derive(
487    Serialize, Deserialize, FromPrimitive, ToPrimitive, Clone, Copy, Debug, PartialEq, Eq, Hash,
488)]
489pub enum SynCode {
490    Report = 0,
491    Config = 1,
492    MTReport = 2,
493    Dropped = 3,
494    Max = 15,
495}