|
From: Elias N. <eli...@us...> - 2003-09-16 08:29:52
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/win32 In directory sc8-pr-cvs1:/tmp/cvs-serv31580 Modified Files: org_lwjgl_Display.cpp Log Message: Tried harder to fix NT display mode selection Index: org_lwjgl_Display.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Display.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Display.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- org_lwjgl_Display.cpp 10 Sep 2003 22:55:25 -0000 1.47 +++ org_lwjgl_Display.cpp 16 Sep 2003 08:29:16 -0000 1.48 @@ -59,32 +59,40 @@ */ JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_Display_nGetAvailableDisplayModes (JNIEnv * env, jclass clazz) -{ - // Determine whether to use a display name or NULL, which depends on the operating - // system - OSVERSIONINFO osvi; - - osvi.dwOSVersionInfoSize = sizeof(osvi); - GetVersionEx(&osvi); - - if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5 || - osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMinorVersion >= 10) { -#ifdef _DEBUG - printf("Selecting extended display mode check\n"); -#endif - return GetAvailableDisplayModesEx(env); - } else { -#ifdef _DEBUG - printf("Selecting standard display mode check"); -#endif - return GetAvailableDisplayModes(env); - } +{ + jobjectArray result = GetAvailableDisplayModesEx(env); + if (result == NULL) { +#ifdef _DEBUG + printf("Extended display mode selection failed, using fallback\n"); +#endif + result = GetAvailableDisplayModes(env); + } + return result; } /** * Choose displaymodes using extended codepath (multiple displaydevices) */ -jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { +jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) { + typedef BOOL (WINAPI * EnumDisplayDevicesAPROC)(IN LPCSTR lpDevice, IN DWORD iDevNum, OUT PDISPLAY_DEVICEA lpDisplayDevice, IN DWORD dwFlags); + typedef BOOL (WINAPI * EnumDisplaySettingsExAPROC)(IN LPCSTR lpszDeviceName, IN DWORD iModeNum, OUT LPDEVMODEA lpDevMode, IN DWORD dwFlags); + EnumDisplayDevicesAPROC EnumDisplayDevicesA; + EnumDisplaySettingsExAPROC EnumDisplaySettingsExA; + + HMODULE lib_handle = LoadLibrary("user32.dll"); + if (lib_handle == NULL) { +#ifdef _DEBUG + printf("Could not load user32.dll\n"); +#endif + return NULL; + } + EnumDisplayDevicesA = (EnumDisplayDevicesAPROC)GetProcAddress(lib_handle, "EnumDisplayDevicesA"); + if (EnumDisplayDevicesA == NULL) + return NULL; + EnumDisplaySettingsExA = (EnumDisplaySettingsExAPROC)GetProcAddress(lib_handle, "EnumDisplaySettingsExA"); + if (EnumDisplaySettingsExA == NULL) + return NULL; + int i = 0, j = 0, n = 0; int AvailableModes = 0; @@ -98,12 +106,12 @@ DisplayDevice.cb = sizeof(DISPLAY_DEVICE); //enumerate all displays, and all of their displaymodes - while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) { + while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) { #ifdef _DEBUG printf("Querying %s device\n", DisplayDevice.DeviceString); #endif j = 0; - while(EnumDisplaySettingsEx(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { + while(EnumDisplaySettingsExA(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { #ifdef _DEBUG printf("Checking setting #%d\n", j); #endif @@ -125,9 +133,9 @@ jmethodID displayModeConstructor = env->GetMethodID(displayModeClass, "<init>", "(IIII)V"); i = 0, n = 0; - while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) { + while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) { j = 0; - while(EnumDisplaySettingsEx(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { + while(EnumDisplaySettingsExA(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { // Filter out indexed modes if (DevMode.dmBitsPerPel > 8) { jobject displayMode; @@ -138,7 +146,8 @@ env->SetObjectArrayElement(ret, n++, displayMode); } } - } + } + FreeLibrary(lib_handle); return ret; } |