From b4cc6176e726100e311389e973a1216cc46ff2cc Mon Sep 17 00:00:00 2001 From: Brian Matzon Date: Sat, 14 Jul 2012 23:29:21 +0000 Subject: [PATCH] fixed issue with win32 get x/y returning client-area coords --- src/java/org/lwjgl/opengl/WindowsDisplay.java | 16 ++++++++++++---- src/native/windows/org_lwjgl_opengl_Display.c | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/java/org/lwjgl/opengl/WindowsDisplay.java b/src/java/org/lwjgl/opengl/WindowsDisplay.java index 24fc722f..c30c1896 100644 --- a/src/java/org/lwjgl/opengl/WindowsDisplay.java +++ b/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -52,6 +52,7 @@ import org.lwjgl.opengles.EGL; final class WindowsDisplay implements DisplayImplementation { private static final int GAMMA_LENGTH = 256; + private static final int WM_WINDOWPOSCHANGED = 0x0047; private static final int WM_MOVE = 0x0003; private static final int WM_CANCELMODE = 0x001F; private static final int WM_MOUSEMOVE = 0x0200; @@ -1012,15 +1013,22 @@ final class WindowsDisplay implements DisplayImplementation { captureMouse = -1; } return 0; - case WM_MOVE: - x = (int)(short)(lParam & 0xFFFF); - y = (int)(short)(lParam >> 16); - return defWindowProc(hwnd, msg, wParam, lParam); + case WM_WINDOWPOSCHANGED: + if(getWindowRect(hwnd, rect_buffer)) { + rect.copyFromBuffer(rect_buffer); + x = rect.top; + y = rect.bottom; + } else { + LWJGLUtil.log("WM_WINDOWPOSCHANGED: Unable to get window rect"); + } + return defWindowProc(hwnd, msg, wParam, lParam); default: return defWindowProc(hwnd, msg, wParam, lParam); } } + private native boolean getWindowRect(long hwnd, IntBuffer rectBuffer); + public int getX() { return x; } diff --git a/src/native/windows/org_lwjgl_opengl_Display.c b/src/native/windows/org_lwjgl_opengl_Display.c index 29163487..53e43e00 100644 --- a/src/native/windows/org_lwjgl_opengl_Display.c +++ b/src/native/windows/org_lwjgl_opengl_Display.c @@ -199,6 +199,18 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clientToScreen(JNIEn buffer[1] = point.y; } + +JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getWindowRect(JNIEnv *env, jclass unused, jlong hwnd_int, jobject buffer_handle) { + HWND hwnd = (HWND)(INT_PTR)hwnd_int; + RECT *buffer = (RECT *)(*env)->GetDirectBufferAddress(env, buffer_handle); + jlong size = (*env)->GetDirectBufferCapacity(env, buffer_handle); + if (size < 4) { + throwFormattedRuntimeException(env, "Buffer size < 4", size); + return false; + } + return GetWindowRect(hwnd, buffer); +} + JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_getForegroundWindow(JNIEnv *env, jclass unused) { return (INT_PTR)GetForegroundWindow(); } @@ -509,4 +521,5 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nTrackMouseEvent tme.dwFlags = TME_LEAVE; tme.hwndTrack = hwnd; return TrackMouseEvent(&tme); -} \ No newline at end of file +} +