TCHAR Buffer[64];
TCHAR Pixel[64];
DWORD index;
+ HWND hwndMonSel;
+ MONSL_MONINFO info;
LoadString(hApplet, IDS_PIXEL, Pixel, sizeof(Pixel) / sizeof(TCHAR));
_stprintf(Buffer, Pixel, pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth, pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight, Pixel);
}
if (LoadString(hApplet, (2900 + pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel), Buffer, sizeof(Buffer) / sizeof(TCHAR)))
SendDlgItemMessage(hwndDlg, IDC_SETTINGS_BPP, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)Buffer);
+
+ hwndMonSel = GetDlgItem(hwndDlg, IDC_SETTINGS_MONSEL);
+ index = (INT)SendMessage(hwndMonSel, MSLM_GETCURSEL, 0, 0);
+ if (index != (DWORD)-1 && SendMessage(hwndMonSel, MSLM_GETMONITORINFO, index, (LPARAM)&info))
+ {
+ info.Size.cx = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
+ info.Size.cy = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
+ SendMessage(hwndMonSel, MSLM_SETMONITORINFO, index, (LPARAM)&info);
+ }
+}
+
+static int
+CompareSettings(PSETTINGS_ENTRY Entry, DWORD dmPelsWidth, DWORD dmPelsHeight,
+ DWORD dmBitsPerPel, DWORD dmDisplayFrequency)
+{
+ if (Entry->dmPelsWidth == dmPelsWidth &&
+ Entry->dmPelsHeight == dmPelsHeight &&
+ Entry->dmBitsPerPel == dmBitsPerPel &&
+ Entry->dmDisplayFrequency == dmDisplayFrequency)
+ {
+ return 0;
+ }
+ else
+ if ((Entry->dmPelsWidth < dmPelsWidth) ||
+ (Entry->dmPelsWidth == dmPelsWidth && Entry->dmPelsHeight < dmPelsHeight) ||
+ (Entry->dmPelsWidth == dmPelsWidth && Entry->dmPelsHeight == dmPelsHeight &&
+ Entry->dmBitsPerPel < dmBitsPerPel))
+ {
+ return 1;
+ }
+ return -1;
}
static PSETTINGS_ENTRY
PSETTINGS_ENTRY Settings = NULL;
HDC hDC;
PSETTINGS_ENTRY Current;
- DWORD bpp, xres, yres, checkbpp;
+ DWORD bpp, xres, yres;
DWORD curDispFreq;
/* Get current settings */
DeleteDC(hDC);
/* List all settings */
- devmode.dmSize = (WORD)sizeof(DEVMODE);
+ devmode.dmSize = (WORD)sizeof(devmode);
devmode.dmDriverExtra = 0;
if (!EnumDisplaySettingsEx(DeviceName, ENUM_CURRENT_SETTINGS, &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;
+ iMode++;
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;
}
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;
}
NbSettings++;
}
- iMode++;
}
*pSettingsCount = NbSettings;
LPTSTR name = NULL;
LPTSTR key = NULL;
LPTSTR devid = NULL;
- DWORD descriptionSize, nameSize, keySize, devidSize;
+ SIZE_T descriptionSize, nameSize, keySize, devidSize;
PSETTINGS_ENTRY Current;
DWORD ResolutionsCount = 1;
DWORD i;
for (Current = newEntry->Settings; Current != NULL; Current = Current->Flink)
{
if (Current->Flink != NULL &&
- ((Current->dmPelsWidth != Current->Flink->dmPelsWidth) &&
- (Current->dmPelsHeight != Current->Flink->dmPelsHeight)))
+ ((Current->dmPelsWidth != Current->Flink->dmPelsWidth) ||
+ (Current->dmPelsHeight != Current->Flink->dmPelsHeight)))
{
ResolutionsCount++;
}
{
if (Current->Flink == NULL ||
(Current->Flink != NULL &&
- ((Current->dmPelsWidth != Current->Flink->dmPelsWidth) &&
- (Current->dmPelsHeight != Current->Flink->dmPelsHeight))))
+ ((Current->dmPelsWidth != Current->Flink->dmPelsWidth) ||
+ (Current->dmPelsHeight != Current->Flink->dmPelsHeight))))
{
newEntry->Resolutions[i].dmPelsWidth = Current->dmPelsWidth;
newEntry->Resolutions[i].dmPelsHeight = Current->dmPelsHeight;
/* Get video cards list */
pData->DisplayDeviceList = NULL;
- displayDevice.cb = (DWORD)sizeof(DISPLAY_DEVICE);
+ displayDevice.cb = sizeof(displayDevice);
while (EnumDisplayDevices(NULL, iDevNum, &displayDevice, 0x1))
{
if ((displayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0)
}
/* Initialize the color spectrum bitmaps */
- for(i = 0; i < NUM_SPECTRUM_BITMAPS; i++)
+ for (i = 0; i < NUM_SPECTRUM_BITMAPS; i++)
{
pData->hSpectrumBitmaps[i] = LoadImageW(hApplet, MAKEINTRESOURCEW(IDB_SPECTRUM_4 + i), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
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;
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)
{
if (Current->dmPelsHeight == dmNewPelsHeight
- && Current->dmPelsWidth == dmNewPelsWidth
- && Current->dmBitsPerPel == pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel)
+ && Current->dmPelsWidth == dmNewPelsWidth
+ && Current->dmBitsPerPel == dmBitsPerPel)
{
pData->CurrentDisplayDevice->CurrentSettings = Current;
UpdateDisplay(hwndDlg, pData, bUpdateThumb);
while (Current != NULL)
{
if (Current->dmPelsHeight == dmNewPelsHeight
- && Current->dmPelsWidth == dmNewPelsWidth
- && Current->dmBitsPerPel == pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel)
+ && Current->dmPelsWidth == dmNewPelsWidth
+ && Current->dmBitsPerPel == dmBitsPerPel)
{
pData->CurrentDisplayDevice->CurrentSettings = Current;
UpdateDisplay(hwndDlg, pData, bUpdateThumb);
return Ret;
}
+static VOID
+ApplyDisplaySettings(HWND hwndDlg, PDATA pData)
+{
+ TCHAR Message[1024], Title[256];
+ DEVMODE devmode;
+ LONG rc;
+
+ RtlZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ devmode.dmPelsWidth = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
+ devmode.dmPelsHeight = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
+ devmode.dmBitsPerPel = pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel;
+ devmode.dmDisplayFrequency = pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency;
+ devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
+
+ rc = ChangeDisplaySettingsEx(pData->CurrentDisplayDevice->DeviceName,
+ &devmode,
+ NULL,
+ CDS_UPDATEREGISTRY,
+ NULL);
+ switch (rc)
+ {
+ case DISP_CHANGE_SUCCESSFUL:
+ break;
+
+ case DISP_CHANGE_RESTART:
+ LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
+ LoadString(hApplet, IDS_APPLY_NEEDS_RESTART, Message, sizeof(Message) / sizeof (TCHAR));
+ MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONINFORMATION);
+ return;
+
+ case DISP_CHANGE_FAILED:
+ default:
+ LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
+ LoadString(hApplet, IDS_APPLY_FAILED, Message, sizeof(Message) / sizeof (TCHAR));
+ MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONSTOP);
+ return;
+ }
+
+ LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
+
+ if (MessageBox(hwndDlg, _T("Do you want to keep these display settings?"), Title, MB_YESNO | MB_ICONQUESTION) == IDYES)
+ {
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
+ pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel = pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel;
+ }
+ else
+ {
+ devmode.dmPelsWidth = pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth;
+ devmode.dmPelsHeight = pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight;
+ devmode.dmBitsPerPel = pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel;
+ devmode.dmDisplayFrequency = pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency;
+
+ rc = ChangeDisplaySettingsEx(pData->CurrentDisplayDevice->DeviceName,
+ &devmode,
+ NULL,
+ CDS_UPDATEREGISTRY,
+ NULL);
+ switch (rc)
+ {
+ case DISP_CHANGE_SUCCESSFUL:
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth = pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth;
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight = pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight;
+ pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel = pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel;
+ UpdateDisplay(hwndDlg, pData, TRUE);
+ break;
+
+ case DISP_CHANGE_RESTART:
+ LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
+ LoadString(hApplet, IDS_APPLY_NEEDS_RESTART, Message, sizeof(Message) / sizeof (TCHAR));
+ MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONINFORMATION);
+ return;
+
+ case DISP_CHANGE_FAILED:
+ default:
+ LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
+ LoadString(hApplet, IDS_APPLY_FAILED, Message, sizeof(Message) / sizeof (TCHAR));
+ MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONSTOP);
+ return;
+ }
+ }
+}
+
/* Property page dialog callback */
INT_PTR CALLBACK
SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
{
PDATA pData;
- TCHAR Message[1024], Title[256];
pData = (PDATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
|| pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight != pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight
|| pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel != pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel)
{
- /* FIXME: Need to test changes */
/* Apply new settings */
- LONG rc;
- DEVMODE devmode;
- RtlZeroMemory(&devmode, sizeof(DEVMODE));
- devmode.dmSize = (WORD)sizeof(DEVMODE);
- devmode.dmPelsWidth = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
- devmode.dmPelsHeight = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
- devmode.dmBitsPerPel = pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel;
- devmode.dmDisplayFrequency = pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency;
- devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
- rc = ChangeDisplaySettingsEx(
- pData->CurrentDisplayDevice->DeviceName,
- &devmode,
- NULL,
- CDS_UPDATEREGISTRY,
- NULL);
- switch (rc)
- {
- case DISP_CHANGE_SUCCESSFUL:
- pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
- pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
- pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel = pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel;
- break;
- case DISP_CHANGE_RESTART:
- LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
- LoadString(hApplet, IDS_APPLY_NEEDS_RESTART, Message, sizeof(Message) / sizeof (TCHAR));
- MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONINFORMATION);
- break;
- case DISP_CHANGE_FAILED:
- default:
- LoadString(hApplet, IDS_DISPLAY_SETTINGS, Title, sizeof(Title) / sizeof(TCHAR));
- LoadString(hApplet, IDS_APPLY_FAILED, Message, sizeof(Message) / sizeof (TCHAR));
- MessageBox(hwndDlg, Message, Title, MB_OK | MB_ICONSTOP);
- break;
- }
+ ApplyDisplaySettings(hwndDlg, pData);
}
}
break;