Skip to content

Commit

Permalink
cocoa: report proper input IDs for mouse/touch events.
Browse files Browse the repository at this point in the history
Otherwise, we generate incorrect mouse events for MacBook trackpads (which
are also multitouch devices), etc.

Partially fixes Bugzilla #4576.
  • Loading branch information
icculus committed Jun 9, 2019
1 parent e43550c commit 781692c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
6 changes: 4 additions & 2 deletions src/video/cocoa/SDL_cocoamouse.m
Expand Up @@ -408,7 +408,8 @@ + (NSCursor *)invisibleCursor
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
Expand Down Expand Up @@ -436,7 +437,8 @@ + (NSCursor *)invisibleCursor
} 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
Expand Down
34 changes: 28 additions & 6 deletions src/video/cocoa/SDL_cocoawindow.m
Expand Up @@ -622,7 +622,7 @@ - (void)windowDidBecomeKey:(NSNotification *)aNotification
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);
}
}

Expand Down Expand Up @@ -932,7 +932,16 @@ - (void)mouseDown:(NSEvent *)theEvent
}

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
Expand Down Expand Up @@ -976,7 +985,16 @@ - (void)mouseUp:(NSEvent *)theEvent
}

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
Expand Down Expand Up @@ -1039,7 +1057,9 @@ - (void)mouseMoved:(NSEvent *)theEvent
#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
Expand Down Expand Up @@ -1073,7 +1093,8 @@ - (void)touchesBeganWithEvent:(NSEvent *) theEvent
}
}
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) {
Expand Down Expand Up @@ -1103,10 +1124,11 @@ - (void)touchesCancelledWithEvent:(NSEvent *) theEvent

- (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. */
Expand Down

0 comments on commit 781692c

Please sign in to comment.