Skip to content

Commit 6144a1c

Browse files
authored
fix: osx, reset modifiers' state after locking screen (rustdesk#11806)
rustdesk#11802 Signed-off-by: fufesou <linlong1266@gmail.com>
1 parent 118552a commit 6144a1c

2 files changed

Lines changed: 32 additions & 15 deletions

File tree

libs/enigo/src/macos/macos_impl.rs

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/server/input_service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1205,7 +1205,7 @@ pub fn handle_key(evt: &KeyEvent) {
12051205
// If we don't sleep, the key press/release events may not take effect.
12061206
//
12071207
// For example, the controlled side osx `12.7.6` or `15.1.1`
1208-
// If we input characters quickly and continuously, and press or release "Shift" for a short period of time,
1208+
// If we input characters quickly and continuously, and press or release "Shift" for a short period of time,
12091209
// it is possible that after releasing "Shift", the controlled side will still print uppercase characters.
12101210
// Though it is not very easy to reproduce.
12111211
key_sleep();

0 commit comments

Comments
 (0)