Commit d8e077ad authored by Paul Hunkin's avatar Paul Hunkin

Added preliminary keyboard event support

parent 26a7c004
......@@ -36,6 +36,8 @@ jmethodID midCreateGLContext;
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 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
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 @@
/* This is our SDL surface */
SDL_Surface *surface;
int rotation = 0;
/**************************************
gluperspective implementation
......@@ -196,10 +198,20 @@ void handleKeyPress( SDL_keysym *keysym )
*/
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 @@ int initGL( GLvoid )
/* Here goes our drawing code */
int drawGLScene( GLvoid )
{
static int Frames = 0;
static int T0 = 0;
......@@ -253,14 +266,14 @@ int drawGLScene( GLvoid )
//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] = {
......
......@@ -4,14 +4,14 @@ import javax.microedition.khronos.egl.EGLConfig;
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 @@ public class SDLActivity extends Activity {
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 @@ public class SDLActivity extends Activity {
//EGL context creation
}
......@@ -104,7 +104,7 @@ class SDLRunner implements Runnable{
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 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{
//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 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback{
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 @@ 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)
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 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
break;
default:
/* Invalid state -- bail */
return 0;
return 2;
}
/* Drop events that don't change state */
......@@ -796,14 +804,14 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode)
#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;
......
......@@ -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 @@ 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: */
......@@ -24,5 +24,6 @@
#include "SDL_androidvideo.h"
extern void Android_PumpEvents(_THIS);
extern void Android_InitEvents();
/* vi: set ts=4 sw=4 expandtab: */
......@@ -132,6 +132,8 @@ Android_VideoInit(_THIS)
SDL_zero(mode);
SDL_AddDisplayMode(&_this->displays[0], &mode);
Android_InitEvents();
/* We're done! */
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