From a0cc34138b266d77241e25200dc2568b8eb0a9ad Mon Sep 17 00:00:00 2001 From: pelya Date: Wed, 24 Nov 2010 20:03:25 +0200 Subject: [PATCH] WARNING: SDL 1.3 won't compile! All SDL events now pushed from main SDL thread - this fixes some GFX problems in point-and-click games like OpenTTD. --- .../fheroes2/AndroidAppSettings.cfg | 4 +- .../openttd/AndroidAppSettings.cfg | 4 +- project/jni/application/src | 2 +- .../application/vice/AndroidAppSettings.cfg | 12 +- .../vice/AndroidData/vice-data.zip | Bin 0 -> 34063 bytes .../src/video/android/SDL_androidvideo-1.2.c | 5 + .../src/video/android/SDL_androidinput.c | 422 ++++++++++++++---- .../src/video/android/SDL_androidinput.h | 69 +-- .../src/video/android/SDL_androidvideo-1.3.c | 1 + .../src/video/android/SDL_androidvideo.h | 5 +- .../video/android/SDL_touchscreenkeyboard.c | 77 ++-- 11 files changed, 400 insertions(+), 201 deletions(-) create mode 100644 project/jni/application/vice/AndroidData/vice-data.zip diff --git a/project/jni/application/fheroes2/AndroidAppSettings.cfg b/project/jni/application/fheroes2/AndroidAppSettings.cfg index b8f27e89c..750be18ac 100644 --- a/project/jni/application/fheroes2/AndroidAppSettings.cfg +++ b/project/jni/application/fheroes2/AndroidAppSettings.cfg @@ -25,9 +25,9 @@ AppVersionCode=100 AppVersionName="1.0.0" CompiledLibraries="sdl_net sdl_mixer sdl_image sdl_ttf png intl" CustomBuildScript=n -AppCflags='-fexceptions -finline-functions -O2 -DWITH_ZLIB -DWITH_MIXER -DWITH_NET -DWITH_XML -DWITH_IMAGE -DWITH_TTF -DAI_EMPTY' +AppCflags='-finline-functions -O2 -DWITH_ZLIB -DWITH_MIXER -DWITH_NET -DWITH_XML -DWITH_IMAGE -DWITH_TTF -DAI_EMPTY' AppLdflags='' AppSubdirsBuild='fheroes2/src/engine/* fheroes2/src/fheroes2/* fheroes2/src/xmlccwrap/*' -AppUseCrystaXToolchain=y +AppUseCrystaXToolchain=n AppCmdline='fheroes2 -d' ReadmeText='^You may press "Home" now - the data will be downloaded in background' diff --git a/project/jni/application/openttd/AndroidAppSettings.cfg b/project/jni/application/openttd/AndroidAppSettings.cfg index ae0a70b1e..bf130ce70 100644 --- a/project/jni/application/openttd/AndroidAppSettings.cfg +++ b/project/jni/application/openttd/AndroidAppSettings.cfg @@ -21,8 +21,8 @@ RedefinedKeys="LALT RETURN KP_PLUS KP_MINUS DELETE ESCAPE" AppTouchscreenKeyboardKeysAmount=0 AppTouchscreenKeyboardKeysAmountAutoFire=0 MultiABI=n -AppVersionCode=10504 -AppVersionName="1.0.5.04" +AppVersionCode=10505 +AppVersionName="1.0.5.05" CompiledLibraries="jpeg png freetype timidity lzma lzo2" CustomBuildScript=y AppCflags='' diff --git a/project/jni/application/src b/project/jni/application/src index 706424f94..550b7b622 120000 --- a/project/jni/application/src +++ b/project/jni/application/src @@ -1 +1 @@ -sc2 \ No newline at end of file +openttd \ No newline at end of file diff --git a/project/jni/application/vice/AndroidAppSettings.cfg b/project/jni/application/vice/AndroidAppSettings.cfg index 2663cc217..2343b0e6f 100644 --- a/project/jni/application/vice/AndroidAppSettings.cfg +++ b/project/jni/application/vice/AndroidAppSettings.cfg @@ -5,7 +5,7 @@ AppName="ViceC64" AppFullName=org.viceteam.sdl ScreenOrientation=h InhibitSuspend=n -AppDataDownloadUrl="Data files size is 1 Mb|http://anddev.at.ua/data/vice-data.zip?attredirects=0&d=1" +AppDataDownloadUrl="Data size is 1 Mb|vice-data.zip" SdlVideoResize=y SdlVideoResizeKeepAspect=n NeedDepthBuffer=n @@ -17,17 +17,17 @@ AppUsesJoystick=n AppHandlesJoystickSensitivity=n AppUsesMultitouch=n NonBlockingSwapBuffers=n -RedefinedKeys="LALT RETURN KP_PLUS KP_MINUS LCTRL" -AppTouchscreenKeyboardKeysAmount=3 +RedefinedKeys="LCTRL RETURN KP_PLUS KP_MINUS LCTRL" +AppTouchscreenKeyboardKeysAmount=4 AppTouchscreenKeyboardKeysAmountAutoFire=0 MultiABI=n -AppVersionCode=12001 -AppVersionName="2.2.01" +AppVersionCode=22001 +AppVersionName="svn23185" CompiledLibraries="jpeg png" CustomBuildScript=y AppCflags='' AppLdflags='' AppSubdirsBuild='' AppUseCrystaXToolchain=n -AppCmdline='/sdcard/app-data/org.viceteam.sdl/vice -sdlcustomw 480 -sdlcustomh 320 -sdllimitmode 1 -menukey 306' +AppCmdline='/sdcard/app-data/org.viceteam.sdl/vice -sdlcustomw 320 -sdlcustomh 240 -sdllimitmode 1 -menukey 306' ReadmeText='^You may press "Home" now - the data will be downloaded in background' diff --git a/project/jni/application/vice/AndroidData/vice-data.zip b/project/jni/application/vice/AndroidData/vice-data.zip new file mode 100644 index 0000000000000000000000000000000000000000..dfa89b70ed3c229ee2f1a706378f26dc5a11c693 GIT binary patch literal 34063 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 VZ&q*-CdwenaEFC~LAC*;0|2<}|CIm$ literal 0 HcmV?d00001 diff --git a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c index d2eff7ca8..e8e0f4e8e 100644 --- a/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c +++ b/project/jni/sdl-1.2/src/video/android/SDL_androidvideo-1.2.c @@ -397,6 +397,7 @@ void ANDROID_VideoQuit(_THIS) void ANDROID_PumpEvents(_THIS) { + SDL_ANDROID_PumpEvents(); } static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface) @@ -797,7 +798,11 @@ static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects) { if( SDL_VideoThreadID != SDL_ThreadID() ) { + static count = 100; __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); + count--; + if(count <=0 ) + abort(); return; } 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 4ae3f22d5..7f26346d5 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 @@ -30,6 +30,8 @@ #include "SDL_config.h" #include "SDL_version.h" +#include "SDL_mutex.h" +#include "SDL_events.h" #if SDL_VERSION_ATLEAST(1,3,0) #include "SDL_touch.h" #include "../../events/SDL_touch_c.h" @@ -41,7 +43,14 @@ #include "jniwrapperstuff.h" -SDLKey SDL_android_keymap[KEYCODE_LAST+1]; +static SDLKey SDL_android_keymap[KEYCODE_LAST+1]; + +static inline SDL_scancode TranslateKey(int scancode) +{ + if ( scancode >= SDL_arraysize(SDL_android_keymap) ) + scancode = KEYCODE_UNKNOWN; + return SDL_android_keymap[scancode]; +} static int isTrackballUsed = 0; @@ -60,6 +69,7 @@ SDL_Joystick *SDL_ANDROID_CurrentJoysticks[MAX_MULTITOUCH_POINTERS+1] = {NULL}; static int TrackballDampening = 0; // in milliseconds static int lastTrackballAction = 0; + static inline int InsideRect(const SDL_Rect * r, int x, int y) { return ( x >= r->x && x <= r->x + r->w ) && ( y >= r->y && y <= r->y + r->h ); @@ -147,28 +157,25 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j #if SDL_VERSION_ATLEAST(1,3,0) // Use nifty SDL 1.3 multitouch API if( action == MOUSE_MOVE ) - SDL_SendTouchMotion(0, pointerId, 0, x, y, force*radius / 16); + SDL_ANDROID_MainThreadPushMultitouchMotion(pointerId, x, y, force*radius / 16); else - SDL_SendFingerDown(0, pointerId, action == MOUSE_DOWN ? 1 : 0, x, y, force*radius / 16); + SDL_ANDROID_MainThreadPushMultitouchButton(pointerId, action == MOUSE_DOWN ? 1 : 0, x, y, force*radius / 16); #endif - if( SDL_ANDROID_CurrentJoysticks[pointerId] ) - { - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[pointerId+1], 0, x); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[pointerId+1], 1, y); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[pointerId+1], 2, force); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[pointerId+1], 3, radius); - if( action == MOUSE_DOWN ) - SDL_PrivateJoystickButton(SDL_ANDROID_CurrentJoysticks[pointerId+1], 0, SDL_PRESSED); - if( action == MOUSE_UP ) - SDL_PrivateJoystickButton(SDL_ANDROID_CurrentJoysticks[pointerId+1], 0, SDL_RELEASED); - } + SDL_ANDROID_MainThreadPushJoystickAxis(pointerId+1, 0, x); + SDL_ANDROID_MainThreadPushJoystickAxis(pointerId+1, 1, y); + SDL_ANDROID_MainThreadPushJoystickAxis(pointerId+1, 2, force); + SDL_ANDROID_MainThreadPushJoystickAxis(pointerId+1, 3, radius); + if( action == MOUSE_DOWN ) + SDL_ANDROID_MainThreadPushJoystickButton(pointerId+1, 0, SDL_PRESSED); + if( action == MOUSE_UP ) + SDL_ANDROID_MainThreadPushJoystickButton(pointerId+1, 0, SDL_RELEASED); } if( !isMouseUsed && !SDL_ANDROID_isTouchscreenKeyboardUsed ) { SDL_keysym keysym; if( action != MOUSE_MOVE ) - SDL_SendKeyboardKey( action == MOUSE_DOWN ? SDL_PRESSED : SDL_RELEASED, GetKeysym(SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_KEYCODE_0)) ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( action == MOUSE_DOWN ? SDL_PRESSED : SDL_RELEASED, SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_KEYCODE_0)) ); return; } @@ -177,27 +184,22 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j if( pointerId == 0 ) { -#if SDL_VERSION_ATLEAST(1,3,0) -#else -#define SDL_SendMouseMotion(A,B,X,Y) SDL_PrivateMouseMotion(0, 0, X, Y) -#define SDL_SendMouseButton(N, A, B) SDL_PrivateMouseButton( A, B, 0, 0 ) -#endif - SDL_SendMouseMotion(NULL, 0, x, y); + SDL_ANDROID_MainThreadPushMouseMotion(x, y); if( action == MOUSE_UP ) { if( SDL_GetMouseState( NULL, NULL ) & SDL_BUTTON(SDL_BUTTON_LEFT) ) - SDL_SendMouseButton( NULL, SDL_RELEASED, SDL_BUTTON_LEFT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_LEFT ); if( SDL_GetMouseState( NULL, NULL ) & SDL_BUTTON(SDL_BUTTON_RIGHT) ) - SDL_SendMouseButton( NULL, SDL_RELEASED, SDL_BUTTON_RIGHT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_RIGHT ); SDL_ANDROID_ShowScreenUnderFingerRect.w = SDL_ANDROID_ShowScreenUnderFingerRect.h = 0; SDL_ANDROID_ShowScreenUnderFingerRectSrc.w = SDL_ANDROID_ShowScreenUnderFingerRectSrc.h = 0; if( SDL_ANDROID_ShowScreenUnderFinger ) - SDL_SendMouseMotion(NULL, 0, x > 0 ? x-1 : 0, y); // Move mouse by 1 pixel so it will force screen update and mouse-under-finger window will be removed + SDL_ANDROID_MainThreadPushMouseMotion(x > 0 ? x-1 : 0, y); // Move mouse by 1 pixel so it will force screen update and mouse-under-finger window will be removed } if( action == MOUSE_DOWN ) { if( !leftClickUsesPressure && !leftClickUsesMultitouch ) - SDL_SendMouseButton( NULL, SDL_PRESSED, SDL_BUTTON_LEFT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_PRESSED, SDL_BUTTON_LEFT ); else action == MOUSE_MOVE; UpdateScreenUnderFingerRect(x, y); @@ -209,9 +211,9 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j int button = leftClickUsesPressure ? SDL_BUTTON_LEFT : SDL_BUTTON_RIGHT; int buttonState = ( force > maxForce || radius > maxRadius ); if( button == SDL_BUTTON_RIGHT && (SDL_GetMouseState( NULL, NULL ) & SDL_BUTTON(SDL_BUTTON_LEFT)) ) - SDL_SendMouseButton( NULL, SDL_RELEASED, SDL_BUTTON_LEFT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_LEFT ); if( ( (SDL_GetMouseState( NULL, NULL ) & SDL_BUTTON(button)) != 0 ) != buttonState ) - SDL_SendMouseButton( NULL, buttonState ? SDL_PRESSED : SDL_RELEASED, button ); + SDL_ANDROID_MainThreadPushMouseButton( buttonState ? SDL_PRESSED : SDL_RELEASED, button ); } UpdateScreenUnderFingerRect(x, y); } @@ -220,13 +222,13 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeMouse) ( JNIEnv* env, jobject thiz, j { if( leftClickUsesMultitouch ) { - SDL_SendMouseButton( NULL, (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_LEFT ); + SDL_ANDROID_MainThreadPushMouseButton( (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_LEFT ); } else if( rightClickMethod == RIGHT_CLICK_WITH_MULTITOUCH ) { if( SDL_GetMouseState( NULL, NULL ) & SDL_BUTTON(SDL_BUTTON_LEFT) ) - SDL_SendMouseButton( NULL, SDL_RELEASED, SDL_BUTTON_LEFT ); - SDL_SendMouseButton( NULL, (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); + SDL_ANDROID_MainThreadPushMouseButton( SDL_RELEASED, SDL_BUTTON_LEFT ); + SDL_ANDROID_MainThreadPushMouseButton( (action == MOUSE_DOWN) ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); } } } @@ -243,35 +245,17 @@ JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeKey) ( JNIEnv* env, jobject thiz, jint return; if( key == KEYCODE_MENU && rightClickMethod == RIGHT_CLICK_WITH_MENU_BUTTON ) { - SDL_SendMouseButton( NULL, action ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); + SDL_ANDROID_MainThreadPushMouseButton( action ? SDL_PRESSED : SDL_RELEASED, SDL_BUTTON_RIGHT ); return; } SDL_keysym keysym; - SDL_SendKeyboardKey( action ? SDL_PRESSED : SDL_RELEASED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( action ? SDL_PRESSED : SDL_RELEASED, TranslateKey(key) ); } JNIEXPORT void JNICALL JAVA_EXPORT_NAME(DemoGLSurfaceView_nativeTextInput) ( JNIEnv* env, jobject thiz, jint ascii, jint unicode ) { - SDL_keysym keysym; - keysym.scancode = ascii; - keysym.sym = ascii; - keysym.mod = KMOD_NONE; - keysym.unicode = 0; - if ( SDL_TranslateUNICODE ) { - /* Populate the unicode field with the ASCII value */ - keysym.unicode = unicode; - } - -#if SDL_VERSION_ATLEAST(1,3,0) - char text[2]; - text[0]=ascii; - text[1]=0; - SDL_SendKeyboardText(text); -#else - SDL_SendKeyboardKey( SDL_PRESSED, &keysym ); - SDL_SendKeyboardKey( SDL_RELEASED, &keysym ); -#endif + SDL_ANDROID_MainThreadPushText(ascii, unicode); } @@ -530,12 +514,12 @@ void updateOrientation ( float accX, float accY, float accZ ) //__android_log_print(ANDROID_LOG_INFO, "libSDL", "updateOrientation(): %f %f %f", accX, accY, accZ); - if( SDL_ANDROID_isJoystickUsed && SDL_ANDROID_CurrentJoysticks[0] ) // TODO: mutex for that stuff? + if( SDL_ANDROID_isJoystickUsed ) // TODO: mutex for that stuff? { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "updateOrientation(): sending joystick event"); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 0, (Sint16)(fminf(32767.0f, fmax(-32767.0f, -(accX - midX) * joystickSensitivity)))); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 1, (Sint16)(fminf(32767.0f, fmax(-32767.0f, (accY - midY) * joystickSensitivity)))); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 2, (Sint16)(fminf(32767.0f, fmax(-32767.0f, (accZ - midZ) * joystickSensitivity)))); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 0, (Sint16)(fminf(32767.0f, fmax(-32767.0f, -(accX - midX) * joystickSensitivity)))); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 1, (Sint16)(fminf(32767.0f, fmax(-32767.0f, (accY - midY) * joystickSensitivity)))); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 2, (Sint16)(fminf(32767.0f, fmax(-32767.0f, (accZ - midZ) * joystickSensitivity)))); if( accelerometerCenterPos == ACCELEROMETER_CENTER_FLOATING ) { @@ -559,7 +543,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: press left, acc %f mid %f d %f", accX, midX, dx); pressLeft = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_LEFT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_LEFT) ); } } else @@ -568,7 +552,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: release left, acc %f mid %f d %f", accX, midX, dx); pressLeft = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT) ); } } if( accX < midX - dx*2 ) @@ -580,7 +564,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: press right, acc %f mid %f d %f", accX, midX, dx); pressRight = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_RIGHT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_RIGHT) ); } } else @@ -589,7 +573,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: release right, acc %f mid %f d %f", accX, midX, dx); pressRight = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT) ); } } if( accX > midX + dx*2 ) @@ -601,7 +585,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: press up, acc %f mid %f d %f", accY, midY, dy); pressUp = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_DOWN, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_DOWN) ); } } else @@ -610,7 +594,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: release up, acc %f mid %f d %f", accY, midY, dy); pressUp = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN) ); } } if( accY < midY - dy*2 ) @@ -622,7 +606,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: press down, acc %f mid %f d %f", accY, midY, dy); pressDown = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_UP, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_DPAD_UP) ); } } else @@ -631,7 +615,7 @@ void updateOrientation ( float accX, float accY, float accZ ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "Accelerometer: release down, acc %f mid %f d %f", accY, midY, dy); pressDown = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP) ); } } if( accY > midY + dy*2 ) @@ -642,7 +626,7 @@ void updateOrientation ( float accX, float accY, float accZ ) if( !pressL ) { pressL = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_ALT_LEFT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_ALT_LEFT) ); } } else @@ -650,7 +634,7 @@ void updateOrientation ( float accX, float accY, float accZ ) if( pressL ) { pressL = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_ALT_LEFT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_ALT_LEFT) ); } } if( accZ < midZ - dz*2 ) @@ -661,7 +645,7 @@ void updateOrientation ( float accX, float accY, float accZ ) if( !pressR ) { pressR = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_ALT_RIGHT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(KEYCODE_ALT_RIGHT) ); } } else @@ -669,7 +653,7 @@ void updateOrientation ( float accX, float accY, float accZ ) if( pressR ) { pressR = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_ALT_RIGHT, &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_ALT_RIGHT) ); } } if( accZ > midZ + dz*2 ) @@ -696,18 +680,18 @@ int processAndroidTrackball(int key, int action) if( downPressed ) { downPressed = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN) ); return 1; } if( !upPressed ) { upPressed = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(key ,&keysym) ); - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(key) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } return 1; } @@ -717,18 +701,18 @@ int processAndroidTrackball(int key, int action) if( upPressed ) { upPressed = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP) ); return 1; } if( !upPressed ) { downPressed = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(key ,&keysym) ); - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(key) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } return 1; } @@ -738,18 +722,18 @@ int processAndroidTrackball(int key, int action) if( rightPressed ) { rightPressed = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT) ); return 1; } if( !leftPressed ) { leftPressed = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(key ,&keysym) ); - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(key) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } return 1; } @@ -759,18 +743,18 @@ int processAndroidTrackball(int key, int action) if( leftPressed ) { leftPressed = 0; - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT) ); return 1; } if( !rightPressed ) { rightPressed = 1; - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(key ,&keysym) ); - SDL_SendKeyboardKey( SDL_PRESSED, TranslateKey(key ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(key) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, TranslateKey(key) ); } return 1; } @@ -786,13 +770,13 @@ void SDL_ANDROID_processAndroidTrackballDampening() if( SDL_GetTicks() - lastTrackballAction > TrackballDampening ) { if( upPressed ) - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_UP) ); if( downPressed ) - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_DOWN) ); if( leftPressed ) - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_LEFT) ); if( rightPressed ) - SDL_SendKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, TranslateKey(KEYCODE_DPAD_RIGHT) ); upPressed = 0; downPressed = 0; leftPressed = 0; @@ -867,3 +851,267 @@ void SDL_SYS_JoystickQuit(void) } +enum { MAX_BUFFERED_EVENTS = 64 }; +static SDL_Event BufferedEvents[MAX_BUFFERED_EVENTS]; +static int BufferedEventsStart = 0, BufferedEventsEnd = 0; +static SDL_mutex * BufferedEventsMutex = NULL; + +#if SDL_VERSION_ATLEAST(1,3,0) + +#define SDL_SendKeyboardKey(state, keysym) SDL_SendKeyboardKey(state, (keysym)->sym) + +#else + +#define SDL_SendMouseMotion(A,B,X,Y) SDL_PrivateMouseMotion(0, 0, X, Y) +#define SDL_SendMouseButton(N, A, B) SDL_PrivateMouseButton( A, B, 0, 0 ) +#define SDL_SendKeyboardKey(state, keysym) SDL_PrivateKeyboard(state, keysym) + +#endif + +extern void SDL_ANDROID_PumpEvents() +{ + if( !BufferedEventsMutex ) + BufferedEventsMutex = SDL_CreateMutex(); + SDL_mutexP(BufferedEventsMutex); + while( BufferedEventsStart != BufferedEventsEnd ) + { + SDL_Event * ev = &BufferedEvents[BufferedEventsStart]; + + switch( ev->type ) + { + case SDL_MOUSEMOTION: + SDL_SendMouseMotion(NULL, 0, ev->motion.x, ev->motion.y); + break; + case SDL_MOUSEBUTTONDOWN: + SDL_SendMouseButton( NULL, ev->button.state, ev->button.button ); + break; + case SDL_KEYDOWN: + SDL_SendKeyboardKey( ev->key.state, &ev->key.keysym ); + break; + case SDL_JOYAXISMOTION: + if( ev->jaxis.which < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[ev->jaxis.which] ) + SDL_PrivateJoystickAxis( SDL_ANDROID_CurrentJoysticks[ev->jaxis.which], ev->jaxis.axis, ev->jaxis.value ); + break; + case SDL_JOYBUTTONDOWN: + if( ev->jbutton.which < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[ev->jbutton.which] ) + SDL_PrivateJoystickButton( SDL_ANDROID_CurrentJoysticks[ev->jbutton.which], ev->jbutton.button, ev->jbutton.state ); + break; +#if SDL_VERSION_ATLEAST(1,3,0) + case SDL_FINGERMOTION: + SDL_SendTouchMotion(0, ev->tfinger.fingerId, 0, ev->tfinger.x, ev->tfinger.y, ev->tfinger.pressure); + break; + case SDL_FINGERDOWN: + SDL_SendFingerDown(0, ev->tfinger.fingerId, ev->tfinger.state ? 1 : 0, ev->tfinger.x, ev->tfinger.y, ev->tfinger.pressure); + break; + case SDL_TEXTINPUT: + SDL_SendKeyboardText(ev->text.text); + break; +#endif + } + + ev->type = 0; + BufferedEventsStart++; + if( BufferedEventsStart >= MAX_BUFFERED_EVENTS ) + BufferedEventsStart = 0; + } + SDL_mutexV(BufferedEventsMutex); +}; +// Queue events to main thread +static int getNextEvent() +{ + int nextEvent; + if( !BufferedEventsMutex ) + return -1; + SDL_mutexP(BufferedEventsMutex); + nextEvent = BufferedEventsEnd; + nextEvent++; + if( nextEvent >= MAX_BUFFERED_EVENTS ) + nextEvent = 0; + while( nextEvent == BufferedEventsStart ) + { + SDL_mutexV(BufferedEventsMutex); + SDL_Delay(100); + SDL_mutexP(BufferedEventsMutex); + nextEvent = BufferedEventsEnd; + nextEvent++; + if( nextEvent >= MAX_BUFFERED_EVENTS ) + nextEvent = 0; + } + return nextEvent; +} + +extern void SDL_ANDROID_MainThreadPushMouseMotion(int x, int y) +{ + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_MOUSEMOTION; + ev->motion.x = x; + ev->motion.y = y; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; +extern void SDL_ANDROID_MainThreadPushMouseButton(int pressed, int button) +{ + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_MOUSEBUTTONDOWN; + ev->button.state = pressed; + ev->button.button = button; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; + +extern void SDL_ANDROID_MainThreadPushKeyboardKey(int pressed, SDL_scancode scancode) +{ + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_KEYDOWN; + ev->key.state = pressed; + ev->key.keysym.scancode = scancode; + ev->key.keysym.sym = scancode; + ev->key.keysym.mod = KMOD_NONE; + ev->key.keysym.unicode = 0; + if ( SDL_TranslateUNICODE ) + ev->key.keysym.unicode = scancode; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; +extern void SDL_ANDROID_MainThreadPushJoystickAxis(int joy, int axis, int value) +{ + if( ! ( joy < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[joy] ) ) + return; + + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_JOYAXISMOTION; + ev->jaxis.which = joy; + ev->jaxis.axis = axis; + ev->jaxis.value = value; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; +extern void SDL_ANDROID_MainThreadPushJoystickButton(int joy, int button, int pressed) +{ + if( ! ( joy < MAX_MULTITOUCH_POINTERS+1 && SDL_ANDROID_CurrentJoysticks[joy] ) ) + return; + + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_JOYBUTTONDOWN; + ev->jbutton.which = joy; + ev->jbutton.button = button; + ev->jbutton.state = pressed; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; +extern void SDL_ANDROID_MainThreadPushMultitouchButton(int id, int pressed, int x, int y, int force) +{ +#if SDL_VERSION_ATLEAST(1,3,0) + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_FINGERDOWN: + ev->tfinger.fingerId = id; + ev->tfinger.state = pressed; + ev->tfinger.x = x; + ev->tfinger.y = y; + ev->tfinger.pressure = force; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +#endif +}; +extern void SDL_ANDROID_MainThreadPushMultitouchMotion(int id, int x, int y, int force) +{ +#if SDL_VERSION_ATLEAST(1,3,0) + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + ev->type = SDL_FINGERMOTION: + ev->tfinger.fingerId = id; + ev->tfinger.x = x; + ev->tfinger.y = y; + ev->tfinger.pressure = force; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +#endif +}; +extern void SDL_ANDROID_MainThreadPushText( int scancode, int unicode ) +{ + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + return; + + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + +#if SDL_VERSION_ATLEAST(1,3,0) + + // TODO: convert to UTF-8 + ev->type = SDL_TEXTINPUT; + ev->text.text[0] = scancode; + ev->text.text[1] = 0; + +#else + + ev->type = SDL_KEYDOWN; + ev->key.state = SDL_PRESSED; + ev->key.keysym.scancode = scancode; + ev->key.keysym.sym = scancode; + ev->key.keysym.mod = KMOD_NONE; + ev->key.keysym.unicode = 0; + if ( SDL_TranslateUNICODE ) + ev->key.keysym.unicode = unicode; + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); + + nextEvent = getNextEvent(); + { + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + ev->type = SDL_KEYUP; + ev->key.state = SDL_PRESSED; + ev->key.keysym.scancode = scancode; + ev->key.keysym.sym = scancode; + ev->key.keysym.mod = KMOD_NONE; + ev->key.keysym.unicode = 0; + if ( SDL_TranslateUNICODE ) + ev->key.keysym.unicode = unicode; + } + +#endif + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); +}; + diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.h b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.h index 7bdd77bb6..1b3d110d0 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidinput.h +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidinput.h @@ -50,8 +50,6 @@ #include "SDL_androidvideo.h" #include "javakeycodes.h" -extern SDLKey SDL_android_keymap[KEYCODE_LAST+1]; - /* JNI-C++ wrapper stuff */ #if SDL_VERSION_ATLEAST(1,3,0) @@ -59,27 +57,11 @@ extern SDLKey SDL_android_keymap[KEYCODE_LAST+1]; #define SDL_KEY2(X) SDL_SCANCODE_ ## X #define SDL_KEY(X) SDL_KEY2(X) -static inline SDL_scancode TranslateKey(int scancode, SDL_keysym *keysym) -{ - if ( scancode >= SDL_arraysize(SDL_android_keymap) ) - scancode = KEYCODE_UNKNOWN; - return SDL_android_keymap[scancode]; -} - -static inline SDL_scancode GetKeysym(SDL_scancode scancode, SDL_keysym *keysym) -{ - return scancode; -} - -//#define SDL_SendKeyboardKey(X, Y, Z) SDL_SendKeyboardKey(X, Y) - #else #define SDL_KEY2(X) SDLK_ ## X #define SDL_KEY(X) SDL_KEY2(X) -#define SDL_SendKeyboardKey SDL_PrivateKeyboard - // Randomly redefining SDL 1.3 scancodes to SDL 1.2 keycodes #define KP_0 KP0 #define KP_1 KP1 @@ -123,47 +105,9 @@ static inline SDL_scancode GetKeysym(SDL_scancode scancode, SDL_keysym *keysym) #define Y y #define Z z -#define SDL_scancode SDLKey +typedef SDLKey SDL_scancode; #define SDL_GetKeyboardState SDL_GetKeyState -static inline SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) -{ - /* Sanity check */ - if ( scancode >= SDL_arraysize(SDL_android_keymap) ) - scancode = KEYCODE_UNKNOWN; - - /* Set the keysym information */ - keysym->scancode = scancode; - keysym->sym = SDL_android_keymap[scancode]; - keysym->mod = KMOD_NONE; - - /* If UNICODE is on, get the UNICODE value for the key */ - keysym->unicode = 0; - if ( SDL_TranslateUNICODE ) { - /* Populate the unicode field with the ASCII value */ - keysym->unicode = scancode; - } - return(keysym); -} - -static inline SDL_keysym *GetKeysym(SDLKey scancode, SDL_keysym *keysym) -{ - /* Sanity check */ - - /* Set the keysym information */ - keysym->scancode = scancode; - keysym->sym = scancode; - keysym->mod = KMOD_NONE; - - /* If UNICODE is on, get the UNICODE value for the key */ - keysym->unicode = 0; - if ( SDL_TranslateUNICODE ) { - /* Populate the unicode field with the ASCII value */ - keysym->unicode = scancode; - } - return(keysym); -} - #endif #define SDL_KEY_VAL(X) X @@ -207,4 +151,15 @@ extern int SDL_ANDROID_isTouchscreenKeyboardUsed; #define SDL_ANDROID_KEYCODE_10 SDL_ANDROID_KEYCODE_1 #endif + +// Queue events to main thread +extern void SDL_ANDROID_MainThreadPushMouseMotion(int x, int y); +extern void SDL_ANDROID_MainThreadPushMouseButton(int pressed, int button); +extern void SDL_ANDROID_MainThreadPushKeyboardKey(int pressed, SDL_scancode key); +extern void SDL_ANDROID_MainThreadPushMultitouchButton(int id, int pressed, int x, int y, int force); +extern void SDL_ANDROID_MainThreadPushMultitouchMotion(int id, int x, int y, int force); +extern void SDL_ANDROID_MainThreadPushJoystickAxis(int joy, int axis, int value); +extern void SDL_ANDROID_MainThreadPushJoystickButton(int joy, int button, int pressed); +extern void SDL_ANDROID_MainThreadPushText( int ascii, int unicode ); + #endif diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo-1.3.c b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo-1.3.c index a58ad2b88..08df551d3 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo-1.3.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo-1.3.c @@ -172,6 +172,7 @@ void ANDROID_VideoQuit(_THIS) void ANDROID_PumpEvents(_THIS) { + SDL_ANDROID_PumpEvents(); } void ANDROID_GL_SwapBuffers(_THIS, SDL_Window * window) diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h index 2fa0cfd39..16bc19bee 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.h @@ -26,6 +26,7 @@ #include "SDL_config.h" #include "SDL_video.h" #include "SDL_joystick.h" +#include "SDL_events.h" extern int SDL_ANDROID_sWindowWidth; extern int SDL_ANDROID_sWindowHeight; @@ -53,6 +54,8 @@ extern SDL_Window * ANDROID_CurrentWindow; enum { MAX_MULTITOUCH_POINTERS = 16 }; extern void ANDROID_InitOSKeymap(); extern int SDL_ANDROID_isJoystickUsed; -extern SDL_Joystick *SDL_ANDROID_CurrentJoysticks[MAX_MULTITOUCH_POINTERS+1]; +// Events have to be sent only from main thread from PumpEvents(), so we'll buffer them here +extern void SDL_ANDROID_PumpEvents(); + #endif /* _SDL_androidvideo_h */ 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 dbef1ce9c..57b9abc51 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 @@ -373,7 +373,6 @@ static inline int ArrowKeysPressed(int x, int y) int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointerId) { int i; - SDL_keysym keysym; int processed = 0; @@ -392,23 +391,20 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer pointerInButtonRect[MAX_BUTTONS] = pointerId; if( SDL_ANDROID_isJoystickUsed ) { - if( SDL_ANDROID_CurrentJoysticks[0] != NULL ) - { - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 0, -(x - arrows.x - arrows.w / 2) * 65534 / arrows.w ); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 1, -(y - arrows.y - arrows.h / 2) * 65534 / arrows.h ); - } + SDL_ANDROID_MainThreadPushJoystickAxis(0, 0, -(x - arrows.x - arrows.w / 2) * 65534 / arrows.w ); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 1, -(y - arrows.y - arrows.h / 2) * 65534 / arrows.h ); } else { i = ArrowKeysPressed(x, y); if( i & ARROW_UP ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(UP), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(UP) ); if( i & ARROW_DOWN ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(DOWN), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(DOWN) ); if( i & ARROW_LEFT ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(LEFT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(LEFT) ); if( i & ARROW_RIGHT ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(RIGHT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(RIGHT) ); oldArrows = i; } } @@ -427,7 +423,7 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer if( i == BUTTON_TEXT_INPUT ) SDL_ANDROID_ToggleScreenKeyboardTextInput(); else - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym(buttonKeysyms[i], &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, buttonKeysyms[i] ); if( i < AutoFireButtonsNum ) { ButtonAutoFire[i] = 0; @@ -458,18 +454,15 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer pointerInButtonRect[MAX_BUTTONS] = -1; if( SDL_ANDROID_isJoystickUsed ) { - if( SDL_ANDROID_CurrentJoysticks[0] ) - { - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 0, 0 ); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 1, 0 ); - } + SDL_ANDROID_MainThreadPushJoystickAxis(0, 0, 0 ); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 1, 0 ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(UP), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(DOWN), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(LEFT), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(RIGHT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(UP) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(DOWN) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(LEFT) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(RIGHT) ); oldArrows = 0; } } @@ -488,7 +481,7 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer else { if( i != BUTTON_TEXT_INPUT ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym(buttonKeysyms[i] ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, buttonKeysyms[i] ); } if( i < AutoFireButtonsNum ) { @@ -521,18 +514,15 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer pointerInButtonRect[MAX_BUTTONS] = -1; if( SDL_ANDROID_isJoystickUsed ) { - if( SDL_ANDROID_CurrentJoysticks[0] ) - { - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 0, 0 ); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 1, 0 ); - } + SDL_ANDROID_MainThreadPushJoystickAxis(0, 0, 0 ); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 1, 0 ); } else { - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(UP), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(DOWN), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(LEFT), &keysym) ); - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(RIGHT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(UP) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(DOWN) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(LEFT) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(RIGHT) ); oldArrows = 0; } } @@ -540,11 +530,8 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer { if( SDL_ANDROID_isJoystickUsed ) { - if( SDL_ANDROID_CurrentJoysticks[0] ) - { - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 0, -(x - arrows.x - arrows.w / 2) * 65534 / arrows.w ); - SDL_PrivateJoystickAxis(SDL_ANDROID_CurrentJoysticks[0], 1, -(y - arrows.y - arrows.h / 2) * 65534 / arrows.h ); - } + SDL_ANDROID_MainThreadPushJoystickAxis(0, 0, -(x - arrows.x - arrows.w / 2) * 65534 / arrows.w ); + SDL_ANDROID_MainThreadPushJoystickAxis(0, 1, -(y - arrows.y - arrows.h / 2) * 65534 / arrows.h ); } else { @@ -552,21 +539,21 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer if( i != oldArrows ) { if( oldArrows & ARROW_UP && ! (i & ARROW_UP) ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(UP), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(UP) ); if( oldArrows & ARROW_DOWN && ! (i & ARROW_DOWN) ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(DOWN), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(DOWN) ); if( oldArrows & ARROW_LEFT && ! (i & ARROW_LEFT) ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(LEFT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(LEFT) ); if( oldArrows & ARROW_RIGHT && ! (i & ARROW_RIGHT) ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym( SDL_KEY(RIGHT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, SDL_KEY(RIGHT) ); if( i & ARROW_UP ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(UP), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(UP) ); if( i & ARROW_DOWN ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(DOWN), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(DOWN) ); if( i & ARROW_LEFT ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(LEFT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(LEFT) ); if( i & ARROW_RIGHT ) - SDL_SendKeyboardKey( SDL_PRESSED, GetKeysym( SDL_KEY(RIGHT), &keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_PRESSED, SDL_KEY(RIGHT) ); } oldArrows = i; } @@ -583,7 +570,7 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer if( !ButtonAutoFire[i] ) { if( i != BUTTON_TEXT_INPUT ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym(buttonKeysyms[i] ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, buttonKeysyms[i] ); } else { @@ -648,7 +635,7 @@ int SDL_ANDROID_processTouchscreenKeyboard(int x, int y, int action, int pointer { pointerInButtonRect[i] = -1; if( i != BUTTON_TEXT_INPUT ) - SDL_SendKeyboardKey( SDL_RELEASED, GetKeysym(buttonKeysyms[i] ,&keysym) ); + SDL_ANDROID_MainThreadPushKeyboardKey( SDL_RELEASED, buttonKeysyms[i] ); } } }