}
}
else if (pdm->dmSize < FIELD_OFFSET(DEVMODEW, dmFields))
- return DISP_CHANGE_BADMODE; /* This is what winXP SP3 returns */
+ {
+ return DISP_CHANGE_BADMODE; /* This is what WinXP SP3 returns */
+ }
else
+ {
dm = *pdm;
+ }
/* Save original bit count */
OrigBC = gpsi->BitCount;
}
/* Fixup values */
- if(dm.dmBitsPerPel == 0 || !(dm.dmFields & DM_BITSPERPEL))
+ if (dm.dmBitsPerPel == 0 || !(dm.dmFields & DM_BITSPERPEL))
{
dm.dmBitsPerPel = ppdev->pdmwDev->dmBitsPerPel;
dm.dmFields |= DM_BITSPERPEL;
}
- if((dm.dmFields & DM_DISPLAYFREQUENCY) && (dm.dmDisplayFrequency == 0))
+ if ((dm.dmFields & DM_DISPLAYFREQUENCY) && (dm.dmDisplayFrequency == 0))
dm.dmDisplayFrequency = ppdev->pdmwDev->dmDisplayFrequency;
/* Look for the requested DEVMODE */
}
}
+ /* Check if DEVMODE matches the current mode */
+ if (pdm == ppdev->pdmwDev && !(flags & CDS_RESET))
+ {
+ ERR("DEVMODE matches, nothing to do\n");
+ goto leave;
+ }
+
/* Shall we apply the settings? */
if (!(flags & CDS_NORESET))
{
pvOldCursor = UserSetCursor(pvOldCursor, TRUE);
ASSERT(pvOldCursor == NULL);
- /* Check for failure */
+ /* Check for success or failure */
if (!ulResult)
{
+ /* Setting mode failed */
ERR("Failed to set mode\n");
- lResult = (lResult == DISP_CHANGE_NOTUPDATED) ?
- DISP_CHANGE_FAILED : DISP_CHANGE_RESTART;
- goto leave;
+ /* Set the correct return value */
+ if ((flags & CDS_UPDATEREGISTRY) && (lResult != DISP_CHANGE_NOTUPDATED))
+ lResult = DISP_CHANGE_RESTART;
+ else
+ lResult = DISP_CHANGE_FAILED;
}
+ else
+ {
+ /* Setting mode succeeded */
+ lResult = DISP_CHANGE_SUCCESSFUL;
- UserUpdateFullscreen(flags);
+ UserUpdateFullscreen(flags);
- /* Update the system metrics */
- InitMetrics();
+ /* Update the system metrics */
+ InitMetrics();
- /* Set new size of the monitor */
- UserUpdateMonitorSize((HDEV)ppdev);
+ /* Set new size of the monitor */
+ UserUpdateMonitorSize((HDEV)ppdev);
- /* Update the SERVERINFO */
- gpsi->dmLogPixels = ppdev->gdiinfo.ulLogPixelsY;
- gpsi->Planes = ppdev->gdiinfo.cPlanes;
- gpsi->BitsPixel = ppdev->gdiinfo.cBitsPixel;
- gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel;
- if (ppdev->gdiinfo.flRaster & RC_PALETTE)
- {
- gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY;
+ /* Update the SERVERINFO */
+ gpsi->dmLogPixels = ppdev->gdiinfo.ulLogPixelsY;
+ gpsi->Planes = ppdev->gdiinfo.cPlanes;
+ gpsi->BitsPixel = ppdev->gdiinfo.cBitsPixel;
+ gpsi->BitCount = gpsi->Planes * gpsi->BitsPixel;
+ gpsi->aiSysMet[SM_CXSCREEN] = ppdev->gdiinfo.ulHorzRes;
+ gpsi->aiSysMet[SM_CYSCREEN] = ppdev->gdiinfo.ulVertRes;
+ if (ppdev->gdiinfo.flRaster & RC_PALETTE)
+ {
+ gpsi->PUSIFlags |= PUSIF_PALETTEDISPLAY;
+ }
+ else
+ {
+ gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY;
+ }
+ // Font is realized and this dc was previously set to internal DC_ATTR.
+ gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar);
+ gpsi->tmSysFont = tmw;
}
- else
- gpsi->PUSIFlags &= ~PUSIF_PALETTEDISPLAY;
- // Font is realized and this dc was previously set to internal DC_ATTR.
- gpsi->cxSysFontChar = IntGetCharDimensions(hSystemBM, &tmw, (DWORD*)&gpsi->cySysFontChar);
- gpsi->tmSysFont = tmw;
+
+ /*
+ * Refresh the display on success and even on failure,
+ * since the display may have been messed up.
+ */
/* Remove all cursor clipping */
UserClipCursor(NULL);
//IntHideDesktop(pdesk);
/* Send WM_DISPLAYCHANGE to all toplevel windows */
- UserSendNotifyMessage( HWND_BROADCAST,
- WM_DISPLAYCHANGE,
- gpsi->BitCount,
- MAKELONG(gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN]) );
+ co_IntSendMessageTimeout( HWND_BROADCAST,
+ WM_DISPLAYCHANGE,
+ gpsi->BitCount,
+ MAKELONG(gpsi->aiSysMet[SM_CXSCREEN], gpsi->aiSysMet[SM_CYSCREEN]),
+ SMTO_NORMAL,
+ 100,
+ &ulResult );
ERR("BitCount New %d Orig %d ChkNew %d\n",gpsi->BitCount,OrigBC,ppdev->gdiinfo.cBitsPixel);
/* Not full screen and different bit count, send messages */
if (!(flags & CDS_FULLSCREEN) &&
- gpsi->BitCount != OrigBC )
+ gpsi->BitCount != OrigBC)
{
- ERR("Detect settings changed.\n");
- UserSendNotifyMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0 );
- UserSendNotifyMessage( HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0 );
+ ERR("Detect settings changed.\n");
+ UserSendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
+ UserSendNotifyMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
}
//co_IntShowDesktop(pdesk, ppdev->gdiinfo.ulHorzRes, ppdev->gdiinfo.ulVertRes);
return DISP_CHANGE_BADFLAGS;
}
+ if ((dwflags & CDS_RESET) && (dwflags & CDS_NORESET))
+ {
+ return DISP_CHANGE_BADFLAGS;
+ }
+
/* Copy the device name */
if (pustrDevice)
{