From 5c2864485d16b8bf3eb1a3baaf1dfcddda3d263e Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sat, 17 May 2025 12:33:16 -0700 Subject: [PATCH] Update: use hid event in macos --- key/keycode_c.h | 3 ++- key/keypress_c.h | 8 +++++--- mouse/mouse_c.h | 15 +++++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/key/keycode_c.h b/key/keycode_c.h index 01f1bdb..efc4f6b 100644 --- a/key/keycode_c.h +++ b/key/keycode_c.h @@ -90,7 +90,8 @@ MMKeyCode keyCodeForChar(const char c) { #if defined(IS_MACOSX) CFStringRef createStringForKey(CGKeyCode keyCode){ - TISInputSourceRef currentKeyboard = TISCopyCurrentASCIICapableKeyboardInputSource(); + // TISInputSourceRef currentKeyboard = TISCopyCurrentASCIICapableKeyboardInputSource(); + TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardLayoutInputSource(); CFDataRef layoutData = (CFDataRef) TISGetInputSourceProperty( currentKeyboard, kTISPropertyUnicodeKeyLayoutData); diff --git a/key/keypress_c.h b/key/keypress_c.h index a606f04..48de33a 100644 --- a/key/keypress_c.h +++ b/key/keypress_c.h @@ -58,7 +58,7 @@ if (pid != 0) { CGEventPostToPid(pid, event); } else { - CGEventPost(kCGSessionEventTap, event); + CGEventPost(kCGHIDEventTap, event); } CFRelease(event); @@ -179,7 +179,8 @@ void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags, uintptr pi NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE); assert(KERN_SUCCESS == kr); } else { - CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)code, down); + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)code, down); assert(keyEvent != NULL); CGEventSetType(keyEvent, down ? kCGEventKeyDown : kCGEventKeyUp); @@ -273,7 +274,8 @@ void toggleKey(char c, const bool down, MMKeyFlags flags, uintptr pid) { convert characters to a keycode, but does not support adding modifier flags. It is only used in typeString(). -- if you need modifier keys, use the above functions instead. */ - CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, 0, down); + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef keyEvent = CGEventCreateKeyboardEvent(source, 0, down); if (keyEvent == NULL) { fputs("Could not create keyboard event.\n", stderr); return; diff --git a/mouse/mouse_c.h b/mouse/mouse_c.h index adf8b7d..26d5e98 100644 --- a/mouse/mouse_c.h +++ b/mouse/mouse_c.h @@ -83,12 +83,13 @@ /* Move the mouse to a specific point. */ void moveMouse(MMPointInt32 point){ #if defined(IS_MACOSX) - CGEventRef move = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef move = CGEventCreateMouseEvent(source, kCGEventMouseMoved, CGPointFromMMPointInt32(point), kCGMouseButtonLeft); calculateDeltas(&move, point); - CGEventPost(kCGSessionEventTap, move); + CGEventPost(kCGHIDEventTap, move); CFRelease(move); #elif defined(USE_X11) Display *display = XGetMainDisplay(); @@ -103,12 +104,13 @@ void moveMouse(MMPointInt32 point){ void dragMouse(MMPointInt32 point, const MMMouseButton button){ #if defined(IS_MACOSX) const CGEventType dragType = MMMouseDragToCGEventType(button); - CGEventRef drag = CGEventCreateMouseEvent(NULL, dragType, + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef drag = CGEventCreateMouseEvent(source, dragType, CGPointFromMMPointInt32(point), (CGMouseButton)button); calculateDeltas(&drag, point); - CGEventPost(kCGSessionEventTap, drag); + CGEventPost(kCGHIDEventTap, drag); CFRelease(drag); #else moveMouse(point); @@ -145,9 +147,10 @@ void toggleMouse(bool down, MMMouseButton button) { #if defined(IS_MACOSX) const CGPoint currentPos = CGPointFromMMPointInt32(location()); const CGEventType mouseType = MMMouseToCGEventType(down, button); - CGEventRef event = CGEventCreateMouseEvent(NULL, mouseType, currentPos, (CGMouseButton)button); + CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); + CGEventRef event = CGEventCreateMouseEvent(source, mouseType, currentPos, (CGMouseButton)button); - CGEventPost(kCGSessionEventTap, event); + CGEventPost(kCGHIDEventTap, event); CFRelease(event); #elif defined(USE_X11) Display *display = XGetMainDisplay();