DESK_EXT_INTERFACE ExtInterface;
+ PDEVMODEW lpOrigDevMode;
+ PDEVMODEW lpCurDevMode;
+ PDEVMODEW * DevModes;
+ DWORD nDevModes;
DWORD StateFlags;
union
CDevSettings_EnumAllModes(PVOID Context,
DWORD Index)
{
- //PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
- /* FIXME: Implement */
+ PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
+ DWORD i, idx = 0;
+
DPRINT1("CDevSettings::EnumAllModes(%u)\n", Index);
+
+ if (!This->DevModes)
+ return NULL;
+
+ for (i = 0; i < This->nDevModes; i++)
+ {
+ /* FIXME: Add more sanity checks */
+ if (!This->DevModes[i])
+ continue;
+
+ if (idx == Index)
+ return This->DevModes[i];
+
+ idx++;
+ }
+
return NULL;
}
PDEVMODEW DESK_EXT_CALLBACK
CDevSettings_GetCurrentMode(PVOID Context)
{
- //PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
- /* FIXME: Implement */
+ PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
+
DPRINT1("CDevSettings::GetCurrentMode\n");
- return NULL;
+ return This->lpCurDevMode;
}
BOOL DESK_EXT_CALLBACK
CDevSettings_SetCurrentMode(PVOID Context,
- const DEVMODEW *pDevMode)
+ DEVMODEW *pDevMode)
{
- //PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
- /* FIXME: Implement */
+ PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
+ DWORD i;
+
DPRINT1("CDevSettings::SetCurrentMode(0x%p)\n", pDevMode);
+
+ if (!This->DevModes)
+ return FALSE;
+
+ for (i = 0; i < This->nDevModes; i++)
+ {
+ /* FIXME: Add more sanity checks */
+ if (!This->DevModes[i])
+ continue;
+
+ if (This->DevModes[i] == pDevMode)
+ {
+ This->lpCurDevMode = pDevMode;
+ return TRUE;
+ }
+ }
+
return FALSE;
}
PDISPLAY_DEVICE_ENTRY DisplayDeviceInfo)
{
HKEY hKey;
+ DWORD i = 0, dwSize;
+ DEVMODEW devmode;
+ This->lpOrigDevMode = NULL;
+ This->lpCurDevMode = NULL;
+ This->DevModes = NULL;
+ This->nDevModes = 0;
This->Flags = 0;
This->StateFlags = DisplayDeviceInfo->DeviceStateFlags;
DPRINT1("This->StateFlags: %x\n", This->StateFlags);
if (hKey != NULL)
{
DWORD dw = 0;
- DWORD dwType, dwSize;
+ DWORD dwType;
dwSize = sizeof(dw);
if (RegQueryValueEx(hKey,
RegCloseKey(hKey);
}
+ /* Initialize display modes */
+ ZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ while (EnumDisplaySettingsExW(This->pDisplayDevice, i, &devmode, EDS_RAWMODE))
+ {
+ dwSize = devmode.dmSize + devmode.dmDriverExtra;
+ PDEVMODEW pDevMode = LocalAlloc(LMEM_FIXED, dwSize);
+ PDEVMODEW * DevModesNew = NULL;
+
+ if (pDevMode)
+ {
+ CopyMemory(pDevMode,
+ &devmode,
+ dwSize);
+
+ dwSize = (This->nDevModes + 1) * sizeof(pDevMode);
+ DevModesNew = LocalAlloc(LMEM_FIXED, dwSize);
+ if (DevModesNew)
+ {
+ if (This->DevModes)
+ {
+ CopyMemory(DevModesNew,
+ This->DevModes,
+ This->nDevModes * sizeof(pDevMode));
+
+ LocalFree(This->DevModes);
+ }
+
+ This->DevModes = DevModesNew;
+ This->DevModes[This->nDevModes++] = pDevMode;
+ }
+ else
+ {
+ DPRINT1("LocalAlloc failed to allocate %d bytes\n", dwSize);
+ return E_OUTOFMEMORY;
+ }
+ }
+ else
+ {
+ DPRINT1("LocalAlloc failed to allocate %d bytes\n", dwSize);
+ return E_OUTOFMEMORY;
+ }
+
+ devmode.dmDriverExtra = 0;
+ i++;
+ }
+
+ /* FIXME: Detect duplicated modes and mark them.
+ * Enumeration functions should check these marks
+ * and skip corresponding array entries. */
+
+ /* Get current display mode */
+ ZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ if (EnumDisplaySettingsExW(This->pDisplayDevice, ENUM_CURRENT_SETTINGS, &devmode, 0))
+ {
+ for (i = 0; i < This->nDevModes; i++)
+ {
+ PDEVMODEW CurMode = This->DevModes[i];
+
+ if (!CurMode)
+ continue;
+
+ if (((CurMode->dmFields & DM_PELSWIDTH) && devmode.dmPelsWidth == CurMode->dmPelsWidth) &&
+ ((CurMode->dmFields & DM_PELSHEIGHT) && devmode.dmPelsHeight == CurMode->dmPelsHeight) &&
+ ((CurMode->dmFields & DM_BITSPERPEL) && devmode.dmBitsPerPel == CurMode->dmBitsPerPel) &&
+ ((CurMode->dmFields & DM_DISPLAYFREQUENCY) && devmode.dmDisplayFrequency == CurMode->dmDisplayFrequency))
+ {
+ This->lpOrigDevMode = This->lpCurDevMode = CurMode;
+ break;
+ }
+ }
+ }
+
/* Initialize the shell extension interface */
pCDevSettings_InitializeExtInterface(This);
static VOID
pCDevSettings_Free(PCDevSettings This)
{
+ This->lpOrigDevMode = NULL;
+ This->lpCurDevMode = NULL;
+ while (This->nDevModes)
+ {
+ LocalFree(This->DevModes[--This->nDevModes]);
+ }
+ LocalFree(This->DevModes);
+ This->DevModes = NULL;
+
pCDevSettings_FreeString(&This->pDisplayDevice);
pCDevSettings_FreeString(&This->pDisplayName);
pCDevSettings_FreeString(&This->pDisplayKey);
DisplaySaveSettings(PVOID pContext,
HWND hwndPropSheet)
{
- //PCDevSettings This = impl_from_IDataObject((IDataObject *)Context);
- DPRINT("DisplaySaveSettings() UNIMPLEMENTED!\n");
- return DISP_CHANGE_BADPARAM;
+ PCDevSettings This = impl_from_IDataObject((IDataObject *)pContext);
+ LONG rc = DISP_CHANGE_SUCCESSFUL;
+
+ if (This->lpCurDevMode != This->lpOrigDevMode)
+ {
+ SETTINGS_ENTRY seOrig, seCur;
+ BOOL Ret;
+
+ seOrig.dmPelsWidth = This->lpOrigDevMode->dmPelsWidth;
+ seOrig.dmPelsHeight = This->lpOrigDevMode->dmPelsHeight;
+ seOrig.dmBitsPerPel = This->lpOrigDevMode->dmBitsPerPel;
+ seOrig.dmDisplayFrequency = This->lpOrigDevMode->dmDisplayFrequency;
+
+ seCur.dmPelsWidth = This->lpCurDevMode->dmPelsWidth;
+ seCur.dmPelsHeight = This->lpCurDevMode->dmPelsHeight;
+ seCur.dmBitsPerPel = This->lpCurDevMode->dmBitsPerPel;
+ seCur.dmDisplayFrequency = This->lpCurDevMode->dmDisplayFrequency;
+
+ Ret = SwitchDisplayMode(hwndPropSheet,
+ This->pDisplayDevice,
+ &seOrig,
+ &seCur,
+ &rc);
+
+ if (rc == DISP_CHANGE_SUCCESSFUL)
+ {
+ if (Ret)
+ This->lpOrigDevMode = This->lpCurDevMode;
+ else
+ This->lpCurDevMode = This->lpOrigDevMode;
+ }
+ }
+
+ return rc;
}
return FALSE;
}
-static VOID
-ApplyDisplaySettings(HWND hwndDlg, PSETTINGS_DATA pData)
+BOOL
+SwitchDisplayMode(HWND hwndDlg, PWSTR DeviceName, PSETTINGS_ENTRY seInit, PSETTINGS_ENTRY seNew, OUT PLONG rc)
{
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.dmPelsWidth = seNew->dmPelsWidth;
+ devmode.dmPelsHeight = seNew->dmPelsHeight;
+ devmode.dmBitsPerPel = seNew->dmBitsPerPel;
+ devmode.dmDisplayFrequency = seNew->dmDisplayFrequency;
devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
- rc = ChangeDisplaySettingsEx(pData->CurrentDisplayDevice->DeviceName,
- &devmode,
- NULL,
- CDS_UPDATEREGISTRY,
- NULL);
- switch (rc)
+ *rc = ChangeDisplaySettingsEx(DeviceName,
+ &devmode,
+ NULL,
+ CDS_UPDATEREGISTRY,
+ NULL);
+ switch (*rc)
{
case DISP_CHANGE_SUCCESSFUL:
break;
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;
+ return FALSE;
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;
+ return FALSE;
}
if (DialogBox(hApplet, MAKEINTRESOURCE(IDD_CONFIRMSETTINGS), hwndDlg, ConfirmDlgProc) == 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;
- pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency = pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency;
+ return TRUE;
}
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)
+ devmode.dmPelsWidth = seInit->dmPelsWidth;
+ devmode.dmPelsHeight = seInit->dmPelsHeight;
+ devmode.dmBitsPerPel = seInit->dmBitsPerPel;
+ devmode.dmDisplayFrequency = seInit->dmDisplayFrequency;
+
+ *rc = ChangeDisplaySettingsEx(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;
- pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency = pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency;
- UpdateDisplay(hwndDlg, pData, TRUE);
- break;
+ return FALSE;
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;
+ return FALSE;
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;
+ return FALSE;
}
}
}
+static VOID
+ApplyDisplaySettings(HWND hwndDlg, PSETTINGS_DATA pData)
+{
+ BOOL Ret;
+ LONG rc;
+
+ Ret = SwitchDisplayMode(hwndDlg,
+ pData->CurrentDisplayDevice->DeviceName,
+ &pData->CurrentDisplayDevice->InitialSettings,
+ pData->CurrentDisplayDevice->CurrentSettings,
+ &rc);
+
+ if (rc != DISP_CHANGE_SUCCESSFUL)
+ return;
+
+ if (Ret)
+ {
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth = pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth;
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight = pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight;
+ pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel = pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel;
+ pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency = pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency;
+ }
+ else
+ {
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth = pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth;
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight = pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight;
+ pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel = pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel;
+ pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency = pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency;
+ UpdateDisplay(hwndDlg, pData, TRUE);
+ }
+}
+
/* Property page dialog callback */
INT_PTR CALLBACK
SettingsPageProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
DWORD command = HIWORD(wParam);
if (controlId == IDC_SETTINGS_ADVANCED && command == BN_CLICKED)
- DisplayAdvancedSettings(hwndDlg, pData->CurrentDisplayDevice);
+ {
+ if (DisplayAdvancedSettings(hwndDlg, pData->CurrentDisplayDevice))
+ {
+ DEVMODE devmode;
+ ZeroMemory(&devmode, sizeof(devmode));
+ devmode.dmSize = (WORD)sizeof(devmode);
+ if (EnumDisplaySettingsExW(pData->CurrentDisplayDevice->DeviceName, ENUM_CURRENT_SETTINGS, &devmode, 0))
+ {
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth = devmode.dmPelsWidth;
+ pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight = devmode.dmPelsHeight;
+ pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel = devmode.dmBitsPerPel;
+ pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency = devmode.dmDisplayFrequency;
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsWidth = pData->CurrentDisplayDevice->InitialSettings.dmPelsWidth;
+ pData->CurrentDisplayDevice->CurrentSettings->dmPelsHeight = pData->CurrentDisplayDevice->InitialSettings.dmPelsHeight;
+ pData->CurrentDisplayDevice->CurrentSettings->dmBitsPerPel = pData->CurrentDisplayDevice->InitialSettings.dmBitsPerPel;
+ pData->CurrentDisplayDevice->CurrentSettings->dmDisplayFrequency = pData->CurrentDisplayDevice->InitialSettings.dmDisplayFrequency;
+ UpdateDisplay(hwndDlg, pData, TRUE);
+ }
+ }
+ }
else if (controlId == IDC_SETTINGS_BPP && command == CBN_SELCHANGE)
OnBPPChanged(hwndDlg, pData);
break;