1pub mod keyboard {
2 #[repr(u8)]
3 #[derive(Debug, Clone, Copy)]
4 pub enum Modifier {
5 None = 0x00,
6 LCtrl = 0x01,
7 LShift = 0x02,
8 LAlt = 0x04,
9 LMeta = 0x08,
10 RCtrl = 0x10,
11 RShift = 0x20,
12 RAlt = 0x40,
13 RMeta = 0x80,
14 }
15
16 #[repr(u8)]
17 #[derive(Debug, Clone, Copy)]
18 pub enum Keycode {
19 None = 0x00,
20 A = 0x04,
21 B = 0x05,
22 C = 0x06,
23 D = 0x07,
24 E = 0x08,
25 F = 0x09,
26 G = 0x0a,
27 H = 0x0b,
28 I = 0x0c,
29 J = 0x0d,
30 K = 0x0e,
31 L = 0x0f,
32 M = 0x10,
33 N = 0x11,
34 O = 0x12,
35 P = 0x13,
36 Q = 0x14,
37 R = 0x15,
38 S = 0x16,
39 T = 0x17,
40 U = 0x18,
41 V = 0x19,
42 W = 0x1a,
43 X = 0x1b,
44 Y = 0x1c,
45 Z = 0x1d,
46 Num1 = 0x1e,
47 Num2 = 0x1f,
48 Num3 = 0x20,
49 Num4 = 0x21,
50 Num5 = 0x22,
51 Num6 = 0x23,
52 Num7 = 0x24,
53 Num8 = 0x25,
54 Num9 = 0x26,
55 Num0 = 0x27,
56 Enter = 0x28,
57 Esc = 0x29,
58 Backspace = 0x2a,
59 Tab = 0x2b,
60 Space = 0x2c,
61 Minus = 0x2d,
62 Equal = 0x2e,
63 LeftBrace = 0x2f,
64 RightBrace = 0x30,
65 Backslash = 0x31,
66 HashTilde = 0x32,
67 Semicolon = 0x33,
68 Apostrophe = 0x34,
69 Grave = 0x35,
70 Comma = 0x36,
71 Dot = 0x37,
72 Slash = 0x38,
73 CapsLock = 0x39,
74 F1 = 0x3a,
75 F2 = 0x3b,
76 F3 = 0x3c,
77 F4 = 0x3d,
78 F5 = 0x3e,
79 F6 = 0x3f,
80 F7 = 0x40,
81 F8 = 0x41,
82 F9 = 0x42,
83 F10 = 0x43,
84 F11 = 0x44,
85 F12 = 0x45,
86 SysRq = 0x46,
87 ScrollLock = 0x47,
88 Pause = 0x48,
89 Insert = 0x49,
90 Home = 0x4a,
91 PageUp = 0x4b,
92 Delete = 0x4c,
93 End = 0x4d,
94 PageDown = 0x4e,
95 Right = 0x4f,
96 Left = 0x50,
97 Down = 0x51,
98 Up = 0x52,
99 NumLock = 0x53,
100 KPDivide = 0x54,
101 KPMultiply = 0x55,
102 KPMinus = 0x56,
103 KPPlus = 0x57,
104 KPEnter = 0x58,
105 KP1 = 0x59,
106 KP2 = 0x5a,
107 KP3 = 0x5b,
108 KP4 = 0x5c,
109 KP5 = 0x5d,
110 KP6 = 0x5e,
111 KP7 = 0x5f,
112 KP8 = 0x60,
113 KP9 = 0x61,
114 KP0 = 0x62,
115 KPDot = 0x63,
116 Key102nd = 0x64,
117 Compose = 0x65,
118 LeftCtrl = 0xe0,
119 LeftShift = 0xe1,
120 LeftAlt = 0xe2,
121 LeftMeta = 0xe3,
122 RightCtrl = 0xe4,
123 RightShift = 0xe5,
124 RightAlt = 0xe6,
125 RightMeta = 0xe7,
126 }
127 #[link(name = "cper", kind = "dylib")]
128 extern "C" {
129 fn KeyDown(keycodes: *mut u8, modifier: u8);
130 fn KeyUp();
131 }
132 pub fn press_key(keycodes: Vec<Keycode>, modifier: Modifier) {
133 let keycodes: Vec<u8> = keycodes.into_iter().map(|k| k as u8).collect();
134 let mut mask: [u8; 6] = [0; 6];
135 mask[..keycodes.len()].copy_from_slice(&keycodes);
136 unsafe {
137 KeyDown(mask.as_mut_ptr(), modifier as u8);
138 }
139 }
140 pub fn release_key() {
141 unsafe {
142 KeyUp()
143 }
144 }
145}