From 1228dbe4b096894a0b4b9e8a3c4da6521d04647b Mon Sep 17 00:00:00 2001 From: pelya Date: Thu, 23 Dec 2010 16:07:37 +0000 Subject: [PATCH] Multitouch gestures --- project/java/Globals.java | 7 +- project/java/Settings.java | 203 +++++++++++++----- .../java/translations/values-de/strings.xml | 22 ++ .../java/translations/values-fi/strings.xml | 22 ++ .../java/translations/values-fr/strings.xml | 22 ++ .../java/translations/values-ru/strings.xml | 22 ++ .../java/translations/values-uk/strings.xml | 22 ++ project/java/translations/values/strings.xml | 3 + .../ballfield/AndroidAppSettings.cfg | 4 +- .../jni/application/ballfield/ballfield.cpp | 3 - project/jni/application/src | 2 +- .../jni/sdl-1.2/src/video/android/atan2i.h | 33 +++ .../src/video/android/SDL_androidinput.c | 144 ++++++++++++- .../video/android/SDL_touchscreenkeyboard.c | 1 - 14 files changed, 438 insertions(+), 72 deletions(-) create mode 100644 project/jni/sdl-1.2/src/video/android/atan2i.h diff --git a/project/java/Globals.java b/project/java/Globals.java index 2f84e88b3..9d00b8416 100644 --- a/project/java/Globals.java +++ b/project/java/Globals.java @@ -81,8 +81,11 @@ class Globals { public static int ClickScreenPressure = 0; public static int ClickScreenTouchspotSize = 0; public static int RemapHwKeycode[] = new int[SDL_Keys.JAVA_KEYCODE_LAST]; - public static int RemapScreenKbKeycode[] = new int[10]; - public static boolean ScreenKbControlsShown[] = new boolean[12]; + public static int RemapScreenKbKeycode[] = new int[6]; + public static boolean ScreenKbControlsShown[] = new boolean[8]; /* Also joystick and text input button added */ + public static int RemapMultitouchGestureKeycode[] = new int[4]; + public static boolean MultitouchGesturesUsed[] = new boolean[4]; + public static int MultitouchGestureSensitivity = 1; } class LoadLibrary { diff --git a/project/java/Settings.java b/project/java/Settings.java index 65d22dfb1..5d4a9e161 100644 --- a/project/java/Settings.java +++ b/project/java/Settings.java @@ -77,6 +77,13 @@ class Settings out.writeBoolean(Globals.ScreenKbControlsShown[i]); } out.writeInt(Globals.TouchscreenKeyboardTransparency); + out.writeInt(Globals.RemapMultitouchGestureKeycode.length); + for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) + { + out.writeInt(Globals.RemapMultitouchGestureKeycode[i]); + out.writeBoolean(Globals.MultitouchGesturesUsed[i]); + } + out.writeInt(Globals.MultitouchGestureSensitivity); out.close(); settingsLoaded = true; @@ -114,10 +121,19 @@ class Settings } Globals.ScreenKbControlsShown[0] = Globals.AppNeedsArrowKeys; Globals.ScreenKbControlsShown[1] = Globals.AppNeedsTextInput; - for( int i = 2; i < 8; i++ ) + for( int i = 2; i < Globals.ScreenKbControlsShown.length; i++ ) Globals.ScreenKbControlsShown[i] = ( i - 2 < Globals.AppTouchscreenKeyboardKeysAmount ); - for( int i = 8; i < 12; i++ ) - Globals.ScreenKbControlsShown[i] = true; + for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) + { + int sdlKey = nativeGetKeymapKeyMultitouchGesture(i); + int idx = 0; + for(int ii = 0; ii < SDL_Keys.values.length; ii++) + if(SDL_Keys.values[ii] == sdlKey) + idx = ii; + Globals.RemapMultitouchGestureKeycode[i] = idx; + } + for( int i = 0; i < Globals.MultitouchGesturesUsed.length; i++ ) + Globals.MultitouchGesturesUsed[i] = true; try { ObjectInputStream settingsFile = new ObjectInputStream(new FileInputStream( p.getFilesDir().getAbsolutePath() + "/" + SettingsFileName )); @@ -163,6 +179,14 @@ class Settings Globals.ScreenKbControlsShown[i] = settingsFile.readBoolean(); } Globals.TouchscreenKeyboardTransparency = settingsFile.readInt(); + if( settingsFile.readInt() != Globals.RemapMultitouchGestureKeycode.length ) + throw new IOException(); + for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) + { + Globals.RemapMultitouchGestureKeycode[i] = settingsFile.readInt(); + Globals.MultitouchGesturesUsed[i] = settingsFile.readBoolean(); + } + Globals.MultitouchGestureSensitivity = settingsFile.readInt(); settingsLoaded = true; @@ -240,6 +264,8 @@ class Settings items.add(p.getResources().getString(R.string.remap_hwkeys)); + items.add(p.getResources().getString(R.string.remap_screenkb_button_gestures)); + items.add(p.getResources().getString(R.string.ok)); AlertDialog.Builder builder = new AlertDialog.Builder(p); @@ -303,6 +329,10 @@ class Settings showRemapHwKeysConfig(p); selected++; + if( item == selected ) + showScreenGesturesConfig(p); + selected++; + if( item == selected ) { Save(p); @@ -1073,13 +1103,6 @@ class Settings p.getResources().getString(R.string.remap_screenkb_button) + " 4", p.getResources().getString(R.string.remap_screenkb_button) + " 5", p.getResources().getString(R.string.remap_screenkb_button) + " 6", - // Not implemented yet! - /* - p.getResources().getString(R.string.remap_screenkb_button_zoomin), - p.getResources().getString(R.string.remap_screenkb_button_zoomout), - p.getResources().getString(R.string.remap_screenkb_button_rotateleft), - p.getResources().getString(R.string.remap_screenkb_button_rotateright), - */ }; boolean defaults[] = { @@ -1091,39 +1114,8 @@ class Settings Globals.ScreenKbControlsShown[5], Globals.ScreenKbControlsShown[6], Globals.ScreenKbControlsShown[7], - // Not implemented yet! - /* - Globals.ScreenKbControlsShown[8], - Globals.ScreenKbControlsShown[9], - Globals.ScreenKbControlsShown[10], - Globals.ScreenKbControlsShown[11], - */ }; - - if( ! Globals.UseTouchscreenKeyboard ) - { - for( int i = 0; i < 8; i++ ) - Globals.ScreenKbControlsShown[i] = false; - - CharSequence[] items2 = { - p.getResources().getString(R.string.remap_screenkb_button_zoomin), - p.getResources().getString(R.string.remap_screenkb_button_zoomout), - p.getResources().getString(R.string.remap_screenkb_button_rotateleft), - p.getResources().getString(R.string.remap_screenkb_button_rotateright), - }; - - boolean defaults2[] = { - Globals.ScreenKbControlsShown[8], - Globals.ScreenKbControlsShown[9], - Globals.ScreenKbControlsShown[10], - Globals.ScreenKbControlsShown[11], - }; - - items = items2; - defaults = defaults2; - } - AlertDialog.Builder builder = new AlertDialog.Builder(p); builder.setTitle(p.getResources().getString(R.string.remap_screenkb)); builder.setMultiChoiceItems(items, defaults, new DialogInterface.OnMultiChoiceClickListener() @@ -1158,16 +1150,9 @@ class Settings p.getResources().getString(R.string.remap_screenkb_button) + " 4", p.getResources().getString(R.string.remap_screenkb_button) + " 5", p.getResources().getString(R.string.remap_screenkb_button) + " 6", - // Not implemented yet! - /* - p.getResources().getString(R.string.remap_screenkb_button_zoomin), - p.getResources().getString(R.string.remap_screenkb_button_zoomout), - p.getResources().getString(R.string.remap_screenkb_button_rotateleft), - p.getResources().getString(R.string.remap_screenkb_button_rotateright), - */ }; - if( currentButton >= items.length ) // Globals.RemapScreenKbKeycode.length ) + if( currentButton >= Globals.RemapScreenKbKeycode.length ) { showScreenKeyboardConfigMainMenu(p); return; @@ -1194,6 +1179,108 @@ class Settings alert.setOwnerActivity(p); alert.show(); } + + static void showScreenGesturesConfig(final MainActivity p) + { + CharSequence[] items = { + p.getResources().getString(R.string.remap_screenkb_button_zoomin), + p.getResources().getString(R.string.remap_screenkb_button_zoomout), + p.getResources().getString(R.string.remap_screenkb_button_rotateleft), + p.getResources().getString(R.string.remap_screenkb_button_rotateright), + }; + + boolean defaults[] = { + Globals.MultitouchGesturesUsed[0], + Globals.MultitouchGesturesUsed[1], + Globals.MultitouchGesturesUsed[2], + Globals.MultitouchGesturesUsed[3], + }; + + AlertDialog.Builder builder = new AlertDialog.Builder(p); + builder.setTitle(p.getResources().getString(R.string.remap_screenkb_button_gestures)); + builder.setMultiChoiceItems(items, defaults, new DialogInterface.OnMultiChoiceClickListener() + { + public void onClick(DialogInterface dialog, int item, boolean isChecked) + { + Globals.MultitouchGesturesUsed[item] = isChecked; + } + }); + builder.setPositiveButton(p.getResources().getString(R.string.ok), new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int item) + { + dialog.dismiss(); + showScreenGesturesConfig2(p); + } + }); + + AlertDialog alert = builder.create(); + alert.setOwnerActivity(p); + alert.show(); + } + + static void showScreenGesturesConfig2(final MainActivity p) + { + final CharSequence[] items = { + p.getResources().getString(R.string.accel_slow), + p.getResources().getString(R.string.accel_medium), + p.getResources().getString(R.string.accel_fast), + p.getResources().getString(R.string.accel_veryfast) + }; + + AlertDialog.Builder builder = new AlertDialog.Builder(p); + builder.setTitle(R.string.remap_screenkb_button_gestures_sensitivity); + builder.setSingleChoiceItems(items, Globals.MultitouchGestureSensitivity, new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int item) + { + Globals.MultitouchGestureSensitivity = item; + + dialog.dismiss(); + showScreenGesturesConfig3(p, 0); + } + }); + AlertDialog alert = builder.create(); + alert.setOwnerActivity(p); + alert.show(); + } + + static void showScreenGesturesConfig3(final MainActivity p, final int currentButton) + { + CharSequence[] items = { + p.getResources().getString(R.string.remap_screenkb_button_zoomin), + p.getResources().getString(R.string.remap_screenkb_button_zoomout), + p.getResources().getString(R.string.remap_screenkb_button_rotateleft), + p.getResources().getString(R.string.remap_screenkb_button_rotateright), + }; + + if( currentButton >= Globals.RemapMultitouchGestureKeycode.length ) + { + showConfigMainMenu(p); + return; + } + if( ! Globals.MultitouchGesturesUsed[currentButton] ) + { + showScreenGesturesConfig3(p, currentButton + 1); + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(p); + builder.setTitle(items[currentButton]); + builder.setSingleChoiceItems(SDL_Keys.names, Globals.RemapMultitouchGestureKeycode[currentButton], new DialogInterface.OnClickListener() + { + public void onClick(DialogInterface dialog, int item) + { + Globals.RemapMultitouchGestureKeycode[currentButton] = item; + + dialog.dismiss(); + showScreenGesturesConfig3(p, currentButton + 1); + } + }); + AlertDialog alert = builder.create(); + alert.setOwnerActivity(p); + alert.show(); + } // =============================================================================================== @@ -1229,18 +1316,15 @@ class Settings } SetupTouchscreenKeyboardGraphics(p); for( int i = 0; i < SDL_Keys.JAVA_KEYCODE_LAST; i++ ) - { nativeSetKeymapKey(i, SDL_Keys.values[Globals.RemapHwKeycode[i]]); - } for( int i = 0; i < Globals.ScreenKbControlsShown.length; i++ ) - { nativeSetScreenKbKeyUsed(i, Globals.ScreenKbControlsShown[i] ? 1 : 0); - } for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ ) - { nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]); - } + for( int i = 0; i < Globals.RemapMultitouchGestureKeycode.length; i++ ) + nativeSetKeymapKeyMultitouchGesture(i, Globals.MultitouchGesturesUsed[i] ? SDL_Keys.values[Globals.RemapMultitouchGestureKeycode[i]] : 0); + nativeSetMultitouchGestureSensitivity(Globals.MultitouchGestureSensitivity); String lang = new String(Locale.getDefault().getLanguage()); if( Locale.getDefault().getCountry().length() > 0 ) @@ -1297,11 +1381,14 @@ class Settings private static native void nativeSetupScreenKeyboard(int size, int theme, int nbuttonsAutoFire, int transparency); private static native void nativeSetupScreenKeyboardButtons(byte[] img); private static native void nativeInitKeymap(); - private static native int nativeGetKeymapKey(int key); + private static native int nativeGetKeymapKey(int key); private static native void nativeSetKeymapKey(int javakey, int key); - private static native int nativeGetKeymapKeyScreenKb(int keynum); + private static native int nativeGetKeymapKeyScreenKb(int keynum); private static native void nativeSetKeymapKeyScreenKb(int keynum, int key); private static native void nativeSetScreenKbKeyUsed(int keynum, int used); - public static native void nativeSetEnv(final String name, final String value); + private static native int nativeGetKeymapKeyMultitouchGesture(int keynum); + private static native void nativeSetKeymapKeyMultitouchGesture(int keynum, int key); + private static native void nativeSetMultitouchGestureSensitivity(int sensitivity); + public static native void nativeSetEnv(final String name, final String value); } diff --git a/project/java/translations/values-de/strings.xml b/project/java/translations/values-de/strings.xml index 37f730d41..686956cd3 100644 --- a/project/java/translations/values-de/strings.xml +++ b/project/java/translations/values-de/strings.xml @@ -79,4 +79,26 @@ Bewegen Sie die Maus mit Joystick-Geschwindigkeit Bewegen Sie die Maus mit Joystick-Beschleunigung Keine +On-Screen-Tastatur Transparenz +Nicht sichtbar +Fast unsichtbar +Transparente +Semi-transparent +Non-transparent +Maus-Emulation +Kalibrieren Touchscreen Druck +Remap physischen Tasten +Drücken Sie eine beliebige Taste außer HOME und POWER, können Sie Lautstärke-Tasten +Wählen Sie SDL Schlüsselcode +Remap On-Screen-Steuerung +On-Screen-Joystick +On-Screen-Taste +On-Screen-Texteingabe-Taste +Zoom in Zwei-Finger-Geste +Verkleinern Zwei-Finger-Geste +Nach links drehen Zwei-Finger-Geste +Nach rechts drehen Zwei-Finger-Geste +Zwei-Finger-Gesten +Sehr schnell +Zwei-Finger-Gesten Bildschirm Empfindlichkeit diff --git a/project/java/translations/values-fi/strings.xml b/project/java/translations/values-fi/strings.xml index d8d1948a4..5969addd5 100644 --- a/project/java/translations/values-fi/strings.xml +++ b/project/java/translations/values-fi/strings.xml @@ -79,4 +79,26 @@ Siirrä hiiri ohjainta nopeasti Siirrä hiiri ohjainta kiihtyvyys Ei +Näyttönäppäimistöllä avoimuutta +Näkymätön +Lähes näkymätön +Läpinäkyvä +Semi-avoimet +Ei-läpinäkyvä +Hiiren emulointi +Kalibroi kosketusnäyttö paine +Remap fyysiset näppäimet +Paina mitä tahansa näppäintä paitsi koti-ja POWER, voit käyttää äänenvoimakkuusnäppäimiä +Valitse SDL näppäinkoodien +Remap näytön valvonnan +Näytöllä ohjainta +Ruutunäyttöpainike +Näytön tekstin tulopainiketta +Suurenna kahden sormen elettä +Pienennä kahden sormen elettä +Kierrä vasemmalle kahden sormen elettä +Kierrä oikealle kahden sormen elettä +Kahden sormen eleitä +Erittäin nopea +Kahden sormen näytön eleet herkkyys diff --git a/project/java/translations/values-fr/strings.xml b/project/java/translations/values-fr/strings.xml index a53d959e1..101f7175c 100644 --- a/project/java/translations/values-fr/strings.xml +++ b/project/java/translations/values-fr/strings.xml @@ -82,4 +82,26 @@ Déplacez la souris avec la vitesse joystick Déplacez la souris avec une accélération joystick Aucun +Sur la transparence du clavier à l\u0026#39;écran +Invisible +Presque invisible +Transparent +Semi-transparent +Non-transparent +l\u0026#39;émulation de la souris +Calibrer la pression tactile +Reconfigurer les touches physiques +Appuyez sur n\u0026#39;importe quelle touche sauf HOME et POWER, vous pouvez utiliser les touches de volume +Sélectionnez SDL keycode +Reconfigurer les contrôles à l\u0026#39;écran +Le joystick à l\u0026#39;écran +Le bouton à l\u0026#39;écran +Sur l\u0026#39;écran de saisie de texte bouton +Zoom sur deux doigts geste +Zoom sur deux doigts geste +Tournez à gauche geste de deux doigts +Tournez à droite geste de deux doigts +Deux doigts gestes +Très rapide +Deux doigts écran gestes sensibilité diff --git a/project/java/translations/values-ru/strings.xml b/project/java/translations/values-ru/strings.xml index 554f7fe24..e9c08802e 100644 --- a/project/java/translations/values-ru/strings.xml +++ b/project/java/translations/values-ru/strings.xml @@ -72,4 +72,26 @@ Перемещение мыши джойстиком - скорость Перемещение мыши джойстиком - ускорение Нет +О прозрачности клавиатура-экран +Невидимый +Почти невидимый +Прозрачный +Полупрозрачные +Непрозрачные +Эмуляции мыши +Калибровка сенсорного давления +Переназначение физических клавиш +Нажмите любую клавишу, кроме HOME и POWER, вы можете использовать клавиши регулировки громкости +Выберите код кнопки SDL +Переназначение экранных кнопок +Экранный джойстик +Экранные кнопки +Экранная кнопка ввода текста +Увеличить двумя пальцами жест +Уменьшить двумя пальцами жест +Повернуть налево двумя пальцами жест +Повернуть вправо двумя пальцами жест +Жест двумя пальцами по экрану +Очень быстро +Чувствительность жеста двумя пальцами по экрану diff --git a/project/java/translations/values-uk/strings.xml b/project/java/translations/values-uk/strings.xml index d2a0e63d0..b3b239c4d 100644 --- a/project/java/translations/values-uk/strings.xml +++ b/project/java/translations/values-uk/strings.xml @@ -72,4 +72,26 @@ Переміщення миші джойстиком - швидкiсть Переміщення миші джойстиком - прискорення Немає +Про прозорість клавіатура-екран +Невидимий +Майже невидимий +Прозорий +Напівпрозорі +Непрозорі +Емуляція миші +Калібрування сенсорного натискання +Перепризначення фізичних кнопок +Натисніть будь-яку клавішу, крім HOME і POWER, ви можете використовувати клавіші регулювання гучності +Виберіть код кнопки SDL +Перепризначення наекранних кнопок +Наекранний джойстік +Наекранні кнопки +Наекранна кнопка вводу тексту +Збільшити двома пальцями жест +Зменшити двома пальцями жест +Повернути наліво двома пальцями жест +Повернути праворуч двома пальцями жест +Жест двома пальцями по екрану +Дуже швидко +Чутливість жесту двома пальцями по екрану diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml index d797f202b..980f2a708 100644 --- a/project/java/translations/values/strings.xml +++ b/project/java/translations/values/strings.xml @@ -55,6 +55,7 @@ Slow Trackball dampening + Very fast Fast Medium Slow @@ -106,6 +107,8 @@ On-screen joystick On-screen button On-screen text input button + Two-finger screen gestures + Two-finger screen gestures sensitivity Zoom in two-finger gesture Zoom out two-finger gesture Rotate left two-finger gesture diff --git a/project/jni/application/ballfield/AndroidAppSettings.cfg b/project/jni/application/ballfield/AndroidAppSettings.cfg index 2773f801f..79538e721 100644 --- a/project/jni/application/ballfield/AndroidAppSettings.cfg +++ b/project/jni/application/ballfield/AndroidAppSettings.cfg @@ -17,10 +17,10 @@ AppUsesJoystick=n AppHandlesJoystickSensitivity=n AppUsesMultitouch=n NonBlockingSwapBuffers=n -RedefinedKeys="SPACE RETURN" +RedefinedKeys="SPACE" AppTouchscreenKeyboardKeysAmount=6 AppTouchscreenKeyboardKeysAmountAutoFire=2 -RedefinedKeysScreenKb="SPACE RETURN" +RedefinedKeysScreenKb="1 2 3 4 5 6 1 2 3 4" MultiABI=n AppVersionCode=101 AppVersionName="1.01" diff --git a/project/jni/application/ballfield/ballfield.cpp b/project/jni/application/ballfield/ballfield.cpp index fc867723a..6b5840e3b 100644 --- a/project/jni/application/ballfield/ballfield.cpp +++ b/project/jni/application/ballfield/ballfield.cpp @@ -460,9 +460,6 @@ int main(int argc, char* argv[]) SDL_Rect r; if(SDL_PollEvent(&event) > 0) { - if(event.type == SDL_MOUSEBUTTONDOWN) - break; - if(event.type & (SDL_KEYUP | SDL_KEYDOWN)) { Uint8 *keys = SDL_GetKeyState(&i); diff --git a/project/jni/application/src b/project/jni/application/src index 7fa7b8f4e..104f796a6 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -opentyrian \ No newline at end of file +ballfield \ No newline at end of file diff --git a/project/jni/sdl-1.2/src/video/android/atan2i.h b/project/jni/sdl-1.2/src/video/android/atan2i.h new file mode 100644 index 000000000..e7111a618 --- /dev/null +++ b/project/jni/sdl-1.2/src/video/android/atan2i.h @@ -0,0 +1,33 @@ +#ifndef __ATAN2I_H__ +#define __ATAN2I_H__ +#include + +// Fast arctan2, returns angle in radians as integer, with fractional part in lower 16 bits +// Stolen from http://www.dspguru.com/dsp/tricks/fixed-point-atan2-with-self-normalization , precision is said to be 0.07 rads + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +enum { atan2i_coeff_1 = ((int)(M_PI*65536.0/4)), atan2i_coeff_2 = (3*atan2i_coeff_1), atan2i_PI = (int)(M_PI * 65536.0) }; + +static inline int atan2i(int y, int x) +{ + int angle; + int abs_y = abs(y); + if( abs_y == 0 ) + abs_y = 1; + if (x>=0) + { + angle = atan2i_coeff_1 - atan2i_coeff_1 * (x - abs_y) / (x + abs_y); + } + else + { + angle = atan2i_coeff_2 - atan2i_coeff_1 * (x + abs_y) / (abs_y - x); + } + if (y < 0) + return(-angle); // negate if in quad III or IV + else + return(angle); +}; + +#endif diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c index 5699a0167..5a774db09 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.c @@ -42,6 +42,7 @@ #include "SDL_androidinput.h" #include "SDL_screenkeyboard.h" #include "jniwrapperstuff.h" +#include "atan2i.h" static SDLKey SDL_android_keymap[KEYCODE_LAST+1]; @@ -53,7 +54,6 @@ static inline SDL_scancode TranslateKey(int scancode) return SDL_android_keymap[scancode]; } - static int isTrackballUsed = 0; static int isMouseUsed = 0; @@ -81,7 +81,19 @@ static Uint32 lastTrackballAction = 0; enum { TOUCH_PTR_UP = 0, TOUCH_PTR_MOUSE = 1, TOUCH_PTR_SCREENKB = 2 }; int touchPointers[MAX_MULTITOUCH_POINTERS] = {0}; int firstMousePointerId = -1; - +enum { MAX_MULTITOUCH_GESTURES = 4 }; +int multitouchGestureKeycode[MAX_MULTITOUCH_GESTURES] = { +SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_6)), +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)) +}; +int multitouchGestureKeyPressed[MAX_MULTITOUCH_GESTURES] = { 0, 0, 0, 0 }; +int multitouchGestureSensitivity = 0; +int multitouchGestureDist = -1; +int multitouchGestureAngle = 0; +int multitouchGestureX = -1; +int multitouchGestureY = -1; static inline int InsideRect(const SDL_Rect * r, int x, int y) { @@ -196,12 +208,111 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j x = x * SDL_ANDROID_sFakeWindowWidth / SDL_ANDROID_sWindowWidth; y = y * SDL_ANDROID_sFakeWindowHeight / SDL_ANDROID_sWindowHeight; + if( x < 0 ) + x = 0; + if( x > SDL_ANDROID_sWindowWidth ) + x = SDL_ANDROID_sWindowWidth; + if( y < 0 ) + y = 0; + if( y > SDL_ANDROID_sWindowHeight ) + y = SDL_ANDROID_sWindowHeight; #endif + if( action == MOUSE_UP ) + { + 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] ); + } + } + } + else + { + if( firstMousePointerId != pointerId ) + { + multitouchGestureX = x; + multitouchGestureY = y; + } + if( firstMousePointerId == pointerId && multitouchGestureX >= 0 ) + { + int dist = abs( x - multitouchGestureX ) + abs( y - multitouchGestureY ); + int angle = atan2i( y - multitouchGestureY, x - multitouchGestureX ); + if( multitouchGestureDist < 0 ) + { + multitouchGestureDist = dist; + multitouchGestureAngle = angle; + } + else + { + int distMaxDiff = SDL_ANDROID_sFakeWindowHeight / ( 1 + (1 + multitouchGestureSensitivity) * 2 ); + int angleMaxDiff = atan2i_PI / ( 1 + (1 + multitouchGestureSensitivity) * 2 ); + if( dist - multitouchGestureDist > distMaxDiff ) + { + multitouchGestureKeyPressed[0] = 1; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[0] ); + } + else + if( multitouchGestureKeyPressed[0] ) + { + multitouchGestureKeyPressed[0] = 0; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[0] ); + } + if( multitouchGestureDist - dist > distMaxDiff ) + { + multitouchGestureKeyPressed[1] = 1; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[1] ); + } + else + if( multitouchGestureKeyPressed[1] ) + { + multitouchGestureKeyPressed[1] = 0; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[1] ); + } + + int angleDiff = angle - multitouchGestureAngle; + + while( angleDiff < atan2i_PI ) + angleDiff += atan2i_PI * 2; + while( angleDiff > atan2i_PI ) + angleDiff -= atan2i_PI * 2; + + if( angleDiff < -angleMaxDiff ) + { + multitouchGestureKeyPressed[2] = 1; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[2] ); + } + else + if( multitouchGestureKeyPressed[2] ) + { + multitouchGestureKeyPressed[2] = 0; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[2] ); + } + if( angleDiff > angleMaxDiff ) + { + multitouchGestureKeyPressed[3] = 1; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, multitouchGestureKeycode[3] ); + } + else + if( multitouchGestureKeyPressed[3] ) + { + multitouchGestureKeyPressed[3] = 0; + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, multitouchGestureKeycode[3] ); + } + __android_log_print(ANDROID_LOG_INFO, "libSDL", "x %d y %d multitouchGestureX %d multitouchGestureY %d dist %d multitouchGestureDist %d angle %08X multitouchGestureAngle %08X angleDiff %09d", + x, y, multitouchGestureX, multitouchGestureY, dist, multitouchGestureDist, angle, multitouchGestureAngle, angleDiff ); + } + } + } + if( isMultitouchUsed ) { - #if SDL_VERSION_ATLEAST(1,3,0) // Use nifty SDL 1.3 multitouch API if( action == MOUSE_MOVE ) @@ -223,7 +334,7 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j { SDL_keysym keysym; if( action != MOUSE_MOVE ) - SDL_ANDROID_MainThreadPushKeyboardKey( action == MOUSE_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_KEYCODE_0)) ); + SDL_ANDROID_MainThreadPushKeyboardKey( action == MOUSE_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_ANDROID_GetScreenKeyboardButtonKey(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0) ); return; } @@ -1314,7 +1425,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetKeymapKey) ( JNIEnv* env, jobject thiz, jint SDL_android_keymap[javakey] = key; } -JNIEXPORT jint JNICALL +JNIEXPORT jint JNICALL JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyScreenKb) ( JNIEnv* env, jobject thiz, jint keynum) { if( keynum < 0 || keynum > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 + 4 ) @@ -1352,6 +1463,29 @@ JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz SDL_ANDROID_SetScreenKeyboardButtonPos(key, &rect); } +JNIEXPORT jint JNICALL +JAVA_EXPORT_NAME(Settings_nativeGetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum) +{ + if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) + return SDL_KEY(UNKNOWN); + return multitouchGestureKeycode[keynum]; +} + +JNIEXPORT void JNICALL +JAVA_EXPORT_NAME(Settings_nativeSetKeymapKeyMultitouchGesture) ( JNIEnv* env, jobject thiz, jint keynum, jint keycode) +{ + if( keynum < 0 || keynum >= MAX_MULTITOUCH_GESTURES ) + return SDL_KEY(UNKNOWN); + multitouchGestureKeycode[keynum] = keycode; +} + +JNIEXPORT void JNICALL +JAVA_EXPORT_NAME(Settings_nativeSetMultitouchGestureSensitivity) ( JNIEnv* env, jobject thiz, jint sensitivity) +{ + multitouchGestureSensitivity = sensitivity; +} + + JNIEXPORT void JNICALL JAVA_EXPORT_NAME(Settings_nativeInitKeymap) ( JNIEnv* env, jobject thiz ) { diff --git a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c index 4ab970bdb..6079f9405 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_touchscreenkeyboard.c @@ -890,7 +890,6 @@ int SDL_ANDROID_SetScreenKeyboardButtonKey(int buttonId, SDLKey key) { if( buttonId < SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 || buttonId > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 || ! key ) return 0; - __android_log_print(ANDROID_LOG_INFO, "libSDL", "SetScreenKeyboardButtonKey(): %d %d", buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, key); buttonKeysyms[buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0] = key; return 1; };