Tried harder to fix NT display mode selection

This commit is contained in:
Elias Naur 2003-09-16 08:29:16 +00:00
parent fe1d693b81
commit f67cd0e384
1 changed files with 30 additions and 21 deletions

View File

@ -60,31 +60,39 @@ DEVMODE devmode; // Now we'll remember this value for the future
JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_Display_nGetAvailableDisplayModes JNIEXPORT jobjectArray JNICALL Java_org_lwjgl_Display_nGetAvailableDisplayModes
(JNIEnv * env, jclass clazz) (JNIEnv * env, jclass clazz)
{ {
// Determine whether to use a display name or NULL, which depends on the operating jobjectArray result = GetAvailableDisplayModesEx(env);
// system if (result == NULL) {
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 #ifdef _DEBUG
printf("Selecting extended display mode check\n"); printf("Extended display mode selection failed, using fallback\n");
#endif #endif
return GetAvailableDisplayModesEx(env); result = GetAvailableDisplayModes(env);
} else {
#ifdef _DEBUG
printf("Selecting standard display mode check");
#endif
return GetAvailableDisplayModes(env);
} }
return result;
} }
/** /**
* Choose displaymodes using extended codepath (multiple displaydevices) * 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 i = 0, j = 0, n = 0;
int AvailableModes = 0; int AvailableModes = 0;
@ -98,12 +106,12 @@ jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) {
DisplayDevice.cb = sizeof(DISPLAY_DEVICE); DisplayDevice.cb = sizeof(DISPLAY_DEVICE);
//enumerate all displays, and all of their displaymodes //enumerate all displays, and all of their displaymodes
while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) { while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) {
#ifdef _DEBUG #ifdef _DEBUG
printf("Querying %s device\n", DisplayDevice.DeviceString); printf("Querying %s device\n", DisplayDevice.DeviceString);
#endif #endif
j = 0; j = 0;
while(EnumDisplaySettingsEx(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { while(EnumDisplaySettingsExA(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) {
#ifdef _DEBUG #ifdef _DEBUG
printf("Checking setting #%d\n", j); printf("Checking setting #%d\n", j);
#endif #endif
@ -125,9 +133,9 @@ jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) {
jmethodID displayModeConstructor = env->GetMethodID(displayModeClass, "<init>", "(IIII)V"); jmethodID displayModeConstructor = env->GetMethodID(displayModeClass, "<init>", "(IIII)V");
i = 0, n = 0; i = 0, n = 0;
while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) { while(EnumDisplayDevicesA(NULL, i++, &DisplayDevice, 0) != 0) {
j = 0; j = 0;
while(EnumDisplaySettingsEx(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) { while(EnumDisplaySettingsExA(DisplayDevice.DeviceName, j++, &DevMode, 0) != 0) {
// Filter out indexed modes // Filter out indexed modes
if (DevMode.dmBitsPerPel > 8) { if (DevMode.dmBitsPerPel > 8) {
jobject displayMode; jobject displayMode;
@ -139,6 +147,7 @@ jobjectArray GetAvailableDisplayModesEx(JNIEnv * env) {
} }
} }
} }
FreeLibrary(lib_handle);
return ret; return ret;
} }