From 49b39870f6c3c4a34b0afc46eca4eafc9d06a728 Mon Sep 17 00:00:00 2001 From: pelya Date: Sun, 23 Feb 2014 21:46:25 +0200 Subject: [PATCH] Two-finger scroll with mouse wheel, changed right mouse click a bit --- .../xserver/AndroidAppSettings.cfg | 4 +- .../src/video/android/SDL_androidinput.c | 94 ++++++++++++------- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/project/jni/application/xserver/AndroidAppSettings.cfg b/project/jni/application/xserver/AndroidAppSettings.cfg index fbfb123da..7c612b9bc 100644 --- a/project/jni/application/xserver/AndroidAppSettings.cfg +++ b/project/jni/application/xserver/AndroidAppSettings.cfg @@ -166,10 +166,10 @@ AppTouchscreenKeyboardKeysAmount=0 AppTouchscreenKeyboardKeysAmountAutoFire=0 # Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right) -RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2" +RedefinedKeysScreenKb="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS UNDO HELP" # Names for on-screen keyboard keys, such as Fire, Jump, Run etc, separated by spaces, they are used in SDL config menu -RedefinedKeysScreenKbNames="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE KP_PLUS KP_MINUS 1 2" +RedefinedKeysScreenKbNames="LALT RETURN KP_PLUS KP_MINUS SPACE DELETE PLUS MINUS UNDO KEYBOARD" # On-screen keys theme # 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick) diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c index 1a2e0325e..f41b59ccc 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidinput.c @@ -97,12 +97,15 @@ SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_7)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_8)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_9)) }; -static int multitouchGestureKeyPressed[MAX_MULTITOUCH_GESTURES] = { 0, 0, 0, 0 }; static int multitouchGestureSensitivity = 0; static int multitouchGestureDist = -1; static int multitouchGestureAngle = 0; static int multitouchGestureX = -1; static int multitouchGestureY = -1; +static int multitouchGestureMiddleX = -1; +static int multitouchGestureMiddleY = -1; +static int multitouchGestureHappened = 0; +enum { MULTITOUCH_MOUSE_WHEEL_DIST = 20 }; int SDL_ANDROID_TouchscreenCalibrationWidth = 480; int SDL_ANDROID_TouchscreenCalibrationHeight = 320; int SDL_ANDROID_TouchscreenCalibrationX = 0; @@ -290,14 +293,8 @@ static void ProcessMultitouchGesture( int x, int y, int action, int pointerId ) multitouchGestureX = -1; multitouchGestureY = -1; multitouchGestureDist = -1; - for(i = 0; i < MAX_MULTITOUCH_GESTURES; i++) - { - if( multitouchGestureKeyPressed[i] ) - { - multitouchGestureKeyPressed[i] = 0; - SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[i], 0 ); - } - } + multitouchGestureMiddleX = -1; + multitouchGestureMiddleY = -1; } else if( !hardwareMouseDetected ) { @@ -310,35 +307,32 @@ static void ProcessMultitouchGesture( int x, int y, int action, int pointerId ) { int dist = abs( x - multitouchGestureX ) + abs( y - multitouchGestureY ); int angle = atan2i( y - multitouchGestureY, x - multitouchGestureX ); + int middleX = (x + multitouchGestureX) / 2; + int middleY = (y + multitouchGestureY) / 2; if( multitouchGestureDist < 0 ) { multitouchGestureDist = dist; multitouchGestureAngle = angle; + multitouchGestureMiddleX = middleX; + multitouchGestureMiddleY = middleY; } else { int distMaxDiff = SDL_ANDROID_sFakeWindowHeight / ( 1 + (1 + multitouchGestureSensitivity) * 2 ); - int angleMaxDiff = atan2i_PI / 2 / ( 1 + (1 + multitouchGestureSensitivity) * 2 ); + int angleMaxDiff = atan2i_PI * 2 / 3 / ( 1 + (1 + multitouchGestureSensitivity) * 2 ); + int wheelThreshold = SDL_ANDROID_sFakeWindowHeight / MULTITOUCH_MOUSE_WHEEL_DIST; if( dist - multitouchGestureDist > distMaxDiff ) { - multitouchGestureKeyPressed[0] = 1; + multitouchGestureHappened = 1; + multitouchGestureDist += distMaxDiff; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[0], 0 ); - } - else - if( multitouchGestureKeyPressed[0] ) - { - multitouchGestureKeyPressed[0] = 0; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[0], 0 ); } if( multitouchGestureDist - dist > distMaxDiff ) { - multitouchGestureKeyPressed[1] = 1; + multitouchGestureHappened = 1; + multitouchGestureDist -= distMaxDiff; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[1], 0 ); - } - else - if( multitouchGestureKeyPressed[1] ) - { - multitouchGestureKeyPressed[1] = 0; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[1], 0 ); } @@ -351,26 +345,48 @@ static void ProcessMultitouchGesture( int x, int y, int action, int pointerId ) if( angleDiff < -angleMaxDiff ) { - multitouchGestureKeyPressed[2] = 1; + multitouchGestureHappened = 1; + multitouchGestureAngle = angle; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[2], 0 ); - } - else - if( multitouchGestureKeyPressed[2] ) - { - multitouchGestureKeyPressed[2] = 0; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[2], 0 ); } if( angleDiff > angleMaxDiff ) { - multitouchGestureKeyPressed[3] = 1; + multitouchGestureHappened = 1; + multitouchGestureAngle = angle; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[3], 0 ); - } - else - if( multitouchGestureKeyPressed[3] ) - { - multitouchGestureKeyPressed[3] = 0; SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[3], 0 ); } + + //__android_log_print(ANDROID_LOG_INFO, "libSDL", "middleY %d multitouchGestureMiddleY %d threshold %d", middleY, multitouchGestureMiddleY, wheelThreshold); + if( middleX - multitouchGestureMiddleX > wheelThreshold ) + { + multitouchGestureHappened = 1; + multitouchGestureMiddleX += wheelThreshold; + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_X1 ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_X1 ); + } + if( multitouchGestureMiddleX - middleX > wheelThreshold ) + { + multitouchGestureHappened = 1; + multitouchGestureMiddleX -= wheelThreshold; + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_X2 ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_X2 ); + } + if( middleY - multitouchGestureMiddleY > wheelThreshold ) + { + multitouchGestureHappened = 1; + multitouchGestureMiddleY += wheelThreshold; + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_WHEELUP ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_WHEELUP ); + } + if( multitouchGestureMiddleY - middleY > wheelThreshold ) + { + multitouchGestureHappened = 1; + multitouchGestureMiddleY -= wheelThreshold; + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_WHEELDOWN ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_WHEELDOWN ); + } } } } @@ -627,7 +643,15 @@ static void ProcessMouseMultitouch( int action, int pointerId ) else if( rightClickMethod == RIGHT_CLICK_WITH_MULTITOUCH ) { SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_LEFT ); - SDL_ANDROID_MainThreadPushMouseButton( (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); + if( action == MOUSE_UP ) + { + if( !multitouchGestureHappened ) + { + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_RIGHT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_RIGHT ); + } + multitouchGestureHappened = 0; + } } } }