From 9293ee40735911266eeb4cf43751336e5a6df697 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 5 May 2008 17:24:42 +0000 Subject: [PATCH] Windows: Split WindowsDisplay.nDestroyWindow into nReleaseDC and nDestroyWindow --- src/java/org/lwjgl/opengl/WindowsDisplay.java | 11 ++++++---- src/native/windows/org_lwjgl_opengl_Display.c | 21 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/java/org/lwjgl/opengl/WindowsDisplay.java b/src/java/org/lwjgl/opengl/WindowsDisplay.java index 31d53546..81578d5e 100644 --- a/src/java/org/lwjgl/opengl/WindowsDisplay.java +++ b/src/java/org/lwjgl/opengl/WindowsDisplay.java @@ -170,7 +170,7 @@ final class WindowsDisplay implements DisplayImplementation { } this.hdc = getDC(hwnd); if (hdc == 0) { - nDestroyWindow(hwnd, hdc); + nDestroyWindow(hwnd); throw new LWJGLException("Failed to get dc"); } try { @@ -183,7 +183,8 @@ final class WindowsDisplay implements DisplayImplementation { setFocus(getHwnd()); } } catch (LWJGLException e) { - nDestroyWindow(hwnd, hdc); + nReleaseDC(hwnd, hdc); + nDestroyWindow(hwnd); throw e; } } @@ -205,12 +206,14 @@ final class WindowsDisplay implements DisplayImplementation { } public void destroyWindow() { - nDestroyWindow(hwnd, hdc); + nReleaseDC(hwnd, hdc); + nDestroyWindow(hwnd); freeLargeIcon(); freeSmallIcon(); resetCursorClipping(); } - private static native void nDestroyWindow(long hwnd, long hdc); + private static native void nReleaseDC(long hwnd, long hdc); + private static native void nDestroyWindow(long hwnd); static void resetCursorClipping() { if (cursor_clipped) { try { diff --git a/src/native/windows/org_lwjgl_opengl_Display.c b/src/native/windows/org_lwjgl_opengl_Display.c index 78167ae0..3f7e8501 100644 --- a/src/native/windows/org_lwjgl_opengl_Display.c +++ b/src/native/windows/org_lwjgl_opengl_Display.c @@ -151,13 +151,6 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_DefaultSysImplementation_getJNIVersion return org_lwjgl_WindowsSysImplementation_JNI_VERSION; } -static void destroyWindow(JNIEnv *env, HWND *hwnd, HDC *hdc) { - jclass display_class_global = (jclass)(LONG_PTR)GetWindowLongPtr(*hwnd, GWLP_USERDATA); - closeWindow(hwnd, hdc); - if (display_class_global != NULL) - (*env)->DeleteGlobalRef(env, display_class_global); -} - JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateWindow(JNIEnv *env, jobject self, jboolean fullscreen, jint x, jint y, jint width, jint height, jboolean undecorated, jboolean child_window, jlong parent_hwnd) { HWND hwnd; static bool oneShotInitialised = false; @@ -173,10 +166,20 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nCreateWindow(JNIEn return (INT_PTR)hwnd; } -JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nDestroyWindow(JNIEnv *env, jclass clazz, jlong hwnd_ptr, jlong hdc_ptr) { +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nReleaseDC(JNIEnv *env, jclass clazz, jlong hwnd_ptr, jlong hdc_ptr) { HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; HDC hdc = (HDC)(INT_PTR)hdc_ptr; - destroyWindow(env, &hwnd, &hdc); + ReleaseDC(hwnd, hdc); +} + +JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_nDestroyWindow(JNIEnv *env, jclass clazz, jlong hwnd_ptr) { + jclass display_class_global; + HWND hwnd = (HWND)(INT_PTR)hwnd_ptr; + display_class_global = (jclass)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_USERDATA); + ShowWindow(hwnd, SW_HIDE); + DestroyWindow(hwnd); + if (display_class_global != NULL) + (*env)->DeleteGlobalRef(env, display_class_global); } JNIEXPORT void JNICALL Java_org_lwjgl_opengl_WindowsDisplay_clientToScreen(JNIEnv *env, jclass unused, jlong hwnd_int, jobject buffer_handle) {