@@ -5,8 +5,9 @@ use input_linux::{
55 EventKind , EventTime , InputEvent , InputId , Key as UKey , KeyEvent , KeyState , RelativeAxis ,
66 RelativeEvent , SynchronizeEvent , SynchronizeKind , UInputHandle ,
77} ;
8- use libc:: input_event;
8+ use libc:: { input_event, O_NONBLOCK } ;
99use std:: fs:: { File , OpenOptions } ;
10+ use std:: os:: unix:: fs:: OpenOptionsExt ;
1011use std:: sync:: { LazyLock , Mutex } ;
1112
1213static HANDLE : LazyLock < Mutex < Option < UInputHandle < File > > > > = LazyLock :: new ( || Mutex :: new ( None ) ) ;
@@ -17,8 +18,11 @@ impl Handle {
1718 pub fn new ( ) -> Self {
1819 let mut handle = HANDLE . lock ( ) . unwrap ( ) ;
1920 if handle. is_none ( ) {
20- let file = OpenOptions :: new ( ) . write ( true ) . open ( "/dev/uinput" ) . unwrap ( ) ;
21- // let file = File::open("/dev/uinput").unwrap();
21+ let file = OpenOptions :: new ( )
22+ . write ( true )
23+ . custom_flags ( O_NONBLOCK )
24+ . open ( "/dev/uinput" )
25+ . unwrap ( ) ;
2226 let uinput = UInputHandle :: new ( file) ;
2327 uinput. set_evbit ( EventKind :: Key ) . unwrap ( ) ;
2428 uinput. set_evbit ( EventKind :: Relative ) . unwrap ( ) ;
@@ -44,29 +48,35 @@ impl Handle {
4448 Handle
4549 }
4650
51+ fn send_key_event (
52+ & self ,
53+ handle : & UInputHandle < File > ,
54+ ukey : UKey ,
55+ state : KeyState ,
56+ ) -> Result < ( ) , SimulateError > {
57+ const ZERO : EventTime = EventTime :: new ( 0 , 0 ) ;
58+ let event = KeyEvent :: new ( ZERO , ukey, state) ;
59+ let event: input_event = InputEvent :: from ( event) . into ( ) ;
60+ let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
61+ let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
62+
63+ handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
64+ Ok ( ( ) )
65+ }
66+
4767 pub fn send ( & self , event : & EventType ) -> Result < ( ) , SimulateError > {
4868 let handle = HANDLE . lock ( ) . unwrap ( ) ;
4969 if let Some ( handle) = handle. as_ref ( ) {
5070 const ZERO : EventTime = EventTime :: new ( 0 , 0 ) ;
5171 match event {
5272 EventType :: KeyPress ( key) => {
5373 if let Some ( ukey) = ukey_from_key ( * key) {
54- let event = KeyEvent :: new ( ZERO , ukey, KeyState :: PRESSED ) ;
55- let event: input_event = InputEvent :: from ( event) . into ( ) ;
56- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
57- let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
58- eprintln ! ( "Writing it" ) ;
59- handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
60- eprintln ! ( "Could write it." ) ;
74+ self . send_key_event ( handle, ukey, KeyState :: PRESSED ) ?;
6175 }
6276 }
6377 EventType :: KeyRelease ( key) => {
6478 if let Some ( ukey) = ukey_from_key ( * key) {
65- let event = KeyEvent :: new ( ZERO , ukey, KeyState :: RELEASED ) ;
66- let event: input_event = InputEvent :: from ( event) . into ( ) ;
67- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
68- let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
69- handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
79+ self . send_key_event ( handle, ukey, KeyState :: RELEASED ) ?;
7080 }
7181 }
7282 EventType :: ButtonPress ( button) => {
0 commit comments