Commit d8e077ad authored by Paul Hunkin's avatar Paul Hunkin

Added preliminary keyboard event support

parent 26a7c004
...@@ -36,6 +36,8 @@ jmethodID midCreateGLContext; ...@@ -36,6 +36,8 @@ jmethodID midCreateGLContext;
jmethodID midFlipBuffers; jmethodID midFlipBuffers;
extern "C" int SDL_main(); extern "C" int SDL_main();
extern "C" int Android_OnKeyDown(int keycode);
extern "C" int Android_OnKeyUp(int keycode);
/******************************************************************************* /*******************************************************************************
Functions called by JNI Functions called by JNI
...@@ -77,6 +79,20 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) ...@@ -77,6 +79,20 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
return JNI_VERSION_1_4; 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);
}
/******************************************************************************* /*******************************************************************************
......
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
/* This is our SDL surface */ /* This is our SDL surface */
SDL_Surface *surface; SDL_Surface *surface;
int rotation = 0;
/************************************** /**************************************
gluperspective implementation gluperspective implementation
...@@ -196,10 +198,20 @@ void handleKeyPress( SDL_keysym *keysym ) ...@@ -196,10 +198,20 @@ void handleKeyPress( SDL_keysym *keysym )
*/ */
SDL_WM_ToggleFullScreen( surface ); SDL_WM_ToggleFullScreen( surface );
break; break;
case SDLK_LEFT:
rotation -= 30;
break;
case SDLK_RIGHT:
rotation += 30;
break;
default: default:
break; break;
} }
__android_log_print(ANDROID_LOG_INFO, "SDL","Keycode: %d, %d, %d\n", keysym->sym, SDLK_LEFT, SDLK_RIGHT);
return; return;
} }
...@@ -231,6 +243,7 @@ int initGL( GLvoid ) ...@@ -231,6 +243,7 @@ int initGL( GLvoid )
/* Here goes our drawing code */ /* Here goes our drawing code */
int drawGLScene( GLvoid ) int drawGLScene( GLvoid )
{ {
static int Frames = 0; static int Frames = 0;
static int T0 = 0; static int T0 = 0;
...@@ -253,14 +266,14 @@ int drawGLScene( GLvoid ) ...@@ -253,14 +266,14 @@ int drawGLScene( GLvoid )
//Draw a triangle //Draw a triangle
//glRotatef(iRot, 0, 1, 0); //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_VERTEX_ARRAY);
glEnableClientState (GL_COLOR_ARRAY); glEnableClientState (GL_COLOR_ARRAY);
/* Rotate The Triangle On The Y axis ( NEW ) */ /* 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 */ /* GLES variant of drawing a triangle */
const GLfloat triVertices[][9] = { const GLfloat triVertices[][9] = {
......
...@@ -4,14 +4,14 @@ import javax.microedition.khronos.egl.EGLConfig; ...@@ -4,14 +4,14 @@ import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.egl.*; import javax.microedition.khronos.egl.*;
import android.app.Activity; import android.app.*;
import android.content.Context; import android.content.*;
import android.view.SurfaceHolder; import android.view.*;
import android.view.SurfaceView; import android.os.*;
import android.os.Bundle;
import android.view.MotionEvent;
import android.util.Log; import android.util.Log;
import android.graphics.*; import android.graphics.*;
import android.text.method.*;
import android.text.*;
import java.lang.*; import java.lang.*;
...@@ -59,9 +59,10 @@ public class SDLActivity extends Activity { ...@@ -59,9 +59,10 @@ public class SDLActivity extends Activity {
//C functions we call //C functions we call
public static native void nativeInit(); public static native void nativeInit();
public static native void onNativeKeyDown(int keycode);
public static native void onNativeKeyUp(int keycode);
...@@ -83,7 +84,6 @@ public class SDLActivity extends Activity { ...@@ -83,7 +84,6 @@ public class SDLActivity extends Activity {
//EGL context creation
} }
...@@ -104,7 +104,7 @@ class SDLRunner implements Runnable{ ...@@ -104,7 +104,7 @@ class SDLRunner implements Runnable{
Because of this, that's where we set up the SDL thread 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 //This is what SDL runs in. It invokes SDL_main(), eventually
private Thread mSDLThread; private Thread mSDLThread;
...@@ -118,6 +118,11 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{ ...@@ -118,6 +118,11 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{
public SDLSurface(Context context) { public SDLSurface(Context context) {
super(context); super(context);
getHolder().addCallback(this); getHolder().addCallback(this);
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
setOnKeyListener(this);
} }
//Called when we have a valid drawing surface //Called when we have a valid drawing surface
...@@ -175,13 +180,13 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{ ...@@ -175,13 +180,13 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{
mEGLDisplay = dpy; mEGLDisplay = dpy;
mEGLSurface = surface; mEGLSurface = surface;
}catch(Exception e){ }catch(Exception e){
Log.v("SDL", e + ""); Log.v("SDL", e + "");
for(StackTraceElement s : e.getStackTrace()){ for(StackTraceElement s : e.getStackTrace()){
Log.v("SDL", s.toString()); Log.v("SDL", s.toString());
} }
} }
Log.v("SDL","Done making!"); Log.v("SDL","Done making!");
return true; return true;
...@@ -211,6 +216,26 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{ ...@@ -211,6 +216,26 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{
} }
} }
} }
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;
}
} }
...@@ -694,8 +694,16 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) ...@@ -694,8 +694,16 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
Uint16 modstate; Uint16 modstate;
Uint32 type; Uint32 type;
if(!keyboard){
return 7;
}
if(!scancode){
return 8;
}
if (!keyboard || !scancode) { if (!keyboard || !scancode) {
return 0; return 1;
} }
#if 0 #if 0
printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode), printf("The '%s' key has been %s\n", SDL_GetScancodeName(scancode),
...@@ -788,7 +796,7 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) ...@@ -788,7 +796,7 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
break; break;
default: default:
/* Invalid state -- bail */ /* Invalid state -- bail */
return 0; return 2;
} }
/* Drop events that don't change state */ /* Drop events that don't change state */
...@@ -796,14 +804,14 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) ...@@ -796,14 +804,14 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
#if 0 #if 0
printf("Keyboard event didn't change state - dropped!\n"); printf("Keyboard event didn't change state - dropped!\n");
#endif #endif
return 0; return 3;
} }
/* Update internal keyboard state */ /* Update internal keyboard state */
keyboard->keystate[scancode] = state; keyboard->keystate[scancode] = state;
/* Post the event, if desired */ /* Post the event, if desired */
posted = 0; posted = 4;
if (SDL_GetEventState(type) == SDL_ENABLE) { if (SDL_GetEventState(type) == SDL_ENABLE) {
SDL_Event event; SDL_Event event;
event.key.type = type; event.key.type = type;
......
...@@ -30,6 +30,24 @@ ...@@ -30,6 +30,24 @@
#include "../../events/SDL_sysevents.h" #include "../../events/SDL_sysevents.h"
#include "../../events/SDL_events_c.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 void
Android_PumpEvents(_THIS) Android_PumpEvents(_THIS)
{ {
...@@ -49,4 +67,14 @@ Android_PumpEvents(_THIS) ...@@ -49,4 +67,14 @@ Android_PumpEvents(_THIS)
*/ */
} }
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: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -24,5 +24,6 @@ ...@@ -24,5 +24,6 @@
#include "SDL_androidvideo.h" #include "SDL_androidvideo.h"
extern void Android_PumpEvents(_THIS); extern void Android_PumpEvents(_THIS);
extern void Android_InitEvents();
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -132,6 +132,8 @@ Android_VideoInit(_THIS) ...@@ -132,6 +132,8 @@ Android_VideoInit(_THIS)
SDL_zero(mode); SDL_zero(mode);
SDL_AddDisplayMode(&_this->displays[0], &mode); SDL_AddDisplayMode(&_this->displays[0], &mode);
Android_InitEvents();
/* We're done! */ /* We're done! */
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment