Tried harder to fix NT display mode selection
This commit is contained in:
parent
fe1d693b81
commit
f67cd0e384
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue