@@ -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