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;
};