rupper/
lib.rs

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}