Added preliminary keyboard event support
This commit is contained in:
parent
26a7c00433
commit
d8e077adbb
7 changed files with 112 additions and 19 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue