Added preliminary keyboard event support
authorPaul Hunkin <paul@bieh.net>
Wed, 07 Jul 2010 00:43:23 +1200
changeset 4713 ba38983b10c2
parent 4712 8319aa8fa4dc
child 4714 0f05f2f16fad
Added preliminary keyboard event support
android/testproject/jni/app-android.cpp
android/testproject/jni/lesson05.c
android/testproject/src/org/libsdl/android/SDLActivity.java
src/events/SDL_keyboard.c
src/video/android/SDL_androidevents.c
src/video/android/SDL_androidevents.h
src/video/android/SDL_androidvideo.c
--- 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);
+}
+
 
 
 /*******************************************************************************
--- 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] = {
--- 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;
+    }
+
+
 }
 
 
--- 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;
--- 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: */
--- 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: */
--- 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;
 }