|
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.
|