# HG changeset patch # User Paul Hunkin # Date 1278420203 -43200 # Node ID ba38983b10c264a6dd666dcc18753100ec7cf7bd # Parent 8319aa8fa4dcd375a31e266fc3fb386f726df6e5 Added preliminary keyboard event support diff -r 8319aa8fa4dc -r ba38983b10c2 android/testproject/jni/app-android.cpp --- a/android/testproject/jni/app-android.cpp Tue Jun 29 01:30:11 2010 +1200 +++ b/android/testproject/jni/app-android.cpp Wed Jul 07 00:43:23 2010 +1200 @@ -36,6 +36,8 @@ jmethodID midFlipBuffers; extern "C" int SDL_main(); +extern "C" int Android_OnKeyDown(int keycode); +extern "C" int Android_OnKeyUp(int keycode); /******************************************************************************* Functions called by JNI @@ -77,6 +79,20 @@ return JNI_VERSION_1_4; } +extern "C" void Java_org_libsdl_android_SDLActivity_onNativeKeyDown(JNIEnv* env, + jobject obj, jint keycode){ + + int r = Android_OnKeyDown(keycode); + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key down %d, %d\n", keycode, r); +} + +extern "C" void Java_org_libsdl_android_SDLActivity_onNativeKeyUp(JNIEnv* env, + jobject obj, jint keycode){ + + int r = Android_OnKeyUp(keycode); + __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: native key up %d, %d\n", keycode, r); +} + /******************************************************************************* diff -r 8319aa8fa4dc -r ba38983b10c2 android/testproject/jni/lesson05.c --- a/android/testproject/jni/lesson05.c Tue Jun 29 01:30:11 2010 +1200 +++ b/android/testproject/jni/lesson05.c Wed Jul 07 00:43:23 2010 +1200 @@ -37,6 +37,8 @@ /* This is our SDL surface */ SDL_Surface *surface; +int rotation = 0; + /************************************** gluperspective implementation @@ -196,10 +198,20 @@ */ SDL_WM_ToggleFullScreen( surface ); break; + case SDLK_LEFT: + rotation -= 30; + break; + + case SDLK_RIGHT: + rotation += 30; + break; + default: break; } + __android_log_print(ANDROID_LOG_INFO, "SDL","Keycode: %d, %d, %d\n", keysym->sym, SDLK_LEFT, SDLK_RIGHT); + return; } @@ -231,6 +243,7 @@ /* Here goes our drawing code */ int drawGLScene( GLvoid ) { + static int Frames = 0; static int T0 = 0; @@ -253,14 +266,14 @@ //Draw a triangle //glRotatef(iRot, 0, 1, 0); - glRotatef( Frames % 360, 0.0f, 1.0f, 0.0f ); + glRotatef( rotation, 0.0f, 1.0f, 0.0f ); glEnableClientState (GL_VERTEX_ARRAY); glEnableClientState (GL_COLOR_ARRAY); /* Rotate The Triangle On The Y axis ( NEW ) */ - glRotatef( Frames % 360, 0.0f, 1.0f, 0.0f ); + //glRotatef( Frames % 360, 0.0f, 1.0f, 0.0f ); /* GLES variant of drawing a triangle */ const GLfloat triVertices[][9] = { diff -r 8319aa8fa4dc -r ba38983b10c2 android/testproject/src/org/libsdl/android/SDLActivity.java --- a/android/testproject/src/org/libsdl/android/SDLActivity.java Tue Jun 29 01:30:11 2010 +1200 +++ b/android/testproject/src/org/libsdl/android/SDLActivity.java Wed Jul 07 00:43:23 2010 +1200 @@ -4,14 +4,14 @@ import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.egl.*; -import android.app.Activity; -import android.content.Context; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.os.Bundle; -import android.view.MotionEvent; +import android.app.*; +import android.content.*; +import android.view.*; +import android.os.*; import android.util.Log; import android.graphics.*; +import android.text.method.*; +import android.text.*; import java.lang.*; @@ -55,13 +55,14 @@ super.onResume(); } - - + //C functions we call public static native void nativeInit(); + public static native void onNativeKeyDown(int keycode); + public static native void onNativeKeyUp(int keycode); @@ -82,8 +83,7 @@ - - //EGL context creation + } @@ -104,7 +104,7 @@ Because of this, that's where we set up the SDL thread */ -class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{ +class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, View.OnKeyListener { //This is what SDL runs in. It invokes SDL_main(), eventually private Thread mSDLThread; @@ -117,7 +117,12 @@ //Startup public SDLSurface(Context context) { super(context); - getHolder().addCallback(this); + getHolder().addCallback(this); + + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + setOnKeyListener(this); } //Called when we have a valid drawing surface @@ -175,13 +180,13 @@ mEGLDisplay = dpy; mEGLSurface = surface; + }catch(Exception e){ Log.v("SDL", e + ""); for(StackTraceElement s : e.getStackTrace()){ Log.v("SDL", s.toString()); } } - Log.v("SDL","Done making!"); return true; @@ -211,6 +216,26 @@ } } } + + + + + public boolean onKey(View v, int keyCode, KeyEvent event){ + + if(event.getAction() == KeyEvent.ACTION_DOWN){ + SDLActivity.onNativeKeyDown(keyCode); + return true; + } + + else if(event.getAction() == KeyEvent.ACTION_UP){ + SDLActivity.onNativeKeyUp(keyCode); + return true; + } + + return false; + } + + } diff -r 8319aa8fa4dc -r ba38983b10c2 src/events/SDL_keyboard.c --- a/src/events/SDL_keyboard.c Tue Jun 29 01:30:11 2010 +1200 +++ b/src/events/SDL_keyboard.c Wed Jul 07 00:43:23 2010 +1200 @@ -694,8 +694,16 @@ Uint16 modstate; Uint32 type; + if(!keyboard){ + return 7; + } + + if(!scancode){ + return 8; + } + if (!keyboard || !scancode) { - return 0; + return 1; } #if 0 printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode), @@ -788,7 +796,7 @@ break; default: /* Invalid state -- bail */ - return 0; + return 2; } /* Drop events that don't change state */ @@ -796,14 +804,14 @@ #if 0 printf("Keyboard event didn't change state - dropped!\n"); #endif - return 0; + return 3; } /* Update internal keyboard state */ keyboard->keystate[scancode] = state; /* Post the event, if desired */ - posted = 0; + posted = 4; if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.key.type = type; diff -r 8319aa8fa4dc -r ba38983b10c2 src/video/android/SDL_androidevents.c --- a/src/video/android/SDL_androidevents.c Tue Jun 29 01:30:11 2010 +1200 +++ b/src/video/android/SDL_androidevents.c Wed Jul 07 00:43:23 2010 +1200 @@ -30,6 +30,24 @@ #include "../../events/SDL_sysevents.h" #include "../../events/SDL_events_c.h" +#include "SDL_androidevents.h" + +void Android_InitEvents(){ + + SDL_Keyboard keyboard; + + SDL_zero(keyboard); + SDL_AddKeyboard(&keyboard, -1); + + SDLKey keymap[SDL_NUM_SCANCODES]; + + /* Add default scancode to key mapping */ + SDL_GetDefaultKeymap(keymap); + SDL_SetKeymap(0, 0, keymap, SDL_NUM_SCANCODES); + + +} + void Android_PumpEvents(_THIS) { @@ -49,4 +67,14 @@ */ } +int +Android_OnKeyDown(int keycode){ + return SDL_SendKeyboardKey(0, SDL_PRESSED, (SDL_scancode)keycode); +} + +int +Android_OnKeyUp(int keycode){ + return SDL_SendKeyboardKey(0, SDL_RELEASED, (SDL_scancode)keycode); +} + /* vi: set ts=4 sw=4 expandtab: */ diff -r 8319aa8fa4dc -r ba38983b10c2 src/video/android/SDL_androidevents.h --- a/src/video/android/SDL_androidevents.h Tue Jun 29 01:30:11 2010 +1200 +++ b/src/video/android/SDL_androidevents.h Wed Jul 07 00:43:23 2010 +1200 @@ -24,5 +24,6 @@ #include "SDL_androidvideo.h" extern void Android_PumpEvents(_THIS); +extern void Android_InitEvents(); /* vi: set ts=4 sw=4 expandtab: */ diff -r 8319aa8fa4dc -r ba38983b10c2 src/video/android/SDL_androidvideo.c --- a/src/video/android/SDL_androidvideo.c Tue Jun 29 01:30:11 2010 +1200 +++ b/src/video/android/SDL_androidvideo.c Wed Jul 07 00:43:23 2010 +1200 @@ -132,6 +132,8 @@ SDL_zero(mode); SDL_AddDisplayMode(&_this->displays[0], &mode); + Android_InitEvents(); + /* We're done! */ return 0; }