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
use core_foundation::mach_port::CFMachPortRef;
use libc::boolean_t;

use crate::{error::CGError, geometry::CGPoint};

pub type CGKeyCode = u16;

#[repr(C)]
pub struct KeyCode;
impl KeyCode {
    pub const A: CGKeyCode = 0x00;
    pub const S: CGKeyCode = 0x01;
    pub const D: CGKeyCode = 0x02;
    pub const F: CGKeyCode = 0x03;
    pub const H: CGKeyCode = 0x04;
    pub const G: CGKeyCode = 0x05;
    pub const Z: CGKeyCode = 0x06;
    pub const X: CGKeyCode = 0x07;
    pub const C: CGKeyCode = 0x08;
    pub const V: CGKeyCode = 0x09;
    pub const B: CGKeyCode = 0x0B;
    pub const Q: CGKeyCode = 0x0C;
    pub const W: CGKeyCode = 0x0D;
    pub const E: CGKeyCode = 0x0E;
    pub const R: CGKeyCode = 0x0F;
    pub const Y: CGKeyCode = 0x10;
    pub const T: CGKeyCode = 0x11;
    pub const One: CGKeyCode = 0x12;
    pub const Two: CGKeyCode = 0x13;
    pub const Three: CGKeyCode = 0x14;
    pub const Four: CGKeyCode = 0x15;
    pub const Six: CGKeyCode = 0x16;
    pub const Five: CGKeyCode = 0x17;
    pub const Equal: CGKeyCode = 0x18;
    pub const Nine: CGKeyCode = 0x19;
    pub const Seven: CGKeyCode = 0x1A;
    pub const Minus: CGKeyCode = 0x1B;
    pub const Eight: CGKeyCode = 0x1C;
    pub const Zero: CGKeyCode = 0x1D;
    pub const RightBracket: CGKeyCode = 0x1E;
    pub const O: CGKeyCode = 0x1F;
    pub const U: CGKeyCode = 0x20;
    pub const LeftBracket: CGKeyCode = 0x21;
    pub const I: CGKeyCode = 0x22;
    pub const P: CGKeyCode = 0x23;
    pub const Return: CGKeyCode = 0x24;
    pub const L: CGKeyCode = 0x25;
    pub const J: CGKeyCode = 0x26;
    pub const Quote: CGKeyCode = 0x27;
    pub const K: CGKeyCode = 0x28;
    pub const Semicolon: CGKeyCode = 0x29;
    pub const Backslash: CGKeyCode = 0x2A;
    pub const Comma: CGKeyCode = 0x2B;
    pub const Slash: CGKeyCode = 0x2C;
    pub const N: CGKeyCode = 0x2D;
    pub const M: CGKeyCode = 0x2E;
    pub const Period: CGKeyCode = 0x2F;
    pub const Tab: CGKeyCode = 0x30;
    pub const Space: CGKeyCode = 0x31;
    pub const Grave: CGKeyCode = 0x32;
    pub const Delete: CGKeyCode = 0x33;
    pub const Escape: CGKeyCode = 0x35;
    pub const RightCommand: CGKeyCode = 0x36;
    pub const Command: CGKeyCode = 0x37;
    pub const Shift: CGKeyCode = 0x38;
    pub const CapsLock: CGKeyCode = 0x39;
    pub const Option: CGKeyCode = 0x3A;
    pub const Control: CGKeyCode = 0x3B;
    pub const RightShift: CGKeyCode = 0x3C;
    pub const RightOption: CGKeyCode = 0x3D;
    pub const RightControl: CGKeyCode = 0x3E;
    pub const Function: CGKeyCode = 0x3F;
    pub const F17: CGKeyCode = 0x40;
    pub const KeypadDecimal: CGKeyCode = 0x41;
    pub const KeypadMultiply: CGKeyCode = 0x43;
    pub const KeypadPlus: CGKeyCode = 0x45;
    pub const KeypadClear: CGKeyCode = 0x47;
    pub const VolumeUp: CGKeyCode = 0x48;
    pub const VolumeDown: CGKeyCode = 0x49;
    pub const Mute: CGKeyCode = 0x4A;
    pub const KeypadDivide: CGKeyCode = 0x4B;
    pub const KeypadEnter: CGKeyCode = 0x4C;
    pub const KeypadMinus: CGKeyCode = 0x4E;
    pub const F18: CGKeyCode = 0x4F;
    pub const F19: CGKeyCode = 0x50;
    pub const KeypadEquals: CGKeyCode = 0x51;
    pub const Keypad0: CGKeyCode = 0x52;
    pub const Keypad1: CGKeyCode = 0x53;
    pub const Keypad2: CGKeyCode = 0x54;
    pub const Keypad3: CGKeyCode = 0x55;
    pub const Keypad4: CGKeyCode = 0x56;
    pub const Keypad5: CGKeyCode = 0x57;
    pub const Keypad6: CGKeyCode = 0x58;
    pub const Keypad7: CGKeyCode = 0x59;
    pub const F20: CGKeyCode = 0x5A;
    pub const Keypad8: CGKeyCode = 0x5B;
    pub const Keypad9: CGKeyCode = 0x5C;
    pub const F5: CGKeyCode = 0x60;
    pub const F6: CGKeyCode = 0x61;
    pub const F7: CGKeyCode = 0x62;
    pub const F3: CGKeyCode = 0x63;
    pub const F8: CGKeyCode = 0x64;
    pub const F9: CGKeyCode = 0x65;
    pub const F11: CGKeyCode = 0x67;
    pub const F13: CGKeyCode = 0x69;
    pub const F16: CGKeyCode = 0x6A;
    pub const F14: CGKeyCode = 0x6B;
    pub const F10: CGKeyCode = 0x6D;
    pub const F12: CGKeyCode = 0x6F;
    pub const F15: CGKeyCode = 0x71;
    pub const Help: CGKeyCode = 0x72;
    pub const Home: CGKeyCode = 0x73;
    pub const PageUp: CGKeyCode = 0x74;
    pub const ForwardDelete: CGKeyCode = 0x75;
    pub const F4: CGKeyCode = 0x76;
    pub const End: CGKeyCode = 0x77;
    pub const F2: CGKeyCode = 0x78;
    pub const PageDown: CGKeyCode = 0x79;
    pub const F1: CGKeyCode = 0x7A;
    pub const LeftArrow: CGKeyCode = 0x7B;
    pub const RightArrow: CGKeyCode = 0x7C;
    pub const DownArrow: CGKeyCode = 0x7D;
    pub const UpArrow: CGKeyCode = 0x7E;
}

extern "C" {
    pub fn CGWarpMouseCursorPosition(newCursorPosition: CGPoint) -> CGError;
    pub fn CGAssociateMouseAndMouseCursorPosition(connected: boolean_t) -> CGError;
    pub fn CGWindowServerCreateServerPort() -> CFMachPortRef;
}