Input fixes

This commit is contained in:
Elias Naur 2002-11-21 15:05:51 +00:00
parent d7e9a66338
commit cac92f22c4
2 changed files with 21 additions and 16 deletions

View File

@ -47,12 +47,12 @@
#define KEYBOARD_BUFFER_SIZE 50 #define KEYBOARD_BUFFER_SIZE 50
#define KEYBOARD_SIZE 256 #define KEYBOARD_SIZE 256
short readBuffer[KEYBOARD_BUFFER_SIZE]; unsigned char readBuffer[KEYBOARD_BUFFER_SIZE * 2];
jfieldID fid_readBuffer; jfieldID fid_readBuffer;
jfieldID fid_readBufferAddress; jfieldID fid_readBufferAddress;
unsigned char key_buf[KEYBOARD_SIZE]; unsigned char key_buf[KEYBOARD_SIZE];
int keyboard_grabbed; bool keyboard_grabbed;
extern Display *disp; extern Display *disp;
extern Window win; extern Window win;
@ -82,12 +82,12 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs
int grabKeyboard(void) { int grabKeyboard(void) {
int result = XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); int result = XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
if (result == GrabSuccess) if (result == GrabSuccess)
keyboard_grabbed = 1; keyboard_grabbed = true;
return result; return result;
} }
void ungrabKeyboard(void) { void ungrabKeyboard(void) {
keyboard_grabbed = 0; keyboard_grabbed = false;
XUngrabKeyboard(disp, CurrentTime); XUngrabKeyboard(disp, CurrentTime);
} }
@ -134,6 +134,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Keyboard_nCreate
JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy
(JNIEnv * env, jclass clazz) (JNIEnv * env, jclass clazz)
{ {
if (keyboard_grabbed)
ungrabKeyboard(); ungrabKeyboard();
} }
@ -141,20 +142,24 @@ int checkKeyEvents(unsigned char *result_buf) {
XEvent event; XEvent event;
int count = 0; int count = 0;
int buf_count = 0; int buf_count = 0;
int state;
updateKeyboardGrab(); updateKeyboardGrab();
while (XCheckMaskEvent(disp, KeyPressMask | KeyReleaseMask, &event)) { while (XCheckMaskEvent(disp, KeyPressMask | KeyReleaseMask, &event)) {
unsigned char keycode = (unsigned char)((event.xkey.keycode - 8) & 0xff);
if (result_buf != NULL) {
result_buf[buf_count++] = keycode;
result_buf[buf_count++] = 1;
}
count++; count++;
unsigned char keycode = (unsigned char)((event.xkey.keycode - 8) & 0xff);
if (event.type == KeyPress) { if (event.type == KeyPress) {
key_buf[keycode] = 1; state = 1;
} else if (event.type == KeyRelease) { } else if (event.type == KeyRelease) {
key_buf[keycode] = 0; state = 0;
} else } else
assert(0); assert(0);
key_buf[keycode] = state;
if (result_buf != NULL) {
result_buf[buf_count++] = keycode;
result_buf[buf_count++] = state;
if (buf_count >= KEYBOARD_BUFFER_SIZE * 2)
break;
}
} }
return count; return count;
} }
@ -190,7 +195,7 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead
JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer
(JNIEnv * env, jclass clazz) (JNIEnv * env, jclass clazz)
{ {
jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, KEYBOARD_BUFFER_SIZE); jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, KEYBOARD_BUFFER_SIZE * 2);
env->SetStaticObjectField(clazz, fid_readBuffer, newBuffer); env->SetStaticObjectField(clazz, fid_readBuffer, newBuffer);
env->SetStaticIntField(clazz, fid_readBufferAddress, (jint) (&readBuffer)); env->SetStaticIntField(clazz, fid_readBufferAddress, (jint) (&readBuffer));
return KEYBOARD_BUFFER_SIZE; return KEYBOARD_BUFFER_SIZE;

View File

@ -54,7 +54,7 @@ extern Window win;
extern int screen; extern int screen;
extern int current_fullscreen; extern int current_fullscreen;
int pointer_grabbed; bool pointer_grabbed;
jfieldID fid_button; jfieldID fid_button;
jfieldID fid_dx; jfieldID fid_dx;
@ -132,12 +132,12 @@ int grabPointer(void) {
} else } else
result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, None, blank_cursor, CurrentTime); result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, None, blank_cursor, CurrentTime);
if (result == GrabSuccess) if (result == GrabSuccess)
pointer_grabbed = 1; pointer_grabbed = true;
return result; return result;
} }
void ungrabPointer(void) { void ungrabPointer(void) {
pointer_grabbed = 0; pointer_grabbed = false;
XUngrabPointer(disp, CurrentTime); XUngrabPointer(disp, CurrentTime);
} }