From: <ma...@us...> - 2009-09-12 22:15:30
|
Revision: 3240 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3240&view=rev Author: matzon Date: 2009-09-12 22:15:21 +0000 (Sat, 12 Sep 2009) Log Message: ----------- support for tracking mouse outside window on drag, new api for checking if mouse is inside window Modified Paths: -------------- trunk/LWJGL/src/java/org/lwjgl/input/Mouse.java trunk/LWJGL/src/java/org/lwjgl/opengl/InputImplementation.java trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java trunk/LWJGL/src/java/org/lwjgl/opengl/MacOSXDisplay.java trunk/LWJGL/src/java/org/lwjgl/opengl/WindowsDisplay.java trunk/LWJGL/src/java/org/lwjgl/test/input/MouseTest.java trunk/LWJGL/src/native/windows/org_lwjgl_opengl_Display.c Modified: trunk/LWJGL/src/java/org/lwjgl/input/Mouse.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/input/Mouse.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/input/Mouse.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -33,6 +33,8 @@ import java.nio.ByteBuffer; import java.nio.IntBuffer; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.HashMap; import java.util.Map; @@ -135,6 +137,8 @@ private static final boolean emulateCursorAnimation = LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_WINDOWS || LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_MACOSX; + private static final boolean allowNegativeMouseCoords = getPrivilegedBoolean("org.lwjgl.input.Mouse.allowNegativeMouseCoords"); + /** * Mouse cannot be constructed. */ @@ -338,9 +342,11 @@ x = poll_coord1; y = poll_coord2; } - x = Math.min(implementation.getWidth() - 1, Math.max(0, x)); - y = Math.min(implementation.getHeight() - 1, Math.max(0, y)); - dwheel += poll_dwheel; + if(!allowNegativeMouseCoords) { + x = Math.min(implementation.getWidth() - 1, Math.max(0, x)); + y = Math.min(implementation.getHeight() - 1, Math.max(0, y)); + } + dwheel += poll_dwheel; read(); } } @@ -634,4 +640,24 @@ } } } + + /** Gets a boolean property as a privileged action. */ + static boolean getPrivilegedBoolean(final String property_name) { + Boolean value = (Boolean)AccessController.doPrivileged(new PrivilegedAction() { + public Object run() { + return new Boolean(Boolean.getBoolean(property_name)); + } + }); + return value.booleanValue(); + } + + /** + * Retrieves whether or not the mouse cursor is within the bounds of the window. + * If the mouse cursor was moved outside the display during a drag, then the result of calling + * this method will be true until the button is released. + * @return true if mouse is inside display, false otherwise. + */ + public static boolean isInsideWindow() { + return implementation.isInsideWindow(); + } } Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/InputImplementation.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/InputImplementation.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/InputImplementation.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -129,4 +129,6 @@ int getWidth(); int getHeight(); + + boolean isInsideWindow(); } Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/LinuxDisplay.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -1221,4 +1221,8 @@ public int getHeight() { return Display.getDisplayMode().getHeight(); } + + public boolean isInsideWindow() { + return true; + } } Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/MacOSXDisplay.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/MacOSXDisplay.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/MacOSXDisplay.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -501,4 +501,8 @@ public int getHeight() { return Display.getDisplayMode().getHeight(); } + + public boolean isInsideWindow() { + return true; + } } Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/WindowsDisplay.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/WindowsDisplay.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/WindowsDisplay.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -66,6 +66,7 @@ private final static int WM_MBUTTONDBLCLK = 0x0209; private final static int WM_MOUSEWHEEL = 0x020A; private final static int WM_CAPTURECHANGED = 0x0215; + private final static int WM_MOUSELEAVE = 0x02A3; private final static int WM_KEYDOWN = 256; private final static int WM_KEYUP = 257; private final static int WM_SYSKEYUP = 261; @@ -154,6 +155,8 @@ private long large_icon; private int captureMouse = -1; + private boolean trackingMouse = false; + private boolean mouseInside = false; WindowsDisplay() { current_display = this; @@ -813,6 +816,10 @@ int yPos = transformY(getHwnd(), (int)(short)((lParam >> 16) & 0xFFFF)); handleMouseMoved(xPos, yPos, millis); checkCursorState(); + mouseInside = true; + if(!trackingMouse) { + trackingMouse = nTrackMouseEvent(hwnd); + } return 0; case WM_MOUSEWHEEL: int dwheel = (int)(short)((wParam >> 16) & 0xFFFF); @@ -878,6 +885,10 @@ case WM_PAINT: is_dirty = true; return defWindowProc(hwnd, msg, wParam, lParam); + case WM_MOUSELEAVE: + mouseInside = false; + trackingMouse = false; + return defWindowProc(hwnd, msg, wParam, lParam); case WM_CANCELMODE: nReleaseCapture(); /* fall through */ @@ -909,6 +920,12 @@ return -1; } + private native boolean nTrackMouseEvent(long hwnd); + + public boolean isInsideWindow() { + return mouseInside; + } + private static final class Rect { public int top; public int bottom; Modified: trunk/LWJGL/src/java/org/lwjgl/test/input/MouseTest.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/test/input/MouseTest.java 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/java/org/lwjgl/test/input/MouseTest.java 2009-09-12 22:15:21 UTC (rev 3240) @@ -239,7 +239,7 @@ private void handleMouse() { readBufferedMouse(); - Display.setTitle("x: " + Mouse.getX() + ", y: " + Mouse.getY() + ", [0]: " + Mouse.isButtonDown(0) + ", [1]: " + Mouse.isButtonDown(1) + ", [2]: " + Mouse.isButtonDown(2)); + Display.setTitle("x: " + Mouse.getX() + ", y: " + Mouse.getY() + ", [0]: " + Mouse.isButtonDown(0) + ", [1]: " + Mouse.isButtonDown(1) + ", [2]: " + Mouse.isButtonDown(2) + ", inside: " + Mouse.isInsideWindow()); } /** Modified: trunk/LWJGL/src/native/windows/org_lwjgl_opengl_Display.c =================================================================== --- trunk/LWJGL/src/native/windows/org_lwjgl_opengl_Display.c 2009-09-10 11:15:12 UTC (rev 3239) +++ trunk/LWJGL/src/native/windows/org_lwjgl_opengl_Display.c 2009-09-12 22:15:21 UTC (rev 3240) @@ -468,3 +468,12 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseCapture(JNIEnv *env, jclass unused) { return ReleaseCapture(); } + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nTrackMouseEvent(JNIEnv *env, jclass clazz, jlong hwnd_ptr) { + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + return TrackMouseEvent(&tme); +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |