@@ -9,6 +9,7 @@ use libc::{input_event, O_NONBLOCK};
99use std:: fs:: { File , OpenOptions } ;
1010use std:: os:: unix:: fs:: OpenOptionsExt ;
1111use std:: sync:: { LazyLock , Mutex } ;
12+ use std:: time:: { SystemTime , UNIX_EPOCH } ;
1213
1314static HANDLE : LazyLock < Mutex < Option < UInputHandle < File > > > > = LazyLock :: new ( || Mutex :: new ( None ) ) ;
1415
@@ -48,26 +49,32 @@ impl Handle {
4849 Handle
4950 }
5051
52+ fn get_current_time ( ) -> EventTime {
53+ let now = SystemTime :: now ( )
54+ . duration_since ( UNIX_EPOCH )
55+ . unwrap_or_default ( ) ;
56+ EventTime :: new ( now. as_secs ( ) as i64 , now. subsec_micros ( ) as i64 )
57+ }
58+
5159 fn send_key_event (
5260 & self ,
5361 handle : & UInputHandle < File > ,
5462 ukey : UKey ,
5563 state : KeyState ,
5664 ) -> Result < ( ) , SimulateError > {
57- const ZERO : EventTime = EventTime :: new ( 0 , 0 ) ;
58- let event = KeyEvent :: new ( ZERO , ukey, state) ;
65+ let time = Self :: get_current_time ( ) ;
66+ let event = KeyEvent :: new ( time , ukey, state) ;
5967 let event: input_event = InputEvent :: from ( event) . into ( ) ;
60- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
68+ let sync = SynchronizeEvent :: new ( time , SynchronizeKind :: Report , 0 ) ;
6169 let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
62-
70+
6371 handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
6472 Ok ( ( ) )
6573 }
6674
6775 pub fn send ( & self , event : & EventType ) -> Result < ( ) , SimulateError > {
6876 let handle = HANDLE . lock ( ) . unwrap ( ) ;
6977 if let Some ( handle) = handle. as_ref ( ) {
70- const ZERO : EventTime = EventTime :: new ( 0 , 0 ) ;
7178 match event {
7279 EventType :: KeyPress ( key) => {
7380 if let Some ( ukey) = ukey_from_key ( * key) {
@@ -86,9 +93,10 @@ impl Handle {
8693 Button :: Middle => UKey :: ButtonMiddle ,
8794 Button :: Unknown ( _) => return Err ( SimulateError ) ,
8895 } ;
89- let event = KeyEvent :: new ( ZERO , ukey, KeyState :: PRESSED ) ;
96+ let time = Self :: get_current_time ( ) ;
97+ let event = KeyEvent :: new ( time, ukey, KeyState :: PRESSED ) ;
9098 let event: input_event = InputEvent :: from ( event) . into ( ) ;
91- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
99+ let sync = SynchronizeEvent :: new ( time , SynchronizeKind :: Report , 0 ) ;
92100 let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
93101 handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
94102 }
@@ -99,29 +107,32 @@ impl Handle {
99107 Button :: Middle => UKey :: ButtonMiddle ,
100108 Button :: Unknown ( _) => return Err ( SimulateError ) ,
101109 } ;
102- let event = KeyEvent :: new ( ZERO , ukey, KeyState :: RELEASED ) ;
110+ let time = Self :: get_current_time ( ) ;
111+ let event = KeyEvent :: new ( time, ukey, KeyState :: RELEASED ) ;
103112 let event: input_event = InputEvent :: from ( event) . into ( ) ;
104- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
113+ let sync = SynchronizeEvent :: new ( time , SynchronizeKind :: Report , 0 ) ;
105114 let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
106115 handle. write ( & [ event, sync] ) . map_err ( |_| SimulateError ) ?;
107116 }
108117 EventType :: MouseMove { x, y } => {
109- let event_x = RelativeEvent :: new ( ZERO , RelativeAxis :: X , * x as i32 ) ;
118+ let time = Self :: get_current_time ( ) ;
119+ let event_x = RelativeEvent :: new ( time, RelativeAxis :: X , * x as i32 ) ;
110120 let event_x: input_event = InputEvent :: from ( event_x) . into ( ) ;
111- let event_y = RelativeEvent :: new ( ZERO , RelativeAxis :: Y , * y as i32 ) ;
121+ let event_y = RelativeEvent :: new ( time , RelativeAxis :: Y , * y as i32 ) ;
112122 let event_y: input_event = InputEvent :: from ( event_y) . into ( ) ;
113- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
123+ let sync = SynchronizeEvent :: new ( time , SynchronizeKind :: Report , 0 ) ;
114124 let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
115125 handle
116126 . write ( & [ event_x, event_y, sync] )
117127 . map_err ( |_| SimulateError ) ?;
118128 }
119129 EventType :: Wheel { delta_x, delta_y } => {
120- let event_x = RelativeEvent :: new ( ZERO , RelativeAxis :: Wheel , * delta_x as i32 ) ;
130+ let time = Self :: get_current_time ( ) ;
131+ let event_x = RelativeEvent :: new ( time, RelativeAxis :: Wheel , * delta_x as i32 ) ;
121132 let event_x: input_event = InputEvent :: from ( event_x) . into ( ) ;
122- let event_y = RelativeEvent :: new ( ZERO , RelativeAxis :: Wheel , * delta_y as i32 ) ;
133+ let event_y = RelativeEvent :: new ( time , RelativeAxis :: Wheel , * delta_y as i32 ) ;
123134 let event_y: input_event = InputEvent :: from ( event_y) . into ( ) ;
124- let sync = SynchronizeEvent :: new ( ZERO , SynchronizeKind :: Report , 0 ) ;
135+ let sync = SynchronizeEvent :: new ( time , SynchronizeKind :: Report , 0 ) ;
125136 let sync: input_event = InputEvent :: from ( sync) . into ( ) ;
126137 handle
127138 . write ( & [ event_x, event_y, sync] )
0 commit comments