Changeset View
Changeset View
Standalone View
Standalone View
intern/ghost/intern/GHOST_SystemCocoa.mm
| Show First 20 Lines • Show All 364 Lines • ▼ Show 20 Lines | GHOST_SystemCocoa::GHOST_SystemCocoa() | ||||
| //Detect multitouch trackpad | //Detect multitouch trackpad | ||||
| mib[0] = CTL_HW; | mib[0] = CTL_HW; | ||||
| mib[1] = HW_MODEL; | mib[1] = HW_MODEL; | ||||
| sysctl( mib, 2, NULL, &len, NULL, 0 ); | sysctl( mib, 2, NULL, &len, NULL, 0 ); | ||||
| rstring = (char*)malloc( len ); | rstring = (char*)malloc( len ); | ||||
| sysctl( mib, 2, rstring, &len, NULL, 0 ); | sysctl( mib, 2, rstring, &len, NULL, 0 ); | ||||
| m_hasMultiTouchTrackpad = false; | |||||
| free( rstring ); | free( rstring ); | ||||
| rstring = NULL; | rstring = NULL; | ||||
| m_ignoreWindowSizedMessages = false; | m_ignoreWindowSizedMessages = false; | ||||
| } | } | ||||
| GHOST_SystemCocoa::~GHOST_SystemCocoa() | GHOST_SystemCocoa::~GHOST_SystemCocoa() | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 835 Lines • ▼ Show 20 Lines | GHOST_TSuccess GHOST_SystemCocoa::handleTabletEvent(void *eventPtr, short eventType) | ||||
| return GHOST_kSuccess; | return GHOST_kSuccess; | ||||
| } | } | ||||
| bool GHOST_SystemCocoa::handleTabletEvent(void *eventPtr) | bool GHOST_SystemCocoa::handleTabletEvent(void *eventPtr) | ||||
| { | { | ||||
| NSEvent *event = (NSEvent *)eventPtr; | NSEvent *event = (NSEvent *)eventPtr; | ||||
| switch ([event subtype]) { | switch ([event subtype]) { | ||||
| case NX_SUBTYPE_TABLET_POINT: | case NSTabletPointEventSubtype: | ||||
| handleTabletEvent(eventPtr, NSTabletPoint); | handleTabletEvent(eventPtr, NSTabletPoint); | ||||
| return true; | return true; | ||||
| case NX_SUBTYPE_TABLET_PROXIMITY: | case NSTabletProximityEventSubtype: | ||||
| handleTabletEvent(eventPtr, NSTabletProximity); | handleTabletEvent(eventPtr, NSTabletProximity); | ||||
| return true; | return true; | ||||
| default: | default: | ||||
| //No tablet event included : do nothing | //No tablet event included : do nothing | ||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 147 Lines • ▼ Show 20 Lines | case NSMouseMoved: | ||||
| m_cursorDelta_x=0; | m_cursorDelta_x=0; | ||||
| m_cursorDelta_y=0; //Mouse motion occurred between two cursor warps, so we can reset the delta counter | m_cursorDelta_y=0; //Mouse motion occurred between two cursor warps, so we can reset the delta counter | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| /* these events only happen on swiping trackpads or tablets */ | |||||
| /* warning: using tablet + trackpad at same time frustrates this static variable */ | |||||
| case NSEventTypeBeginGesture: | |||||
| m_hasMultiTouchTrackpad = 1; | |||||
| break; | |||||
| case NSEventTypeEndGesture: | |||||
| m_hasMultiTouchTrackpad = 0; | |||||
| break; | |||||
| case NSScrollWheel: | case NSScrollWheel: | ||||
| { | { | ||||
| int *momentum = NULL; | NSEventPhase momentum = NSEventPhaseNone; | ||||
| NSEventPhase phase = NSEventPhaseNone; | |||||
| bool hasMultiTouch = false; | |||||
| if ([event respondsToSelector:@selector(momentumPhase)]) | if ([event respondsToSelector:@selector(momentumPhase)]) | ||||
| momentum = (int *)[event momentumPhase]; | momentum = [event momentumPhase]; | ||||
| if ([event respondsToSelector:@selector(phase)]) | |||||
| phase = [event phase]; | |||||
| if ([event respondsToSelector:@selector(hasPreciseScrollingDeltas)]) | |||||
| hasMultiTouch = [event hasPreciseScrollingDeltas]; | |||||
| /* standard scrollwheel case, if no swiping happened, and no momentum (kinetic scroll) works */ | /* standard scrollwheel case, if no swiping happened, and no momentum (kinetic scroll) works */ | ||||
| if (!m_hasMultiTouchTrackpad && momentum == NULL) { | if (!hasMultiTouch && momentum == NSEventPhaseNone) { | ||||
| GHOST_TInt32 delta; | GHOST_TInt32 delta; | ||||
| double deltaF = [event deltaY]; | double deltaF = [event deltaY]; | ||||
| if (deltaF == 0.0) deltaF = [event deltaX]; // make blender decide if it's horizontal scroll | if (deltaF == 0.0) deltaF = [event deltaX]; // make blender decide if it's horizontal scroll | ||||
| if (deltaF == 0.0) break; //discard trackpad delta=0 events | if (deltaF == 0.0) break; //discard trackpad delta=0 events | ||||
| delta = deltaF > 0.0 ? 1 : -1; | delta = deltaF > 0.0 ? 1 : -1; | ||||
| pushEvent(new GHOST_EventWheel([event timestamp] * 1000, window, delta)); | pushEvent(new GHOST_EventWheel([event timestamp] * 1000, window, delta)); | ||||
| } | } | ||||
| else { | else { | ||||
| NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream]; | NSPoint mousePos = [cocoawindow mouseLocationOutsideOfEventStream]; | ||||
| GHOST_TInt32 x, y; | GHOST_TInt32 x, y; | ||||
| double dx; | double dx; | ||||
| double dy; | double dy; | ||||
| #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 | #if MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 | ||||
| int phase = [event phase]; | |||||
| /* with 10.7 nice scrolling deltas are supported */ | /* with 10.7 nice scrolling deltas are supported */ | ||||
| dx = [event scrollingDeltaX]; | dx = [event scrollingDeltaX]; | ||||
| dy = [event scrollingDeltaY]; | dy = [event scrollingDeltaY]; | ||||
| /* however, wacom tablet (intuos5) needs old deltas, it then has momentum and phase at zero */ | /* however, wacom tablet (intuos5) needs old deltas, it then has momentum and phase at zero */ | ||||
| if (phase == 0 && momentum==NULL) { | if (phase == NSEventPhaseNone && momentum == NSEventPhaseNone) { | ||||
| dx = [event deltaX]; | dx = [event deltaX]; | ||||
| dy = [event deltaY]; | dy = [event deltaY]; | ||||
| } | } | ||||
| #else | #else | ||||
| /* trying to pretend you have nice scrolls... */ | /* trying to pretend you have nice scrolls... */ | ||||
| dx = [event deltaX]; | dx = [event deltaX]; | ||||
| dy = -[event deltaY]; | dy = -[event deltaY]; | ||||
| ▲ Show 20 Lines • Show All 239 Lines • Show Last 20 Lines | |||||