Skip to content

Commit 44cca9a

Browse files
authored
fix(macos): preserve modifier state in input events (#5102)
1 parent f9d1aca commit 44cca9a

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

src/platform/macos/input.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ namespace platf {
3636
CGEventSourceRef source {};
3737

3838
// keyboard related stuff
39-
CGEventRef kb_event {};
4039
CGEventFlags kb_flags {};
4140

4241
// mouse related stuff
@@ -256,12 +255,19 @@ const KeyCodeMap kKeyCodesMap[] = {
256255
}
257256

258257
auto macos_input = ((macos_input_t *) input.get());
259-
auto event = macos_input->kb_event;
258+
CGEventRef event = nullptr;
260259

261260
if (key == kVK_Shift || key == kVK_RightShift ||
262261
key == kVK_Command || key == kVK_RightCommand ||
263262
key == kVK_Option || key == kVK_RightOption ||
264263
key == kVK_Control || key == kVK_RightControl) {
264+
event = CGEventCreate(macos_input->source);
265+
if (!event) {
266+
return;
267+
}
268+
269+
CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, key);
270+
265271
CGEventFlags mask;
266272

267273
switch (key) {
@@ -285,13 +291,18 @@ const KeyCodeMap kKeyCodesMap[] = {
285291

286292
macos_input->kb_flags = release ? macos_input->kb_flags & ~mask : macos_input->kb_flags | mask;
287293
CGEventSetType(event, kCGEventFlagsChanged);
288-
CGEventSetFlags(event, macos_input->kb_flags);
289294
} else {
290-
CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, key);
295+
event = CGEventCreateKeyboardEvent(macos_input->source, key, !release);
296+
if (!event) {
297+
return;
298+
}
299+
291300
CGEventSetType(event, release ? kCGEventKeyUp : kCGEventKeyDown);
292301
}
293302

303+
CGEventSetFlags(event, macos_input->kb_flags);
294304
CGEventPost(kCGHIDEventTap, event);
305+
CFRelease(event);
295306
}
296307

297308
void unicode(input_t &input, char *utf8, int size) {
@@ -358,6 +369,8 @@ const KeyCodeMap kKeyCodesMap[] = {
358369
CGEventSetDoubleValueField(event, kCGMouseEventDeltaX, deltaX);
359370
CGEventSetDoubleValueField(event, kCGMouseEventDeltaY, deltaY);
360371

372+
// Inject modifier flags into mouse events so that shift+click and similar combinations work correctly.
373+
CGEventSetFlags(event, macos_input->kb_flags);
361374
CGEventPost(kCGHIDEventTap, event);
362375
// For why this is here, see:
363376
// https://stackoverflow.com/questions/15194409/simulated-mouseevent-not-working-properly-osx
@@ -555,7 +568,6 @@ const KeyCodeMap kKeyCodesMap[] = {
555568

556569
macos_input->source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
557570

558-
macos_input->kb_event = CGEventCreate(macos_input->source);
559571
macos_input->kb_flags = 0;
560572

561573
macos_input->mouse_event = CGEventCreate(macos_input->source);
@@ -572,7 +584,6 @@ const KeyCodeMap kKeyCodesMap[] = {
572584
const auto *input = static_cast<macos_input_t *>(p);
573585

574586
CFRelease(input->source);
575-
CFRelease(input->kb_event);
576587
CFRelease(input->mouse_event);
577588

578589
delete input;

0 commit comments

Comments
 (0)