|
From: Elias N. <eli...@us...> - 2004-09-27 13:20:39
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/linux In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1328/linux Modified Files: org_lwjgl_input_Keyboard.c org_lwjgl_input_Mouse.c Log Message: Track event mouse deltas even when the event queue overflows Index: org_lwjgl_input_Keyboard.c =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/linux/org_lwjgl_input_Keyboard.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- org_lwjgl_input_Keyboard.c 22 Sep 2004 11:08:21 -0000 1.6 +++ org_lwjgl_input_Keyboard.c 27 Sep 2004 13:20:27 -0000 1.7 @@ -120,7 +120,7 @@ keyboard_grabbed = false; translation_enabled = false; buffer_enabled = false; - initEventQueue(&event_queue); + initEventQueue(&event_queue, 3); updateKeyboardGrab(); } @@ -138,14 +138,19 @@ return keycode; } -static int translateEvent(XKeyEvent *event) { +static void putKeyboardEvent(jint keycode, jint state, jint ch) { + int event_list[] = {keycode, state, ch}; + putEvent(&event_queue, event_list); +} + +static int translateEvent(XKeyEvent *event, jint keycode, jint state) { static char temp_translation_buffer[KEYBOARD_BUFFER_SIZE]; static XComposeStatus status; int num_chars, i; jint ch; if (!translation_enabled || event->type == KeyRelease) { - putEventElement(&event_queue, 0); + putKeyboardEvent(keycode, state, 0); return 0; } num_chars = XLookupString(event, temp_translation_buffer, KEYBOARD_BUFFER_SIZE, NULL, &status); @@ -153,15 +158,13 @@ num_chars--; /* Assume little endian byte order */ ch = (jint)temp_translation_buffer[0] & 0xFF; - putEventElement(&event_queue, ch); + putKeyboardEvent(keycode, state, ch); for (i = 0; i < num_chars; i++) { - putEventElement(&event_queue, 0); - putEventElement(&event_queue, 0); ch = ((jint)temp_translation_buffer[i + 1]) & 0xFF; - putEventElement(&event_queue, ch); + putKeyboardEvent(0, 0, ch); } } else { - putEventElement(&event_queue, 0); + putKeyboardEvent(keycode, state, 0); } return num_chars; } @@ -179,9 +182,7 @@ unsigned char keycode = getKeycode(key_event); unsigned char state = eventState(key_event); //printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events); - putEventElement(&event_queue, keycode); - putEventElement(&event_queue, state); - translateEvent(key_event); + translateEvent(key_event, keycode, state); } void handleKeyEvent(XKeyEvent *event) { @@ -199,11 +200,10 @@ } JNIEXPORT int JNICALL Java_org_lwjgl_input_Keyboard_nRead(JNIEnv * env, jclass clazz, jobject buffer, jint buffer_position) { - int event_size = 3; handleMessages(); jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer); int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position; - return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, event_size); + return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size); } JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation(JNIEnv *env, jclass clazz) { Index: org_lwjgl_input_Mouse.c =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/linux/org_lwjgl_input_Mouse.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- org_lwjgl_input_Mouse.c 22 Sep 2004 18:35:14 -0000 1.12 +++ org_lwjgl_input_Mouse.c 27 Sep 2004 13:20:27 -0000 1.13 @@ -53,7 +53,6 @@ #define NUM_BUTTONS 3 #define POINTER_WARP_BORDER 10 -#define WARP_RETRY 5 // scale the mouse wheel according to win32 #define WHEEL_SCALE 120 @@ -63,8 +62,11 @@ static int accum_dx; static int accum_dy; static int accum_dz; -static int last_x; -static int last_y; +static int last_poll_x; +static int last_poll_y; +static int last_event_x; +static int last_event_y; +static int last_z; static jbyte buttons[NUM_BUTTONS]; static event_queue_t event_queue; static bool buffer_enabled; @@ -72,24 +74,24 @@ static Cursor blank_cursor; static Cursor current_cursor; -static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) { - if (buffer_enabled) { - putEventElement(&event_queue, button); - putEventElement(&event_queue, state); - putEventElement(&event_queue, dx); - putEventElement(&event_queue, -dy); - putEventElement(&event_queue, dz); - } +static bool putMouseEvent(jint button, jint state, jint dx, jint dy, jint dz) { + jint event[] = {button, state, dx, dy, dz}; + return putEvent(&event_queue, event); } static void setCursorPos(int x, int y) { - jint event_dx = x - last_x; - jint event_dy = y - last_y; - accum_dx += event_dx; - accum_dy += event_dy; - last_x = x; - last_y = y; - putEvent(-1, 0, event_dx, event_dy, 0); + jint poll_dx = x - last_poll_x; + jint poll_dy = y - last_poll_y; + accum_dx += poll_dx; + accum_dy += poll_dy; + last_poll_x = x; + last_poll_y = y; + jint event_dx = x - last_event_x; + jint event_dy = y - last_event_y; + if (putMouseEvent(-1, 0, event_dx, -event_dy, 0)) { + last_event_x = x; + last_event_y = y; + } } static int transformY(int y) { @@ -97,8 +99,10 @@ } static void resetCursor(int x, int y) { - last_x = x; - last_y = y; + last_poll_x = x; + last_poll_y = y; + last_event_x = x; + last_event_y = y; } static bool blankCursor(void) { @@ -242,7 +246,7 @@ if (disp == NULL) return; int i; - last_y = last_x = accum_dx = accum_dy = accum_dz = 0; + last_z = last_poll_y = last_poll_x = last_event_x = last_event_y = accum_dx = accum_dy = accum_dz = 0; for (i = 0; i < NUM_BUTTONS; i++) buttons[i] = 0; if (!blankCursor()) { @@ -255,7 +259,7 @@ pointer_grabbed = false; buffer_enabled = false; updatePointerGrab(); - initEventQueue(&event_queue); + initEventQueue(&event_queue, 5); doWarpPointer(getWindowWidth()/2, getWindowHeight()/2); } @@ -285,7 +289,7 @@ if (button_num == NUM_BUTTONS) return; buttons[button_num] = state; - putEvent(button_num, state, 0, 0, 0); + putMouseEvent(button_num, state, 0, 0, 0); } void handleButtonPress(XButtonEvent *event) { @@ -293,11 +297,11 @@ switch (event->button) { case Button4: delta = WHEEL_SCALE; - putEvent(-1, 0, 0, 0, delta); + putMouseEvent(-1, 0, 0, 0, delta); break; case Button5: delta = -WHEEL_SCALE; - putEvent(-1, 0, 0, 0, delta); + putMouseEvent(-1, 0, 0, 0, delta); break; default: break; @@ -377,7 +381,7 @@ jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer); int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position; handleMessages(); - return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, 5); + return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size); } JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nGrabMouse(JNIEnv * env, jclass clazz, jboolean new_grab) { |