Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Added preliminary keyboard event support

  • Loading branch information
bieh committed Jul 6, 2010
1 parent 6f2641d commit b839e9722877b950f6124d359a2f10942daf9d1b
@@ -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.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 @@ protected void onResume() {
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 static void flipBuffers(){




//EGL context creation


}

@@ -104,7 +104,7 @@ public void run(){
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 @@ public void run(){
//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 @@ public boolean initEGL(){
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 void flipEGL(){
}
}
}




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,22 +796,22 @@ 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 */
if (keyboard->keystate[scancode] == state) {
#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;
}

0 comments on commit b839e97

Please sign in to comment.