{
PWINSTATION_OBJECT WinStaObject;
NTSTATUS Status;
+ BOOL bChanged = FALSE;
static BOOL bInitialized = FALSE;
static LOGFONTW IconFont;
static NONCLIENTMETRICSW pMetrics;
+ static MINIMIZEDMETRICS MinimizedMetrics;
static BOOL GradientCaptions = TRUE;
static UINT FocusBorderHeight = 1;
static UINT FocusBorderWidth = 1;
pMetrics.iMenuHeight = UserGetSystemMetrics(SM_CYMENUSIZE);
pMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
+ MinimizedMetrics.cbSize = sizeof(MINIMIZEDMETRICS);
+ MinimizedMetrics.iWidth = UserGetSystemMetrics(SM_CXMINIMIZED);
+ MinimizedMetrics.iHorzGap = UserGetSystemMetrics(SM_CXMINSPACING);
+ MinimizedMetrics.iVertGap = UserGetSystemMetrics(SM_CYMINSPACING);
+ MinimizedMetrics.iArrange = ARW_HIDE;
+
bInitialized = TRUE;
}
case SPI_SETDOUBLECLKHEIGHT:
case SPI_SETDOUBLECLICKTIME:
case SPI_SETDESKWALLPAPER:
+ case SPI_SETSCREENSAVERRUNNING:
+ case SPI_SETSCREENSAVETIMEOUT:
+ case SPI_SETFLATMENU:
+ /* We will change something, so set the flag here */
+ bChanged = TRUE;
case SPI_GETDESKWALLPAPER:
case SPI_GETWHEELSCROLLLINES:
case SPI_GETWHEELSCROLLCHARS:
- case SPI_SETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVERRUNNING:
case SPI_GETSCREENSAVETIMEOUT:
- case SPI_SETSCREENSAVETIMEOUT:
case SPI_GETSCREENSAVEACTIVE:
case SPI_GETFLATMENU:
- case SPI_SETFLATMENU:
{
PSYSTEM_CURSORINFO CurInfo;
switch(uiAction)
{
case SPI_GETFLATMENU:
- if (pvParam != NULL) *((UINT*)pvParam) = WinStaObject->FlatMenu;
- return TRUE;
+ ASSERT(pvParam);
+ *((UINT*)pvParam) = WinStaObject->FlatMenu;
break;
case SPI_SETFLATMENU:
- WinStaObject->FlatMenu = uiParam;
+ WinStaObject->FlatMenu = uiParam;
break;
case SPI_GETSCREENSAVETIMEOUT:
- if (pvParam != NULL) *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut;
- return TRUE;
- break;
- case SPI_SETSCREENSAVETIMEOUT:
- WinStaObject->ScreenSaverTimeOut = uiParam;
+ ASSERT(pvParam);
+ *((UINT*)pvParam) = WinStaObject->ScreenSaverTimeOut;
+ break;
+ case SPI_SETSCREENSAVETIMEOUT:
+ WinStaObject->ScreenSaverTimeOut = uiParam;
break;
case SPI_GETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
- return TRUE;
break;
- case SPI_SETSCREENSAVERRUNNING:
+ case SPI_SETSCREENSAVERRUNNING:
if (pvParam != NULL) *((BOOL*)pvParam) = WinStaObject->ScreenSaverRunning;
- WinStaObject->ScreenSaverRunning = uiParam;
+ WinStaObject->ScreenSaverRunning = uiParam;
break;
case SPI_GETSCREENSAVEACTIVE:
/* FIXME: how to disable the screensaver? */
- if (pvParam != NULL) *((BOOL*)pvParam) = TRUE;
- return TRUE;
+ ASSERT(pvParam);
+ *((BOOL*)pvParam) = TRUE;
break;
case SPI_GETWHEELSCROLLLINES:
+ ASSERT(pvParam);
CurInfo = IntGetSysCursorInfo(WinStaObject);
- if (pvParam != NULL) *((UINT*)pvParam) = CurInfo->WheelScroLines;
+ *((UINT*)pvParam) = CurInfo->WheelScroLines;
/* FIXME add this value to scroll list as scroll value ?? */
- return TRUE;
break;
case SPI_GETWHEELSCROLLCHARS:
+ ASSERT(pvParam);
CurInfo = IntGetSysCursorInfo(WinStaObject);
- if (pvParam != NULL) *((UINT*)pvParam) = CurInfo->WheelScroChars;
+ *((UINT*)pvParam) = CurInfo->WheelScroChars;
// FIXME add this value to scroll list as scroll value ??
- return TRUE;
break;
case SPI_SETDOUBLECLKWIDTH:
CurInfo = IntGetSysCursorInfo(WinStaObject);
if(!KeyValuePartialInfo)
{
NtClose(KeyHandle);
- return 0;
+ return FALSE;
}
Status = ZwQueryValueKey(KeyHandle, &Tile, KeyValuePartialInformation,
{
ZwClose(KeyHandle);
ExFreePool(KeyValuePartialInfo);
- return 0;
+ return FALSE;
}
Tile.Length = KeyValuePartialInfo->DataLength;
if(!KeyValuePartialInfo)
{
ZwClose(KeyHandle);
- return 0;
+ return FALSE;
}
Status = ZwQueryValueKey(KeyHandle, &Style, KeyValuePartialInformation,
{
ZwClose(KeyHandle);
ExFreePool(KeyValuePartialInfo);
- return 0;
+ return FALSE;
}
Style.Length = KeyValuePartialInfo->DataLength;
/* FIXME save the value to the registry */
ObDereferenceObject(WinStaObject);
- return TRUE;
+ break;
}
case SPI_SETWORKAREA:
{
ASSERT(pvParam);
rc = (RECT*)pvParam;
Desktop->WorkArea = *rc;
+ bChanged = TRUE;
- return TRUE;
+ break;
}
case SPI_GETWORKAREA:
{
ASSERT(pvParam);
IntGetDesktopWorkArea(Desktop, (PRECT)pvParam);
- return TRUE;
+ break;
}
case SPI_SETGRADIENTCAPTIONS:
{
GradientCaptions = (pvParam != NULL);
/* FIXME - should be checked if the color depth is higher than 8bpp? */
- return TRUE;
+ bChanged = TRUE;
+ break;
}
case SPI_GETGRADIENTCAPTIONS:
{
BOOL Ret = GradientCaptions;
hDC = IntGetScreenDC();
- if(hDC)
+ if(!hDC)
{
+ return FALSE;
+ }
Ret = (NtGdiGetDeviceCaps(hDC, BITSPIXEL) > 8) && Ret;
ASSERT(pvParam);
*((PBOOL)pvParam) = Ret;
- return TRUE;
+ break;
}
- return FALSE;
- }
case SPI_SETFONTSMOOTHING:
{
IntEnableFontRendering(uiParam != 0);
- return TRUE;
+ bChanged = TRUE;
+ break;
}
case SPI_GETFONTSMOOTHING:
{
ASSERT(pvParam);
*((BOOL*)pvParam) = IntIsFontRenderingEnabled();
- return TRUE;
+ break;
}
case SPI_GETICONTITLELOGFONT:
{
ASSERT(pvParam);
*((LOGFONTW*)pvParam) = IconFont;
- return TRUE;
+ break;
}
case SPI_GETNONCLIENTMETRICS:
{
ASSERT(pvParam);
*((NONCLIENTMETRICSW*)pvParam) = pMetrics;
- return TRUE;
+ break;
}
case SPI_SETNONCLIENTMETRICS:
{
ASSERT(pvParam);
pMetrics = *((NONCLIENTMETRICSW*)pvParam);
- return TRUE;
+ bChanged = TRUE;
+ break;
+ }
+ case SPI_GETMINIMIZEDMETRICS:
+ {
+ ASSERT(pvParam);
+ *((MINIMIZEDMETRICS*)pvParam) = MinimizedMetrics;
+ break;
+ }
+ case SPI_SETMINIMIZEDMETRICS:
+ {
+ ASSERT(pvParam);
+ MinimizedMetrics = *((MINIMIZEDMETRICS*)pvParam);
+ bChanged = TRUE;
+ break;
}
case SPI_GETFOCUSBORDERHEIGHT:
{
ASSERT(pvParam);
*((UINT*)pvParam) = FocusBorderHeight;
- return TRUE;
+ break;
}
case SPI_GETFOCUSBORDERWIDTH:
{
ASSERT(pvParam);
*((UINT*)pvParam) = FocusBorderWidth;
- return TRUE;
+ break;
}
case SPI_SETFOCUSBORDERHEIGHT:
{
FocusBorderHeight = (UINT)pvParam;
- return TRUE;
+ bChanged = TRUE;
+ break;
}
case SPI_SETFOCUSBORDERWIDTH:
{
FocusBorderWidth = (UINT)pvParam;
- return TRUE;
+ bChanged = TRUE;
+ break;
}
default:
return FALSE;
}
}
- return FALSE;
+ /* Did we change something ? */
+ if (bChanged)
+ {
+ /* Shall we send a WM_SETTINGCHANGE message ? */
+ if (fWinIni & (SPIF_UPDATEINIFILE | SPIF_SENDCHANGE))
+ {
+ /* Broadcast WM_SETTINGCHANGE to all toplevel windows */
+ /* FIXME: lParam should be pointer to a string containing the reg key */
+ UserPostMessage(HWND_BROADCAST, WM_SETTINGCHANGE, (WPARAM)uiAction, 0);
+}
+ }
+ return TRUE;
}
/*
}
return( TRUE);
}
+ case SPI_GETMINIMIZEDMETRICS:
+ case SPI_SETMINIMIZEDMETRICS:
+ {
+ MINIMIZEDMETRICS minimetrics;
+
+ Status = MmCopyFromCaller(&minimetrics, pvParam, sizeof(MINIMIZEDMETRICS));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ return( FALSE);
+ }
+ if(minimetrics.cbSize != sizeof(MINIMIZEDMETRICS))
+ {
+ SetLastWin32Error(ERROR_INVALID_PARAMETER);
+ return( FALSE);
+ }
+ if(!IntSystemParametersInfo(uiAction, uiParam, &minimetrics, fWinIni))
+ {
+ return( FALSE);
+ }
+
+ Status = MmCopyToCaller(pvParam, &minimetrics, sizeof(MINIMIZEDMETRICS));
+ if(!NT_SUCCESS(Status))
+ {
+ SetLastNtError(Status);
+ return( FALSE);
+ }
+ return( TRUE);
+ }
default :
{
DPRINT1("FIXME: UNIMPLEMENTED SPI Code: %lx \n",uiAction );