diff --git a/src/native/linux/org_lwjgl_Display.cpp b/src/native/linux/org_lwjgl_Display.cpp index f78f6b18..f5e7b93a 100644 --- a/src/native/linux/org_lwjgl_Display.cpp +++ b/src/native/linux/org_lwjgl_Display.cpp @@ -201,16 +201,15 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_setDisplayMode(JNIEnv * env, jclas Display *disp = XOpenDisplay(NULL); if (disp == NULL) { -#ifdef _DEBUG - printf("Could not open X connection\n"); -#endif + throwException(env, "Could not open X connection."); return; } screen = DefaultScreen(disp); if (setMode(disp, screen, width, height, true)) { jfieldID fid_initialMode = env->GetStaticFieldID(clazz, "mode", "Lorg/lwjgl/DisplayMode;"); env->SetStaticObjectField(clazz, fid_initialMode, mode); - } + } else + throwException(env, "Could not switch mode."); XCloseDisplay(disp); } diff --git a/src/native/macosx/Window.h b/src/native/macosx/Window.h index 8df5a0e6..94d540d4 100644 --- a/src/native/macosx/Window.h +++ b/src/native/macosx/Window.h @@ -44,9 +44,8 @@ #include #include - extern void setQuitRequested(void); extern void resetMode(JNIEnv *env); - extern void switchMode(JNIEnv *env, long width, long height, long bpp, long freq); + extern bool switchMode(JNIEnv *env, long width, long height, long bpp, long freq); extern void handleKeyboardEvent(EventRef event); #endif /* _LWJGL_WINDOW_H_INCLUDED_ */ diff --git a/src/native/macosx/org_lwjgl_Display.cpp b/src/native/macosx/org_lwjgl_Display.cpp index 662f0125..d006589e 100644 --- a/src/native/macosx/org_lwjgl_Display.cpp +++ b/src/native/macosx/org_lwjgl_Display.cpp @@ -93,12 +93,30 @@ static void releaseDisplay(void) { } } -void switchMode(JNIEnv *env, long width, long height, long bpp, long freq) { +bool switchMode(JNIEnv *env, long width, long height, long bpp, long freq) { init(env); captureDisplay(); - CFDictionaryRef displayMode = CGDisplayBestModeForParametersAndRefreshRate(kCGDirectMainDisplay, bpp, width, height, freq, NULL); - CGDisplaySwitchToMode(kCGDirectMainDisplay, displayMode); - saveMode(env, width, height, bpp, freq); + CFArrayRef modes = CGDisplayAvailableModes(kCGDirectMainDisplay); + int size = CFArrayGetCount(modes); + for (int i = 0; i < size; i++) { + CFDictionaryRef mode = (CFDictionaryRef)CFArrayGetValueAtIndex(modes, i); + long mode_width; + long mode_height; + long mode_bpp; + long mode_freq; + getDictLong(mode, kCGDisplayWidth, &mode_width); + getDictLong(mode, kCGDisplayHeight, &mode_height); + getDictLong(mode, kCGDisplayRefreshRate, &mode_freq); + getDictLong(mode, kCGDisplayBitsPerPixel, &mode_bpp); + if (width == mode_width && height == mode_height && bpp == mode_bpp && mode_freq == freq) { + CGDisplayErr err = CGDisplaySwitchToMode(kCGDirectMainDisplay, mode); + if (!err) { + saveMode(env, width, height, bpp, freq); + return true; + } + } + } + return false; } void resetMode(JNIEnv *env) { @@ -123,7 +141,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_setDisplayMode(JNIEnv * env, jclas int height = env->GetIntField(mode, fid_height); int bpp = env->GetIntField(mode, fid_bpp); int freq = env->GetIntField(mode, fid_freq); - switchMode(env, width, height, bpp, freq); + if (!switchMode(env, width, height, bpp, freq)) { + throwException(env, "Could not switch mode."); + } } JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_Display_nGetAvailableDisplayModes(JNIEnv * env, jclass clazz) { diff --git a/src/native/macosx/org_lwjgl_opengl_Window.cpp b/src/native/macosx/org_lwjgl_opengl_Window.cpp index aae45fd5..5ea7015b 100644 --- a/src/native/macosx/org_lwjgl_opengl_Window.cpp +++ b/src/native/macosx/org_lwjgl_opengl_Window.cpp @@ -103,7 +103,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsCloseRequested(JNIEnv JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jobject ext_set) { vsync_enabled = false; - current_fullscreen = fullscreen == JNI_FALSE; + current_fullscreen = fullscreen == JNI_TRUE; if (!extgl_Open()) { throwException(env, "Could not load gl library"); return; @@ -112,8 +112,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass throwException(env, "Could not load agl symbols"); return; } - if (current_fullscreen) - switchMode(env, width, height, bpp, 60); + if (!current_fullscreen) { + if (!switchMode(env, width, height, bpp, 60)) { + destroyMode(env, clazz); + extgl_Close(); + throwException(env, "Could not switch mode."); + return; + } + } if (!createFullscreenContext(env, bpp, alpha, depth, stencil)) { destroyMode(env, clazz); extgl_Close();