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 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 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 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 let mut curr_keys: [u8; 32] = [0; 32];
254
255 unsafe {
257 xlib::XQueryKeymap(self.display, curr_keys.as_mut_ptr() as *mut i8);
258 }
259 let keycode = kc.to_x11_keycode();
260
261 let byte_index = (keycode / 8) as usize;
263 let bit_index = (keycode % 8) as usize;
264
265 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 self.prev_keys.borrow_mut().copy_from_slice(&curr_keys);
271
272 was_not_pressed && is_pressed_now
274 }
275 pub fn getkeyup(&self, kc: KeyCode) -> bool {
276 let mut curr_keys: [u8; 32] = [0; 32];
278
279 unsafe {
281 xlib::XQueryKeymap(self.display, curr_keys.as_mut_ptr() as *mut i8);
282 }
283 let keycode = kc.to_x11_keycode();
284
285 let byte_index = (keycode / 8) as usize;
287 let bit_index = (keycode % 8) as usize;
288
289 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 self.prev_keys.borrow_mut().copy_from_slice(&curr_keys);
295
296 was_pressed && is_not_pressed_now
298 }
299 pub fn getkey(&self, kc: KeyCode) -> bool {
300 unsafe {
301 let mut keys: [u8; 32] = [0; 32];
303
304 xlib::XQueryKeymap(self.display, keys.as_mut_ptr() as *mut i8);
306
307 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 let mut pressed_keys: Vec<u8> = Vec::new();
314
315 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 let root = xlib::XDefaultRootWindow(self.display);
331
332 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 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 if status == 0 {
356 eprintln!("XQueryPointer failed");
357 return false;
358 }
359
360 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 { pressed_buttons.push(6);
379 }
380 if mask_return & (1 << 9) != 0 { pressed_buttons.push(7);
382 }
383 if mask_return & (1 << 10) != 0 { pressed_buttons.push(8);
385 }
386 if mask_return & (1 << 11) != 0 { 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 let root = xlib::XDefaultRootWindow(self.display);
397
398 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 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 if status == 0 {
422 eprintln!("XQueryPointer failed");
423 return false;
424 }
425
426 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 { pressed_buttons.push(6);
445 }
446 if mask_return & (1 << 9) != 0 { pressed_buttons.push(7);
448 }
449 if mask_return & (1 << 10) != 0 { pressed_buttons.push(8);
451 }
452 if mask_return & (1 << 11) != 0 { 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 let root = xlib::XDefaultRootWindow(self.display);
466
467 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 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 if status == 0 {
491 eprintln!("XQueryPointer failed");
492 return false;
493 }
494
495 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 { pressed_buttons.push(6);
514 }
515 if mask_return & (1 << 9) != 0 { pressed_buttons.push(7);
517 }
518 if mask_return & (1 << 10) != 0 { pressed_buttons.push(8);
520 }
521 if mask_return & (1 << 11) != 0 { 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 let root = xlib::XDefaultRootWindow(self.display);
536
537 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 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 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 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}