From 21120665e32cc40b074e61e7ae20b9a08303aaef Mon Sep 17 00:00:00 2001 From: michi_cc Date: Mon, 5 Aug 2013 20:36:17 +0000 Subject: [PATCH] (svn r25666) -Feature [FS#4760]: [OSX] Pinch gesture support for zooming. (Based on patch by leecbaker) --- src/os/macosx/osx_stdafx.h | 8 ++++++++ src/video/cocoa/event.mm | 40 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/os/macosx/osx_stdafx.h b/src/os/macosx/osx_stdafx.h index 5adbde1792..3b3e3fbde8 100644 --- a/src/os/macosx/osx_stdafx.h +++ b/src/os/macosx/osx_stdafx.h @@ -108,6 +108,14 @@ typedef unsigned int NSUInteger; #endif /* __LP64__ */ #endif /* NSInteger */ +#ifndef CGFLOAT_DEFINED +#if __LP64__ +typedef double CGFloat; +#else +typedef float CGFloat; +#endif /* __LP64__ */ +#endif /* CGFLOAT_DEFINED */ + /* OS X SDK versions >= 10.5 have a non-const iconv. */ #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 # define HAVE_NON_CONST_ICONV diff --git a/src/video/cocoa/event.mm b/src/video/cocoa/event.mm index 81de0b7b2f..0e7831c345 100644 --- a/src/video/cocoa/event.mm +++ b/src/video/cocoa/event.mm @@ -58,11 +58,28 @@ enum RightMouseButtonEmulationState { static unsigned int _current_mods; static bool _tab_is_down; static bool _emulating_right_button; +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) +static float _current_magnification; +#endif #ifdef _DEBUG static uint32 _tEvent; #endif +/* Support for touch gestures is only available starting with the + * 10.6 SDK, even if it says that support starts in fact with 10.5.2. + * Replicate the needed stuff for older SDKs. */ +#if MAC_OS_X_VERSION_MAX_ALLOWED == MAC_OS_X_VERSION_10_5 +static const NSUInteger NSEventTypeMagnify = 30; +static const NSUInteger NSEventTypeEndGesture = 20; + +@interface NSEvent () +/* This message is valid for events of type NSEventTypeMagnify, on 10.5.2 or later */ +- (CGFloat)magnification WEAK_IMPORT_ATTRIBUTE; +@end +#endif + + static uint32 GetTick() { struct timeval tim; @@ -542,6 +559,29 @@ static bool QZ_PollEvent() _cursor.v_wheel -= (int)([ event deltaY ] * 5 * _settings_client.gui.scrollwheel_multiplier); break; +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) + case NSEventTypeMagnify: + /* Pinch open or close gesture. */ + _current_magnification += [ event magnification ] * 5.0f; + + while (_current_magnification >= 1.0f) { + _current_magnification -= 1.0f; + _cursor.wheel++; + HandleMouseEvents(); + } + while (_current_magnification <= -1.0f) { + _current_magnification += 1.0f; + _cursor.wheel--; + HandleMouseEvents(); + } + break; + + case NSEventTypeEndGesture: + /* Gesture ended. */ + _current_magnification = 0.0f; + break; +#endif + case NSCursorUpdate: case NSMouseEntered: case NSMouseExited: