From a47e419168454aa110d4f94e557c2426e5158366 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Thu, 26 Oct 2006 20:49:07 +0000 Subject: [PATCH] Mac OS X: Moved mouse handling from MacOSXDisplay to MacOSXMouseEventQueue --- build.xml | 1 + src/java/org/lwjgl/opengl/MacOSXDisplay.java | 23 +++------------- .../lwjgl/opengl/MacOSXMouseEventQueue.java | 26 +++++++++++++++++-- .../org/lwjgl/opengl/MouseEventQueue.java | 5 +++- src/native/macosx/org_lwjgl_input_Mouse.c | 7 ++--- 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/build.xml b/build.xml index a63035d7..68a58064 100644 --- a/build.xml +++ b/build.xml @@ -524,6 +524,7 @@ + diff --git a/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/src/java/org/lwjgl/opengl/MacOSXDisplay.java index 685ea16e..1837d15c 100644 --- a/src/java/org/lwjgl/opengl/MacOSXDisplay.java +++ b/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -69,7 +69,7 @@ final class MacOSXDisplay implements DisplayImplementation { private static final int GAMMA_LENGTH = 256; private MacOSXFrame frame; - private MouseEventQueue mouse_queue; + private MacOSXMouseEventQueue mouse_queue; private KeyboardEventQueue keyboard_queue; private java.awt.DisplayMode requested_mode; @@ -256,17 +256,8 @@ final class MacOSXDisplay implements DisplayImplementation { GL11.glGetInteger(GL11.GL_VIEWPORT, current_viewport); GL11.glViewport(current_viewport.get(0), current_viewport.get(1), current_viewport.get(2), current_viewport.get(3)); } - if (frame.syncShouldWarpCursor()) { - warpCursor(); - } - } - - private void warpCursor() { - if (mouse_queue != null && mouse_queue.isGrabbed()) { - Rectangle bounds = frame.syncGetBounds(); - int x = bounds.x + bounds.width/2; - int y = bounds.y + bounds.height/2; - nWarpCursor(x, y); + if (frame.syncShouldWarpCursor() && mouse_queue != null) { + mouse_queue.warpCursor(); } } @@ -286,8 +277,6 @@ final class MacOSXDisplay implements DisplayImplementation { private native void nHideUI(boolean hide); - native void getMouseDeltas(IntBuffer delta_buffer); - public void reshape(int x, int y, int width, int height) { frame.resize(x, y, width, height); } @@ -323,14 +312,8 @@ final class MacOSXDisplay implements DisplayImplementation { public void grabMouse(boolean grab) { mouse_queue.setGrabbed(grab); - warpCursor(); - nGrabMouse(grab); } - private native void nWarpCursor(int x, int y); - - private native void nGrabMouse(boolean grab); - public int getNativeCursorCapabilities() { return AWTUtil.getNativeCursorCapabilities(); } diff --git a/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java b/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java index a8492846..ad32b78c 100644 --- a/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java +++ b/src/java/org/lwjgl/opengl/MacOSXMouseEventQueue.java @@ -42,6 +42,7 @@ import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.Component; +import java.awt.Rectangle; import java.nio.ByteBuffer; import java.nio.IntBuffer; @@ -55,16 +56,22 @@ final class MacOSXMouseEventQueue extends MouseEventQueue { super(component); } + public void setGrabbed(boolean grab) { + super.setGrabbed(grab); + warpCursor(); + nGrabMouse(grab); + } + protected void resetCursorToCenter() { super.resetCursorToCenter(); /* Clear accumulated deltas */ - ((MacOSXDisplay)Display.getImplementation()).getMouseDeltas(delta_buffer); + getMouseDeltas(delta_buffer); } protected void updateDeltas(long nanos) { super.updateDeltas(nanos); synchronized ( this ) { - ((MacOSXDisplay)Display.getImplementation()).getMouseDeltas(delta_buffer); + getMouseDeltas(delta_buffer); int dx = delta_buffer.get(0); int dy = -delta_buffer.get(1); if ( dx != 0 || dy != 0 ) { @@ -73,4 +80,19 @@ final class MacOSXMouseEventQueue extends MouseEventQueue { } } } + + void warpCursor() { + if (isGrabbed()) { + Rectangle bounds = getComponent().getBounds(); + int x = bounds.x + bounds.width/2; + int y = bounds.y + bounds.height/2; + nWarpCursor(x, y); + } + } + + private static native void getMouseDeltas(IntBuffer delta_buffer); + + private static native void nWarpCursor(int x, int y); + + private static native void nGrabMouse(boolean grab); } diff --git a/src/java/org/lwjgl/opengl/MouseEventQueue.java b/src/java/org/lwjgl/opengl/MouseEventQueue.java index 0f9916e2..eb7dd0c1 100644 --- a/src/java/org/lwjgl/opengl/MouseEventQueue.java +++ b/src/java/org/lwjgl/opengl/MouseEventQueue.java @@ -56,7 +56,6 @@ class MouseEventQueue extends EventQueue implements MouseListener, MouseMotionLi private boolean grabbed; - /** The accumulated mouse deltas returned by poll() */ private int accum_dx; private int accum_dy; @@ -93,6 +92,10 @@ class MouseEventQueue extends EventQueue implements MouseListener, MouseMotionLi component.removeMouseWheelListener(this); } + protected Component getComponent() { + return component; + } + public synchronized void setGrabbed(boolean grabbed) { this.grabbed = grabbed; resetCursorToCenter(); diff --git a/src/native/macosx/org_lwjgl_input_Mouse.c b/src/native/macosx/org_lwjgl_input_Mouse.c index f337295e..f7f824dd 100644 --- a/src/native/macosx/org_lwjgl_input_Mouse.c +++ b/src/native/macosx/org_lwjgl_input_Mouse.c @@ -41,11 +41,12 @@ #include #include +#include "org_lwjgl_opengl_MacOSXMouseEventQueue.h" #include "common_tools.h" static bool is_grabbed; -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGrabMouse(JNIEnv *env, jobject this, jboolean grab) { +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nGrabMouse(JNIEnv *env, jclass unused, jboolean grab) { bool new_grabbed = grab == JNI_TRUE; if (is_grabbed != new_grabbed) { is_grabbed = new_grabbed; @@ -57,14 +58,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nGrabMouse(JNIEnv *en } } -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nWarpCursor(JNIEnv *env, jobject this, jint x, jint y) { +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_nWarpCursor(JNIEnv *env, jclass unused, jint x, jint y) { CGPoint p; p.x = x; p.y = y; CGWarpMouseCursorPosition(p); } -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_getMouseDeltas(JNIEnv *env, jobject this, jobject delta_buffer) { +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXMouseEventQueue_getMouseDeltas(JNIEnv *env, jclass unused, jobject delta_buffer) { CGMouseDelta dx, dy; CGGetLastMouseDelta(&dx, &dy); int buffer_length = (*env)->GetDirectBufferCapacity(env, delta_buffer);