From 278506fd45f1233decffe68fae4473f561341fb6 Mon Sep 17 00:00:00 2001 From: pelya Date: Fri, 17 Dec 2010 09:26:02 +0000 Subject: [PATCH] Fixes for text input --- project/java/MainActivity.java | 15 +- project/java/Video.java | 2 + project/jni/sdl-1.2/sdl-1.2-android.diff | 198 ------------------ .../jni/sdl-1.3/include/SDL_screenkeyboard.h | 2 +- .../src/video/android/SDL_androidinput.c | 97 +++++++-- .../src/video/android/SDL_androidvideo-1.3.c | 1 - .../src/video/android/SDL_androidvideo.c | 5 + .../src/video/android/SDL_androidvideo.h | 1 + .../video/android/SDL_touchscreenkeyboard.c | 13 +- todo.txt | 10 +- 10 files changed, 112 insertions(+), 232 deletions(-) delete mode 100644 project/jni/sdl-1.2/sdl-1.2-android.diff diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java index 94826e52a..0e4dbe26b 100644 --- a/project/java/MainActivity.java +++ b/project/java/MainActivity.java @@ -221,11 +221,13 @@ public class MainActivity extends Activity { synchronized(textInput) { for(int i = 0; i < text.length(); i++) { - textInput.addLast((int)text.charAt(i)); - textInput.addLast((int)text.codePointAt(i)); + DemoRenderer.nativeTextInput( (int)text.charAt(i), (int)text.codePointAt(i) ); + //textInput.addLast((int)text.charAt(i)); + //textInput.addLast((int)text.codePointAt(i)); } - textInput.addLast(13); // send return - textInput.addLast(13); + DemoRenderer.nativeTextInput( 13, 13 ); // send return + //textInput.addLast(13); + //textInput.addLast(13); } } _videoLayout.removeView(_screenKeyboard); @@ -253,8 +255,9 @@ public class MainActivity extends Activity { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_CLEAR)) { synchronized(textInput) { - textInput.addLast(8); // send backspace keycode - textInput.addLast(8); + DemoRenderer.nativeTextInput( 8, 8 ); + //textInput.addLast(8); // send backspace keycode + //textInput.addLast(8); } return false; // and proceed to delete text in keyboard input field } diff --git a/project/java/Video.java b/project/java/Video.java index ba2bb346b..bcb6ff036 100644 --- a/project/java/Video.java +++ b/project/java/Video.java @@ -227,6 +227,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer { Settings.SetupTouchscreenKeyboardGraphics(context); // Reload on-screen buttons graphics } + /* // Pass just one char per frame, many SDL games cannot handle multiple events in a single frame synchronized(context.textInput) { if( context.textInput.size() >= 2 ) @@ -237,6 +238,7 @@ class DemoRenderer extends GLSurfaceView_SDL.Renderer { context.textInput.removeFirst(); } } + */ return 1; } diff --git a/project/jni/sdl-1.2/sdl-1.2-android.diff b/project/jni/sdl-1.2/sdl-1.2-android.diff deleted file mode 100644 index 1f9c51703..000000000 --- a/project/jni/sdl-1.2/sdl-1.2-android.diff +++ /dev/null @@ -1,198 +0,0 @@ -Only in .: acinclude -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2: Android.mk -Only in .: autogen.sh -Only in .: Borland.html -Only in .: Borland.zip -Only in .: build-scripts -Only in .: configure -Only in .: configure.in -Only in .: CWprojects.sea.bin -Only in .: docs -Only in .: docs.html -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include: SDL -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include: SDL_config_android.h -diff -u -r ./include/SDL_config.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_config.h ---- ./include/SDL_config.h 2009-10-19 14:51:07.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_config.h 2010-05-18 13:09:18.000000000 +0300 -@@ -38,6 +38,8 @@ - #include "SDL_config_win32.h" - #elif defined(__OS2__) - #include "SDL_config_os2.h" -+#elif defined(ANDROID) -+#include "SDL_config_android.h" - #else - #include "SDL_config_minimal.h" - #endif /* platform config */ -diff -u -r ./include/SDL_endian.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_endian.h -diff -u -r ./include/SDL_main.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_main.h ---- ./include/SDL_main.h 2009-10-13 02:07:19.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_main.h 2010-07-26 12:49:30.000000000 +0300 -@@ -32,7 +32,7 @@ - #if defined(__WIN32__) || \ - (defined(__MWERKS__) && !defined(__BEOS__)) || \ - defined(__MACOS__) || defined(__MACOSX__) || \ -- defined(__SYMBIAN32__) || defined(QWS) -+ defined(__SYMBIAN32__) || defined(QWS) || defined(ANDROID) - - #ifdef __cplusplus - #define C_LINKAGE "C" -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include: SDL_screenkeyboard.h -diff -u -r ./include/SDL_stdinc.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/include/SDL_stdinc.h -Only in .: Makefile.dc -Only in .: Makefile.in -Only in .: Makefile.minimal -Only in .: MPWmake.sea.bin -Only in .: README.AmigaOS -Only in .: README.BeOS -Only in .: README.CVS -Only in .: README.DC -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2: README.HG -Only in .: README.MacOS -Only in .: README.MacOSX -Only in .: README.MiNT -Only in .: README.NanoX -Only in .: README.NDS -Only in .: README.OS2 -Only in .: README.PicoGUI -Only in .: README.PS3 -Only in .: README.QNX -Only in .: README.Qtopia -Only in .: README.RISCOS -Only in .: README.SVN -Only in .: README.Symbian -Only in .: README.Watcom -Only in .: README.WinCE -Only in .: README.wscons -Only in .: sdl-1.2-android.diff -Only in .: sdl-config.in -Only in .: sdl.m4 -Only in .: sdl.pc.in -Only in .: SDL.qpg.in -Only in .: SDL.spec -Only in .: SDL.spec.in -diff -u -r ./src/audio/alsa/SDL_alsa_audio.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/alsa/SDL_alsa_audio.c -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio: android -diff -u -r ./src/audio/mint/SDL_mintaudio_it.S /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/mint/SDL_mintaudio_it.S -diff -u -r ./src/audio/pulse/SDL_pulseaudio.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/pulse/SDL_pulseaudio.c -diff -u -r ./src/audio/pulse/SDL_pulseaudio.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/pulse/SDL_pulseaudio.h -diff -u -r ./src/audio/SDL_audio.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_audio.c ---- ./src/audio/SDL_audio.c 2009-10-13 13:25:35.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_audio.c 2010-07-15 18:26:48.000000000 +0300 -@@ -113,6 +113,9 @@ - #if SDL_AUDIO_DRIVER_EPOCAUDIO - &EPOCAudio_bootstrap, - #endif -+#if SDL_AUDIO_DRIVER_ANDROID -+ &ANDROIDAUD_bootstrap, -+#endif - NULL - }; - SDL_AudioDevice *current_audio = NULL; -diff -u -r ./src/audio/SDL_audio_c.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_audio_c.h -diff -u -r ./src/audio/SDL_mixer.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_mixer.c -diff -u -r ./src/audio/SDL_mixer_m68k.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_mixer_m68k.c -diff -u -r ./src/audio/SDL_sysaudio.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_sysaudio.h ---- ./src/audio/SDL_sysaudio.h 2009-10-13 02:07:14.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/SDL_sysaudio.h 2010-07-15 18:22:45.000000000 +0300 -@@ -177,6 +179,9 @@ - #if SDL_AUDIO_DRIVER_EPOCAUDIO - extern AudioBootStrap EPOCAudio_bootstrap; - #endif -+#if SDL_AUDIO_DRIVER_ANDROID -+extern AudioBootStrap ANDROIDAUD_bootstrap; -+#endif - - /* This is the current audio device */ - extern SDL_AudioDevice *current_audio; -diff -u -r ./src/audio/windx5/directx.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/audio/windx5/directx.h -diff -u -r ./src/cdrom/mint/SDL_syscdrom.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/cdrom/mint/SDL_syscdrom.c -diff -u -r ./src/cpuinfo/SDL_cpuinfo.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/cpuinfo/SDL_cpuinfo.c -diff -u -r ./src/joystick/bsd/SDL_sysjoystick.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/joystick/bsd/SDL_sysjoystick.c -diff -u -r ./src/joystick/linux/SDL_sysjoystick.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/joystick/linux/SDL_sysjoystick.c -Only in ./src/joystick: os2 -diff -u -r ./src/joystick/SDL_joystick.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/joystick/SDL_joystick.c -diff -u -r ./src/stdlib/SDL_iconv.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/stdlib/SDL_iconv.c -diff -u -r ./src/thread/win32/SDL_systhread.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/thread/win32/SDL_systhread.c -diff -u -r ./src/timer/mint/SDL_vbltimer.S /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/timer/mint/SDL_vbltimer.S -Only in /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video: android -diff -u -r ./src/video/ataricommon/SDL_ataric2p.S /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/ataricommon/SDL_ataric2p.S -diff -u -r ./src/video/ataricommon/SDL_ikbdinterrupt.S /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/ataricommon/SDL_ikbdinterrupt.S -diff -u -r ./src/video/ataricommon/SDL_xbiosinterrupt.S /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/ataricommon/SDL_xbiosinterrupt.S -diff -u -r ./src/video/math_private.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/math_private.h -diff -u -r ./src/video/quartz/SDL_QuartzGL.m /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/quartz/SDL_QuartzGL.m -diff -u -r ./src/video/quartz/SDL_QuartzVideo.m /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/quartz/SDL_QuartzVideo.m -diff -u -r ./src/video/quartz/SDL_QuartzWM.m /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/quartz/SDL_QuartzWM.m -diff -u -r ./src/video/SDL_blit.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_blit.c ---- ./src/video/SDL_blit.c 2009-10-13 02:07:15.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_blit.c 2010-07-28 18:58:30.000000000 +0300 -@@ -26,6 +26,7 @@ - #include "SDL_blit.h" - #include "SDL_RLEaccel_c.h" - #include "SDL_pixels_c.h" -+#include - - #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && SDL_ASSEMBLY_ROUTINES - #define MMX_ASMBLIT -@@ -242,6 +243,7 @@ - - /* Figure out if an accelerated hardware blit is possible */ - surface->flags &= ~SDL_HWACCEL; -+ //__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_CalculateBlit(): identity %d src hw %d dst hw %d video hw %d", (int)surface->map->identity, (int)(surface->flags & SDL_HWSURFACE), (int)(surface->map->dst->flags & SDL_HWSURFACE), (int)(current_video->info.blit_hw)); - if ( surface->map->identity ) { - int hw_blit_ok; - -diff -u -r ./src/video/SDL_pixels.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_pixels.c ---- ./src/video/SDL_pixels.c 2009-10-13 02:07:15.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_pixels.c 2010-10-18 12:26:43.000000000 +0300 -@@ -304,7 +304,12 @@ - default: - break; - } -+ -+#ifdef ANDROID -+ if( surface->format->BytesPerPixel != 2 ) /* Avoid extra memcpy() when updating GLES textures */ -+#endif - pitch = (pitch + 3) & ~3; /* 4-byte aligning */ -+ - return(pitch); - } - /* -diff -u -r ./src/video/SDL_sysvideo.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_sysvideo.h ---- ./src/video/SDL_sysvideo.h 2009-10-13 02:07:15.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_sysvideo.h 2010-07-15 18:26:06.000000000 +0300 -@@ -410,6 +410,9 @@ - #if SDL_VIDEO_DRIVER_CACA - extern VideoBootStrap CACA_bootstrap; - #endif -+#if SDL_VIDEO_DRIVER_ANDROID -+extern VideoBootStrap ANDROID_bootstrap; -+#endif - #if SDL_VIDEO_DRIVER_DUMMY - extern VideoBootStrap DUMMY_bootstrap; - #endif -diff -u -r ./src/video/SDL_video.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_video.c ---- ./src/video/SDL_video.c 2009-10-13 02:07:15.000000000 +0300 -+++ /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/SDL_video.c 2010-08-27 15:41:51.000000000 +0300 -@@ -126,6 +126,9 @@ - #if SDL_VIDEO_DRIVER_CACA - &CACA_bootstrap, - #endif -+#if SDL_VIDEO_DRIVER_ANDROID -+ &ANDROID_bootstrap, -+#endif - #if SDL_VIDEO_DRIVER_DUMMY - &DUMMY_bootstrap, - #endif -diff -u -r ./src/video/wincommon/SDL_sysevents.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/wincommon/SDL_sysevents.c -diff -u -r ./src/video/windib/SDL_dibevents.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/windib/SDL_dibevents.c -diff -u -r ./src/video/windx5/directx.h /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/windx5/directx.h -diff -u -r ./src/video/windx5/SDL_dx5events.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/windx5/SDL_dx5events.c -diff -u -r ./src/video/windx5/SDL_dx5yuv.c /home/pelya/src/endless_space/SDL-android/project/jni/sdl-1.2/src/video/windx5/SDL_dx5yuv.c -Only in .: symbian.zip -Only in .: test -Only in .: VisualCE.zip -Only in .: VisualC.html -Only in .: VisualC.zip -Only in .: Watcom-OS2.zip -Only in .: Watcom-Win32.zip -Only in .: Xcode.tar.gz diff --git a/project/jni/sdl-1.3/include/SDL_screenkeyboard.h b/project/jni/sdl-1.3/include/SDL_screenkeyboard.h index cfb9e5f03..7ab3e4702 100644 --- a/project/jni/sdl-1.3/include/SDL_screenkeyboard.h +++ b/project/jni/sdl-1.3/include/SDL_screenkeyboard.h @@ -49,7 +49,7 @@ enum { SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT, /* Button to show screen keyboard */ - SDL_ANDROID_SCREENKEYBOARD_BUTTON_MAX = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT + SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM }; /* All functions return 0 on failure and 1 on success */ 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 96fd73de5..a792119b4 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 @@ -875,6 +875,7 @@ extern void SDL_ANDROID_PumpEvents() SDL_SendMouseButton( NULL, ev->button.state, ev->button.button ); break; case SDL_KEYDOWN: + //__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_KEYDOWN: %i %i", ev->key.keysym.sym, ev->key.state); SDL_SendKeyboardKey( ev->key.state, &ev->key.keysym ); break; case SDL_JOYAXISMOTION: @@ -1133,8 +1134,63 @@ extern void SDL_ANDROID_MainThreadPushMultitouchMotion(int id, int x, int y, int SDL_mutexV(BufferedEventsMutex); #endif }; + +#if SDL_VERSION_ATLEAST(1,3,0) +extern void SDL_ANDROID_DeferredTextInput() +{ +}; +#else + +enum { DEFERRED_TEXT_COUNT = 128 }; +static struct { int scancode; int unicode; int down; } deferredText[DEFERRED_TEXT_COUNT]; +static int deferredTextIdx1 = 0; +static int deferredTextIdx2 = 0; +static SDL_mutex * deferredTextMutex = NULL; + +extern void SDL_ANDROID_DeferredTextInput() +{ + int count = 2; + if( !deferredTextMutex ) + deferredTextMutex = SDL_CreateMutex(); + + SDL_mutexP(deferredTextMutex); + + while( deferredTextIdx1 != deferredTextIdx2 && count > 0 ) + { + int nextEvent = getNextEvent(); + if( nextEvent == -1 ) + { + SDL_mutexV(deferredTextMutex); + return; + } + SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; + + deferredTextIdx1++; + if( deferredTextIdx1 >= DEFERRED_TEXT_COUNT ) + deferredTextIdx1 = 0; + + ev->type = SDL_KEYDOWN; + ev->key.state = deferredText[deferredTextIdx1].down; + ev->key.keysym.scancode = deferredText[deferredTextIdx1].scancode; + ev->key.keysym.sym = deferredText[deferredTextIdx1].scancode; + ev->key.keysym.mod = KMOD_NONE; + ev->key.keysym.unicode = 0; + if ( SDL_TranslateUNICODE ) + ev->key.keysym.unicode = deferredText[deferredTextIdx1].unicode; + + BufferedEventsEnd = nextEvent; + SDL_mutexV(BufferedEventsMutex); + count --; + } + + SDL_mutexV(deferredTextMutex); +}; +#endif + extern void SDL_ANDROID_MainThreadPushText( int scancode, int unicode ) { + + //__android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_ANDROID_MainThreadPushText(): %i %i", scancode, unicode); int nextEvent = getNextEvent(); if( nextEvent == -1 ) return; @@ -1150,22 +1206,17 @@ extern void SDL_ANDROID_MainThreadPushText( int scancode, int unicode ) #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); + if( !deferredTextMutex ) + deferredTextMutex = SDL_CreateMutex(); - nextEvent = getNextEvent(); + SDL_mutexP(deferredTextMutex); + + ev->type = 0; + + if( deferredTextIdx1 == deferredTextIdx2 ) { - SDL_Event * ev = &BufferedEvents[BufferedEventsEnd]; ev->type = SDL_KEYDOWN; - ev->key.state = SDL_RELEASED; + ev->key.state = SDL_PRESSED; ev->key.keysym.scancode = scancode; ev->key.keysym.sym = scancode; ev->key.keysym.mod = KMOD_NONE; @@ -1173,6 +1224,24 @@ extern void SDL_ANDROID_MainThreadPushText( int scancode, int unicode ) if ( SDL_TranslateUNICODE ) ev->key.keysym.unicode = unicode; } + else + { + deferredTextIdx2++; + if( deferredTextIdx2 >= DEFERRED_TEXT_COUNT ) + deferredTextIdx2 = 0; + deferredText[deferredTextIdx2].down = SDL_PRESSED; + deferredText[deferredTextIdx2].scancode = scancode; + deferredText[deferredTextIdx2].unicode = unicode; + } + + deferredTextIdx2++; + if( deferredTextIdx2 >= DEFERRED_TEXT_COUNT ) + deferredTextIdx2 = 0; + deferredText[deferredTextIdx2].down = SDL_RELEASED; + deferredText[deferredTextIdx2].scancode = scancode; + deferredText[deferredTextIdx2].unicode = unicode; + + SDL_mutexV(deferredTextMutex); #endif @@ -1276,7 +1345,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetScreenKbKeyUsed) ( JNIEnv* env, jobject thiz key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD; if( keynum == 1 ) key = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT; - if( keynum - 2 > 0 && keynum - 2 < SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 ) + if( keynum - 2 >= 0 && keynum - 2 <= SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 ) key = keynum - 2 + SDL_ANDROID_SCREENKEYBOARD_BUTTON_0; if( key >= 0 && !used ) 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 73125d088..698d4c9a8 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 @@ -200,7 +200,6 @@ void ANDROID_GL_DeleteContext (_THIS, SDL_GLContext context) { }; - SDL_Window * ANDROID_CurrentWindow = NULL; int ANDROID_CreateWindow(_THIS, SDL_Window * window) { diff --git a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c index c12813aad..80fd450de 100644 --- a/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c +++ b/project/jni/sdl-1.3/src/video/android/SDL_androidvideo.c @@ -117,6 +117,7 @@ int SDL_ANDROID_CallJavaSwapBuffers() showScreenKeyboardDeferred = 0; (*JavaEnv)->CallVoidMethod( JavaEnv, JavaRenderer, JavaShowScreenKeyboard ); } + SDL_ANDROID_DeferredTextInput(); return 1; } @@ -208,6 +209,10 @@ JAVA_EXPORT_NAME(DemoRenderer_nativeGlContextRecreated) ( JNIEnv* env, jobject void SDL_ANDROID_CallJavaShowScreenKeyboard() { showScreenKeyboardDeferred = 1; + // Move mouse by 1 pixel to force screen update + int x, y; + SDL_GetMouseState( &x, &y ); + SDL_ANDROID_MainThreadPushMouseMotion(x > 0 ? x-1 : 0, y); } JNIEXPORT void JNICALL 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 f765469b9..da5e7f049 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 @@ -47,6 +47,7 @@ extern void SDL_ANDROID_processAndroidTrackballDampening(); extern void SDL_ANDROID_processMoveMouseWithKeyboard(); extern int SDL_ANDROID_InsideVideoThread(); extern SDL_VideoDevice *ANDROID_CreateDevice_1_3(int devindex); +extern void SDL_ANDROID_DeferredTextInput(); #if SDL_VERSION_ATLEAST(1,3,0) extern SDL_Window * ANDROID_CurrentWindow; 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 c88a744f2..7b77d5a63 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 @@ -55,7 +55,7 @@ FONT_BTN1 = 4, FONT_BTN2 = 5, FONT_BTN3 = 6, FONT_BTN4 = 7 static GLshort fontGL[sizeof(font)/sizeof(font[0])][FONT_MAX_LINES_PER_CHAR * 4 + 1]; enum { FONT_CHAR_LINES_COUNT = FONT_MAX_LINES_PER_CHAR * 4 }; -enum { MAX_BUTTONS = SDL_ANDROID_SCREENKEYBOARD_BUTTON_MAX, MAX_BUTTONS_AUTOFIRE = 2, BUTTON_TEXT_INPUT = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT } ; // Max amount of custom buttons +enum { MAX_BUTTONS = SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM-1, MAX_BUTTONS_AUTOFIRE = 2, BUTTON_TEXT_INPUT = SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT-1 } ; // Max amount of custom buttons int SDL_ANDROID_isTouchscreenKeyboardUsed = 0; static int touchscreenKeyboardTheme = 0; @@ -70,7 +70,8 @@ SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_1)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_2)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_3)), SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_4)), -SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_5)) +SDL_KEY(SDL_KEY_VAL(SDL_ANDROID_SCREENKB_KEYCODE_5)), +0 }; enum { ARROW_LEFT = 1, ARROW_RIGHT = 2, ARROW_UP = 4, ARROW_DOWN = 8 }; @@ -848,7 +849,7 @@ JAVA_EXPORT_NAME(Settings_nativeSetupScreenKeyboardButtons) ( JNIEnv* env, jobj int SDL_ANDROID_SetScreenKeyboardButtonPos(int buttonId, SDL_Rect * pos) { - if( buttonId < 0 || buttonId > SDL_ANDROID_SCREENKEYBOARD_BUTTON_MAX || ! pos ) + if( buttonId < 0 || buttonId >= SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM || ! pos ) return 0; if( buttonId == SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD ) @@ -876,7 +877,7 @@ int SDL_ANDROID_SetScreenKeyboardButtonPos(int buttonId, SDL_Rect * pos) int SDL_ANDROID_GetScreenKeyboardButtonPos(int buttonId, SDL_Rect * pos) { - if( buttonId < 0 || buttonId > SDL_ANDROID_SCREENKEYBOARD_BUTTON_MAX || ! pos ) + if( buttonId < 0 || buttonId >= SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM || ! pos ) return 0; if( buttonId == SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD ) @@ -902,14 +903,12 @@ SDLKey SDL_ANDROID_GetScreenKeyboardButtonKey(int buttonId) { if( buttonId < SDL_ANDROID_SCREENKEYBOARD_BUTTON_0 || buttonId > SDL_ANDROID_SCREENKEYBOARD_BUTTON_5 ) return SDLK_UNKNOWN; - if( buttonId == SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD ) - return SDLK_UNKNOWN; return buttonKeysyms[buttonId - SDL_ANDROID_SCREENKEYBOARD_BUTTON_0]; }; int SDL_ANDROID_SetScreenKeyboardAutoFireButtonsAmount(int nbuttons) { - if( nbuttons < 0 || nbuttons > MAX_BUTTONS_AUTOFIRE ) + if( nbuttons < 0 || nbuttons >= MAX_BUTTONS_AUTOFIRE ) return 0; AutoFireButtonsNum = nbuttons; return 1; diff --git a/todo.txt b/todo.txt index 4c81f7341..d98944899 100644 --- a/todo.txt +++ b/todo.txt @@ -13,18 +13,18 @@ Bugs to fix - Add an option for overlay buttons transparency and button images size. -- Generic keycode remapper. +- Running OpenGL SwapBuffers in a separate thread - huge speed improvement expected. - Show/hide screen controls with longpress on Text Edit button. - Zoom and rotate multitouch gestures should return some keycodes. -- Adjustable speed for moving mouse via joystick +- Right click by longpress. -- Mouse buttons assigned to hw buttons only +- Option to calibrate touch area of the screen. -- Option to calibrate touch area of the screen +- Calling SDL_SetVideoMode() with SDL 1.3 makes it crash. -- Calling SDL_SetVideoMode() with SDL 1.3 makes it crash +- Support for NDK r5. And that's all, I won't be doing any more development or fix other bugs (see bugs.txt for details).