@@ -141,9 +141,27 @@ impl Enigo {
141141 self . flags |= flag;
142142 }
143143
144- fn post ( & self , event : CGEvent ) {
145- // event.set_flags(CGEventFlags::CGEventFlagNull); will cause `F11` not working. no idea why.
146- if !self . ignore_flags && self . flags != CGEventFlags :: CGEventFlagNull {
144+ // Just check F11 for minimal changes.
145+ // Since enigo (legacy mode) is deprecated, it is currently in maintenance only.
146+ fn post ( & self , event : CGEvent , keycode : Option < u16 > ) {
147+ if keycode == Some ( kVK_F11) {
148+ // Some key events require the flags to work.
149+ // We can't simply set the flag to `CGEventFlags::CGEventFlagNull`.
150+ // eg. `F11` requires flags `CGEventFlags::CGEventFlagSecondaryFn | 0x20000000` to work.
151+ self . post_event ( event, false ) ;
152+ } else {
153+ // macOS system may use the previous event flag to generate the next event.
154+ // Only found this issue when locking the screen.
155+ // When we use enigo to lock the screen, the next mouse event will have the flag
156+ // `CGEventFlagControl | CGEventFlagCommand | 0x20000000`.
157+ // The key event will also have the flag `CGEventFlagControl | CGEventFlagCommand | 0x20000000`.
158+ // Therefore, we need to set the flag to `event.set_flags(self.flags)` to avoid this.
159+ self . post_event ( event, true ) ;
160+ }
161+ }
162+
163+ fn post_event ( & self , event : CGEvent , force_flags : bool ) {
164+ if !self . ignore_flags && ( force_flags || self . flags != CGEventFlags :: CGEventFlagNull ) {
147165 event. set_flags ( self . flags ) ;
148166 }
149167 event. set_integer_value_field ( EventField :: EVENT_SOURCE_USER_DATA , ENIGO_INPUT_EXTRA_VALUE ) ;
@@ -205,7 +223,7 @@ impl MouseControllable for Enigo {
205223 if let Ok ( event) =
206224 CGEvent :: new_mouse_event ( src. clone ( ) , event_type, dest, CGMouseButton :: Left )
207225 {
208- self . post ( event) ;
226+ self . post ( event, None ) ;
209227 }
210228 }
211229 }
@@ -270,7 +288,7 @@ impl MouseControllable for Enigo {
270288 if let Some ( v) = btn_value {
271289 event. set_integer_value_field ( EventField :: MOUSE_EVENT_BUTTON_NUMBER , v) ;
272290 }
273- self . post ( event) ;
291+ self . post ( event, None ) ;
274292 }
275293 }
276294 Ok ( ( ) )
@@ -309,7 +327,7 @@ impl MouseControllable for Enigo {
309327 if let Some ( v) = btn_value {
310328 event. set_integer_value_field ( EventField :: MOUSE_EVENT_BUTTON_NUMBER , v) ;
311329 }
312- self . post ( event) ;
330+ self . post ( event, None ) ;
313331 }
314332 }
315333 }
@@ -395,7 +413,7 @@ impl KeyboardControllable for Enigo {
395413 if let Some ( src) = self . event_source . as_ref ( ) {
396414 if let Ok ( event) = CGEvent :: new_keyboard_event ( src. clone ( ) , 0 , true ) {
397415 event. set_string ( cluster) ;
398- self . post ( event) ;
416+ self . post ( event, None ) ;
399417 }
400418 }
401419 }
@@ -409,11 +427,11 @@ impl KeyboardControllable for Enigo {
409427
410428 if let Some ( src) = self . event_source . as_ref ( ) {
411429 if let Ok ( event) = CGEvent :: new_keyboard_event ( src. clone ( ) , keycode, true ) {
412- self . post ( event) ;
430+ self . post ( event, Some ( keycode ) ) ;
413431 }
414432
415433 if let Ok ( event) = CGEvent :: new_keyboard_event ( src. clone ( ) , keycode, false ) {
416- self . post ( event) ;
434+ self . post ( event, Some ( keycode ) ) ;
417435 }
418436 }
419437 }
@@ -425,18 +443,17 @@ impl KeyboardControllable for Enigo {
425443 }
426444 if let Some ( src) = self . event_source . as_ref ( ) {
427445 if let Ok ( event) = CGEvent :: new_keyboard_event ( src. clone ( ) , code, true ) {
428- self . post ( event) ;
446+ self . post ( event, Some ( code ) ) ;
429447 }
430448 }
431449 Ok ( ( ) )
432450 }
433451
434452 fn key_up ( & mut self , key : Key ) {
453+ let code = self . key_to_keycode ( key) ;
435454 if let Some ( src) = self . event_source . as_ref ( ) {
436- if let Ok ( event) =
437- CGEvent :: new_keyboard_event ( src. clone ( ) , self . key_to_keycode ( key) , false )
438- {
439- self . post ( event) ;
455+ if let Ok ( event) = CGEvent :: new_keyboard_event ( src. clone ( ) , code, false ) {
456+ self . post ( event, Some ( code) ) ;
440457 }
441458 }
442459 }
0 commit comments