Index: cpl/desk/settings.c =================================================================== --- cpl/desk/settings.c (revision 70615) +++ cpl/desk/settings.c (working copy) @@ -56,6 +56,28 @@ } } +static int +CompareSettings(PSETTINGS_ENTRY Entry, DWORD dmPelsWidth, DWORD dmPelsHeight, + DWORD dmBitsPerPel, DWORD dmDisplayFrequency) +{ + if (Entry->dmBitsPerPel == dmBitsPerPel && + Entry->dmPelsWidth == dmPelsWidth && + Entry->dmPelsHeight == dmPelsHeight && + Entry->dmDisplayFrequency == dmDisplayFrequency) + { + return 0; + } + else if (Entry->dmPelsWidth < dmPelsWidth || + (Entry->dmPelsWidth == dmPelsWidth && Entry->dmPelsHeight < dmPelsHeight) || + (Entry->dmPelsHeight == dmPelsHeight && + Entry->dmPelsWidth == dmPelsWidth && + Entry->dmBitsPerPel < dmBitsPerPel)) + { + return 1; + } + return -1; +} + static PSETTINGS_ENTRY GetPossibleSettings(IN LPCTSTR DeviceName, OUT DWORD* pSettingsCount, OUT PSETTINGS_ENTRY* CurrentSettings) { @@ -66,7 +88,7 @@ PSETTINGS_ENTRY Settings = NULL; HDC hDC; PSETTINGS_ENTRY Current; - DWORD bpp, xres, yres, checkbpp; + DWORD bpp, xres, yres; DWORD curDispFreq; /* Get current settings */ @@ -87,24 +109,17 @@ curDispFreq = devmode.dmDisplayFrequency; - while (EnumDisplaySettingsEx(DeviceName, iMode, &devmode, dwFlags)) + while (EnumDisplaySettingsEx(DeviceName, iMode++, &devmode, dwFlags)) { - if ((devmode.dmBitsPerPel == 4 || - devmode.dmBitsPerPel == 8 || - devmode.dmBitsPerPel == 16 || - devmode.dmBitsPerPel == 24 || - devmode.dmBitsPerPel == 32) && - devmode.dmDisplayFrequency == curDispFreq) - { - checkbpp=1; - } - else - checkbpp=0; - if (devmode.dmPelsWidth < 640 || - devmode.dmPelsHeight < 480 || checkbpp == 0) + devmode.dmPelsHeight < 480 || + devmode.dmDisplayFrequency != curDispFreq || + (devmode.dmBitsPerPel != 4 && + devmode.dmBitsPerPel != 8 && + devmode.dmBitsPerPel != 16 && + devmode.dmBitsPerPel != 24 && + devmode.dmBitsPerPel != 32)) { - iMode++; continue; } @@ -118,12 +133,9 @@ Current->dmPelsHeight = devmode.dmPelsHeight; Current->dmBitsPerPel = devmode.dmBitsPerPel; Current->dmDisplayFrequency = devmode.dmDisplayFrequency; - while (Next != NULL && ( - Next->dmPelsWidth < Current->dmPelsWidth || - (Next->dmPelsWidth == Current->dmPelsWidth && Next->dmPelsHeight < Current->dmPelsHeight) || - (Next->dmPelsHeight == Current->dmPelsHeight && - Next->dmPelsWidth == Current->dmPelsWidth && - Next->dmBitsPerPel < Current->dmBitsPerPel ))) + while (Next != NULL && CompareSettings(Next, devmode.dmPelsWidth, + devmode.dmPelsHeight, devmode.dmBitsPerPel, + devmode.dmDisplayFrequency) > 0) { Previous = Next; Next = Next->Flink; @@ -142,7 +154,6 @@ } NbSettings++; } - iMode++; } *pSettingsCount = NbSettings; @@ -538,6 +549,8 @@ PSETTINGS_ENTRY Current; DWORD dmNewPelsHeight = pData->CurrentDisplayDevice->Resolutions[NewPosition].dmPelsHeight; DWORD dmNewPelsWidth = pData->CurrentDisplayDevice->Resolutions[NewPosition].dmPelsWidth; + DWORD dmBitsPerPel; + DWORD dmDisplayFrequency; /* Find if new parameters are valid */ Current = pData->CurrentDisplayDevice->CurrentSettings; @@ -549,7 +562,12 @@ PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - if (dmNewPelsHeight < Current->dmPelsHeight) + dmBitsPerPel = Current->dmBitsPerPel; + dmDisplayFrequency = Current->dmDisplayFrequency; + + if (CompareSettings(Current, dmNewPelsWidth, + dmNewPelsHeight, dmBitsPerPel, + dmDisplayFrequency) < 0) { Current = Current->Blink; while (Current != NULL) @@ -556,7 +574,7 @@ { if (Current->dmPelsHeight == dmNewPelsHeight && Current->dmPelsWidth == dmNewPelsWidth - && Current->dmBitsPerPel == pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel) + && Current->dmBitsPerPel == dmBitsPerPel) { pData->CurrentDisplayDevice->CurrentSettings = Current; UpdateDisplay(hwndDlg, pData, bUpdateThumb); @@ -572,7 +590,7 @@ { if (Current->dmPelsHeight == dmNewPelsHeight && Current->dmPelsWidth == dmNewPelsWidth - && Current->dmBitsPerPel == pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel) + && Current->dmBitsPerPel == dmBitsPerPel) { pData->CurrentDisplayDevice->CurrentSettings = Current; UpdateDisplay(hwndDlg, pData, bUpdateThumb);