From 781692c03cc174e356e6c64253c0b5d8f4bcf287 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 9 Jun 2019 19:27:25 -0400 Subject: [PATCH] cocoa: report proper input IDs for mouse/touch events. Otherwise, we generate incorrect mouse events for MacBook trackpads (which are also multitouch devices), etc. Partially fixes Bugzilla #4576. --- src/video/cocoa/SDL_cocoamouse.m | 6 ++++-- src/video/cocoa/SDL_cocoawindow.m | 34 +++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/video/cocoa/SDL_cocoamouse.m b/src/video/cocoa/SDL_cocoamouse.m index 24a705bed..375f077ca 100644 --- a/src/video/cocoa/SDL_cocoamouse.m +++ b/src/video/cocoa/SDL_cocoamouse.m @@ -408,7 +408,8 @@ Cocoa_HandleMouseEvent(_THIS, NSEvent *event) DLog("Motion was (%g, %g), offset to (%g, %g)", [event deltaX], [event deltaY], deltaX, deltaY); } - SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 1, (int)deltaX, (int)deltaY); + const SDL_MouseID mouseID = ([event subtype] == NSEventSubtypeTouch) ? SDL_TOUCH_MOUSEID : mouse->mouseID; + SDL_SendMouseMotion(mouse->focus, mouseID, 1, (int)deltaX, (int)deltaY); } void @@ -436,7 +437,8 @@ Cocoa_HandleMouseWheel(SDL_Window *window, NSEvent *event) } else if (y < 0) { y = SDL_floor(y); } - SDL_SendMouseWheel(window, mouse->mouseID, x, y, direction); + const SDL_MouseID mouseID = ([event subtype] == NSEventSubtypeTouch) ? SDL_TOUCH_MOUSEID : mouse->mouseID; + SDL_SendMouseWheel(window, mouseID, x, y, direction); } void diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 29e56ea03..f0f856f19 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -622,7 +622,7 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) y = (int)(window->h - point.y); if (x >= 0 && x < window->w && y >= 0 && y < window->h) { - SDL_SendMouseMotion(window, 0, 0, x, y); + SDL_SendMouseMotion(window, mouse->mouseID, 0, x, y); } } @@ -932,7 +932,16 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) } clicks = (int) [theEvent clickCount]; - SDL_SendMouseButtonClicks(_data->window, 0, SDL_PRESSED, button, clicks); + + SDL_MouseID mouseID; + if ([theEvent subtype] == NSEventSubtypeTouch) { + mouseID = SDL_TOUCH_MOUSEID; + } else { + SDL_Mouse *mouse = SDL_GetMouse(); + mouseID = mouse ? mouse->mouseID : 0; + } + + SDL_SendMouseButtonClicks(_data->window, mouseID, SDL_PRESSED, button, clicks); } - (void)rightMouseDown:(NSEvent *)theEvent @@ -976,7 +985,16 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) } clicks = (int) [theEvent clickCount]; - SDL_SendMouseButtonClicks(_data->window, 0, SDL_RELEASED, button, clicks); + + SDL_MouseID mouseID; + if ([theEvent subtype] == NSEventSubtypeTouch) { + mouseID = SDL_TOUCH_MOUSEID; + } else { + SDL_Mouse *mouse = SDL_GetMouse(); + mouseID = mouse ? mouse->mouseID : 0; + } + + SDL_SendMouseButtonClicks(_data->window, mouseID, SDL_RELEASED, button, clicks); } - (void)rightMouseUp:(NSEvent *)theEvent @@ -1039,7 +1057,9 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) #endif } } - SDL_SendMouseMotion(window, 0, 0, x, y); + + const SDL_MouseID mouseID = ([theEvent subtype] == NSEventSubtypeTouch) ? SDL_TOUCH_MOUSEID : mouse->mouseID; + SDL_SendMouseMotion(window, mouseID, 0, x, y); } - (void)mouseDragged:(NSEvent *)theEvent @@ -1073,7 +1093,8 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) } } if (existingTouchCount == 0) { - SDL_TouchID touchID = (SDL_TouchID)(intptr_t)[[touches anyObject] device]; + const BOOL ismouse = ([theEvent subtype] == NSEventSubtypeMouseEvent); + const SDL_TouchID touchID = ismouse ? SDL_MOUSE_TOUCHID : (SDL_TouchID)(intptr_t)[[touches anyObject] device]; int numFingers = SDL_GetNumTouchFingers(touchID); DLog("Reset Lost Fingers: %d", numFingers); for (--numFingers; numFingers >= 0; --numFingers) { @@ -1103,10 +1124,11 @@ SetWindowStyle(SDL_Window * window, NSUInteger style) - (void)handleTouches:(NSTouchPhase) phase withEvent:(NSEvent *) theEvent { + const BOOL ismouse = ([theEvent subtype] == NSEventSubtypeMouseEvent); NSSet *touches = [theEvent touchesMatchingPhase:phase inView:nil]; for (NSTouch *touch in touches) { - const SDL_TouchID touchId = (SDL_TouchID)(intptr_t)[touch device]; + const SDL_TouchID touchId = ismouse ? SDL_MOUSE_TOUCHID : (SDL_TouchID)(intptr_t)[touch device]; SDL_TouchDeviceType devtype = SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE; #if MAC_OS_X_VERSION_MAX_ALLOWED >= 101202 /* Added in the 10.12.2 SDK. */