2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: System parameters functions
5 * FILE: subsystem/win32/win32k/ntuser/sysparam.c
6 * PROGRAMER: Ge van Geldorp (ge@gse.nl)
8 * 2008/03/20 Split from misc.c
18 IntGetFontMetricSetting(LPWSTR lpValueName
, PLOGFONTW font
)
20 RTL_QUERY_REGISTRY_TABLE QueryTable
[2];
22 /* Firefox 1.0.7 depends on the lfHeight value being negative */
23 static LOGFONTW DefaultFont
= {
24 -11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
25 0, 0, DEFAULT_QUALITY
, VARIABLE_PITCH
| FF_SWISS
,
29 RtlZeroMemory(&QueryTable
, sizeof(QueryTable
));
31 QueryTable
[0].Name
= lpValueName
;
32 QueryTable
[0].Flags
= RTL_QUERY_REGISTRY_DIRECT
| RTL_QUERY_REGISTRY_REQUIRED
;
33 QueryTable
[0].EntryContext
= font
;
35 Status
= RtlQueryRegistryValues(
37 L
"Control Panel\\Desktop\\WindowMetrics",
42 if (!NT_SUCCESS(Status
))
44 RtlCopyMemory(font
, &DefaultFont
, sizeof(LOGFONTW
));
50 IntSystemParametersInfo(
56 PWINSTATION_OBJECT WinStaObject
;
58 BOOL bChanged
= FALSE
;
60 static BOOL bInitialized
= FALSE
;
61 static LOGFONTW IconFont
;
62 static NONCLIENTMETRICSW pMetrics
;
63 static MINIMIZEDMETRICS MinimizedMetrics
;
64 static BOOL GradientCaptions
= TRUE
;
65 static UINT FocusBorderHeight
= 1;
66 static UINT FocusBorderWidth
= 1;
67 static ANIMATIONINFO anim
;
68 static STICKYKEYS StickyKeys
= {sizeof(STICKYKEYS
), 0x1fa};
69 static FILTERKEYS FilterKeys
= {sizeof(FILTERKEYS
), 0, 0, 0, 0, 0};
70 static TOGGLEKEYS ToggleKeys
= {sizeof(TOGGLEKEYS
), 0};
71 static MOUSEKEYS MouseKeys
= {sizeof(MOUSEKEYS
), 0, 0, 0, 0, 0, 0};
72 static BOOL KeyboardPref
= FALSE
;
73 static BOOL ShowSounds
= FALSE
;
74 static ACCESSTIMEOUT AccessTimeout
= {sizeof(ACCESSTIMEOUT
), 0, 0};
75 static SERIALKEYS SerialKeys
= {sizeof(SERIALKEYS
), 0, 0, 0, 0, 0, 0};
79 RtlZeroMemory(&IconFont
, sizeof(LOGFONTW
));
80 RtlZeroMemory(&pMetrics
, sizeof(NONCLIENTMETRICSW
));
82 IntGetFontMetricSetting(L
"CaptionFont", &pMetrics
.lfCaptionFont
);
83 IntGetFontMetricSetting(L
"SmCaptionFont", &pMetrics
.lfSmCaptionFont
);
84 IntGetFontMetricSetting(L
"MenuFont", &pMetrics
.lfMenuFont
);
85 IntGetFontMetricSetting(L
"StatusFont", &pMetrics
.lfStatusFont
);
86 IntGetFontMetricSetting(L
"MessageFont", &pMetrics
.lfMessageFont
);
87 IntGetFontMetricSetting(L
"IconFont", &IconFont
);
89 pMetrics
.iBorderWidth
= 1;
90 pMetrics
.iScrollWidth
= UserGetSystemMetrics(SM_CXVSCROLL
);
91 pMetrics
.iScrollHeight
= UserGetSystemMetrics(SM_CYHSCROLL
);
92 pMetrics
.iCaptionWidth
= UserGetSystemMetrics(SM_CXSIZE
);
93 pMetrics
.iCaptionHeight
= UserGetSystemMetrics(SM_CYSIZE
);
94 pMetrics
.iSmCaptionWidth
= UserGetSystemMetrics(SM_CXSMSIZE
);
95 pMetrics
.iSmCaptionHeight
= UserGetSystemMetrics(SM_CYSMSIZE
);
96 pMetrics
.iMenuWidth
= UserGetSystemMetrics(SM_CXMENUSIZE
);
97 pMetrics
.iMenuHeight
= UserGetSystemMetrics(SM_CYMENUSIZE
);
98 pMetrics
.cbSize
= sizeof(NONCLIENTMETRICSW
);
100 MinimizedMetrics
.cbSize
= sizeof(MINIMIZEDMETRICS
);
101 MinimizedMetrics
.iWidth
= UserGetSystemMetrics(SM_CXMINIMIZED
);
102 MinimizedMetrics
.iHorzGap
= UserGetSystemMetrics(SM_CXMINSPACING
);
103 MinimizedMetrics
.iVertGap
= UserGetSystemMetrics(SM_CYMINSPACING
);
104 MinimizedMetrics
.iArrange
= ARW_HIDE
;
111 case SPI_GETDRAGFULLWINDOWS
:
112 /* FIXME: Implement this, don't just return constant */
113 *(PBOOL
)pvParam
= FALSE
;
118 case SPI_GETKEYBOARDCUES
:
119 /* FIXME: Implement this, don't just return constant */
120 *(PBOOL
)pvParam
= FALSE
;
123 case SPI_SETDOUBLECLKWIDTH
:
124 case SPI_SETDOUBLECLKHEIGHT
:
125 case SPI_SETDOUBLECLICKTIME
:
126 case SPI_SETDESKWALLPAPER
:
127 case SPI_SETSCREENSAVERRUNNING
:
128 case SPI_SETSCREENSAVETIMEOUT
:
129 case SPI_SETFLATMENU
:
130 case SPI_SETMOUSEHOVERTIME
:
131 case SPI_SETMOUSEHOVERWIDTH
:
132 case SPI_SETMOUSEHOVERHEIGHT
:
134 case SPI_SETMOUSESPEED
:
135 case SPI_SETMOUSEBUTTONSWAP
:
136 /* We will change something, so set the flag here */
138 case SPI_GETDESKWALLPAPER
:
139 case SPI_GETWHEELSCROLLLINES
:
140 case SPI_GETWHEELSCROLLCHARS
:
141 case SPI_GETSCREENSAVERRUNNING
:
142 case SPI_GETSCREENSAVETIMEOUT
:
143 case SPI_GETSCREENSAVEACTIVE
:
144 case SPI_GETFLATMENU
:
145 case SPI_GETMOUSEHOVERTIME
:
146 case SPI_GETMOUSEHOVERWIDTH
:
147 case SPI_GETMOUSEHOVERHEIGHT
:
149 case SPI_GETMOUSESPEED
:
151 PSYSTEM_CURSORINFO CurInfo
;
153 Status
= IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation
,
157 if(!NT_SUCCESS(Status
))
159 SetLastNtError(Status
);
165 case SPI_GETKEYBOARDCUES
:
167 *((BOOL
*)pvParam
) = TRUE
;
168 case SPI_GETFLATMENU
:
170 *((UINT
*)pvParam
) = WinStaObject
->FlatMenu
;
172 case SPI_SETFLATMENU
:
173 WinStaObject
->FlatMenu
= (BOOL
)pvParam
;
175 case SPI_GETSCREENSAVETIMEOUT
:
177 *((UINT
*)pvParam
) = WinStaObject
->ScreenSaverTimeOut
;
179 case SPI_SETSCREENSAVETIMEOUT
:
180 WinStaObject
->ScreenSaverTimeOut
= uiParam
;
182 case SPI_GETSCREENSAVERRUNNING
:
183 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
185 case SPI_SETSCREENSAVERRUNNING
:
186 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverRunning
;
187 WinStaObject
->ScreenSaverRunning
= uiParam
;
189 case SPI_SETSCREENSAVEACTIVE
:
190 WinStaObject
->ScreenSaverActive
= uiParam
;
192 case SPI_GETSCREENSAVEACTIVE
:
193 if (pvParam
!= NULL
) *((BOOL
*)pvParam
) = WinStaObject
->ScreenSaverActive
;
195 case SPI_GETWHEELSCROLLLINES
:
197 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
198 *((UINT
*)pvParam
) = CurInfo
->WheelScroLines
;
199 /* FIXME add this value to scroll list as scroll value ?? */
201 case SPI_GETWHEELSCROLLCHARS
:
203 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
204 *((UINT
*)pvParam
) = CurInfo
->WheelScroChars
;
205 // FIXME add this value to scroll list as scroll value ??
207 case SPI_SETDOUBLECLKWIDTH
:
208 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
209 /* FIXME limit the maximum value? */
210 CurInfo
->DblClickWidth
= uiParam
;
212 case SPI_SETDOUBLECLKHEIGHT
:
213 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
214 /* FIXME limit the maximum value? */
215 CurInfo
->DblClickHeight
= uiParam
;
217 case SPI_SETDOUBLECLICKTIME
:
218 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
219 /* FIXME limit the maximum time to 1000 ms? */
220 CurInfo
->DblClickSpeed
= uiParam
;
222 case SPI_GETMOUSEHOVERTIME
:
223 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
224 *((UINT
*)pvParam
) = CurInfo
->MouseHoverTime
;
226 case SPI_SETMOUSEHOVERTIME
:
227 /* see http://msdn2.microsoft.com/en-us/library/ms724947.aspx
228 * copy text from it, if some agument why xp and 2003 behovir diffent
229 * only if they do not have SP install
230 * " Windows Server 2003 and Windows XP: The operating system does not
231 * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until
232 * Windows Server 2003 SP1 and Windows XP SP2 "
234 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
235 CurInfo
->MouseHoverTime
= uiParam
;
236 if(CurInfo
->MouseHoverTime
< USER_TIMER_MINIMUM
)
238 CurInfo
->MouseHoverTime
= USER_TIMER_MINIMUM
;
240 if(CurInfo
->MouseHoverTime
> USER_TIMER_MAXIMUM
)
242 CurInfo
->MouseHoverTime
= USER_TIMER_MAXIMUM
;
246 case SPI_GETMOUSEHOVERWIDTH
:
247 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
248 *(PUINT
)pvParam
= CurInfo
->MouseHoverWidth
;
250 case SPI_GETMOUSEHOVERHEIGHT
:
251 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
252 *(PUINT
)pvParam
= CurInfo
->MouseHoverHeight
;
254 case SPI_SETMOUSEHOVERWIDTH
:
255 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
256 CurInfo
->MouseHoverWidth
= uiParam
;
258 case SPI_SETMOUSEHOVERHEIGHT
:
259 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
260 CurInfo
->MouseHoverHeight
= uiParam
;
262 case SPI_SETMOUSEBUTTONSWAP
:
263 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
264 CurInfo
->SwapButtons
= uiParam
;
267 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
268 CurInfo
->CursorAccelerationInfo
= *(PCURSORACCELERATION_INFO
)pvParam
;
271 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
272 *(PCURSORACCELERATION_INFO
)pvParam
= CurInfo
->CursorAccelerationInfo
;
274 case SPI_SETMOUSESPEED
:
275 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
276 CurInfo
->MouseSpeed
= (UINT
)pvParam
;
277 /* Limit value to 1...20 range */
278 if(CurInfo
->MouseSpeed
< 1)
280 CurInfo
->MouseSpeed
= 1;
282 else if(CurInfo
->MouseSpeed
> 20)
284 CurInfo
->MouseSpeed
= 20;
287 case SPI_GETMOUSESPEED
:
288 CurInfo
= IntGetSysCursorInfo(WinStaObject
);
289 *(PUINT
)pvParam
= CurInfo
->MouseSpeed
;
291 case SPI_SETDESKWALLPAPER
:
293 /* This function expects different parameters than the user mode version!
295 We let the user mode code load the bitmap, it passed the handle to
296 the bitmap. We'll change it's ownership to system and replace it with
297 the current wallpaper bitmap */
298 HBITMAP hOldBitmap
, hNewBitmap
;
299 UNICODE_STRING Key
= RTL_CONSTANT_STRING(L
"Control Panel\\Desktop");
300 UNICODE_STRING Tile
= RTL_CONSTANT_STRING(L
"TileWallpaper");
301 UNICODE_STRING Style
= RTL_CONSTANT_STRING(L
"WallpaperStyle");
302 UNICODE_STRING KeyPath
;
303 OBJECT_ATTRIBUTES KeyAttributes
;
304 OBJECT_ATTRIBUTES ObjectAttributes
;
306 HANDLE CurrentUserKey
= NULL
;
307 HANDLE KeyHandle
= NULL
;
308 PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo
;
315 hNewBitmap
= *(HBITMAP
*)pvParam
;
316 if(hNewBitmap
!= NULL
)
319 /* try to get the size of the wallpaper */
320 if(!(bmp
= BITMAPOBJ_LockBitmap(hNewBitmap
)))
322 ObDereferenceObject(WinStaObject
);
325 WinStaObject
->cxWallpaper
= bmp
->SurfObj
.sizlBitmap
.cx
;
326 WinStaObject
->cyWallpaper
= bmp
->SurfObj
.sizlBitmap
.cy
;
328 BITMAPOBJ_UnlockBitmap(bmp
);
330 /* change the bitmap's ownership */
331 GDIOBJ_SetOwnership(hNewBitmap
, NULL
);
333 hOldBitmap
= (HBITMAP
)InterlockedExchange((LONG
*)&WinStaObject
->hbmWallpaper
, (LONG
)hNewBitmap
);
334 if(hOldBitmap
!= NULL
)
336 /* delete the old wallpaper */
337 NtGdiDeleteObject(hOldBitmap
);
341 /*default value is center */
342 WinStaObject
->WallpaperMode
= wmCenter
;
344 /* Get a handle to the current users settings */
345 RtlFormatCurrentUserKeyPath(&KeyPath
);
346 InitializeObjectAttributes(&ObjectAttributes
,&KeyPath
,OBJ_CASE_INSENSITIVE
,NULL
,NULL
);
347 ZwOpenKey(&CurrentUserKey
, KEY_READ
, &ObjectAttributes
);
348 RtlFreeUnicodeString(&KeyPath
);
350 /* open up the settings to read the values */
351 InitializeObjectAttributes(&KeyAttributes
, &Key
, OBJ_CASE_INSENSITIVE
,
352 CurrentUserKey
, NULL
);
353 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
354 ZwClose(CurrentUserKey
);
356 /* read the tile value in the registry */
357 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
360 /* fall back to .DEFAULT if we didnt find values */
361 if(Status
== STATUS_INVALID_HANDLE
)
363 RtlInitUnicodeString (&KeyPath
,L
"\\Registry\\User\\.Default\\Control Panel\\Desktop");
364 InitializeObjectAttributes(&KeyAttributes
, &KeyPath
, OBJ_CASE_INSENSITIVE
,
366 ZwOpenKey(&KeyHandle
, KEY_READ
, &KeyAttributes
);
367 ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
371 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
372 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
375 if(!KeyValuePartialInfo
)
381 Status
= ZwQueryValueKey(KeyHandle
, &Tile
, KeyValuePartialInformation
,
382 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
383 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
386 ExFreePool(KeyValuePartialInfo
);
390 Tile
.Length
= KeyValuePartialInfo
->DataLength
;
391 Tile
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
392 Tile
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
394 Status
= RtlUnicodeStringToInteger(&Tile
, 0, &TileNum
);
395 if(!NT_SUCCESS(Status
))
399 ExFreePool(KeyValuePartialInfo
);
401 /* start over again and look for the style*/
403 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
406 ResLength
+= sizeof(KEY_VALUE_PARTIAL_INFORMATION
);
407 KeyValuePartialInfo
= ExAllocatePoolWithTag(PagedPool
, ResLength
, TAG_STRING
);
410 if(!KeyValuePartialInfo
)
416 Status
= ZwQueryValueKey(KeyHandle
, &Style
, KeyValuePartialInformation
,
417 (PVOID
)KeyValuePartialInfo
, Length
, &ResLength
);
418 if(!NT_SUCCESS(Status
) || (KeyValuePartialInfo
->Type
!= REG_SZ
))
421 ExFreePool(KeyValuePartialInfo
);
425 Style
.Length
= KeyValuePartialInfo
->DataLength
;
426 Style
.MaximumLength
= KeyValuePartialInfo
->DataLength
;
427 Style
.Buffer
= (PWSTR
)KeyValuePartialInfo
->Data
;
429 Status
= RtlUnicodeStringToInteger(&Style
, 0, &StyleNum
);
430 if(!NT_SUCCESS(Status
))
434 ExFreePool(KeyValuePartialInfo
);
436 /* Check the values we found in the registry */
437 if(TileNum
&& !StyleNum
)
439 WinStaObject
->WallpaperMode
= wmTile
;
441 else if(!TileNum
&& StyleNum
== 2)
443 WinStaObject
->WallpaperMode
= wmStretch
;
449 case SPI_GETDESKWALLPAPER
:
450 /* This function expects different parameters than the user mode version!
451 We basically return the current wallpaper handle - if any. The user
452 mode version should load the string from the registry and return it
453 without calling this function */
456 *(HBITMAP
*)pvParam
= (HBITMAP
)WinStaObject
->hbmWallpaper
;
460 /* FIXME save the value to the registry */
462 ObDereferenceObject(WinStaObject
);
465 case SPI_SETWORKAREA
:
468 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
472 /* FIXME - Set last error */
478 Desktop
->WorkArea
= *rc
;
483 case SPI_GETWORKAREA
:
485 PDESKTOP_OBJECT Desktop
= PsGetCurrentThreadWin32Thread()->Desktop
;
489 /* FIXME - Set last error */
494 IntGetDesktopWorkArea(Desktop
, (PRECT
)pvParam
);
498 case SPI_SETGRADIENTCAPTIONS
:
500 GradientCaptions
= (pvParam
!= NULL
);
501 /* FIXME - should be checked if the color depth is higher than 8bpp? */
505 case SPI_GETGRADIENTCAPTIONS
:
508 BOOL Ret
= GradientCaptions
;
510 hDC
= IntGetScreenDC();
515 Ret
= (NtGdiGetDeviceCaps(hDC
, BITSPIXEL
) > 8) && Ret
;
518 *((PBOOL
)pvParam
) = Ret
;
521 case SPI_SETFONTSMOOTHING
:
523 IntEnableFontRendering(uiParam
!= 0);
527 case SPI_GETFONTSMOOTHING
:
530 *((BOOL
*)pvParam
) = IntIsFontRenderingEnabled();
533 case SPI_GETICONTITLELOGFONT
:
536 *((LOGFONTW
*)pvParam
) = IconFont
;
539 case SPI_GETNONCLIENTMETRICS
:
542 *((NONCLIENTMETRICSW
*)pvParam
) = pMetrics
;
545 case SPI_GETANIMATION
:
548 *(( ANIMATIONINFO
*)pvParam
) = anim
;
551 case SPI_SETANIMATION
:
554 anim
= *((ANIMATIONINFO
*)pvParam
);
557 case SPI_SETNONCLIENTMETRICS
:
560 pMetrics
= *((NONCLIENTMETRICSW
*)pvParam
);
564 case SPI_GETMINIMIZEDMETRICS
:
567 *((MINIMIZEDMETRICS
*)pvParam
) = MinimizedMetrics
;
570 case SPI_SETMINIMIZEDMETRICS
:
573 MinimizedMetrics
= *((MINIMIZEDMETRICS
*)pvParam
);
577 case SPI_GETFOCUSBORDERHEIGHT
:
580 *((UINT
*)pvParam
) = FocusBorderHeight
;
583 case SPI_GETFOCUSBORDERWIDTH
:
586 *((UINT
*)pvParam
) = FocusBorderWidth
;
589 case SPI_SETFOCUSBORDERHEIGHT
:
591 FocusBorderHeight
= (UINT
)pvParam
;
595 case SPI_SETFOCUSBORDERWIDTH
:
597 FocusBorderWidth
= (UINT
)pvParam
;
601 case SPI_GETSTICKYKEYS
:
603 *((STICKYKEYS
*)pvParam
) = StickyKeys
;
606 case SPI_SETSTICKYKEYS
:
608 StickyKeys
= *((STICKYKEYS
*)pvParam
);
612 case SPI_GETFILTERKEYS
:
614 *((FILTERKEYS
*)pvParam
) = FilterKeys
;
617 case SPI_SETFILTERKEYS
:
619 FilterKeys
= *((FILTERKEYS
*)pvParam
);
623 case SPI_GETTOGGLEKEYS
:
625 *((TOGGLEKEYS
*)pvParam
) = ToggleKeys
;
628 case SPI_SETTOGGLEKEYS
:
630 ToggleKeys
= *((TOGGLEKEYS
*)pvParam
);
634 case SPI_GETSERIALKEYS
:
636 *((SERIALKEYS
*)pvParam
) = SerialKeys
;
639 case SPI_SETSERIALKEYS
:
641 SerialKeys
= *((SERIALKEYS
*)pvParam
);
645 case SPI_GETMOUSEKEYS
:
647 *((MOUSEKEYS
*)pvParam
) = MouseKeys
;
650 case SPI_SETMOUSEKEYS
:
652 MouseKeys
= *((MOUSEKEYS
*)pvParam
);
656 case SPI_GETKEYBOARDPREF
:
658 *((BOOL
*)pvParam
) = KeyboardPref
;
661 case SPI_SETKEYBOARDPREF
:
663 KeyboardPref
= (BOOL
)uiParam
;
667 case SPI_GETSHOWSOUNDS
:
669 *((BOOL
*)pvParam
) = ShowSounds
;
672 case SPI_SETSHOWSOUNDS
:
674 ShowSounds
= (BOOL
)uiParam
;
678 case SPI_GETACCESSTIMEOUT
:
680 *((ACCESSTIMEOUT
*)pvParam
) = AccessTimeout
;
683 case SPI_SETACCESSTIMEOUT
:
685 AccessTimeout
= *((ACCESSTIMEOUT
*)pvParam
);
692 DPRINT1("FIXME: Unsupported SPI Action 0x%x (uiParam: 0x%x, pvParam: 0x%x, fWinIni: 0x%x)\n",
693 uiAction
, uiParam
, pvParam
, fWinIni
);
697 /* Did we change something ? */
700 /* Shall we send a WM_SETTINGCHANGE message ? */
701 if (fWinIni
& (SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
))
703 /* Broadcast WM_SETTINGCHANGE to all toplevel windows */
704 /* FIXME: lParam should be pointer to a string containing the reg key */
705 UserPostMessage(HWND_BROADCAST
, WM_SETTINGCHANGE
, (WPARAM
)uiAction
, 0);
712 UserSystemParametersInfo_StructSet(
717 PVOID pBuffer
, /* private kmode buffer */
718 UINT cbSize
/* size of buffer and expected size usermode data, pointed by pvParam */
721 NTSTATUS Status
= STATUS_SUCCESS
;
723 DPRINT("UserSystemParametersInfo_StructSet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n",
724 uiAction
, uiParam
, fWinIni
);
728 ProbeForRead(pvParam
, cbSize
, 1);
729 RtlCopyMemory(pBuffer
,pvParam
,cbSize
);
733 Status
= _SEH_GetExceptionCode();
736 if(!NT_SUCCESS(Status
))
738 SetLastNtError(Status
);
741 if(*(PUINT
)pBuffer
!= cbSize
)
743 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
746 return IntSystemParametersInfo(uiAction
, uiParam
, pBuffer
, fWinIni
);
750 UserSystemParametersInfo_StructGet(
755 PVOID pBuffer
, /* private kmode buffer */
756 UINT cbSize
/* size of buffer and expected size usermode data, pointed by pvParam */
759 NTSTATUS Status
= STATUS_SUCCESS
;
761 DPRINT("UserSystemParametersInfo_StructGet SPI Action 0x%x (uiParam: 0x%x, fWinIni: 0x%x)\n",uiAction
, uiParam
, fWinIni
);
765 ProbeForRead(pvParam
, cbSize
, 1);
766 /* Copy only first UINT describing structure size*/
767 *((PUINT
)pBuffer
) = *((PUINT
)pvParam
);
771 Status
= _SEH_GetExceptionCode();
774 if(!NT_SUCCESS(Status
))
776 SetLastNtError(Status
);
779 if(*((PUINT
)pBuffer
) != cbSize
)
781 SetLastWin32Error(ERROR_INVALID_PARAMETER
);
784 if(!IntSystemParametersInfo(uiAction
, uiParam
, pBuffer
, fWinIni
))
790 ProbeForWrite(pvParam
, cbSize
, 1);
791 RtlCopyMemory(pvParam
,pBuffer
,cbSize
);
795 Status
= _SEH_GetExceptionCode();
798 if(!NT_SUCCESS(Status
))
800 SetLastNtError(Status
);
810 UserSystemParametersInfo(
816 NTSTATUS Status
= STATUS_SUCCESS
;
818 /* FIXME: Support Windows Vista SPI Actions */
822 #if 1 /* only for 32bit applications */
823 case SPI_SETLOWPOWERACTIVE
:
824 case SPI_SETLOWPOWERTIMEOUT
:
825 case SPI_SETPOWEROFFACTIVE
:
826 case SPI_SETPOWEROFFTIMEOUT
:
829 case SPI_SETSCREENSAVETIMEOUT
:
830 case SPI_SETSCREENSAVEACTIVE
:
831 case SPI_SETDOUBLECLKWIDTH
:
832 case SPI_SETDOUBLECLKHEIGHT
:
833 case SPI_SETDOUBLECLICKTIME
:
834 case SPI_SETFONTSMOOTHING
:
835 case SPI_SETMOUSEHOVERTIME
:
836 case SPI_SETMOUSEHOVERWIDTH
:
837 case SPI_SETMOUSEHOVERHEIGHT
:
838 case SPI_SETMOUSETRAILS
:
839 case SPI_SETSNAPTODEFBUTTON
:
841 case SPI_SETBLOCKSENDINPUTRESETS
:
842 case SPI_SETKEYBOARDDELAY
:
843 case SPI_SETKEYBOARDPREF
:
844 case SPI_SETKEYBOARDSPEED
:
845 case SPI_SETMOUSEBUTTONSWAP
:
846 case SPI_SETWHEELSCROLLLINES
:
847 case SPI_SETMENUSHOWDELAY
:
848 case SPI_SETMENUDROPALIGNMENT
:
849 case SPI_SETICONTITLEWRAP
:
851 case SPI_SETDESKPATTERN
:
853 case SPI_SETDRAGHEIGHT
:
854 case SPI_SETDRAGWIDTH
:
855 case SPI_SETSHOWIMEUI
:
856 case SPI_SETSCREENREADER
:
857 case SPI_SETSHOWSOUNDS
:
858 return IntSystemParametersInfo(uiAction
, uiParam
, NULL
, fWinIni
);
860 /* NOTICE: from the IntSystemParametersInfo implementation it uses pvParam */
861 case SPI_SETSCREENSAVERRUNNING
:
862 case SPI_SETFLATMENU
:
863 case SPI_SETMOUSESPEED
:
864 case SPI_SETGRADIENTCAPTIONS
:
865 case SPI_SETFOCUSBORDERHEIGHT
:
866 case SPI_SETFOCUSBORDERWIDTH
:
867 case SPI_SETLANGTOGGLE
:
868 case SPI_SETMENUFADE
:
869 case SPI_SETDROPSHADOW
:
870 case SPI_SETACTIVEWINDOWTRACKING
:
871 case SPI_SETACTIVEWNDTRKZORDER
:
872 case SPI_SETACTIVEWNDTRKTIMEOUT
:
873 case SPI_SETCARETWIDTH
:
874 case SPI_SETFOREGROUNDFLASHCOUNT
:
875 case SPI_SETFOREGROUNDLOCKTIMEOUT
:
876 case SPI_SETFONTSMOOTHINGORIENTATION
:
877 case SPI_SETFONTSMOOTHINGTYPE
:
878 case SPI_SETFONTSMOOTHINGCONTRAST
:
879 case SPI_SETKEYBOARDCUES
:
880 case SPI_SETCOMBOBOXANIMATION
:
881 case SPI_SETCURSORSHADOW
:
882 case SPI_SETHOTTRACKING
:
883 case SPI_SETLISTBOXSMOOTHSCROLLING
:
884 case SPI_SETMENUANIMATION
:
885 case SPI_SETSELECTIONFADE
:
886 case SPI_SETTOOLTIPANIMATION
:
887 case SPI_SETTOOLTIPFADE
:
888 case SPI_SETUIEFFECTS
:
889 case SPI_SETMOUSECLICKLOCK
:
890 case SPI_SETMOUSESONAR
:
891 case SPI_SETMOUSEVANISH
:
892 return IntSystemParametersInfo(uiAction
, 0, pvParam
, fWinIni
);
894 /* Get SPI msg here */
896 #if 1 /* only for 32bit applications */
897 case SPI_GETLOWPOWERACTIVE
:
898 case SPI_GETLOWPOWERTIMEOUT
:
899 case SPI_GETPOWEROFFACTIVE
:
900 case SPI_GETPOWEROFFTIMEOUT
:
903 case SPI_GETSCREENSAVERRUNNING
:
904 case SPI_GETSCREENSAVETIMEOUT
:
905 case SPI_GETSCREENSAVEACTIVE
:
906 case SPI_GETKEYBOARDCUES
:
907 case SPI_GETFONTSMOOTHING
:
908 case SPI_GETGRADIENTCAPTIONS
:
909 case SPI_GETFOCUSBORDERHEIGHT
:
910 case SPI_GETFOCUSBORDERWIDTH
:
911 case SPI_GETWHEELSCROLLLINES
:
912 case SPI_GETWHEELSCROLLCHARS
:
913 case SPI_GETFLATMENU
:
914 case SPI_GETMOUSEHOVERHEIGHT
:
915 case SPI_GETMOUSEHOVERWIDTH
:
916 case SPI_GETMOUSEHOVERTIME
:
917 case SPI_GETMOUSESPEED
:
918 case SPI_GETMOUSETRAILS
:
919 case SPI_GETSNAPTODEFBUTTON
:
921 case SPI_GETBLOCKSENDINPUTRESETS
:
922 case SPI_GETKEYBOARDDELAY
:
923 case SPI_GETKEYBOARDPREF
:
924 case SPI_GETMENUDROPALIGNMENT
:
925 case SPI_GETMENUFADE
:
926 case SPI_GETMENUSHOWDELAY
:
927 case SPI_GETICONTITLEWRAP
:
928 case SPI_GETDROPSHADOW
:
929 case SPI_GETFONTSMOOTHINGCONTRAST
:
930 case SPI_GETFONTSMOOTHINGORIENTATION
:
931 case SPI_GETFONTSMOOTHINGTYPE
:
932 case SPI_GETACTIVEWINDOWTRACKING
:
933 case SPI_GETACTIVEWNDTRKZORDER
:
935 case SPI_GETCOMBOBOXANIMATION
:
936 case SPI_GETCURSORSHADOW
:
937 case SPI_GETHOTTRACKING
:
938 case SPI_GETLISTBOXSMOOTHSCROLLING
:
939 case SPI_GETMENUANIMATION
:
940 case SPI_GETSELECTIONFADE
:
941 case SPI_GETTOOLTIPANIMATION
:
942 case SPI_GETTOOLTIPFADE
:
943 case SPI_GETUIEFFECTS
:
944 case SPI_GETMOUSECLICKLOCK
:
945 case SPI_GETMOUSECLICKLOCKTIME
:
946 case SPI_GETMOUSESONAR
:
947 case SPI_GETMOUSEVANISH
:
948 case SPI_GETSCREENREADER
:
949 case SPI_GETSHOWSOUNDS
:
951 /* pvParam is PINT,PUINT or PBOOL */
953 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
959 ProbeForWrite(pvParam
, sizeof(UINT
), 1);
960 *(PUINT
)pvParam
= Ret
;
964 Status
= _SEH_GetExceptionCode();
967 if(!NT_SUCCESS(Status
))
969 SetLastNtError(Status
);
975 case SPI_GETACTIVEWNDTRKTIMEOUT
:
976 case SPI_GETKEYBOARDSPEED
:
977 case SPI_GETCARETWIDTH
:
978 case SPI_GETDRAGFULLWINDOWS
:
979 case SPI_GETFOREGROUNDFLASHCOUNT
:
980 case SPI_GETFOREGROUNDLOCKTIMEOUT
:
982 /* pvParam is PDWORD */
984 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
990 ProbeForWrite(pvParam
, sizeof(DWORD
), 1);
991 *(PDWORD
)pvParam
= Ret
;
995 Status
= _SEH_GetExceptionCode();
998 if(!NT_SUCCESS(Status
))
1000 SetLastNtError(Status
);
1005 case SPI_GETICONMETRICS
:
1007 ICONMETRICSW Buffer
;
1008 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1010 case SPI_SETICONMETRICS
:
1012 ICONMETRICSW Buffer
;
1013 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1015 case SPI_GETMINIMIZEDMETRICS
:
1017 MINIMIZEDMETRICS Buffer
;
1018 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
,&Buffer
,sizeof(Buffer
));
1020 case SPI_SETMINIMIZEDMETRICS
:
1022 MINIMIZEDMETRICS Buffer
;
1023 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
,&Buffer
,sizeof(Buffer
));
1025 case SPI_GETNONCLIENTMETRICS
:
1027 NONCLIENTMETRICSW Buffer
;
1028 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1030 case SPI_SETNONCLIENTMETRICS
:
1032 NONCLIENTMETRICSW Buffer
;
1033 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1035 case SPI_GETANIMATION
:
1037 ANIMATIONINFO Buffer
;
1038 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1040 case SPI_SETANIMATION
:
1042 ANIMATIONINFO Buffer
;
1043 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1045 case SPI_GETACCESSTIMEOUT
:
1047 ACCESSTIMEOUT Buffer
;
1048 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1050 case SPI_SETACCESSTIMEOUT
:
1052 ACCESSTIMEOUT Buffer
;
1053 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1055 case SPI_GETFILTERKEYS
:
1058 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
,
1059 &Buffer
,sizeof(Buffer
));
1061 case SPI_SETFILTERKEYS
:
1064 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
,
1065 &Buffer
,sizeof(Buffer
));
1067 case SPI_GETSTICKYKEYS
:
1070 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1072 case SPI_SETSTICKYKEYS
:
1075 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1077 case SPI_GETTOGGLEKEYS
:
1080 return UserSystemParametersInfo_StructGet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1082 case SPI_SETTOGGLEKEYS
:
1085 return UserSystemParametersInfo_StructSet(uiAction
, uiParam
, pvParam
, fWinIni
, &Buffer
,sizeof(Buffer
));
1087 case SPI_SETWORKAREA
:
1092 ProbeForRead(pvParam
, sizeof( RECT
), 1);
1093 RtlCopyMemory(&rc
,pvParam
,sizeof(RECT
));
1097 Status
= _SEH_GetExceptionCode();
1100 if(!NT_SUCCESS(Status
))
1102 SetLastNtError(Status
);
1105 return IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
);
1107 case SPI_GETWORKAREA
:
1110 if(!IntSystemParametersInfo(uiAction
, uiParam
, &rc
, fWinIni
))
1116 ProbeForWrite(pvParam
, sizeof( RECT
), 1);
1117 RtlCopyMemory(pvParam
,&rc
,sizeof(RECT
));
1121 Status
= _SEH_GetExceptionCode();
1124 if(!NT_SUCCESS(Status
))
1126 SetLastNtError(Status
);
1133 CURSORACCELERATION_INFO CursorAccelerationInfo
;
1136 ProbeForRead(pvParam
, sizeof( CURSORACCELERATION_INFO
), 1);
1137 RtlCopyMemory(&CursorAccelerationInfo
,pvParam
,sizeof(CURSORACCELERATION_INFO
));
1141 Status
= _SEH_GetExceptionCode();
1144 if(!NT_SUCCESS(Status
))
1146 SetLastNtError(Status
);
1149 return IntSystemParametersInfo(uiAction
, uiParam
, &CursorAccelerationInfo
, fWinIni
);
1153 CURSORACCELERATION_INFO CursorAccelerationInfo
;
1154 if(!IntSystemParametersInfo(uiAction
, uiParam
, &CursorAccelerationInfo
, fWinIni
))
1160 ProbeForWrite(pvParam
, sizeof( CURSORACCELERATION_INFO
), 1);
1161 RtlCopyMemory(pvParam
,&CursorAccelerationInfo
,sizeof(CURSORACCELERATION_INFO
));
1165 Status
= _SEH_GetExceptionCode();
1168 if(!NT_SUCCESS(Status
))
1170 SetLastNtError(Status
);
1175 case SPI_SETICONTITLELOGFONT
:
1180 ProbeForRead(pvParam
, sizeof( LOGFONTW
), 1);
1181 RtlCopyMemory(&LogFont
,pvParam
,sizeof(LOGFONTW
));
1185 Status
= _SEH_GetExceptionCode();
1188 if(!NT_SUCCESS(Status
))
1190 SetLastNtError(Status
);
1193 return IntSystemParametersInfo(uiAction
, uiParam
, &LogFont
, fWinIni
);
1195 case SPI_GETICONTITLELOGFONT
:
1198 if(!IntSystemParametersInfo(uiAction
, uiParam
, &LogFont
, fWinIni
))
1204 ProbeForWrite(pvParam
, sizeof( LOGFONTW
), 1);
1205 RtlCopyMemory(pvParam
,&LogFont
,sizeof(LOGFONTW
));
1209 Status
= _SEH_GetExceptionCode();
1212 if(!NT_SUCCESS(Status
))
1214 SetLastNtError(Status
);
1219 case SPI_ICONVERTICALSPACING
:
1220 case SPI_ICONHORIZONTALSPACING
:
1223 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Ret
, fWinIni
))
1231 ProbeForWrite(pvParam
, sizeof(UINT
), 1);
1232 *(PUINT
)pvParam
= Ret
;
1236 Status
= _SEH_GetExceptionCode();
1239 if(!NT_SUCCESS(Status
))
1241 SetLastNtError(Status
);
1247 case SPI_SETDEFAULTINPUTLANG
:
1248 case SPI_SETDESKWALLPAPER
:
1249 /* !!! As opposed to the user mode version this version accepts a handle to the bitmap! */
1254 ProbeForRead(pvParam
, sizeof( HANDLE
), 1);
1255 Handle
= *(PHANDLE
)pvParam
;
1259 Status
= _SEH_GetExceptionCode();
1262 if(!NT_SUCCESS(Status
))
1264 SetLastNtError(Status
);
1267 return IntSystemParametersInfo(uiAction
, uiParam
, &Handle
, fWinIni
);
1269 case SPI_GETDEFAULTINPUTLANG
:
1270 case SPI_GETDESKWALLPAPER
:
1273 if(!IntSystemParametersInfo(uiAction
, uiParam
, &Handle
, fWinIni
))
1279 ProbeForWrite(pvParam
, sizeof( HANDLE
), 1);
1280 *(PHANDLE
)pvParam
= Handle
;
1281 RtlCopyMemory(pvParam
,&Handle
,sizeof(HANDLE
));
1285 Status
= _SEH_GetExceptionCode();
1288 if(!NT_SUCCESS(Status
))
1290 SetLastNtError(Status
);
1295 case SPI_GETHIGHCONTRAST
:
1296 case SPI_SETHIGHCONTRAST
:
1297 case SPI_GETSOUNDSENTRY
:
1298 case SPI_SETSOUNDSENTRY
:
1300 /* FIXME: Support this accessibility SPI actions */
1301 DPRINT1("FIXME: Unsupported SPI Code: %lx \n",uiAction
);
1306 SetLastNtError(ERROR_INVALID_PARAMETER
);
1307 DPRINT1("Invalid SPI Code: %lx \n",uiAction
);
1319 NtUserSystemParametersInfo(
1325 DECLARE_RETURN(BOOLEAN
);
1327 DPRINT("Enter NtUserSystemParametersInfo\n");
1328 UserEnterExclusive();
1330 RETURN( UserSystemParametersInfo(uiAction
, uiParam
, pvParam
, fWinIni
));
1333 DPRINT("Leave NtUserSystemParametersInfo, ret=%i\n",_ret_
);
1340 NtUserUpdatePerUserSystemParameters(
1345 DECLARE_RETURN(BOOLEAN
);
1347 DPRINT("Enter NtUserUpdatePerUserSystemParameters\n");
1348 UserEnterExclusive();
1350 Result
&= IntDesktopUpdatePerUserSettings(bEnable
);
1354 DPRINT("Leave NtUserUpdatePerUserSystemParameters, ret=%i\n",_ret_
);