From a972dd272db479e95a6bf777bf82b1f954c42c10 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 24 Oct 2006 10:39:14 +0000 Subject: [PATCH] Linux: Moved input event processing to LinuxKeyboard and LinuxMouse --- src/java/org/lwjgl/opengl/LinuxDisplay.java | 25 +++--------------- src/java/org/lwjgl/opengl/LinuxKeyboard.java | 14 +++++++++- src/java/org/lwjgl/opengl/LinuxMouse.java | 27 +++++++++++++++++--- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/java/org/lwjgl/opengl/LinuxDisplay.java b/src/java/org/lwjgl/opengl/LinuxDisplay.java index f60b5a09..09249ee8 100644 --- a/src/java/org/lwjgl/opengl/LinuxDisplay.java +++ b/src/java/org/lwjgl/opengl/LinuxDisplay.java @@ -638,16 +638,13 @@ final class LinuxDisplay implements DisplayImplementation { while (LinuxEvent.getPending(getDisplay()) > 0) { event_buffer.nextEvent(getDisplay()); long event_window = event_buffer.getWindow(); - if (event_window != getWindow()) - continue; - if (event_buffer.filterEvent(event_window)) + if (event_window != getWindow() || event_buffer.filterEvent(event_window) || + (mouse != null && mouse.filterEvent(grab, shouldWarpPointer(), event_buffer)) || + (keyboard != null && keyboard.filterEvent(event_buffer))) continue; switch (event_buffer.getType()) { case LinuxEvent.ClientMessage: - if (event_buffer.getClientMessageType() == warp_atom) { - if (mouse != null) - mouse.handleWarpEvent(event_buffer.getClientData(0), event_buffer.getClientData(1)); - } else if ((event_buffer.getClientFormat() == 32) && (event_buffer.getClientData(0) == delete_atom)) + if ((event_buffer.getClientFormat() == 32) && (event_buffer.getClientData(0) == delete_atom)) close_requested = true; break; case LinuxEvent.MapNotify: @@ -661,20 +658,6 @@ final class LinuxDisplay implements DisplayImplementation { case LinuxEvent.Expose: dirty = true; break; - case LinuxEvent.ButtonPress: /* Fall through */ - case LinuxEvent.ButtonRelease: - if (mouse != null) - mouse.handleButtonEvent(grab, event_buffer.getButtonTime(), event_buffer.getButtonType(), (byte)event_buffer.getButtonButton()); - break; - case LinuxEvent.MotionNotify: - if (mouse != null) - mouse.handlePointerMotion(grab, shouldWarpPointer(), event_buffer.getButtonTime(), event_buffer.getButtonRoot(), event_buffer.getButtonXRoot(), event_buffer.getButtonYRoot(), event_buffer.getButtonX(), event_buffer.getButtonY()); - break; - case LinuxEvent.KeyPress: /* Fall through */ - case LinuxEvent.KeyRelease: - if (keyboard != null) - keyboard.handleKeyEvent(event_buffer.getKeyAddress(), event_buffer.getKeyTime(), event_buffer.getKeyType(), event_buffer.getKeyKeyCode(), event_buffer.getKeyState()); - break; default: break; } diff --git a/src/java/org/lwjgl/opengl/LinuxKeyboard.java b/src/java/org/lwjgl/opengl/LinuxKeyboard.java index 0b336943..f1b24c39 100644 --- a/src/java/org/lwjgl/opengl/LinuxKeyboard.java +++ b/src/java/org/lwjgl/opengl/LinuxKeyboard.java @@ -296,10 +296,22 @@ final class LinuxKeyboard { } } - public void handleKeyEvent(long event_ptr, long millis, int event_type, int event_keycode, int event_state) { + private void handleKeyEvent(long event_ptr, long millis, int event_type, int event_keycode, int event_state) { int keycode = getKeycode(event_ptr, event_state); byte key_state = getKeyState(event_type); key_down_buffer[keycode] = key_state; translateEvent(event_ptr, event_type, keycode, key_state, millis*1000000); } + + public boolean filterEvent(LinuxEvent event) { + switch (event.getType()) { + case LinuxEvent.KeyPress: /* Fall through */ + case LinuxEvent.KeyRelease: + handleKeyEvent(event.getKeyAddress(), event.getKeyTime(), event.getKeyType(), event.getKeyKeyCode(), event.getKeyState()); + return true; + default: + break; + } + return false; + } } diff --git a/src/java/org/lwjgl/opengl/LinuxMouse.java b/src/java/org/lwjgl/opengl/LinuxMouse.java index 373a9c13..450bdb96 100644 --- a/src/java/org/lwjgl/opengl/LinuxMouse.java +++ b/src/java/org/lwjgl/opengl/LinuxMouse.java @@ -190,7 +190,7 @@ final class LinuxMouse { } private static native void nWarpCursor(long display, long window, int x, int y); - public void handlePointerMotion(boolean grab, boolean warp_pointer, long millis, long root_window, int x_root, int y_root, int x, int y) { + private void handlePointerMotion(boolean grab, boolean warp_pointer, long millis, long root_window, int x_root, int y_root, int x, int y) { doHandlePointerMotion(grab, warp_pointer, root_window, x_root, y_root, x, y, millis*1000000); } @@ -239,7 +239,7 @@ final class LinuxMouse { } } - public void handleButtonEvent(boolean grab, long millis, int type, byte button) { + private void handleButtonEvent(boolean grab, long millis, int type, byte button) { long nanos = millis*1000000; switch (type) { case ButtonRelease: @@ -258,7 +258,28 @@ final class LinuxMouse { last_y = transformY(y); } - public void handleWarpEvent(int x, int y) { + private void handleWarpEvent(int x, int y) { resetCursor(x, y); } + + public boolean filterEvent(boolean grab, boolean warp_pointer, LinuxEvent event) { + switch (event.getType()) { + case LinuxEvent.ClientMessage: + if (event.getClientMessageType() == warp_atom) { + handleWarpEvent(event.getClientData(0), event.getClientData(1)); + return true; + } + break; + case LinuxEvent.ButtonPress: /* Fall through */ + case LinuxEvent.ButtonRelease: + handleButtonEvent(grab, event.getButtonTime(), event.getButtonType(), (byte)event.getButtonButton()); + return true; + case LinuxEvent.MotionNotify: + handlePointerMotion(grab, warp_pointer, event.getButtonTime(), event.getButtonRoot(), event.getButtonXRoot(), event.getButtonYRoot(), event.getButtonX(), event.getButtonY()); + return true; + default: + break; + } + return false; + } }