detectlib/
lib.rs

1extern crate x11;
2
3use std::ptr;
4pub use x11::{xlib,xtest::XTestFakeKeyEvent};
5use std::cell::RefCell;
6
7pub struct Input {
8    display: *mut xlib::Display,
9    prev_keys: RefCell<[u8; 32]>,
10    prev_mbs: Vec<u8>,
11}
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
14pub enum KeyCode {
15    Esc, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num0,
16    Minus, Equals,
17    Q, W, E, R, T, Y, U, I, O, P,
18    LeftBracket, RightBracket,
19    A,
20    S,
21    D,
22    F,
23    G,
24    H,
25    J,
26    K,
27    L,
28    Semicolon,
29    Apostrophe,
30    Backtick,
31    Backslash,
32    Z,
33    X,
34    C,
35    V,
36    B,
37    N,
38    M,
39    Comma,
40    Period,
41    Slash,
42    Enter,
43    Space,
44    ShiftL,
45    ShiftR,
46    ControlL,
47    ControlR,
48    AltL,
49    AltR,
50    SuperL,
51    SuperR,
52    CapsLock,
53    Tab,
54    Backspace,
55    F1,
56    F2,
57    F3,
58    F4,
59    F5,
60    F6,
61    F7,
62    F8,
63    F9,
64    F10,
65    F11,
66    F12,
67    Print,
68    ScrollLock,
69    Pause,
70    Insert,
71    Delete,
72    Home,
73    End,
74    PageUp,
75    PageDown,
76    LeftArrow,
77    RightArrow,
78    UpArrow,
79    DownArrow,
80    NumLock,
81    KpEnter,
82    KpAdd,
83    KpSubtract,
84    KpMultiply,
85    KpDivide,
86    Kp0,
87    Kp1,
88    Kp2,
89    Kp3,
90    Kp4,
91    Kp5,
92    Kp6,
93    Kp7,
94    Kp8,
95    Kp9,
96}
97#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
98pub enum MouseButton {
99    Left,
100    Middle,
101    Right,
102    ScrollUp,
103    ScrollDown,
104    ScrollLeft,
105    ScrollRight,
106    ExtraButton1,
107    ExtraButton2,
108}
109
110
111impl KeyCode {
112    /// Returns the X11 keycode associated with the `KeyCode` enum.
113    pub fn to_x11_keycode(&self) -> u8 {
114        match self {
115            KeyCode::Esc => 9,
116            KeyCode::Num1 => 10,
117            KeyCode::Num2 => 11,
118            KeyCode::Num3 => 12,
119            KeyCode::Num4 => 13,
120            KeyCode::Num5 => 14,
121            KeyCode::Num6 => 15,
122            KeyCode::Num7 => 16,
123            KeyCode::Num8 => 17,
124            KeyCode::Num9 => 18,
125            KeyCode::Num0 => 19,
126            KeyCode::Minus => 20,
127            KeyCode::Equals => 21,
128            KeyCode::Q => 24,
129            KeyCode::W => 25,
130            KeyCode::E => 26,
131            KeyCode::R => 27,
132            KeyCode::T => 28,
133            KeyCode::Y => 29,
134            KeyCode::U => 30,
135            KeyCode::I => 31,
136            KeyCode::O => 32,
137            KeyCode::P => 33,
138            KeyCode::LeftBracket => 34,
139            KeyCode::RightBracket => 35,
140            KeyCode::A => 38,
141            KeyCode::S => 39,
142            KeyCode::D => 40,
143            KeyCode::F => 41,
144            KeyCode::G => 42,
145            KeyCode::H => 43,
146            KeyCode::J => 44,
147            KeyCode::K => 45,
148            KeyCode::L => 46,
149            KeyCode::Semicolon => 47,
150            KeyCode::Apostrophe => 48,
151            KeyCode::Backtick => 49,
152            KeyCode::Backslash => 51,
153            KeyCode::Z => 52,
154            KeyCode::X => 53,
155            KeyCode::C => 54,
156            KeyCode::V => 55,
157            KeyCode::B => 56,
158            KeyCode::N => 57,
159            KeyCode::M => 58,
160            KeyCode::Comma => 59,
161            KeyCode::Period => 60,
162            KeyCode::Slash => 61,
163            KeyCode::Enter => 36,
164            KeyCode::Space => 65,
165            KeyCode::ShiftL => 50,
166            KeyCode::ShiftR => 62,
167            KeyCode::ControlL => 37,
168            KeyCode::ControlR => 105,
169            KeyCode::AltL => 64,
170            KeyCode::AltR => 108,
171            KeyCode::SuperL => 133,
172            KeyCode::SuperR => 134,
173            KeyCode::CapsLock => 66,
174            KeyCode::Tab => 23,
175            KeyCode::Backspace => 22,
176            KeyCode::F1 => 67,
177            KeyCode::F2 => 68,
178            KeyCode::F3 => 69,
179            KeyCode::F4 => 70,
180            KeyCode::F5 => 71,
181            KeyCode::F6 => 72,
182            KeyCode::F7 => 73,
183            KeyCode::F8 => 74,
184            KeyCode::F9 => 75,
185            KeyCode::F10 => 76,
186            KeyCode::F11 => 95,
187            KeyCode::F12 => 96,
188            KeyCode::Print => 107,
189            KeyCode::ScrollLock => 78,
190            KeyCode::Pause => 127,
191            KeyCode::Insert => 118,
192            KeyCode::Delete => 119,
193            KeyCode::Home => 110,
194            KeyCode::End => 115,
195            KeyCode::PageUp => 112,
196            KeyCode::PageDown => 117,
197            KeyCode::LeftArrow => 113,
198            KeyCode::RightArrow => 114,
199            KeyCode::UpArrow => 111,
200            KeyCode::DownArrow => 116,
201            KeyCode::NumLock => 77,
202            KeyCode::KpEnter => 104,
203            KeyCode::KpAdd => 86,
204            KeyCode::KpSubtract => 82,
205            KeyCode::KpMultiply => 63,
206            KeyCode::KpDivide => 106,
207            KeyCode::Kp0 => 90,
208            KeyCode::Kp1 => 87,
209            KeyCode::Kp2 => 88,
210            KeyCode::Kp3 => 89,
211            KeyCode::Kp4 => 83,
212            KeyCode::Kp5 => 84,
213            KeyCode::Kp6 => 85,
214            KeyCode::Kp7 => 79,
215            KeyCode::Kp8 => 80,
216            KeyCode::Kp9 => 81,
217        }
218    }
219}
220impl MouseButton {
221    /// Returns the X11 button code associated with the `MouseButton` enum.
222    pub fn to_x11_buttoncode(&self) -> u8 {
223        match self {
224            MouseButton::Left => 1,
225            MouseButton::Middle => 2,
226            MouseButton::Right => 3,
227            MouseButton::ScrollUp => 4,
228            MouseButton::ScrollDown => 5,
229            MouseButton::ScrollLeft => 6,
230            MouseButton::ScrollRight => 7,
231            MouseButton::ExtraButton1 => 8,
232            MouseButton::ExtraButton2 => 9,
233        }
234    }
235}
236impl Input {
237    /// Initializes the X11KeyChecker by opening the X11 display.
238    pub fn new() -> Option<Self> {
239        unsafe {
240            let display = xlib::XOpenDisplay(ptr::null());
241            if display.is_null() {
242                return None;
243            }
244            Some(Input {
245                display,
246                prev_keys: RefCell::new([0; 32]),
247                prev_mbs: vec![],
248            })
249        }
250    }
251    pub fn getkeydown(&self, kc: KeyCode) -> bool {
252        // Allocate a 32-byte array to hold the current key states
253        let mut curr_keys: [u8; 32] = [0; 32];
254
255        // Get the current key states
256        unsafe {
257            xlib::XQueryKeymap(self.display, curr_keys.as_mut_ptr() as *mut i8);
258        }
259        let keycode = kc.to_x11_keycode();
260
261        // Calculate the byte and bit position for the keycode
262        let byte_index = (keycode / 8) as usize;
263        let bit_index = (keycode % 8) as usize;
264
265        // Check if the key was not pressed previously but is pressed now
266        let was_not_pressed = (self.prev_keys.borrow()[byte_index] & (1 << bit_index)) == 0;
267        let is_pressed_now = (curr_keys[byte_index] & (1 << bit_index)) != 0;
268
269        // Update the previous keys array with the current state
270        self.prev_keys.borrow_mut().copy_from_slice(&curr_keys);
271
272        // Return true if the key was just pressed down
273        was_not_pressed && is_pressed_now
274    }
275    pub fn getkeyup(&self, kc: KeyCode) -> bool {
276        // Allocate a 32-byte array to hold the current key states
277        let mut curr_keys: [u8; 32] = [0; 32];
278
279        // Get the current key states
280        unsafe {
281            xlib::XQueryKeymap(self.display, curr_keys.as_mut_ptr() as *mut i8);
282        }
283        let keycode = kc.to_x11_keycode();
284
285        // Calculate the byte and bit position for the keycode
286        let byte_index = (keycode / 8) as usize;
287        let bit_index = (keycode % 8) as usize;
288
289        // Check if the key was not pressed previously but is pressed now
290        let was_pressed = (self.prev_keys.borrow()[byte_index] & (1 << bit_index)) != 0;
291        let is_not_pressed_now = (curr_keys[byte_index] & (1 << bit_index)) == 0;
292
293        // Update the previous keys array with the current state
294        self.prev_keys.borrow_mut().copy_from_slice(&curr_keys);
295
296        // Return true if the key was just pressed down
297        was_pressed && is_not_pressed_now
298    }
299    pub fn getkey(&self, kc: KeyCode) -> bool {
300        unsafe {
301            // Allocate a 32-byte array to hold key states
302            let mut keys: [u8; 32] = [0; 32];
303    
304            // Get the current key states
305            xlib::XQueryKeymap(self.display, keys.as_mut_ptr() as *mut i8);
306    
307            // Get the min and max keycode for the keyboard
308            let mut min_keycode: i32 = 0;
309            let mut max_keycode: i32 = 0;
310            xlib::XDisplayKeycodes(self.display, &mut min_keycode, &mut max_keycode);
311    
312            // Create a vector to store pressed keycodes
313            let mut pressed_keys: Vec<u8> = Vec::new();
314    
315            // Check which keys are pressed
316            for keycode in min_keycode..=max_keycode {
317                let byte_index = (keycode / 8) as usize;
318                let bit_index = (keycode % 8) as usize;
319    
320                if (keys[byte_index] & (1 << bit_index)) != 0 {
321                    pressed_keys.push(keycode as u8);
322                }
323            }
324            pressed_keys.contains(&kc.to_x11_keycode())
325        }
326    }
327    pub fn getmousebutton(&self, button: MouseButton) -> bool {
328        unsafe {
329            // Get the root window
330            let root = xlib::XDefaultRootWindow(self.display);
331    
332            // Variables to hold the pointer position and mask state
333            let mut root_return: xlib::Window = 0;
334            let mut child_return: xlib::Window = 0;
335            let mut root_x_return: i32 = 0;
336            let mut root_y_return: i32 = 0;
337            let mut win_x_return: i32 = 0;
338            let mut win_y_return: i32 = 0;
339            let mut mask_return: u32 = 0;
340    
341            // Query the pointer
342            let status = xlib::XQueryPointer(
343                self.display,
344                root,
345                &mut root_return,
346                &mut child_return,
347                &mut root_x_return,
348                &mut root_y_return,
349                &mut win_x_return,
350                &mut win_y_return,
351                &mut mask_return,
352            );
353    
354            // Check if the query was successful
355            if status == 0 {
356                eprintln!("XQueryPointer failed");
357                return false;
358            }
359    
360            // Create a vector to store pressed button codes
361            let mut pressed_buttons: Vec<u8> = Vec::new();
362            if mask_return & xlib::Button1Mask != 0 {
363                pressed_buttons.push(1);
364            }
365            if mask_return & xlib::Button2Mask != 0 {
366                pressed_buttons.push(2);
367            }
368            if mask_return & xlib::Button3Mask != 0 {
369                pressed_buttons.push(3);
370            }
371            if mask_return & xlib::Button4Mask != 0 {
372                pressed_buttons.push(4);
373            }
374            if mask_return & xlib::Button5Mask != 0 {
375                pressed_buttons.push(5);
376            }
377            if mask_return & 8192 != 0 { // Button 6
378                pressed_buttons.push(6);
379            }
380            if mask_return & (1 << 9) != 0 { // Button 7
381                pressed_buttons.push(7);
382            }
383            if mask_return & (1 << 10) != 0 { // Button 8
384                pressed_buttons.push(8);
385            }
386            if mask_return & (1 << 11) != 0 { // Button 9
387                pressed_buttons.push(9);
388            }
389
390            pressed_buttons.contains(&button.to_x11_buttoncode())
391        }
392    }
393    pub fn getmousebuttondown(&mut self, button: MouseButton) -> bool {
394        unsafe {
395            // Get the root window
396            let root = xlib::XDefaultRootWindow(self.display);
397    
398            // Variables to hold the pointer position and mask state
399            let mut root_return: xlib::Window = 0;
400            let mut child_return: xlib::Window = 0;
401            let mut root_x_return: i32 = 0;
402            let mut root_y_return: i32 = 0;
403            let mut win_x_return: i32 = 0;
404            let mut win_y_return: i32 = 0;
405            let mut mask_return: u32 = 0;
406    
407            // Query the pointer
408            let status = xlib::XQueryPointer(
409                self.display,
410                root,
411                &mut root_return,
412                &mut child_return,
413                &mut root_x_return,
414                &mut root_y_return,
415                &mut win_x_return,
416                &mut win_y_return,
417                &mut mask_return,
418            );
419    
420            // Check if the query was successful
421            if status == 0 {
422                eprintln!("XQueryPointer failed");
423                return false;
424            }
425    
426            // Create a vector to store pressed button codes
427            let mut pressed_buttons: Vec<u8> = Vec::new();
428            if mask_return & xlib::Button1Mask != 0 {
429                pressed_buttons.push(1);
430            }
431            if mask_return & xlib::Button2Mask != 0 {
432                pressed_buttons.push(2);
433            }
434            if mask_return & xlib::Button3Mask != 0 {
435                pressed_buttons.push(3);
436            }
437            if mask_return & xlib::Button4Mask != 0 {
438                pressed_buttons.push(4);
439            }
440            if mask_return & xlib::Button5Mask != 0 {
441                pressed_buttons.push(5);
442            }
443            if mask_return & 8192 != 0 { // Button 6
444                pressed_buttons.push(6);
445            }
446            if mask_return & (1 << 9) != 0 { // Button 7
447                pressed_buttons.push(7);
448            }
449            if mask_return & (1 << 10) != 0 { // Button 8
450                pressed_buttons.push(8);
451            }
452            if mask_return & (1 << 11) != 0 { // Button 9
453                pressed_buttons.push(9);
454            }
455            
456            let res = pressed_buttons.contains(&button.to_x11_buttoncode()) && !self.prev_mbs.contains(&button.to_x11_buttoncode());
457
458            self.prev_mbs = pressed_buttons;
459            res
460        }
461    }
462    pub fn getmousebuttonup(&mut self, button: MouseButton) -> bool {
463        unsafe {
464            // Get the root window
465            let root = xlib::XDefaultRootWindow(self.display);
466    
467            // Variables to hold the pointer position and mask state
468            let mut root_return: xlib::Window = 0;
469            let mut child_return: xlib::Window = 0;
470            let mut root_x_return: i32 = 0;
471            let mut root_y_return: i32 = 0;
472            let mut win_x_return: i32 = 0;
473            let mut win_y_return: i32 = 0;
474            let mut mask_return: u32 = 0;
475    
476            // Query the pointer
477            let status = xlib::XQueryPointer(
478                self.display,
479                root,
480                &mut root_return,
481                &mut child_return,
482                &mut root_x_return,
483                &mut root_y_return,
484                &mut win_x_return,
485                &mut win_y_return,
486                &mut mask_return,
487            );
488    
489            // Check if the query was successful
490            if status == 0 {
491                eprintln!("XQueryPointer failed");
492                return false;
493            }
494    
495            // Create a vector to store pressed button codes
496            let mut pressed_buttons: Vec<u8> = Vec::new();
497            if mask_return & xlib::Button1Mask != 0 {
498                pressed_buttons.push(1);
499            }
500            if mask_return & xlib::Button2Mask != 0 {
501                pressed_buttons.push(2);
502            }
503            if mask_return & xlib::Button3Mask != 0 {
504                pressed_buttons.push(3);
505            }
506            if mask_return & xlib::Button4Mask != 0 {
507                pressed_buttons.push(4);
508            }
509            if mask_return & xlib::Button5Mask != 0 {
510                pressed_buttons.push(5);
511            }
512            if mask_return & 8192 != 0 { // Button 6
513                pressed_buttons.push(6);
514            }
515            if mask_return & (1 << 9) != 0 { // Button 7
516                pressed_buttons.push(7);
517            }
518            if mask_return & (1 << 10) != 0 { // Button 8
519                pressed_buttons.push(8);
520            }
521            if mask_return & (1 << 11) != 0 { // Button 9
522                pressed_buttons.push(9);
523            }
524            
525            let res = !pressed_buttons.contains(&button.to_x11_buttoncode()) && self.prev_mbs.contains(&button.to_x11_buttoncode());
526
527            self.prev_mbs = pressed_buttons;
528            res
529        }
530    }
531    pub fn getmousepos(&self) -> (u16, u16) {
532        unsafe {
533    
534            // Get the root window
535            let root = xlib::XDefaultRootWindow(self.display);
536    
537            // Variables to hold the pointer position and mask state
538            let mut root_return: xlib::Window = 0;
539            let mut child_return: xlib::Window = 0;
540            let mut root_x_return: i32 = 0;
541            let mut root_y_return: i32 = 0;
542            let mut win_x_return: i32 = 0;
543            let mut win_y_return: i32 = 0;
544            let mut mask_return: u32 = 0;
545    
546            // Query the pointer
547            let status = xlib::XQueryPointer(
548                self.display,
549                root,
550                &mut root_return,
551                &mut child_return,
552                &mut root_x_return,
553                &mut root_y_return,
554                &mut win_x_return,
555                &mut win_y_return,
556                &mut mask_return,
557            );
558    
559            // Check if the query was successful
560            if status == 0 {
561                eprintln!("XQueryPointer failed");
562                return (0, 0);
563            }
564            (root_x_return as u16, root_y_return as u16)
565        }
566    }
567    pub fn write(&self, text: &'static str) {
568        for i in 0..text.chars().count() {
569            unsafe {
570                match text.chars().collect::<Vec<char>>()[i] {
571                    'A' => {
572                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
573                        XTestFakeKeyEvent(self.display, KeyCode::A.to_x11_keycode() as u32, xlib::True, 0);
574                        XTestFakeKeyEvent(self.display, KeyCode::A.to_x11_keycode() as u32, xlib::False, 0);
575                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
576                    },
577                    'B' => {
578                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
579                        XTestFakeKeyEvent(self.display, KeyCode::B.to_x11_keycode() as u32, xlib::True, 0);
580                        XTestFakeKeyEvent(self.display, KeyCode::B.to_x11_keycode() as u32, xlib::False, 0);
581                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
582                    },
583                    'C' => {
584                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
585                        XTestFakeKeyEvent(self.display, KeyCode::C.to_x11_keycode() as u32, xlib::True, 0);
586                        XTestFakeKeyEvent(self.display, KeyCode::C.to_x11_keycode() as u32, xlib::False, 0);
587                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
588                    },
589                    'D' => {
590                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
591                        XTestFakeKeyEvent(self.display, KeyCode::D.to_x11_keycode() as u32, xlib::True, 0);
592                        XTestFakeKeyEvent(self.display, KeyCode::D.to_x11_keycode() as u32, xlib::False, 0);
593                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
594                    },
595                    'E' => {
596                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
597                        XTestFakeKeyEvent(self.display, KeyCode::E.to_x11_keycode() as u32, xlib::True, 0);
598                        XTestFakeKeyEvent(self.display, KeyCode::E.to_x11_keycode() as u32, xlib::False, 0);
599                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
600                    },
601                    'F' => {
602                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
603                        XTestFakeKeyEvent(self.display, KeyCode::F.to_x11_keycode() as u32, xlib::True, 0);
604                        XTestFakeKeyEvent(self.display, KeyCode::F.to_x11_keycode() as u32, xlib::False, 0);
605                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
606                    },
607                    'G' => {
608                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
609                        XTestFakeKeyEvent(self.display, KeyCode::G.to_x11_keycode() as u32, xlib::True, 0);
610                        XTestFakeKeyEvent(self.display, KeyCode::G.to_x11_keycode() as u32, xlib::False, 0);
611                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
612                    },
613                    'H' => {
614                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
615                        XTestFakeKeyEvent(self.display, KeyCode::H.to_x11_keycode() as u32, xlib::True, 0);
616                        XTestFakeKeyEvent(self.display, KeyCode::H.to_x11_keycode() as u32, xlib::False, 0);
617                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
618                    },
619                    'I' => {
620                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
621                        XTestFakeKeyEvent(self.display, KeyCode::I.to_x11_keycode() as u32, xlib::True, 0);
622                        XTestFakeKeyEvent(self.display, KeyCode::I.to_x11_keycode() as u32, xlib::False, 0);
623                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
624                    },
625                    'J' => {
626                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
627                        XTestFakeKeyEvent(self.display, KeyCode::J.to_x11_keycode() as u32, xlib::True, 0);
628                        XTestFakeKeyEvent(self.display, KeyCode::J.to_x11_keycode() as u32, xlib::False, 0);
629                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
630                    },
631                    'K' => {
632                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
633                        XTestFakeKeyEvent(self.display, KeyCode::K.to_x11_keycode() as u32, xlib::True, 0);
634                        XTestFakeKeyEvent(self.display, KeyCode::K.to_x11_keycode() as u32, xlib::False, 0);
635                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
636                    },
637                    'L' => {
638                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
639                        XTestFakeKeyEvent(self.display, KeyCode::L.to_x11_keycode() as u32, xlib::True, 0);
640                        XTestFakeKeyEvent(self.display, KeyCode::L.to_x11_keycode() as u32, xlib::False, 0);
641                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
642                    },
643                    'M' => {
644                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
645                        XTestFakeKeyEvent(self.display, KeyCode::M.to_x11_keycode() as u32, xlib::True, 0);
646                        XTestFakeKeyEvent(self.display, KeyCode::M.to_x11_keycode() as u32, xlib::False, 0);
647                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
648                    },
649                    'N' => {
650                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
651                        XTestFakeKeyEvent(self.display, KeyCode::N.to_x11_keycode() as u32, xlib::True, 0);
652                        XTestFakeKeyEvent(self.display, KeyCode::N.to_x11_keycode() as u32, xlib::False, 0);
653                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
654                    },
655                    'O' => {
656                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
657                        XTestFakeKeyEvent(self.display, KeyCode::O.to_x11_keycode() as u32, xlib::True, 0);
658                        XTestFakeKeyEvent(self.display, KeyCode::O.to_x11_keycode() as u32, xlib::False, 0);
659                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
660                    },
661                    'P' => {
662                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
663                        XTestFakeKeyEvent(self.display, KeyCode::P.to_x11_keycode() as u32, xlib::True, 0);
664                        XTestFakeKeyEvent(self.display, KeyCode::P.to_x11_keycode() as u32, xlib::False, 0);
665                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
666                    },
667                    'Q' => {
668                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
669                        XTestFakeKeyEvent(self.display, KeyCode::Q.to_x11_keycode() as u32, xlib::True, 0);
670                        XTestFakeKeyEvent(self.display, KeyCode::Q.to_x11_keycode() as u32, xlib::False, 0);
671                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
672                    },
673                    'R' => {
674                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
675                        XTestFakeKeyEvent(self.display, KeyCode::R.to_x11_keycode() as u32, xlib::True, 0);
676                        XTestFakeKeyEvent(self.display, KeyCode::R.to_x11_keycode() as u32, xlib::False, 0);
677                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
678                    },
679                    'S' => {
680                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
681                        XTestFakeKeyEvent(self.display, KeyCode::S.to_x11_keycode() as u32, xlib::True, 0);
682                        XTestFakeKeyEvent(self.display, KeyCode::S.to_x11_keycode() as u32, xlib::False, 0);
683                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
684                    },
685                    'T' => {
686                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
687                        XTestFakeKeyEvent(self.display, KeyCode::T.to_x11_keycode() as u32, xlib::True, 0);
688                        XTestFakeKeyEvent(self.display, KeyCode::T.to_x11_keycode() as u32, xlib::False, 0);
689                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
690                    },
691                    'U' => {
692                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
693                        XTestFakeKeyEvent(self.display, KeyCode::U.to_x11_keycode() as u32, xlib::True, 0);
694                        XTestFakeKeyEvent(self.display, KeyCode::U.to_x11_keycode() as u32, xlib::False, 0);
695                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
696                    },
697                    'V' => {
698                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
699                        XTestFakeKeyEvent(self.display, KeyCode::V.to_x11_keycode() as u32, xlib::True, 0);
700                        XTestFakeKeyEvent(self.display, KeyCode::V.to_x11_keycode() as u32, xlib::False, 0);
701                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
702                    },
703                    'W' => {
704                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
705                        XTestFakeKeyEvent(self.display, KeyCode::W.to_x11_keycode() as u32, xlib::True, 0);
706                        XTestFakeKeyEvent(self.display, KeyCode::W.to_x11_keycode() as u32, xlib::False, 0);
707                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
708                    },
709                    'X' => {
710                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
711                        XTestFakeKeyEvent(self.display, KeyCode::X.to_x11_keycode() as u32, xlib::True, 0);
712                        XTestFakeKeyEvent(self.display, KeyCode::X.to_x11_keycode() as u32, xlib::False, 0);
713                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
714                    },
715                    'Y' => {
716                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
717                        XTestFakeKeyEvent(self.display, KeyCode::Y.to_x11_keycode() as u32, xlib::True, 0);
718                        XTestFakeKeyEvent(self.display, KeyCode::Y.to_x11_keycode() as u32, xlib::False, 0);
719                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
720                    },
721                    'Z' => {
722                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
723                        XTestFakeKeyEvent(self.display, KeyCode::Z.to_x11_keycode() as u32, xlib::True, 0);
724                        XTestFakeKeyEvent(self.display, KeyCode::Z.to_x11_keycode() as u32, xlib::False, 0);
725                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
726                    },
727                    'a' => {
728                        XTestFakeKeyEvent(self.display, KeyCode::A.to_x11_keycode() as u32, xlib::True, 0);
729                        XTestFakeKeyEvent(self.display, KeyCode::A.to_x11_keycode() as u32, xlib::False, 0);
730                    },
731                    'b' => {
732                        XTestFakeKeyEvent(self.display, KeyCode::B.to_x11_keycode() as u32, xlib::True, 0);
733                        XTestFakeKeyEvent(self.display, KeyCode::B.to_x11_keycode() as u32, xlib::False, 0);
734                    },
735                    'c' => {
736                        XTestFakeKeyEvent(self.display, KeyCode::C.to_x11_keycode() as u32, xlib::True, 0);
737                        XTestFakeKeyEvent(self.display, KeyCode::C.to_x11_keycode() as u32, xlib::False, 0);
738                    },
739                    'd' => {
740                        XTestFakeKeyEvent(self.display, KeyCode::D.to_x11_keycode() as u32, xlib::True, 0);
741                        XTestFakeKeyEvent(self.display, KeyCode::D.to_x11_keycode() as u32, xlib::False, 0);
742                    },
743                    'e' => {
744                        XTestFakeKeyEvent(self.display, KeyCode::E.to_x11_keycode() as u32, xlib::True, 0);
745                        XTestFakeKeyEvent(self.display, KeyCode::E.to_x11_keycode() as u32, xlib::False, 0);
746                    },
747                    'f' => {
748                        XTestFakeKeyEvent(self.display, KeyCode::F.to_x11_keycode() as u32, xlib::True, 0);
749                        XTestFakeKeyEvent(self.display, KeyCode::F.to_x11_keycode() as u32, xlib::False, 0);
750                    },
751                    'g' => {
752                        XTestFakeKeyEvent(self.display, KeyCode::G.to_x11_keycode() as u32, xlib::True, 0);
753                        XTestFakeKeyEvent(self.display, KeyCode::G.to_x11_keycode() as u32, xlib::False, 0);
754                    },
755                    'h' => {
756                        XTestFakeKeyEvent(self.display, KeyCode::H.to_x11_keycode() as u32, xlib::True, 0);
757                        XTestFakeKeyEvent(self.display, KeyCode::H.to_x11_keycode() as u32, xlib::False, 0);
758                    },
759                    'i' => {
760                        XTestFakeKeyEvent(self.display, KeyCode::I.to_x11_keycode() as u32, xlib::True, 0);
761                        XTestFakeKeyEvent(self.display, KeyCode::I.to_x11_keycode() as u32, xlib::False, 0);
762                    },
763                    'j' => {
764                        XTestFakeKeyEvent(self.display, KeyCode::J.to_x11_keycode() as u32, xlib::True, 0);
765                        XTestFakeKeyEvent(self.display, KeyCode::J.to_x11_keycode() as u32, xlib::False, 0);
766                    },
767                    'k' => {
768                        XTestFakeKeyEvent(self.display, KeyCode::K.to_x11_keycode() as u32, xlib::True, 0);
769                        XTestFakeKeyEvent(self.display, KeyCode::K.to_x11_keycode() as u32, xlib::False, 0);
770                    },
771                    'l' => {
772                        XTestFakeKeyEvent(self.display, KeyCode::L.to_x11_keycode() as u32, xlib::True, 0);
773                        XTestFakeKeyEvent(self.display, KeyCode::L.to_x11_keycode() as u32, xlib::False, 0);
774                    },
775                    'm' => {
776                        XTestFakeKeyEvent(self.display, KeyCode::M.to_x11_keycode() as u32, xlib::True, 0);
777                        XTestFakeKeyEvent(self.display, KeyCode::M.to_x11_keycode() as u32, xlib::False, 0);
778                    },
779                    'n' => {
780                        XTestFakeKeyEvent(self.display, KeyCode::N.to_x11_keycode() as u32, xlib::True, 0);
781                        XTestFakeKeyEvent(self.display, KeyCode::N.to_x11_keycode() as u32, xlib::False, 0);
782                    },
783                    'o' => {
784                        XTestFakeKeyEvent(self.display, KeyCode::O.to_x11_keycode() as u32, xlib::True, 0);
785                        XTestFakeKeyEvent(self.display, KeyCode::O.to_x11_keycode() as u32, xlib::False, 0);
786                    },
787                    'p' => {
788                        XTestFakeKeyEvent(self.display, KeyCode::P.to_x11_keycode() as u32, xlib::True, 0);
789                        XTestFakeKeyEvent(self.display, KeyCode::P.to_x11_keycode() as u32, xlib::False, 0);
790                    },
791                    'q' => {
792                        XTestFakeKeyEvent(self.display, KeyCode::Q.to_x11_keycode() as u32, xlib::True, 0);
793                        XTestFakeKeyEvent(self.display, KeyCode::Q.to_x11_keycode() as u32, xlib::False, 0);
794                    },
795                    'r' => {
796                        XTestFakeKeyEvent(self.display, KeyCode::R.to_x11_keycode() as u32, xlib::True, 0);
797                        XTestFakeKeyEvent(self.display, KeyCode::R.to_x11_keycode() as u32, xlib::False, 0);
798                    },
799                    's' => {
800                        XTestFakeKeyEvent(self.display, KeyCode::S.to_x11_keycode() as u32, xlib::True, 0);
801                        XTestFakeKeyEvent(self.display, KeyCode::S.to_x11_keycode() as u32, xlib::False, 0);
802                    },
803                    't' => {
804                        XTestFakeKeyEvent(self.display, KeyCode::T.to_x11_keycode() as u32, xlib::True, 0);
805                        XTestFakeKeyEvent(self.display, KeyCode::T.to_x11_keycode() as u32, xlib::False, 0);
806                    },
807                    'u' => {
808                        XTestFakeKeyEvent(self.display, KeyCode::U.to_x11_keycode() as u32, xlib::True, 0);
809                        XTestFakeKeyEvent(self.display, KeyCode::U.to_x11_keycode() as u32, xlib::False, 0);
810                    },
811                    'v' => {
812                        XTestFakeKeyEvent(self.display, KeyCode::V.to_x11_keycode() as u32, xlib::True, 0);
813                        XTestFakeKeyEvent(self.display, KeyCode::V.to_x11_keycode() as u32, xlib::False, 0);
814                    },
815                    'w' => {
816                        XTestFakeKeyEvent(self.display, KeyCode::W.to_x11_keycode() as u32, xlib::True, 0);
817                        XTestFakeKeyEvent(self.display, KeyCode::W.to_x11_keycode() as u32, xlib::False, 0);
818                    },
819                    'x' => {
820                        XTestFakeKeyEvent(self.display, KeyCode::X.to_x11_keycode() as u32, xlib::True, 0);
821                        XTestFakeKeyEvent(self.display, KeyCode::X.to_x11_keycode() as u32, xlib::False, 0);
822                    },
823                    'y' => {
824                        XTestFakeKeyEvent(self.display, KeyCode::Y.to_x11_keycode() as u32, xlib::True, 0);
825                        XTestFakeKeyEvent(self.display, KeyCode::Y.to_x11_keycode() as u32, xlib::False, 0);
826                    },
827                    'z' => {
828                        XTestFakeKeyEvent(self.display, KeyCode::Z.to_x11_keycode() as u32, xlib::True, 0);
829                        XTestFakeKeyEvent(self.display, KeyCode::Z.to_x11_keycode() as u32, xlib::False, 0);
830                    },
831                    ';' => {
832                        XTestFakeKeyEvent(self.display, KeyCode::Semicolon.to_x11_keycode() as u32, xlib::True, 0);
833                        XTestFakeKeyEvent(self.display, KeyCode::Semicolon.to_x11_keycode() as u32, xlib::False, 0);
834                    },
835                    ':' => {
836                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
837                        XTestFakeKeyEvent(self.display, KeyCode::Semicolon.to_x11_keycode() as u32, xlib::True, 0);
838                        XTestFakeKeyEvent(self.display, KeyCode::Semicolon.to_x11_keycode() as u32, xlib::False, 0);
839                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
840                    },
841                    ',' => {
842                        XTestFakeKeyEvent(self.display, KeyCode::Comma.to_x11_keycode() as u32, xlib::True, 0);
843                        XTestFakeKeyEvent(self.display, KeyCode::Comma.to_x11_keycode() as u32, xlib::False, 0);
844                    },
845                    '<' => {
846                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
847                        XTestFakeKeyEvent(self.display, KeyCode::Comma.to_x11_keycode() as u32, xlib::True, 0);
848                        XTestFakeKeyEvent(self.display, KeyCode::Comma.to_x11_keycode() as u32, xlib::False, 0);
849                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
850                    },
851                    '.' => {
852                        XTestFakeKeyEvent(self.display, KeyCode::Period.to_x11_keycode() as u32, xlib::True, 0);
853                        XTestFakeKeyEvent(self.display, KeyCode::Period.to_x11_keycode() as u32, xlib::False, 0);
854                    },
855                    '>' => {
856                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::True, 0);
857                        XTestFakeKeyEvent(self.display, KeyCode::Period.to_x11_keycode() as u32, xlib::True, 0);
858                        XTestFakeKeyEvent(self.display, KeyCode::Period.to_x11_keycode() as u32, xlib::False, 0);
859                        XTestFakeKeyEvent(self.display, KeyCode::ShiftL.to_x11_keycode() as u32, xlib::False, 0);
860                    },
861					'0' => {
862						XTestFakeKeyEvent(self.display, KeyCode::Num0.to_x11_keycode() as u32, xlib::True, 0);
863						XTestFakeKeyEvent(self.display, KeyCode::Num0.to_x11_keycode() as u32, xlib::False, 0);
864					},
865					'1' => {
866						XTestFakeKeyEvent(self.display, KeyCode::Num1.to_x11_keycode() as u32, xlib::True, 0);
867						XTestFakeKeyEvent(self.display, KeyCode::Num1.to_x11_keycode() as u32, xlib::False, 0);
868					},
869					'2' => {
870						XTestFakeKeyEvent(self.display, KeyCode::Num2.to_x11_keycode() as u32, xlib::True, 0);
871						XTestFakeKeyEvent(self.display, KeyCode::Num2.to_x11_keycode() as u32, xlib::False, 0);
872					},
873					'3' => {
874						XTestFakeKeyEvent(self.display, KeyCode::Num3.to_x11_keycode() as u32, xlib::True, 0);
875						XTestFakeKeyEvent(self.display, KeyCode::Num3.to_x11_keycode() as u32, xlib::False, 0);
876					},
877					'4' => {
878						XTestFakeKeyEvent(self.display, KeyCode::Num4.to_x11_keycode() as u32, xlib::True, 0);
879						XTestFakeKeyEvent(self.display, KeyCode::Num4.to_x11_keycode() as u32, xlib::False, 0);
880					},
881					'5' => {
882						XTestFakeKeyEvent(self.display, KeyCode::Num5.to_x11_keycode() as u32, xlib::True, 0);
883						XTestFakeKeyEvent(self.display, KeyCode::Num5.to_x11_keycode() as u32, xlib::False, 0);
884					},
885					'6' => {
886						XTestFakeKeyEvent(self.display, KeyCode::Num6.to_x11_keycode() as u32, xlib::True, 0);
887						XTestFakeKeyEvent(self.display, KeyCode::Num6.to_x11_keycode() as u32, xlib::False, 0);
888					},
889					'7' => {
890						XTestFakeKeyEvent(self.display, KeyCode::Num7.to_x11_keycode() as u32, xlib::True, 0);
891						XTestFakeKeyEvent(self.display, KeyCode::Num7.to_x11_keycode() as u32, xlib::False, 0);
892					},
893					'8' => {
894						XTestFakeKeyEvent(self.display, KeyCode::Num8.to_x11_keycode() as u32, xlib::True, 0);
895						XTestFakeKeyEvent(self.display, KeyCode::Num8.to_x11_keycode() as u32, xlib::False, 0);
896					},
897					'9' => {
898						XTestFakeKeyEvent(self.display, KeyCode::Num9.to_x11_keycode() as u32, xlib::True, 0);
899						XTestFakeKeyEvent(self.display, KeyCode::Num9.to_x11_keycode() as u32, xlib::False, 0);
900					},
901                    _ => {}
902                }
903                xlib::XFlush(self.display);
904            }
905        }
906    }
907    pub fn hotkey(&self, keyvec: Vec<KeyCode>) {
908        unsafe {
909            for i in &keyvec {
910                XTestFakeKeyEvent(self.display, i.to_x11_keycode() as u32, xlib::True, 0);
911            }
912            for i in &keyvec.into_iter().rev().collect::<Vec<KeyCode>>() {
913                XTestFakeKeyEvent(self.display, i.to_x11_keycode() as u32, xlib::False, 0);
914            }
915        }
916    }
917    pub fn press(&self, key: KeyCode) {
918        unsafe {
919            XTestFakeKeyEvent(self.display, key.to_x11_keycode() as u32, xlib::True, 0);
920        }
921    }
922    pub fn release(&self, key: KeyCode) {
923        unsafe {
924            XTestFakeKeyEvent(self.display, key.to_x11_keycode() as u32, xlib::False, 0);
925        }
926    }
927}
928
929impl Drop for Input {
930    /// Closes the X11 display when the X11KeyChecker is dropped.
931    fn drop(&mut self) {
932        unsafe {
933            xlib::XCloseDisplay(self.display);
934        }
935    }
936}
937
938#[cfg(test)]
939mod tests {
940    use super::*;
941
942    #[test]
943    fn test() {
944        let input = Input::new().expect("unable to create input");
945        input.press(KeyCode::SuperL);
946        input.release(KeyCode::SuperL);
947    }
948}