From: <eli...@us...> - 2007-05-13 21:12:10
|
Revision: 2817 http://svn.sourceforge.net/java-game-lib/?rev=2817&view=rev Author: elias_naur Date: 2007-05-13 14:11:53 -0700 (Sun, 13 May 2007) Log Message: ----------- Use event timestamp to detect key repeat events in KeyboardEventQueue Modified Paths: -------------- trunk/LWJGL/src/java/org/lwjgl/opengl/KeyboardEventQueue.java trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxAWTInput.java trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/KeyboardEventQueue.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/KeyboardEventQueue.java 2007-05-13 20:13:37 UTC (rev 2816) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/KeyboardEventQueue.java 2007-05-13 21:11:53 UTC (rev 2817) @@ -53,6 +53,13 @@ private final Component component; + private boolean has_deferred_event; + private long deferred_nanos; + private int deferred_key_code; + private int deferred_key_location; + private byte deferred_key_state; + private int deferred_character; + static { KEY_MAP[KeyEvent.VK_0] = Keyboard.KEY_0; KEY_MAP[KeyEvent.VK_1] = Keyboard.KEY_1; @@ -265,14 +272,50 @@ } public synchronized void poll(ByteBuffer key_down_buffer) { + flushDeferredEvent(); int old_position = key_down_buffer.position(); key_down_buffer.put(key_states); key_down_buffer.position(old_position); } - private synchronized void handleKey(int key_code_mapped, byte state, int character, long nanos) { - if ( character == KeyEvent.CHAR_UNDEFINED ) + public synchronized void copyEvents(ByteBuffer dest) { + flushDeferredEvent(); + super.copyEvents(dest); + } + + private synchronized void handleKey(int key_code, int key_location, byte state, int character, long nanos) { + if (character == KeyEvent.CHAR_UNDEFINED) character = Keyboard.CHAR_NONE; + if (state == 1) { + if (has_deferred_event) { + if ((nanos == deferred_nanos && deferred_key_code == key_code && + deferred_key_location == key_location)) { + has_deferred_event = false; + return; // Ignore repeated key down, key up event pair + } + flushDeferredEvent(); + } + putKeyEvent(key_code, key_location, state, character, nanos); + } else { + flushDeferredEvent(); + has_deferred_event = true; + deferred_nanos = nanos; + deferred_key_code = key_code; + deferred_key_location = key_location; + deferred_key_state = state; + deferred_character = character; + } + } + + private void flushDeferredEvent() { + if (has_deferred_event) { + putKeyEvent(deferred_key_code, deferred_key_location, deferred_key_state, deferred_character, deferred_nanos); + has_deferred_event = false; + } + } + + private void putKeyEvent(int key_code, int key_location, byte state, int character, long nanos) { + int key_code_mapped = getMappedKeyCode(key_code, key_location); /* Ignore repeating presses */ if ( key_states[key_code_mapped] == state ) return; @@ -306,11 +349,11 @@ } public void keyPressed(KeyEvent e) { - handleKey(getMappedKeyCode(e.getKeyCode(), e.getKeyLocation()), (byte)1, e.getKeyChar(), e.getWhen()*1000000); + handleKey(e.getKeyCode(), e.getKeyLocation(), (byte)1, e.getKeyChar(), e.getWhen()*1000000); } public void keyReleased(KeyEvent e) { - handleKey(getMappedKeyCode(e.getKeyCode(), e.getKeyLocation()), (byte)0, Keyboard.CHAR_NONE, e.getWhen()*1000000); + handleKey(e.getKeyCode(), e.getKeyLocation(), (byte)0, Keyboard.CHAR_NONE, e.getWhen()*1000000); } public void keyTyped(KeyEvent e) { Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxAWTInput.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxAWTInput.java 2007-05-13 20:13:37 UTC (rev 2816) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxAWTInput.java 2007-05-13 21:11:53 UTC (rev 2817) @@ -92,7 +92,6 @@ if (input_grabbed) { // LinuxDisplay.nUngrabKeyboard(display); LinuxDisplay.nUngrabPointer(display); - LinuxDisplay.nSetRepeatMode(display, LinuxDisplay.AutoRepeatModeDefault); input_grabbed = false; } } @@ -100,7 +99,6 @@ private void grabInput(long window) { if (!input_grabbed) { // int res1 = LinuxDisplay.nGrabKeyboard(display, window); - LinuxDisplay.nSetRepeatMode(display, LinuxDisplay.AutoRepeatModeOff); int res2 = LinuxDisplay.nGrabPointer(display, window, blank_cursor); if (/*res1 == LinuxDisplay.GrabSuccess && */res2 == LinuxDisplay.GrabSuccess) input_grabbed = true; Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2007-05-13 20:13:37 UTC (rev 2816) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2007-05-13 21:11:53 UTC (rev 2817) @@ -789,7 +789,6 @@ } } } - static native void nSetRepeatMode(long display, int mode); public void grabMouse(boolean new_grab) { lockAWT(); Modified: trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c =================================================================== --- trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c 2007-05-13 20:13:37 UTC (rev 2816) +++ trunk/LWJGL/src/native/linux/org_lwjgl_opengl_Display.c 2007-05-13 21:11:53 UTC (rev 2817) @@ -469,13 +469,6 @@ return win; } -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nSetRepeatMode(JNIEnv *env, jclass unused, jlong display_ptr, jint mode) { - Display *disp = (Display *)(intptr_t)display_ptr; - XKeyboardControl repeat_mode; - repeat_mode.auto_repeat_mode = mode; - XChangeKeyboardControl(disp, KBAutoRepeatMode, &repeat_mode); -} - JNIEXPORT void JNICALL Java_org_lwjgl_opengl_LinuxDisplay_nIconifyWindow(JNIEnv *env, jclass unused, jlong display_ptr, jlong window_ptr, jint screen) { Display *disp = (Display *)(intptr_t)display_ptr; Window win = (Window)window_ptr; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |