mac: Distinguish trackpad from Magic Mouse scroll (#1274)

This is the second attempt to distinguish trackpad scrolling that when used
should yield panning from Magic Mouse scrolling that should control zoom.

Since trackpad will begin with a touch prior to the scroll event, but Magic
Mouse not, we can use it to make sure we trigger panning only on a trackpad.

Previous "mac: Don't interpret single-touch scroll events as pan gestures"
that was flawed was reverted which ultimately lead to being unable to zoom using
Magic Mouse.
pull/1280/head
Adam Strzelecki 2022-08-18 00:15:14 +02:00 committed by GitHub
parent c65e31bece
commit cf4defcd47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 27 additions and 1 deletions

View File

@ -372,6 +372,8 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
double rotationGestureCurrent; double rotationGestureCurrent;
Point2d trackpadPositionShift; Point2d trackpadPositionShift;
bool inTrackpadScrollGesture; bool inTrackpadScrollGesture;
int activeTrackpadTouches;
bool scrollFromTrackpadTouch;
Platform::Window::Kind kind; Platform::Window::Kind kind;
} }
@ -397,6 +399,9 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
editor.action = @selector(didEdit:); editor.action = @selector(didEdit:);
inTrackpadScrollGesture = false; inTrackpadScrollGesture = false;
activeTrackpadTouches = 0;
scrollFromTrackpadTouch = false;
self.acceptsTouchEvents = YES;
kind = aKind; kind = aKind;
if(kind == Platform::Window::Kind::TOPLEVEL) { if(kind == Platform::Window::Kind::TOPLEVEL) {
NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self
@ -573,7 +578,16 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
using Platform::MouseEvent; using Platform::MouseEvent;
MouseEvent event = [self convertMouseEvent:nsEvent]; MouseEvent event = [self convertMouseEvent:nsEvent];
if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { if(nsEvent.phase == NSEventPhaseBegan) {
// If this scroll began on trackpad then touchesBeganWithEvent was called prior to this
// event and we have at least one active trackpad touch. We store this information so we
// can handle scroll originating from trackpad differently below.
scrollFromTrackpadTouch = activeTrackpadTouches > 0 &&
nsEvent.subtype == NSEventSubtypeTabletPoint &&
kind == Platform::Window::Kind::TOPLEVEL;
}
// Check if we are scrolling on trackpad and handle things differently.
if(scrollFromTrackpadTouch) {
// This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via
// NSPanGestureRecognizer which is how you might expect this to work... We complicate this // NSPanGestureRecognizer which is how you might expect this to work... We complicate this
// further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using
@ -626,6 +640,18 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) {
receiver->onMouseEvent(event); receiver->onMouseEvent(event);
} }
- (void)touchesBeganWithEvent:(NSEvent *)event {
activeTrackpadTouches++;
}
- (void)touchesEndedWithEvent:(NSEvent *)event {
activeTrackpadTouches--;
}
- (void)touchesCancelledWithEvent:(NSEvent *)event {
activeTrackpadTouches--;
}
- (void)mouseExited:(NSEvent *)nsEvent { - (void)mouseExited:(NSEvent *)nsEvent {
using Platform::MouseEvent; using Platform::MouseEvent;