ReactOS 0.4.16-dev-2473-gb34a1f1
sysparams.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: GPL, see COPYING in the top level directory
3 * PROJECT: ReactOS win32 kernel mode subsystem server
4 * PURPOSE: System parameters functions
5 * FILE: win32ss/user/ntuser/sysparams.c
6 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9// TODO:
10// - Check all values that are in Winsta in ROS.
11// - Does setting invalid fonts work?
12// - Save appropriate text metrics.
13
14#include <win32k.h>
15DBG_DEFAULT_CHANNEL(UserSysparams);
16
21
22// HACK! We initialize SPI before we have a proper surface to get this from.
23#define dpi 96
24//(pPrimarySurface->GDIInfo.ulLogPixelsY)
25#define REG2METRIC(reg) (reg > 0 ? reg : ((-(reg) * dpi + 720) / 1440))
26#define METRIC2REG(met) (-((((met) * 1440)- 0) / dpi))
27
28#define REQ_INTERACTIVE_WINSTA(err) \
29do { \
30 if (GetW32ProcessInfo()->prpwinsta != InputWindowStation) \
31 { \
32 if (GetW32ProcessInfo()->prpwinsta == NULL) \
33 { \
34 ERR("NtUserSystemParametersInfo called without active window station, and it requires an interactive one\n"); \
35 } \
36 else \
37 { \
38 ERR("NtUserSystemParametersInfo requires interactive window station (current is '%wZ')\n", \
39 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(GetW32ProcessInfo()->prpwinsta))->Name)); \
40 } \
41 EngSetLastError(err); \
42 return 0; \
43 } \
44} while (0)
45
46static const WCHAR* KEY_MOUSE = L"Control Panel\\Mouse";
47static const WCHAR* VAL_MOUSE1 = L"MouseThreshold1";
48static const WCHAR* VAL_MOUSE2 = L"MouseThreshold2";
49static const WCHAR* VAL_MOUSE3 = L"MouseSpeed";
50static const WCHAR* VAL_MOUSETRAILS = L"MouseTrails";
51static const WCHAR* VAL_DBLCLKWIDTH = L"DoubleClickWidth";
52static const WCHAR* VAL_DBLCLKHEIGHT = L"DoubleClickHeight";
53static const WCHAR* VAL_DBLCLKTIME = L"DoubleClickSpeed";
54static const WCHAR* VAL_SNAPDEFBTN = L"SnapToDefaultButton";
55static const WCHAR* VAL_SWAP = L"SwapMouseButtons";
56static const WCHAR* VAL_HOVERTIME = L"MouseHoverTime";
57static const WCHAR* VAL_HOVERWIDTH = L"MouseHoverWidth";
58static const WCHAR* VAL_HOVERHEIGHT = L"MouseHoverHeight";
59static const WCHAR* VAL_SENSITIVITY = L"MouseSensitivity";
60
61static const WCHAR* KEY_DESKTOP = L"Control Panel\\Desktop";
62static const WCHAR* VAL_SCRTO = L"ScreenSaveTimeOut";
63static const WCHAR* VAL_SCRNSV = L"SCRNSAVE.EXE";
64static const WCHAR* VAL_SCRACT = L"ScreenSaveActive";
65static const WCHAR* VAL_GRID = L"GridGranularity";
66static const WCHAR* VAL_DRAG = L"DragFullWindows";
67static const WCHAR* VAL_DRAGHEIGHT = L"DragHeight";
68static const WCHAR* VAL_DRAGWIDTH = L"DragWidth";
69static const WCHAR* VAL_FONTSMOOTHING = L"FontSmoothing";
70static const WCHAR* VAL_FONTSMOOTHINGTYPE = L"FontSmoothingType";
71static const WCHAR* VAL_FONTSMOOTHINGCONTRAST = L"FontSmoothingGamma";
72static const WCHAR* VAL_FONTSMOOTHINGORIENTATION = L"FontSmoothingOrientation";
73static const WCHAR* VAL_SCRLLLINES = L"WheelScrollLines";
74static const WCHAR* VAL_CLICKLOCKTIME = L"ClickLockTime";
75static const WCHAR* VAL_PAINTDESKVER = L"PaintDesktopVersion";
76static const WCHAR* VAL_CARETRATE = L"CursorBlinkRate";
77static const WCHAR* VAL_CARETWIDTH = L"CaretWidth";
78#if (_WIN32_WINNT >= 0x0600)
79static const WCHAR* VAL_SCRLLCHARS = L"WheelScrollChars";
80#endif
81static const WCHAR* VAL_USERPREFMASK = L"UserPreferencesMask";
82static const WCHAR* VAL_SNAP_ENABLED = L"WindowArrangementActive";
83static const WCHAR* VAL_SNAP_DOCKMOVING = L"DockMoving";
84
85static const WCHAR* KEY_MDALIGN = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows";
86static const WCHAR* VAL_MDALIGN = L"MenuDropAlignment";
87
88static const WCHAR* KEY_METRIC = L"Control Panel\\Desktop\\WindowMetrics";
89static const WCHAR* VAL_BORDER = L"BorderWidth";
90static const WCHAR* VAL_ICONSPC = L"IconSpacing";
91static const WCHAR* VAL_ICONVSPC = L"IconVerticalspacing";
92static const WCHAR* VAL_ITWRAP = L"IconTitleWrap";
93
94static const WCHAR* KEY_SOUND = L"Control Panel\\Sound";
95static const WCHAR* VAL_BEEP = L"Beep";
96
97static const WCHAR* KEY_KBD = L"Control Panel\\Keyboard";
98static const WCHAR* VAL_KBDSPD = L"KeyboardSpeed";
99static const WCHAR* VAL_KBDDELAY = L"KeyboardDelay";
100
101static const WCHAR* KEY_INPUT_METHOD = L"Control Panel\\Input Method";
102// static const WCHAR* VAL_ENABLE_HEXNUMPAD = L"EnableHexNumpad";
103
104static const WCHAR* KEY_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds";
105static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference";
106static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access";
107static const WCHAR* VAL_ON = L"On";
108
109static const WCHAR* KEY_MOUSEKEYS = L"Control Panel\\Accessibility\\MouseKeys";
110static const WCHAR* VAL_MOUSEKEYS_FLAGS = L"Flags";
111static const WCHAR* VAL_MOUSEKEYS_MAX = L"MaximumSpeed";
112static const WCHAR* VAL_MOUSEKEYS_TIMETOMAX = L"TimeToMaximumSpeed";
113
116static
117INT
118SpiLoadDWord(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
119{
121 if (!RegReadUserSetting(pwszKey, pwszValue, REG_DWORD, &Result, sizeof(Result)))
122 {
123 return iValue;
124 }
125 return Result;
126}
127
128static
129INT
130SpiLoadInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
131{
132 WCHAR awcBuffer[12];
133 ULONG cbSize;
134
135 cbSize = sizeof(awcBuffer);
136 if (!RegReadUserSetting(pwszKey, pwszValue, REG_SZ, awcBuffer, cbSize))
137 {
138 return iValue;
139 }
140 return _wtoi(awcBuffer);
141}
142
143static
144DWORD
146{
148 if (!RegReadUserSetting(KEY_DESKTOP, VAL_USERPREFMASK, REG_BINARY, &Result, sizeof(Result)))
149 {
150 return dValue;
151 }
152 return Result;
153}
154
155static
156DWORD
158{ // Must have the string!
159 WCHAR szApplicationName[MAX_PATH];
160 RtlZeroMemory(&szApplicationName, sizeof(szApplicationName));
161 if (!RegReadUserSetting(KEY_DESKTOP, VAL_SCRNSV, REG_SZ, &szApplicationName, sizeof(szApplicationName)))
162 {
163 return 0;
164 }
165 if (szApplicationName[0] == 0) return 0;
166 return SpiLoadInt(KEY_DESKTOP, VAL_SCRTO, 600);
167}
168
169static
170INT
171SpiLoadMouse(PCWSTR pwszValue, INT iValue)
172{
173 return SpiLoadInt(KEY_MOUSE, pwszValue, iValue);
174}
175
176static
177INT
178SpiLoadMetric(PCWSTR pwszValue, INT iValue)
179{
180 INT iRegVal;
181
182 iRegVal = SpiLoadInt(KEY_METRIC, pwszValue, METRIC2REG(iValue));
183 TRACE("Loaded metric setting '%S', iValue=%d(reg:%d), ret=%d(reg:%d)\n",
184 pwszValue, iValue, METRIC2REG(iValue), REG2METRIC(iRegVal), iRegVal);
185 return REG2METRIC(iRegVal);
186}
187
188static
189VOID
191{
192 BOOL bResult;
193
194 bResult = RegReadUserSetting(KEY_METRIC,
197 plfOut,
198 sizeof(LOGFONTW));
199 if (!bResult)
200 *plfOut = *plfDefault;
201}
202
203static
204VOID
206{
207 /* Fixup values */
208 gspv.ncm.iCaptionWidth = max(gspv.ncm.iCaptionWidth, 8);
209 gspv.ncm.iBorderWidth = max(gspv.ncm.iBorderWidth, 1);
210 gspv.ncm.iScrollWidth = max(gspv.ncm.iScrollWidth, 8);
211 gspv.ncm.iScrollHeight = max(gspv.ncm.iScrollHeight, 8);
212// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, gspv.tmMenuFont.tmHeight);
213// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight,
214// 2 + gspv.tmMenuFont.tmHeight +
215// gspv.tmMenuFont.tmExternalLeading);
216 if (gspv.iDblClickTime == 0) gspv.iDblClickTime = 500;
217
218 // FIXME: Hack!!!
221
224
225}
226
227static
228VOID
230{
231 static LOGFONTW lf1 = {-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
233 VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"};
234 static LOGFONTW lf2 = {-11, 0, 0, 0, FW_BOLD, FALSE, FALSE,
236 VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"};
237
238 TRACE("Enter SpiUpdatePerUserSystemParameters\n");
239
240 /* Clear the structure */
241 RtlZeroMemory(&gspv, sizeof(gspv));
242
243 /* Load mouse settings */
257
258 /* Load keyboard settings */
261
262 /* Load NONCLIENTMETRICS */
263 gspv.ncm.cbSize = sizeof(NONCLIENTMETRICSW);
264 gspv.ncm.iBorderWidth = SpiLoadMetric(VAL_BORDER, 1);
265 gspv.ncm.iScrollWidth = SpiLoadMetric(L"ScrollWidth", 16);
266 gspv.ncm.iScrollHeight = SpiLoadMetric(L"ScrollHeight", 16);
267 gspv.ncm.iCaptionWidth = SpiLoadMetric(L"CaptionWidth", 19);
268 gspv.ncm.iCaptionHeight = SpiLoadMetric(L"CaptionHeight", 19);
269 gspv.ncm.iSmCaptionWidth = SpiLoadMetric(L"SmCaptionWidth", 12);
270 gspv.ncm.iSmCaptionHeight = SpiLoadMetric(L"SmCaptionHeight", 15);
271 gspv.ncm.iMenuWidth = SpiLoadMetric(L"MenuWidth", 18);
272 gspv.ncm.iMenuHeight = SpiLoadMetric(L"MenuHeight", 18);
273#if (WINVER >= 0x0600)
274 gspv.ncm.iPaddedBorderWidth = SpiLoadMetric(L"PaddedBorderWidth", 18);
275#endif
276 SpiLoadFont(&gspv.ncm.lfCaptionFont, L"CaptionFont", &lf2);
277 SpiLoadFont(&gspv.ncm.lfSmCaptionFont, L"SmCaptionFont", &lf1);
278 SpiLoadFont(&gspv.ncm.lfMenuFont, L"MenuFont", &lf1);
279 SpiLoadFont(&gspv.ncm.lfStatusFont, L"StatusFont", &lf1);
280 SpiLoadFont(&gspv.ncm.lfMessageFont, L"MessageFont", &lf1);
281
282 /* Load MINIMIZEDMETRICS */
283 gspv.mm.cbSize = sizeof(MINIMIZEDMETRICS);
284 gspv.mm.iWidth = SpiLoadMetric(L"MinWidth", 160);
285 gspv.mm.iHorzGap = SpiLoadMetric(L"MinHorzGap", 160);
286 gspv.mm.iVertGap = SpiLoadMetric(L"MinVertGap", 24);
287 gspv.mm.iArrange = SpiLoadInt(KEY_METRIC, L"MinArrange", ARW_HIDE);
288
289 /* Load ICONMETRICS */
290 gspv.im.cbSize = sizeof(ICONMETRICSW);
291 gspv.im.iHorzSpacing = SpiLoadMetric(VAL_ICONSPC, 64);
292 gspv.im.iVertSpacing = SpiLoadMetric(VAL_ICONVSPC, 64);
293 gspv.im.iTitleWrap = SpiLoadMetric(VAL_ITWRAP, 1);
294 SpiLoadFont(&gspv.im.lfFont, L"IconFont", &lf1);
295
296 /* Load desktop settings */
300 if (gpsi)
301 gpsi->dtCaretBlink = SpiLoadInt(KEY_DESKTOP, VAL_CARETRATE, 530);
310#if (_WIN32_WINNT >= 0x0600)
311 gspv.uiWheelScrollChars = SpiLoadInt(KEY_DESKTOP, VAL_SCRLLCHARS, 3);
312#endif
313
314 /* Some hardcoded values for now */
315
317 gspv.bBeep = TRUE;
321 gspv.dwMenuShowDelay = SpiLoadInt(KEY_DESKTOP, L"MenuShowDelay", 400);
323
327#if(WINVER >= 0x0600)
328 gspv.bScrSaverSecure = FALSE;
329#endif
330
332
336 gspv.mousekeys.cbSize = sizeof(MOUSEKEYS);
340 gspv.mousekeys.iCtrlSpeed = 8; // FIXME
346
349
350 /* Make sure we don't use broken values */
352
353 /* Update SystemMetrics */
354 InitMetrics();
355
356 if (gbSpiInitialized && gpsi)
357 {
362 }
363
365
366 gdwLanguageToggleKey = UserGetLanguageToggle(L"Language Hotkey", 1);
367 gdwLayoutToggleKey = UserGetLanguageToggle(L"Layout Hotkey", 2);
368}
369
370BOOL
372{
375 return TRUE;
376}
377
378
379BOOL
384{
385 BOOL bResult;
386
387 TRACE("Enter NtUserUpdatePerUserSystemParameters\n");
389
391 if(bEnable)
393 else
395 bResult = TRUE;
396
397 TRACE("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult);
398 UserLeave();
399
400 return bResult;
401}
402
403
406static
407VOID
409{
410 RegWriteUserSetting(pwszKey,
411 pwszValue,
412 REG_DWORD,
413 &Value,
414 sizeof(Value));
415}
416
417static
418VOID
419SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz)
420{
421 RegWriteUserSetting(pwszKey,
422 pwszValue,
423 REG_SZ,
424 pwsz,
425 (wcslen(pwsz) + 1) * sizeof(WCHAR));
426}
427
428static
429VOID
430SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
431{
432 WCHAR awcBuffer[15];
433
434 _itow(iValue, awcBuffer, 10);
435 RegWriteUserSetting(pwszKey,
436 pwszValue,
437 REG_SZ,
438 awcBuffer,
439 (wcslen(awcBuffer) + 1) * sizeof(WCHAR));
440}
441
442static
443VOID
444SpiStoreMetric(LPCWSTR pwszValue, INT iValue)
445{
446 SpiStoreSzInt(KEY_METRIC, pwszValue, METRIC2REG(iValue));
447}
448
449static
450VOID
451SpiStoreFont(PCWSTR pwszValue, LOGFONTW* plogfont)
452{
453 RegWriteUserSetting(KEY_METRIC,
454 pwszValue,
456 plogfont,
457 sizeof(LOGFONTW));
458}
459
460
463// FIXME: get rid of the flags and only use this from um. kernel can access data directly.
464static
466SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect)
467{
469
470 if (bProtect)
471 {
473 {
474 RtlCopyMemory(pvDst, pvSrc, cbSize);
475 }
477 {
479 }
480 _SEH2_END;
481 }
482 else
483 {
484 RtlCopyMemory(pvDst, pvSrc, cbSize);
485 }
486
487 if (!NT_SUCCESS(Status))
488 {
490 ERR("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d\n", pvDst, pvSrc, bProtect);
491 }
492
493 return NT_SUCCESS(Status);
494}
495
496static inline
499{
501 return SpiMemCopy(pvParam, pvData, cbSize, fl & SPIF_PROTECT);
502}
503
504static inline
507{
509 return SpiMemCopy(pvData, pvParam, cbSize, fl & SPIF_PROTECT);
510}
511
512static inline
515{
517 /* Get the cbSite member from UM memory */
518 if (!SpiSet(&cbBufSize, pvParam, sizeof(ULONG), fl))
519 return 0;
520 /* Verify the correct size */
521 if (cbBufSize != cbSize)
522 return 0;
523 return SpiGet(pvParam, pvData, cbSize, fl);
524}
525
526static inline
528SpiGetInt(PVOID pvParam, PVOID piValue, FLONG fl)
529{
530 return SpiGet(pvParam, piValue, sizeof(INT), fl);
531}
532
533static inline
535SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
536{
538 *pbData = bValue ? TRUE : FALSE;
540 {
541 SpiStoreSz(pwszKey, pwszValue, bValue ? L"Yes" : L"No");
542 }
543 return (UINT_PTR)pwszKey;
544}
545
546static inline
548SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
549{
551 *pbData = iValue ? TRUE : FALSE;
553 {
554 SpiStoreSzInt(pwszKey, pwszValue, iValue);
555 }
556 return (UINT_PTR)pwszKey;
557}
558
559static inline
561SpiSetDWord(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
562{
564 *(INT*)pvData = iValue;
566 {
567 SpiStoreDWord(pwszKey, pwszValue, iValue);
568 }
569 return (UINT_PTR)pwszKey;
570}
571
572static inline
574SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
575{
577 *(INT*)pvData = iValue;
579 {
580 SpiStoreSzInt(pwszKey, pwszValue, iValue);
581 }
582 return (UINT_PTR)pwszKey;
583}
584
585static inline
588{
590 *(INT*)pvData = iValue;
592 {
593 SpiStoreMetric(pwszValue, iValue);
594 }
595 return (UINT_PTR)KEY_METRIC;
596}
597
598static inline
601{
602 DWORD dwRegMask;
603 BOOL bValue = PtrToUlong(pvValue);
604
606
607 /* Set or clear bit according to bValue */
608 gspv.dwUserPrefMask = bValue ? gspv.dwUserPrefMask | dwMask :
609 gspv.dwUserPrefMask & ~dwMask;
610
612 {
613 /* Read current value */
614 if (!RegReadUserSetting(KEY_DESKTOP,
617 &dwRegMask,
618 sizeof(DWORD)))
619 {
620 WARN("Failed to read UserPreferencesMask setting\n");
621 dwRegMask = 0;
622 }
623
624 /* Set or clear bit according to bValue */
625 dwRegMask = bValue ? (dwRegMask | dwMask) : (dwRegMask & ~dwMask);
626
627 /* write back value */
628 RegWriteUserSetting(KEY_DESKTOP,
631 &dwRegMask,
632 sizeof(DWORD));
633 }
634
635 return (UINT_PTR)KEY_DESKTOP;
636}
637
638static inline
641{
642 INT iValue = gspv.dwUserPrefMask & dwMask ? 1 : 0;
643 return SpiGetInt(pvParam, &iValue, fl);
644}
645
646static
649{
650 UNICODE_STRING ustr;
651 WCHAR awc[MAX_PATH];
652 BOOL bResult;
653 HBITMAP hbmp, hOldBitmap;
654 SURFACE *psurfBmp;
655 ULONG ulTile, ulStyle;
656
658
659 if (!pvParam)
660 {
661 /* FIXME: Reset Wallpaper to registry value */
662 return (UINT_PTR)KEY_DESKTOP;
663 }
664
665 /* Capture UNICODE_STRING */
666 bResult = SpiMemCopy(&ustr, pvParam, sizeof(ustr), fl & SPIF_PROTECT);
667 if (!bResult)
668 {
669 return 0;
670 }
671 if (ustr.Length > MAX_PATH * sizeof(WCHAR))
672 {
673 return 0;
674 }
675
676 /* Copy the string buffer name */
677 bResult = SpiMemCopy(gspv.awcWallpaper, ustr.Buffer, ustr.Length, fl & SPIF_PROTECT);
678 if (!bResult)
679 {
680 return 0;
681 }
682
683 /* Update the UNICODE_STRING */
687 gspv.awcWallpaper[ustr.Length / sizeof(WCHAR)] = 0;
688
689 TRACE("SpiSetWallpaper, name=%S\n", gspv.awcWallpaper);
690
691 /* Update registry */
693 {
695 }
696
697 /* Got a filename? */
698 if (gspv.awcWallpaper[0] != 0)
699 {
700 /* Convert file name to nt file name */
701 ustr.Buffer = awc;
702 ustr.MaximumLength = MAX_PATH * sizeof(WCHAR);
703 ustr.Length = 0;
705 {
706 ERR("RtlDosPathNameToNtPathName_U failed\n");
707 return 0;
708 }
709
710 /* Load the Bitmap */
711 hbmp = UserLoadImage(ustr.Buffer);
712 if (!hbmp)
713 {
714 ERR("UserLoadImage failed\n");
715 return 0;
716 }
717
718 /* Try to get the size of the wallpaper */
719 if (!(psurfBmp = SURFACE_ShareLockSurface(hbmp)))
720 {
722 return 0;
723 }
724
728
730
731 /* Change the bitmap's ownership */
733
734 /* Yes, Windows really loads the current setting from the registry. */
735 ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0);
736 ulStyle = SpiLoadInt(KEY_DESKTOP, L"WallpaperStyle", 0);
737 TRACE("SpiSetWallpaper: ulTile=%lu, ulStyle=%lu\n", ulTile, ulStyle);
738
739 /* Check the values we found in the registry */
740 if (ulTile && !ulStyle)
741 {
743 }
744 else if (!ulTile && ulStyle)
745 {
746 if (ulStyle == 2)
747 {
749 }
750 else if (ulStyle == 6)
751 {
753 }
754 else if (ulStyle == 10)
755 {
757 }
758 }
759 }
760 else
761 {
762 /* Remove wallpaper */
763 gspv.cxWallpaper = 0;
764 gspv.cyWallpaper = 0;
765 hbmp = 0;
766 }
767
768 /* Take care of the old wallpaper, if any */
769 hOldBitmap = gspv.hbmWallpaper;
770 if(hOldBitmap != NULL)
771 {
772 /* Delete the old wallpaper */
774 GreDeleteObject(hOldBitmap);
775 }
776
777 /* Set the new wallpaper */
779
781
782
783 return (UINT_PTR)KEY_DESKTOP;
784}
785
786static BOOL
788{
789 PWND pwndDesktop, pwndCurrent;
790 HWND *ahwnd;
792 int i;
793
794 pwndDesktop = UserGetDesktopWindow();
795 ASSERT(pwndDesktop);
796
797 ahwnd = IntWinListChildren(pwndDesktop);
798 if(!ahwnd)
799 return FALSE;
800
801 for (i = 0; ahwnd[i]; i++)
802 {
803 pwndCurrent = UserGetWindowObject(ahwnd[i]);
804 if(!pwndCurrent)
805 continue;
806
807 UserRefObjectCo(pwndCurrent, &Ref);
808 co_WinPosSetWindowPos(pwndCurrent, 0, pwndCurrent->rcWindow.left,pwndCurrent->rcWindow.top,
809 pwndCurrent->rcWindow.right-pwndCurrent->rcWindow.left
810 ,pwndCurrent->rcWindow.bottom - pwndCurrent->rcWindow.top,
813 UserDerefObjectCo(pwndCurrent);
814 }
815
817
818 return TRUE;
819}
820
821static
823SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl)
824{
825 switch (uiAction)
826 {
827 case SPI_GETBEEP:
828 return SpiGetInt(pvParam, &gspv.bBeep, fl);
829
830 case SPI_SETBEEP:
831 return SpiSetYesNo(&gspv.bBeep, uiParam, KEY_SOUND, VAL_BEEP, fl);
832
833 case SPI_GETMOUSE:
834 return SpiGet(pvParam, &gspv.caiMouse, 3 * sizeof(INT), fl);
835
836 case SPI_SETMOUSE:
837 if (!SpiSet(&gspv.caiMouse, pvParam, 3 * sizeof(INT), fl))
838 return 0;
840 {
844 }
845 return (UINT_PTR)KEY_MOUSE;
846
847 case SPI_GETBORDER:
848 return SpiGetInt(pvParam, &gspv.ncm.iBorderWidth, fl);
849
850 case SPI_SETBORDER:
851 uiParam = max(uiParam, 1);
852 return SpiSetInt(&gspv.ncm.iBorderWidth, uiParam, KEY_METRIC, VAL_BORDER, fl);
853
855 return SpiGetInt(pvParam, &gspv.dwKbdSpeed, fl);
856
858 return SpiSetInt(&gspv.dwKbdSpeed, uiParam, KEY_KBD, VAL_KBDSPD, fl);
859
860 case SPI_LANGDRIVER:
861 ERR("SPI_LANGDRIVER is unimplemented\n");
862 break;
863
865 return SpiGetInt(pvParam, &gspv.iScrSaverTimeout, fl);
866
869
871 return SpiGetInt(pvParam, &gspv.bScrSaverActive, fl);
872
875
877 return SpiGetInt(pvParam, &gspv.uiGridGranularity, fl);
878
881
882 case SPI_GETDESKWALLPAPER:
883 uiParam = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
884 return SpiGet(pvParam, gspv.awcWallpaper, uiParam, fl);
885
887 return SpiSetWallpaper(pvParam, fl);
888
890 ERR("SPI_SETDESKPATTERN is unimplemented\n");
891 break;
892
894 return SpiGetInt(pvParam, &gspv.iKbdDelay, fl);
895
897 return SpiSetInt(&gspv.iKbdDelay, uiParam, KEY_KBD, VAL_KBDDELAY, fl);
898
900 if (pvParam)
901 {
902 return SpiGetInt(pvParam, &gspv.im.iHorzSpacing, fl);
903 }
904 uiParam = max(uiParam, 32);
905 return SpiSetMetric(&gspv.im.iHorzSpacing, uiParam, VAL_ICONSPC, fl);
906
908 if (pvParam)
909 {
910 return SpiGetInt(pvParam, &gspv.im.iVertSpacing, fl);
911 }
912 uiParam = max(uiParam, 32);
913 return SpiSetMetric(&gspv.im.iVertSpacing, uiParam, VAL_ICONVSPC, fl);
914
916 return SpiGetInt(pvParam, &gspv.im.iTitleWrap, fl);
917
919 return SpiSetInt(&gspv.im.iTitleWrap, uiParam, KEY_METRIC, VAL_ITWRAP, fl);
920
922 return SpiGetInt(pvParam, &gspv.bMenuDropAlign, fl);
923
926
929
932
934 return SpiGet(pvParam, &gspv.im.lfFont, sizeof(LOGFONTW), fl);
935
937 if (!SpiSet(&gspv.im.lfFont, pvParam, sizeof(LOGFONTW), fl))
938 return 0;
940 {
941 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
942 }
943 return (UINT_PTR)KEY_METRIC;
944
947
949 return SpiSetInt(&gspv.bMouseBtnSwap, uiParam, KEY_MOUSE, VAL_SWAP, fl);
950
952 return SpiGetInt(pvParam, &gspv.bFastTaskSwitch, fl);
953
955 /* According to Winetest this one is unimplemented */
956 return 1;
957
958 case SPI_GETDRAGFULLWINDOWS:
959 return SpiGetInt(pvParam, &gspv.bDragFullWindows, fl);
960
961 case SPI_SETDRAGFULLWINDOWS:
963
964 case SPI_GETNONCLIENTMETRICS:
965 {
966 return SpiGet(pvParam, &gspv.ncm, sizeof(NONCLIENTMETRICSW), fl);
967 }
968
969 case SPI_SETNONCLIENTMETRICS:
970 {
971 LPNONCLIENTMETRICSW metrics = (LPNONCLIENTMETRICSW)pvParam;
972
973 /* Fixup user's structure size */
974 metrics->cbSize = sizeof(NONCLIENTMETRICSW);
975
976 if (!SpiSet(&gspv.ncm, metrics, sizeof(NONCLIENTMETRICSW), fl))
977 return 0;
978
980 {
981 SpiStoreMetric(VAL_BORDER, gspv.ncm.iBorderWidth);
982 SpiStoreMetric(L"ScrollWidth", gspv.ncm.iScrollWidth);
983 SpiStoreMetric(L"ScrollHeight", gspv.ncm.iScrollHeight);
984 SpiStoreMetric(L"CaptionWidth", gspv.ncm.iCaptionWidth);
985 SpiStoreMetric(L"CaptionHeight", gspv.ncm.iCaptionHeight);
986 SpiStoreMetric(L"SmCaptionWidth", gspv.ncm.iSmCaptionWidth);
987 SpiStoreMetric(L"SmCaptionHeight", gspv.ncm.iSmCaptionHeight);
988 SpiStoreMetric(L"MenuWidth", gspv.ncm.iMenuWidth);
989 SpiStoreMetric(L"MenuHeight", gspv.ncm.iMenuHeight);
990#if (WINVER >= 0x0600)
991 SpiStoreMetric(L"PaddedBorderWidth", gspv.ncm.iPaddedBorderWidth);
992#endif
993 SpiStoreFont(L"CaptionFont", &gspv.ncm.lfCaptionFont);
994 SpiStoreFont(L"SmCaptionFont", &gspv.ncm.lfSmCaptionFont);
995 SpiStoreFont(L"MenuFont", &gspv.ncm.lfMenuFont);
996 SpiStoreFont(L"StatusFont", &gspv.ncm.lfStatusFont);
997 SpiStoreFont(L"MessageFont", &gspv.ncm.lfMessageFont);
998 }
999
1001 return 0;
1002
1003 return (UINT_PTR)KEY_METRIC;
1004 }
1005
1006 case SPI_GETMINIMIZEDMETRICS:
1007 {
1008 return SpiGet(pvParam, &gspv.mm, sizeof(MINIMIZEDMETRICS), fl);
1009 }
1010
1011 case SPI_SETMINIMIZEDMETRICS:
1012 {
1014
1015 /* Fixup user's structure size */
1016 metrics->cbSize = sizeof(MINIMIZEDMETRICS);
1017
1018 if (!SpiSet(&gspv.mm, metrics, sizeof(MINIMIZEDMETRICS), fl))
1019 return 0;
1020
1021 gspv.mm.iWidth = max(0, gspv.mm.iWidth);
1024 gspv.mm.iArrange = gspv.mm.iArrange & 0xf;
1025
1026 if (fl & SPIF_UPDATEINIFILE)
1027 {
1028 SpiStoreMetric(L"MinWidth", gspv.mm.iWidth);
1029 SpiStoreMetric(L"MinHorzGap", gspv.mm.iHorzGap);
1030 SpiStoreMetric(L"MinVertGap", gspv.mm.iVertGap);
1031 SpiStoreMetric(L"MinArrange", gspv.mm.iArrange);
1032 }
1033
1034 return (UINT_PTR)KEY_METRIC;
1035 }
1036
1037 case SPI_GETICONMETRICS:
1038 {
1039 return SpiGet(pvParam, &gspv.im, sizeof(ICONMETRICSW), fl);
1040 }
1041
1042 case SPI_SETICONMETRICS:
1043 {
1044 LPICONMETRICSW metrics = (LPICONMETRICSW)pvParam;
1045
1046 /* Fixup user's structure size */
1047 metrics->cbSize = sizeof(ICONMETRICSW);
1048
1049 if (!SpiSet(&gspv.im, metrics, sizeof(ICONMETRICSW), fl))
1050 return 0;
1051
1052 if (fl & SPIF_UPDATEINIFILE)
1053 {
1054 SpiStoreMetric(VAL_ICONSPC, gspv.im.iHorzSpacing);
1055 SpiStoreMetric(VAL_ICONVSPC, gspv.im.iVertSpacing);
1056 SpiStoreMetric(VAL_ITWRAP, gspv.im.iTitleWrap);
1057 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
1058 }
1059 return (UINT_PTR)KEY_METRIC;
1060 }
1061
1062 case SPI_GETWORKAREA:
1063 {
1064 PMONITOR pmonitor = UserGetPrimaryMonitor();
1065
1066 if(!pmonitor)
1067 return 0;
1068
1069 return SpiGet(pvParam, &pmonitor->rcWork, sizeof(RECTL), fl);
1070 }
1071
1072 case SPI_SETWORKAREA:
1073 {
1074 PMONITOR pmonitor;
1075 RECTL rcWorkArea, rcIntersect;
1076
1077 if (!pvParam)
1078 return 0;
1079
1080 RtlCopyMemory(&rcWorkArea, pvParam, sizeof(rcWorkArea));
1081
1082 /* fail if empty */
1083 if (RECTL_bIsEmptyRect(&rcWorkArea))
1084 return 0;
1085
1086 /* get the nearest monitor */
1087 pmonitor = UserMonitorFromRect(&rcWorkArea, MONITOR_DEFAULTTONEAREST);
1088 if (!pmonitor)
1089 return 0;
1090
1091 /* fail unless work area is completely in monitor */
1092 if (!RECTL_bIntersectRect(&rcIntersect, &pmonitor->rcMonitor, &rcWorkArea) ||
1093 !RtlEqualMemory(&rcIntersect, &rcWorkArea, sizeof(rcIntersect)))
1094 {
1095 return 0;
1096 }
1097
1098 if (!SpiSet(&pmonitor->rcWork, pvParam, sizeof(RECTL), fl))
1099 return 0;
1100
1101 if (fl & SPIF_UPDATEINIFILE)
1102 {
1103 // FIXME: What to do?
1104 }
1105 return (UINT_PTR)KEY_DESKTOP;
1106 }
1107
1108 case SPI_SETPENWINDOWS:
1109 ERR("SPI_SETPENWINDOWS is unimplemented\n");
1110 break;
1111
1112 case SPI_GETFILTERKEYS:
1113 {
1114 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1115
1116 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1117 return 0;
1118
1119 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1120 return 0;
1121
1122 return SpiGet(pvParam, &gspv.filterkeys, sizeof(FILTERKEYS), fl);
1123 }
1124
1125 case SPI_SETFILTERKEYS:
1126 {
1127 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1128
1129 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1130 return 0;
1131
1132 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1133 return 0;
1134
1135 if (!SpiSet(&gspv.filterkeys, pvParam, sizeof(FILTERKEYS), fl))
1136 return 0;
1137
1138 if (fl & SPIF_UPDATEINIFILE)
1139 {
1140 // FIXME: What to do?
1141 }
1142 return (UINT_PTR)KEY_DESKTOP;
1143 }
1144
1145 case SPI_GETTOGGLEKEYS:
1146 {
1147 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1148
1149 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1150 return 0;
1151
1152 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1153 return 0;
1154
1155 return SpiGet(pvParam, &gspv.togglekeys, sizeof(TOGGLEKEYS), fl);
1156 }
1157
1158 case SPI_SETTOGGLEKEYS:
1159 {
1160 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1161
1162 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1163 return 0;
1164
1165 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1166 return 0;
1167
1168 if (!SpiSet(&gspv.togglekeys, pvParam, sizeof(TOGGLEKEYS), fl))
1169 return 0;
1170
1171 if (fl & SPIF_UPDATEINIFILE)
1172 {
1173 // FIXME: What to do?
1174 }
1175 return (UINT_PTR)KEY_DESKTOP;
1176 }
1177
1178 case SPI_GETMOUSEKEYS:
1179 {
1180 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1181
1182 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1183 return 0;
1184
1185 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1186 return 0;
1187
1188 return SpiGet(pvParam, &gspv.mousekeys, sizeof(MOUSEKEYS), fl);
1189 }
1190
1191 case SPI_SETMOUSEKEYS:
1192 {
1193 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1194
1195 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1196 return 0;
1197
1198 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1199 return 0;
1200
1201 if (!SpiSet(&gspv.mousekeys, pvParam, sizeof(MOUSEKEYS), fl))
1202 return 0;
1203
1204 if (fl & SPIF_UPDATEINIFILE)
1205 {
1209 }
1210 return (UINT_PTR)KEY_DESKTOP;
1211 }
1212
1213 case SPI_GETSHOWSOUNDS:
1214 return SpiGetInt(pvParam, &gspv.bShowSounds, fl);
1215
1216 case SPI_SETSHOWSOUNDS:
1217 return SpiSetBool(&gspv.bShowSounds, uiParam, KEY_SHOWSNDS, VAL_ON, fl);
1218
1219 case SPI_GETSTICKYKEYS:
1220 {
1221 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1222
1223 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1224 return 0;
1225
1226 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1227 return 0;
1228
1229 return SpiGetEx(pvParam, &gspv.stickykeys, sizeof(STICKYKEYS), fl);
1230 }
1231
1232 case SPI_SETSTICKYKEYS:
1233 {
1234 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1235
1236 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1237 return 0;
1238
1239 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1240 return 0;
1241
1242 if (!SpiSet(&gspv.stickykeys, pvParam, sizeof(STICKYKEYS), fl))
1243 return 0;
1244
1245 if (fl & SPIF_UPDATEINIFILE)
1246 {
1247 // FIXME: What to do?
1248 }
1249 return (UINT_PTR)KEY_DESKTOP;
1250 }
1251
1253 {
1254 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1255
1256 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1257 return 0;
1258
1259 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1260 return 0;
1261
1262 return SpiGetEx(pvParam, &gspv.accesstimeout, sizeof(ACCESSTIMEOUT), fl);
1263 }
1264
1266 {
1267 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1268
1269 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1270 {
1271 return 0;
1272 }
1273
1274 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1275 {
1276 return 0;
1277 }
1278
1279 if (!SpiSet(&gspv.accesstimeout, pvParam, sizeof(ACCESSTIMEOUT), fl))
1280 return 0;
1281
1282 if (fl & SPIF_UPDATEINIFILE)
1283 {
1284 // FIXME: What to do?
1285 }
1286 return (UINT_PTR)KEY_DESKTOP;
1287 }
1288
1289 case SPI_GETSERIALKEYS:
1290 {
1291 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1292
1293 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1294 return 0;
1295
1296 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1297 return 0;
1298
1299 return SpiGet(pvParam, &gspv.serialkeys, sizeof(SERIALKEYS), fl);
1300 }
1301
1302 case SPI_SETSERIALKEYS:
1303 {
1304 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1305
1306 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1307 return 0;
1308
1309 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1310 return 0;
1311
1312 if (!SpiSet(&gspv.serialkeys, pvParam, sizeof(SERIALKEYS), fl))
1313 return 0;
1314
1315 if (fl & SPIF_UPDATEINIFILE)
1316 {
1317 // FIXME: What to do?
1318 }
1319 return (UINT_PTR)KEY_DESKTOP;
1320 }
1321
1322 case SPI_GETSOUNDSENTRY:
1323 {
1324 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1325
1326 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1327 return 0;
1328
1329 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1330 return 0;
1331
1332 return SpiGet(pvParam, &gspv.soundsentry, sizeof(SOUNDSENTRYW), fl);
1333 }
1334
1335 case SPI_SETSOUNDSENTRY:
1336 {
1337 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1338
1339 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1340 return 0;
1341
1342 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1343 return 0;
1344
1345 if (!SpiSet(&gspv.soundsentry, pvParam, sizeof(SOUNDSENTRYW), fl))
1346 return 0;
1347
1348 if (fl & SPIF_UPDATEINIFILE)
1349 {
1350 // FIXME: What to do?
1351 }
1352 return (UINT_PTR)KEY_DESKTOP;
1353 }
1354
1355 case SPI_GETHIGHCONTRAST:
1356 {
1357 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1358
1359 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1360 return 0;
1361
1362 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1363 return 0;
1364
1365 return SpiGet(pvParam, &gspv.highcontrast, sizeof(HIGHCONTRASTW), fl);
1366 }
1367
1368 case SPI_SETHIGHCONTRAST:
1369 {
1370 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1371
1372 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1373 return 0;
1374
1375 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1376 return 0;
1377
1378 if (!SpiSet(&gspv.highcontrast, pvParam, sizeof(HIGHCONTRASTW), fl))
1379 return 0;
1380
1381 if (fl & SPIF_UPDATEINIFILE)
1382 {
1383 // FIXME: What to do?
1384 }
1385 return (UINT_PTR)KEY_DESKTOP;
1386 }
1387
1388 case SPI_GETKEYBOARDPREF:
1389 return SpiGetInt(pvParam, &gspv.bKbdPref, fl);
1390
1391 case SPI_SETKEYBOARDPREF:
1392 return SpiSetBool(&gspv.bKbdPref, uiParam, KEY_KDBPREF, VAL_ON, fl);
1393
1394 case SPI_GETSCREENREADER:
1395 return SpiGetInt(pvParam, &gspv.bScreenReader, fl);
1396
1397 case SPI_SETSCREENREADER:
1398 return SpiSetBool(&gspv.bScreenReader, uiParam, KEY_SCRREAD, VAL_ON, fl);
1399
1400 case SPI_GETANIMATION:
1401 return SpiGet(pvParam, &gspv.animationinfo, sizeof(ANIMATIONINFO), fl);
1402
1403 case SPI_SETANIMATION:
1404 if (!SpiSet(&gspv.animationinfo, pvParam, sizeof(ANIMATIONINFO), fl))
1405 return 0;
1406 if (fl & SPIF_UPDATEINIFILE)
1407 {
1408 // FIXME: What to do?
1409 }
1410 return (UINT_PTR)KEY_DESKTOP;
1411
1412 case SPI_GETFONTSMOOTHING:
1413 return SpiGetInt(pvParam, &gspv.bFontSmoothing, fl);
1414
1415 case SPI_SETFONTSMOOTHING:
1416 gspv.bFontSmoothing = !!uiParam;
1417 if (fl & SPIF_UPDATEINIFILE)
1418 {
1420 }
1421 return (UINT_PTR)KEY_DESKTOP;
1422
1423 case SPI_SETDRAGWIDTH:
1424 return SpiSetInt(&gspv.iDragWidth, uiParam, KEY_DESKTOP, VAL_DRAGWIDTH, fl);
1425
1426 case SPI_SETDRAGHEIGHT:
1428
1429 case SPI_SETHANDHELD:
1430 return SpiSetBool(&gspv.bHandHeld, uiParam, KEY_DESKTOP, L"HandHeld", fl);
1431
1432 case SPI_GETLOWPOWERTIMEOUT:
1433 return SpiGetInt(pvParam, &gspv.iLowPwrTimeout, fl);
1434
1435 case SPI_GETPOWEROFFTIMEOUT:
1436 return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl);
1437
1438 case SPI_SETLOWPOWERTIMEOUT:
1439 return SpiSetInt(&gspv.iLowPwrTimeout, uiParam, KEY_DESKTOP, L"LowPowerTimeOut", fl);
1440
1441 case SPI_SETPOWEROFFTIMEOUT:
1442 return SpiSetInt(&gspv.iPwrOffTimeout, uiParam, KEY_DESKTOP, L"PowerOffTimeOut", fl);
1443
1444 case SPI_GETLOWPOWERACTIVE:
1445 return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl);
1446
1447 case SPI_GETPOWEROFFACTIVE:
1448 return SpiGetInt(pvParam, &gspv.bPwrOffActive, fl);
1449
1450 case SPI_SETLOWPOWERACTIVE:
1451 return SpiSetBool(&gspv.bLowPwrActive, uiParam, KEY_DESKTOP, L"LowPowerActive", fl);
1452
1453 case SPI_SETPOWEROFFACTIVE:
1454 return SpiSetBool(&gspv.bPwrOffActive, uiParam, KEY_DESKTOP, L"PowerOffActive", fl);
1455
1456 case SPI_SETCURSORS:
1457 ERR("SPI_SETCURSORS is unimplemented\n");
1458 break;
1459
1460 case SPI_SETICONS:
1461 ERR("SPI_SETICONS is unimplemented\n");
1462 break;
1463
1464 case SPI_GETDEFAULTINPUTLANG:
1465 if (!gspklBaseLayout)
1466 return FALSE;
1467
1468 return SpiGet(pvParam, &gspklBaseLayout->hkl, sizeof(HKL), fl);
1469
1470 case SPI_SETDEFAULTINPUTLANG:
1471 {
1472 HKL hkl;
1473
1474 /* Note: SPIF_UPDATEINIFILE is not supported */
1475 if ((fl & SPIF_UPDATEINIFILE) || !SpiSet(&hkl, pvParam, sizeof(hkl), fl))
1476 return FALSE;
1477
1479 }
1480
1481 case SPI_SETLANGTOGGLE:
1482 gdwLayoutToggleKey = UserGetLanguageToggle(L"Layout Hotkey", 2);
1483 gdwLanguageToggleKey = UserGetLanguageToggle(L"Language Hotkey", 1);
1484 return gdwLanguageToggleKey;
1485
1486 case SPI_GETWINDOWSEXTENSION:
1487 ERR("SPI_GETWINDOWSEXTENSION is unimplemented\n");
1488 break;
1489
1490 case SPI_GETMOUSETRAILS:
1491 return SpiGetInt(pvParam, &gspv.iMouseTrails, fl);
1492
1493 case SPI_SETMOUSETRAILS:
1495
1496 case SPI_GETSNAPTODEFBUTTON:
1497 return SpiGetInt(pvParam, &gspv.bSnapToDefBtn, fl);
1498
1499 case SPI_SETSNAPTODEFBUTTON:
1501
1502 case SPI_GETMOUSEHOVERWIDTH:
1503 return SpiGetInt(pvParam, &gspv.iMouseHoverWidth, fl);
1504
1505 case SPI_SETMOUSEHOVERWIDTH:
1507
1508 case SPI_GETMOUSEHOVERHEIGHT:
1509 return SpiGetInt(pvParam, &gspv.iMouseHoverHeight, fl);
1510
1511 case SPI_SETMOUSEHOVERHEIGHT:
1513
1514 case SPI_GETMOUSEHOVERTIME:
1515 return SpiGetInt(pvParam, &gspv.iMouseHoverTime, fl);
1516
1517 case SPI_SETMOUSEHOVERTIME:
1518 /* See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
1519 * copy text from it, if some agument why xp and 2003 behovir diffent
1520 * only if they do not have SP install
1521 * " Windows Server 2003 and Windows XP: The operating system does not
1522 * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until
1523 * Windows Server 2003 SP1 and Windows XP SP2 "
1524 */
1526
1527 case SPI_GETWHEELSCROLLLINES:
1528 return SpiGetInt(pvParam, &gspv.iWheelScrollLines, fl);
1529
1532
1533 case SPI_GETMENUSHOWDELAY:
1534 return SpiGetInt(pvParam, &gspv.dwMenuShowDelay, fl);
1535
1536 case SPI_SETMENUSHOWDELAY:
1537 return SpiSetInt(&gspv.dwMenuShowDelay, uiParam, KEY_DESKTOP, L"MenuShowDelay", fl);
1538
1539#if (_WIN32_WINNT >= 0x0600)
1541 return SpiGetInt(pvParam, &gspv.uiWheelScrollChars, fl);
1542
1543 case SPI_SETWHEELSCROLLCHARS:
1544 return SpiSetInt(&gspv.uiWheelScrollChars, uiParam, KEY_DESKTOP, VAL_SCRLLCHARS, fl);
1545#endif
1546 case SPI_GETSHOWIMEUI:
1547 return SpiGetInt(pvParam, &gspv.bShowImeUi, fl);
1548
1549 case SPI_SETSHOWIMEUI:
1550 return SpiSetBool(&gspv.bShowImeUi, uiParam, KEY_DESKTOP, L"", fl);
1551
1552 case SPI_GETMOUSESPEED:
1553 return SpiGetInt(pvParam, &gspv.iMouseSpeed, fl);
1554
1555 case SPI_SETMOUSESPEED:
1556 {
1557 /* Allowed range is [1:20] */
1558 if ((INT_PTR)pvParam < 1 || (INT_PTR)pvParam > 20)
1559 return 0;
1560 else
1562 }
1563
1564 case SPI_GETSCREENSAVERRUNNING:
1565 return SpiGetInt(pvParam, &gspv.bScrSaverRunning, fl);
1566
1567 case SPI_SETSCREENSAVERRUNNING:
1568 // FIXME: also return value?
1569 return SpiSetBool(&gspv.bScrSaverRunning, uiParam, KEY_MOUSE, L"", fl);
1570
1571#if(WINVER >= 0x0600)
1572 case SPI_GETAUDIODESCRIPTION:
1573 return SpiGet(pvParam, &gspv.audiodescription, sizeof(AUDIODESCRIPTION), fl);
1574
1575 case SPI_SETAUDIODESCRIPTION:
1576 ERR("SPI_SETAUDIODESCRIPTION is unimplemented\n");
1577 break;
1578
1579 case SPI_GETSCREENSAVESECURE:
1580 return SpiGetInt(pvParam, &gspv.bScrSaverSecure, fl);
1581
1582 case SPI_SETSCREENSAVESECURE:
1583 return SpiSetBool(&gspv.bScrSaverSecure, uiParam, KEY_DESKTOP, L"ScreenSaverIsSecure", fl);
1584#endif
1585
1586 case SPI_GETACTIVEWINDOWTRACKING:
1587 return SpiGetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1588
1589 case SPI_SETACTIVEWINDOWTRACKING:
1590 return SpiSetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1591
1592 case SPI_GETMENUANIMATION:
1593 return SpiGetUserPref(UPM_MENUANIMATION, pvParam, fl);
1594
1595 case SPI_SETMENUANIMATION:
1596 return SpiSetUserPref(UPM_MENUANIMATION, pvParam, fl);
1597
1598 case SPI_GETCOMBOBOXANIMATION:
1599 return SpiGetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1600
1601 case SPI_SETCOMBOBOXANIMATION:
1602 return SpiSetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1603
1604 case SPI_GETLISTBOXSMOOTHSCROLLING:
1606
1607 case SPI_SETLISTBOXSMOOTHSCROLLING:
1609
1610 case SPI_GETGRADIENTCAPTIONS:
1611 {
1613 {
1614 INT iValue = 0;
1615 return SpiGetInt(pvParam, &iValue, fl);
1616 }
1617 else
1618 {
1619 return SpiGetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1620 }
1621 }
1622
1623 case SPI_SETGRADIENTCAPTIONS:
1624 return SpiSetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1625
1626 case SPI_GETKEYBOARDCUES:
1627 return SpiGetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1628
1629 case SPI_SETKEYBOARDCUES:
1630 return SpiSetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1631
1632 case SPI_GETACTIVEWNDTRKZORDER:
1633 return SpiGetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1634
1635 case SPI_SETACTIVEWNDTRKZORDER:
1636 return SpiSetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1637
1638 case SPI_GETHOTTRACKING:
1639 return SpiGetUserPref(UPM_HOTTRACKING, pvParam, fl);
1640
1641 case SPI_SETHOTTRACKING:
1642 return SpiSetUserPref(UPM_HOTTRACKING, pvParam, fl);
1643
1644 case SPI_GETMENUFADE:
1645 return SpiGetUserPref(UPM_MENUFADE, pvParam, fl);
1646
1647 case SPI_SETMENUFADE:
1648 return SpiSetUserPref(UPM_MENUFADE, pvParam, fl);
1649
1650 case SPI_GETSELECTIONFADE:
1651 return SpiGetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1652
1653 case SPI_SETSELECTIONFADE:
1654 return SpiSetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1655
1656 case SPI_GETTOOLTIPANIMATION:
1657 return SpiGetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1658
1659 case SPI_SETTOOLTIPANIMATION:
1660 return SpiSetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1661
1662 case SPI_GETTOOLTIPFADE:
1663 return SpiGetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1664
1665 case SPI_SETTOOLTIPFADE:
1666 return SpiSetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1667
1668 case SPI_GETCURSORSHADOW:
1669 return SpiGetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1670
1671 case SPI_SETCURSORSHADOW:
1673 return SpiSetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1674
1675 case SPI_GETUIEFFECTS:
1676 return SpiGetUserPref(UPM_UIEFFECTS, pvParam, fl);
1677
1678 case SPI_SETUIEFFECTS:
1679 return SpiSetUserPref(UPM_UIEFFECTS, pvParam, fl);
1680
1681 case SPI_GETMOUSESONAR:
1682 return SpiGetInt(pvParam, &gspv.bMouseSonar, fl);
1683
1684 case SPI_SETMOUSESONAR:
1685 return SpiSetBool(&gspv.bMouseSonar, uiParam, KEY_MOUSE, L"", fl);
1686
1687 case SPI_GETMOUSECLICKLOCK:
1688 return SpiGetUserPref(UPM_CLICKLOCK, pvParam, fl);
1689
1690 case SPI_SETMOUSECLICKLOCK:
1691 gspv.bMouseClickLock = PtrToUlong(pvParam);
1692 return SpiSetUserPref(UPM_CLICKLOCK, pvParam, fl);
1693
1694 case SPI_GETMOUSEVANISH:
1695 return SpiGetInt(pvParam, &gspv.bMouseVanish, fl);
1696
1697 case SPI_SETMOUSEVANISH:
1698 return SpiSetBool(&gspv.bMouseVanish, uiParam, KEY_MOUSE, L"", fl);
1699
1700 case SPI_GETFLATMENU:
1701 return SpiGetUserPref(UPM_FLATMENU, pvParam, fl);
1702
1703 case SPI_SETFLATMENU:
1704 return SpiSetUserPref(UPM_FLATMENU, pvParam, fl);
1705
1706 case SPI_GETDROPSHADOW:
1707 return SpiGetUserPref(UPM_DROPSHADOW, pvParam, fl);
1708
1709 case SPI_SETDROPSHADOW:
1710 return SpiSetUserPref(UPM_DROPSHADOW, pvParam, fl);
1711
1712 case SPI_GETBLOCKSENDINPUTRESETS:
1713 return SpiGetInt(pvParam, &gspv.bBlockSendInputResets, fl);
1714
1715 case SPI_SETBLOCKSENDINPUTRESETS:
1716 return SpiSetBool(&gspv.bBlockSendInputResets, uiParam, KEY_MOUSE, L"", fl);
1717
1718#if(_WIN32_WINNT >= 0x0600)
1719 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1720 return SpiGetInt(pvParam, &gspv.bDisableOverlappedContent, fl);
1721
1722 case SPI_SETDISABLEOVERLAPPEDCONTENT:
1723 return SpiSetBool(&gspv.bDisableOverlappedContent, uiParam, KEY_MOUSE, L"", fl);
1724
1725 case SPI_GETCLIENTAREAANIMATION:
1726 return SpiGetInt(pvParam, &gspv.bClientAreaAnimation, fl);
1727
1728 case SPI_SETCLIENTAREAANIMATION:
1729 return SpiSetBool(&gspv.bClientAreaAnimation, uiParam, KEY_MOUSE, L"", fl);
1730
1731 case SPI_GETCLEARTYPE:
1732 return SpiGetInt(pvParam, &gspv.bClearType, fl);
1733
1734 case SPI_SETCLEARTYPE:
1735 return SpiSetBool(&gspv.bClearType, uiParam, KEY_MOUSE, L"", fl);
1736
1737 case SPI_GETSPEECHRECOGNITION:
1738 return SpiGetInt(pvParam, &gspv.bSpeechRecognition, fl);
1739
1740 case SPI_SETSPEECHRECOGNITION:
1741 return SpiSetBool(&gspv.bSpeechRecognition, uiParam, KEY_MOUSE, L"", fl);
1742#endif
1743
1744 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1745 return SpiGetInt(pvParam, &gspv.dwForegroundLockTimeout, fl);
1746
1747 case SPI_SETFOREGROUNDLOCKTIMEOUT:
1748 return SpiSetInt(&gspv.dwForegroundLockTimeout, uiParam, KEY_MOUSE, L"", fl);
1749
1750 case SPI_GETACTIVEWNDTRKTIMEOUT:
1751 return SpiGetInt(pvParam, &gspv.dwActiveTrackingTimeout, fl);
1752
1753 case SPI_SETACTIVEWNDTRKTIMEOUT:
1754 return SpiSetInt(&gspv.dwActiveTrackingTimeout, uiParam, KEY_MOUSE, L"", fl);
1755
1756 case SPI_GETFOREGROUNDFLASHCOUNT:
1757 return SpiGetInt(pvParam, &gspv.dwForegroundFlashCount, fl);
1758
1759 case SPI_SETFOREGROUNDFLASHCOUNT:
1760 return SpiSetInt(&gspv.dwForegroundFlashCount, uiParam, KEY_MOUSE, L"", fl);
1761
1762 case SPI_GETCARETWIDTH:
1763 return SpiGetInt(pvParam, &gspv.dwCaretWidth, fl);
1764
1765 case SPI_SETCARETWIDTH:
1767
1768 case SPI_GETMOUSECLICKLOCKTIME:
1769 return SpiGetInt(pvParam, &gspv.dwMouseClickLockTime, fl);
1770
1771 case SPI_SETMOUSECLICKLOCKTIME:
1773
1774 case SPI_GETFONTSMOOTHINGTYPE:
1775 return SpiGetInt(pvParam, &gspv.uiFontSmoothingType, fl);
1776
1777 case SPI_SETFONTSMOOTHINGTYPE:
1779
1780 case SPI_GETFONTSMOOTHINGCONTRAST:
1781 return SpiGetInt(pvParam, &gspv.uiFontSmoothingContrast, fl);
1782
1783 case SPI_SETFONTSMOOTHINGCONTRAST:
1785
1786 case SPI_GETFOCUSBORDERWIDTH:
1787 return SpiGetInt(pvParam, &gspv.uiFocusBorderWidth, fl);
1788
1789 case SPI_SETFOCUSBORDERWIDTH:
1790 return SpiSetInt(&gspv.uiFocusBorderWidth, uiParam, KEY_MOUSE, L"", fl);
1791
1792 case SPI_GETFOCUSBORDERHEIGHT:
1793 return SpiGetInt(pvParam, &gspv.uiFocusBorderHeight, fl);
1794
1795 case SPI_SETFOCUSBORDERHEIGHT:
1796 return SpiSetInt(&gspv.uiFocusBorderHeight, uiParam, KEY_MOUSE, L"", fl);
1797
1798 case SPI_GETFONTSMOOTHINGORIENTATION:
1799 return SpiGetInt(pvParam, &gspv.uiFontSmoothingOrientation, fl);
1800
1801 case SPI_SETFONTSMOOTHINGORIENTATION:
1803
1804 case SPI_GETWINARRANGING:
1805 return SpiGetInt(pvParam, &g_bWindowSnapEnabled, fl);
1806 case SPI_SETWINARRANGING:
1808
1809 case SPI_GETDOCKMOVING:
1810 return SpiGetInt(pvParam, &gspv.bDockMoving, fl);
1811 case SPI_SETDOCKMOVING:
1813
1814 /* The following are undocumented, but valid SPI values */
1815 case 0x1010:
1816 case 0x1011:
1817 case 0x1028:
1818 case 0x1029:
1819 case 0x102A:
1820 case 0x102B:
1821 case 0x102C:
1822 case 0x102D:
1823 case 0x102E:
1824 case 0x102F:
1825 case 0x1030:
1826 case 0x1031:
1827 case 0x1032:
1828 case 0x1033:
1829 case 0x1034:
1830 case 0x1035:
1831 case 0x1036:
1832 case 0x1037:
1833 case 0x1038:
1834 case 0x1039:
1835 case 0x103A:
1836 case 0x103B:
1837 case 0x103C:
1838 case 0x103D:
1839 ERR("Undocumented SPI value %x is unimplemented\n", uiAction);
1840 break;
1841
1842 default:
1843 ERR("Invalid SPI value: %u\n", uiAction);
1845 return 0;
1846 }
1847
1848 return 0;
1849}
1850
1851static BOOL
1852SpiGetSetProbeBuffer(UINT uiAction, UINT uiParam, PVOID pvParam)
1853{
1854 BOOL bToUser = TRUE;
1855 ULONG cbSize = 0;
1856
1857 switch (uiAction)
1858 {
1859 case SPI_GETBEEP:
1860 case SPI_GETBORDER:
1869 case SPI_GETDRAGFULLWINDOWS:
1870 case SPI_GETSHOWSOUNDS:
1871 case SPI_GETKEYBOARDPREF:
1872 case SPI_GETSCREENREADER:
1873 case SPI_GETFONTSMOOTHING:
1874 case SPI_GETLOWPOWERTIMEOUT:
1875 case SPI_GETPOWEROFFTIMEOUT:
1876 case SPI_GETLOWPOWERACTIVE:
1877 case SPI_GETPOWEROFFACTIVE:
1878 case SPI_GETMOUSETRAILS:
1879 case SPI_GETSNAPTODEFBUTTON:
1880 case SPI_GETMOUSEHOVERWIDTH:
1881 case SPI_GETMOUSEHOVERHEIGHT:
1882 case SPI_GETMOUSEHOVERTIME:
1883 case SPI_GETWHEELSCROLLLINES:
1884 case SPI_GETMENUSHOWDELAY:
1885#if (_WIN32_WINNT >= 0x0600)
1887#endif
1888 case SPI_GETSHOWIMEUI:
1889 case SPI_GETMOUSESPEED:
1890 case SPI_GETSCREENSAVERRUNNING:
1891#if(WINVER >= 0x0600)
1892 case SPI_GETSCREENSAVESECURE:
1893#endif
1894 case SPI_GETACTIVEWINDOWTRACKING:
1895 case SPI_GETMENUANIMATION:
1896 case SPI_GETCOMBOBOXANIMATION:
1897 case SPI_GETLISTBOXSMOOTHSCROLLING:
1898 case SPI_GETGRADIENTCAPTIONS:
1899 case SPI_GETKEYBOARDCUES:
1900 case SPI_GETACTIVEWNDTRKZORDER:
1901 case SPI_GETHOTTRACKING:
1902 case SPI_GETMENUFADE:
1903 case SPI_GETSELECTIONFADE:
1904 case SPI_GETTOOLTIPANIMATION:
1905 case SPI_GETTOOLTIPFADE:
1906 case SPI_GETCURSORSHADOW:
1907 case SPI_GETUIEFFECTS:
1908 case SPI_GETMOUSESONAR:
1909 case SPI_GETMOUSECLICKLOCK:
1910 case SPI_GETMOUSEVANISH:
1911 case SPI_GETFLATMENU:
1912 case SPI_GETDROPSHADOW:
1913 case SPI_GETBLOCKSENDINPUTRESETS:
1914#if(_WIN32_WINNT >= 0x0600)
1915 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1916 case SPI_GETCLIENTAREAANIMATION:
1917 case SPI_GETCLEARTYPE:
1918 case SPI_GETSPEECHRECOGNITION:
1919#endif
1920 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1921 case SPI_GETACTIVEWNDTRKTIMEOUT:
1922 case SPI_GETFOREGROUNDFLASHCOUNT:
1923 case SPI_GETCARETWIDTH:
1924 case SPI_GETMOUSECLICKLOCKTIME:
1925 case SPI_GETFONTSMOOTHINGTYPE:
1926 case SPI_GETFONTSMOOTHINGCONTRAST:
1927 case SPI_GETFOCUSBORDERWIDTH:
1928 case SPI_GETFOCUSBORDERHEIGHT:
1929 case SPI_GETFONTSMOOTHINGORIENTATION:
1930 cbSize = sizeof(INT);
1931 break;
1932
1935 if (pvParam) cbSize = sizeof(INT);
1936 break;
1937
1938 case SPI_GETMOUSE:
1939 cbSize = 3 * sizeof(INT);
1940 break;
1941
1942 case SPI_GETDESKWALLPAPER:
1943 cbSize = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
1944 break;
1945
1947 cbSize = sizeof(LOGFONTW);
1948 break;
1949
1950 case SPI_GETNONCLIENTMETRICS:
1951 cbSize = sizeof(NONCLIENTMETRICSW);
1952 break;
1953
1954 case SPI_GETMINIMIZEDMETRICS:
1955 cbSize = sizeof(MINIMIZEDMETRICS);
1956 break;
1957
1958 case SPI_GETICONMETRICS:
1959 cbSize = sizeof(ICONMETRICSW);
1960 break;
1961
1962 case SPI_GETWORKAREA:
1963 cbSize = sizeof(RECTL);
1964 break;
1965
1966 case SPI_GETFILTERKEYS:
1967 cbSize = sizeof(FILTERKEYS);
1968 break;
1969
1970 case SPI_GETTOGGLEKEYS:
1971 cbSize = sizeof(TOGGLEKEYS);
1972 break;
1973
1974 case SPI_GETMOUSEKEYS:
1975 cbSize = sizeof(MOUSEKEYS);
1976 break;
1977
1978 case SPI_GETSTICKYKEYS:
1979 cbSize = sizeof(STICKYKEYS);
1980 break;
1981
1983 cbSize = sizeof(ACCESSTIMEOUT);
1984 break;
1985
1986 case SPI_GETSERIALKEYS:
1987 cbSize = sizeof(SERIALKEYS);
1988 break;
1989
1990 case SPI_GETSOUNDSENTRY:
1991 cbSize = sizeof(SOUNDSENTRYW);
1992 break;
1993
1994 case SPI_GETHIGHCONTRAST:
1995 cbSize = sizeof(HIGHCONTRASTW);
1996 break;
1997
1998 case SPI_GETANIMATION:
1999 cbSize = sizeof(ANIMATIONINFO);
2000 break;
2001
2002 case SPI_GETDEFAULTINPUTLANG:
2003 cbSize = sizeof(HKL);
2004 break;
2005
2006#if(WINVER >= 0x0600)
2007 case SPI_GETAUDIODESCRIPTION:
2008 cbSize = sizeof(AUDIODESCRIPTION);
2009 break;
2010#endif
2011
2012 case SPI_SETMOUSE:
2013 cbSize = 3 * sizeof(INT);
2014 bToUser = FALSE;
2015 break;
2016
2018 cbSize = sizeof(LOGFONTW);
2019 bToUser = FALSE;
2020 break;
2021
2022 case SPI_SETNONCLIENTMETRICS:
2023 cbSize = sizeof(NONCLIENTMETRICSW);
2024 bToUser = FALSE;
2025 break;
2026
2027 case SPI_SETMINIMIZEDMETRICS:
2028 cbSize = sizeof(MINIMIZEDMETRICS);
2029 bToUser = FALSE;
2030 break;
2031
2032 case SPI_SETICONMETRICS:
2033 cbSize = sizeof(ICONMETRICSW);
2034 bToUser = FALSE;
2035 break;
2036
2037 case SPI_SETWORKAREA:
2038 cbSize = sizeof(RECTL);
2039 bToUser = FALSE;
2040 break;
2041
2042 case SPI_SETFILTERKEYS:
2043 cbSize = sizeof(FILTERKEYS);
2044 bToUser = FALSE;
2045 break;
2046
2047 case SPI_SETTOGGLEKEYS:
2048 cbSize = sizeof(TOGGLEKEYS);
2049 bToUser = FALSE;
2050 break;
2051
2052 case SPI_SETMOUSEKEYS:
2053 cbSize = sizeof(MOUSEKEYS);
2054 bToUser = FALSE;
2055 break;
2056
2057 case SPI_SETSTICKYKEYS:
2058 cbSize = sizeof(STICKYKEYS);
2059 bToUser = FALSE;
2060 break;
2061
2063 cbSize = sizeof(ACCESSTIMEOUT);
2064 bToUser = FALSE;
2065 break;
2066
2067 case SPI_SETSERIALKEYS:
2068 cbSize = sizeof(SERIALKEYS);
2069 bToUser = FALSE;
2070 break;
2071
2072 case SPI_SETSOUNDSENTRY:
2073 cbSize = sizeof(SOUNDSENTRYW);
2074 bToUser = FALSE;
2075 break;
2076
2077 case SPI_SETHIGHCONTRAST:
2078 cbSize = sizeof(HIGHCONTRASTW);
2079 bToUser = FALSE;
2080 break;
2081
2082 case SPI_SETANIMATION:
2083 cbSize = sizeof(ANIMATIONINFO);
2084 bToUser = FALSE;
2085 break;
2086
2087 case SPI_SETDEFAULTINPUTLANG:
2088 cbSize = sizeof(HKL);
2089 bToUser = FALSE;
2090 break;
2091
2092 case SPI_SETMOUSESPEED:
2093 cbSize = sizeof(INT);
2094 bToUser = FALSE;
2095 break;
2096 }
2097
2098 if (cbSize)
2099 {
2100 _SEH2_TRY
2101 {
2102 if (bToUser)
2103 {
2104 ProbeForWrite(pvParam, cbSize, sizeof(UCHAR));
2105 }
2106 else
2107 {
2108 ProbeForRead(pvParam, cbSize, sizeof(UCHAR));
2109 }
2110 }
2112 {
2113 _SEH2_YIELD(return FALSE);
2114 }
2115 _SEH2_END;
2116 }
2117
2118 return TRUE;
2119}
2120
2121BOOL
2124 UINT uiAction,
2125 UINT uiParam,
2126 PVOID pvParam,
2127 UINT fWinIni)
2128{
2129 ULONG_PTR ulResult;
2131
2132 ASSERT(ppi);
2133
2134 if (!gbSpiInitialized)
2135 {
2137 //ASSERT(FALSE);
2138 return FALSE;
2139 }
2140
2141 /* Get a pointer to the current Windowstation */
2142 if (!ppi->prpwinsta)
2143 {
2144 ERR("UserSystemParametersInfo called without active window station.\n");
2145 //ASSERT(FALSE);
2146 //return FALSE;
2147 }
2148
2149 if ((fWinIni & SPIF_PROTECT) && !SpiGetSetProbeBuffer(uiAction, uiParam, pvParam))
2150 {
2152 return FALSE;
2153 }
2154
2155 /* Do the actual operation */
2156 ulResult = SpiGetSet(uiAction, uiParam, pvParam, fWinIni);
2157
2158 /* Did we change something? */
2159 if (ulResult > 1)
2160 {
2162
2163 /* Update system metrics */
2164 InitMetrics();
2165
2166 /* Send notification to toplevel windows, if requested */
2167 if (fWinIni & SPIF_SENDCHANGE)
2168 {
2169 /* Send WM_SETTINGCHANGE to all toplevel windows */
2172 (WPARAM)uiAction,
2173 (LPARAM)ulResult,
2175 100,
2176 &ulResult);
2177 }
2178 ulResult = 1;
2179 }
2180
2181 return ulResult;
2182}
2183
2184BOOL
2187 UINT uiAction,
2188 UINT uiParam,
2189 PVOID pvParam,
2190 UINT fWinIni)
2191{
2192 BOOL bResult;
2193
2194 TRACE("Enter NtUserSystemParametersInfo(%u)\n", uiAction);
2196
2197 // FIXME: Get rid of the flags and only use this from um. kernel can access data directly.
2198 /* Set UM memory protection flag */
2199 fWinIni |= SPIF_PROTECT;
2200
2201 /* Call internal function */
2202 bResult = UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
2203
2204 TRACE("Leave NtUserSystemParametersInfo, returning %d\n", bResult);
2205 UserLeave();
2206
2207 return bResult;
2208}
2209
2210/* EOF */
@ UPM_TOOLTIPANIMATION
@ UPM_COMBOBOXANIMATION
@ UPM_ACTIVEWINDOWTRACKING
@ UPM_GRADIENTCAPTIONS
@ UPM_LISTBOXSMOOTHSCROLLING
@ UPM_ACTIVEWNDTRKZORDER
LONG NTSTATUS
Definition: precomp.h:26
#define SPI_GETWHEELSCROLLCHARS
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
HBITMAP hbmp
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define MAX_PATH
Definition: compat.h:34
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
_ACRTIMP wchar_t *__cdecl _itow(int, wchar_t *, int)
Definition: string.c:2135
_ACRTIMP int __cdecl _wtoi(const wchar_t *)
Definition: wcs.c:2773
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
#define L(x)
Definition: resources.c:13
#define PtrToUlong(u)
Definition: config.h:107
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define KeRosDumpStackFrames(Frames, Count)
Definition: gdidebug.h:11
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLuint GLsizei GLfloat * metrics
Definition: glext.h:11745
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PSERVERINFO gpsi
Definition: imm.c:18
#define SRVINFO_KBDPREF
Definition: ntuser.h:952
#define PUSIF_COMBOBOXANIMATION
Definition: ntuser.h:995
#define PUSIF_KEYBOARDCUES
Definition: ntuser.h:997
BOOL NTAPI NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags)
Definition: painting.c:2003
#define PUSIF_LISTBOXSMOOTHSCROLLING
Definition: ntuser.h:996
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
#define REG_SZ
Definition: layer.c:22
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static HBITMAP
Definition: button.c:44
#define min(a, b)
Definition: monoChain.cc:55
HKL hkl
Definition: msctf.idl:632
UINT_PTR HKL
Definition: msctf.idl:125
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define REG_BINARY
Definition: nt_native.h:1499
#define FASTCALL
Definition: nt_native.h:50
unsigned long FLONG
Definition: ntbasedef.h:378
__kernel_entry W32KAPI INT APIENTRY NtGdiGetDeviceCaps(_In_ HDC hdc, _In_ INT i)
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1792
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:43
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:27
#define INT
Definition: polytest.cpp:20
_In_ DWORD _In_ DWORD cbBufSize
Definition: winsvc.h:430
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:207
#define REG_DWORD
Definition: sdbapi.c:615
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACE(s)
Definition: solgame.cpp:4
RECT rcWork
Definition: monitor.h:19
RECT rcMonitor
Definition: monitor.h:18
struct _WINSTATION_OBJECT * prpwinsta
Definition: win32.h:267
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
INT iMouseHoverWidth
Definition: sysparams.h:85
BOOL bDockMoving
Definition: sysparams.h:162
INT iDragHeight
Definition: sysparams.h:92
MINIMIZEDMETRICS mm
Definition: sysparams.h:52
BOOL bFontSmoothing
Definition: sysparams.h:125
WALLPAPER_MODE WallpaperMode
Definition: sysparams.h:144
BOOL bScreenReader
Definition: sysparams.h:60
FILTERKEYS filterkeys
Definition: sysparams.h:100
UINT uiFocusBorderHeight
Definition: sysparams.h:55
UINT uiFocusBorderWidth
Definition: sysparams.h:54
TEXTMETRICW tmCaptionFont
Definition: sysparams.h:139
NONCLIENTMETRICSW ncm
Definition: sysparams.h:51
DWORD dwMenuShowDelay
Definition: sysparams.h:131
MOUSEKEYS mousekeys
Definition: sysparams.h:76
BOOL bHandHeld
Definition: sysparams.h:148
INT iWheelScrollLines
Definition: sysparams.h:94
INT iKbdDelay
Definition: sysparams.h:107
INT iDblClickHeight
Definition: sysparams.h:89
BOOL bMouseBtnSwap
Definition: sysparams.h:82
SOUNDSENTRYW soundsentry
Definition: sysparams.h:70
UNICODE_STRING ustrWallpaper
Definition: sysparams.h:145
ULONG cxWallpaper
Definition: sysparams.h:143
SERIALKEYS serialkeys
Definition: sysparams.h:101
DWORD dwForegroundLockTimeout
Definition: sysparams.h:155
INT iDblClickTime
Definition: sysparams.h:90
STICKYKEYS stickykeys
Definition: sysparams.h:102
INT iLowPwrTimeout
Definition: sysparams.h:118
INT iScrSaverTimeout
Definition: sysparams.h:110
TEXTMETRICW tmMenuFont
Definition: sysparams.h:138
BOOL bSnapToDefBtn
Definition: sysparams.h:153
ICONMETRICSW im
Definition: sysparams.h:53
DWORD dwMouseClickLockTime
Definition: sysparams.h:79
BOOL bMouseClickLock
Definition: sysparams.h:77
BOOL bBeep
Definition: sysparams.h:72
DWORD dwKbdSpeed
Definition: sysparams.h:104
BOOL bMenuDropAlign
Definition: sysparams.h:130
DWORD dwUserPrefMask
Definition: sysparams.h:124
ULONG cyWallpaper
Definition: sysparams.h:143
INT iMouseHoverHeight
Definition: sysparams.h:86
ANIMATIONINFO animationinfo
Definition: sysparams.h:152
BOOL bLowPwrActive
Definition: sysparams.h:120
HIGHCONTRASTW highcontrast
Definition: sysparams.h:59
BOOL bMouseCursorShadow
Definition: sysparams.h:78
DWORD dwCaretWidth
Definition: sysparams.h:158
BOOL bShowSounds
Definition: sysparams.h:71
INT iDragWidth
Definition: sysparams.h:91
HANDLE hbmWallpaper
Definition: sysparams.h:142
WCHAR awcWallpaper[MAX_PATH+1]
Definition: sysparams.h:146
INT iDblClickWidth
Definition: sysparams.h:88
BOOL bScrSaverRunning
Definition: sysparams.h:112
ACCESSTIMEOUT accesstimeout
Definition: sysparams.h:58
DWORD dwActiveTrackingTimeout
Definition: sysparams.h:156
UINT uiFontSmoothingContrast
Definition: sysparams.h:127
UINT uiGridGranularity
Definition: sysparams.h:150
BOOL bKbdPref
Definition: sysparams.h:105
DWORD dwForegroundFlashCount
Definition: sysparams.h:157
INT iMouseSpeed
Definition: sysparams.h:84
UINT uiFontSmoothingType
Definition: sysparams.h:126
CURSORACCELERATION_INFO caiMouse
Definition: sysparams.h:75
BOOL bMouseVanish
Definition: sysparams.h:81
BOOL bScrSaverActive
Definition: sysparams.h:111
BOOL bBlockSendInputResets
Definition: sysparams.h:132
BOOL bPwrOffActive
Definition: sysparams.h:121
UINT uiFontSmoothingOrientation
Definition: sysparams.h:128
BOOL bDragFullWindows
Definition: sysparams.h:129
BOOL bMouseSonar
Definition: sysparams.h:80
INT iMouseTrails
Definition: sysparams.h:93
TOGGLEKEYS togglekeys
Definition: sysparams.h:103
INT iMouseHoverTime
Definition: sysparams.h:87
BOOL bFastTaskSwitch
Definition: sysparams.h:149
INT iPwrOffTimeout
Definition: sysparams.h:119
BOOL bShowImeUi
Definition: sysparams.h:154
SURFOBJ SurfObj
Definition: surface.h:8
SIZEL sizlBitmap
Definition: winddi.h:1209
USHORT MaximumLength
Definition: env_spec_w32.h:370
Definition: object.h:4
Definition: ntuser.h:694
RECT rcWindow
Definition: ntuser.h:716
HKL hkl
Definition: input.h:32
DWORD iMaxSpeed
Definition: winuser.h:3520
DWORD iTimeToMaxSpeed
Definition: winuser.h:3521
UINT cbSize
Definition: winuser.h:3518
DWORD dwFlags
Definition: winuser.h:3519
DWORD iCtrlSpeed
Definition: winuser.h:3522
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
DWORD dwSRVIFlags
Definition: ntuser.h:1051
DWORD cbSize
Definition: winuser.h:3636
LONG tmAveCharWidth
Definition: wingdi.h:2834
LONG tmExternalLeading
Definition: wingdi.h:2833
LONG tmHeight
Definition: wingdi.h:2829
DWORD cbSize
Definition: winuser.h:3641
#define max(a, b)
Definition: svc.c:63
BOOL InitSysParams()
#define SPIF_PROTECT
Definition: sysparams.h:13
#define SPITESTPREF(x)
Definition: sysparams.h:201
@ wmCenter
Definition: sysparams.h:41
@ wmFill
Definition: sysparams.h:45
@ wmTile
Definition: sysparams.h:42
@ wmStretch
Definition: sysparams.h:43
@ wmFit
Definition: sysparams.h:44
@ UPM_FLATMENU
Definition: sysparams.h:32
@ UPM_DROPSHADOW
Definition: sysparams.h:33
int32_t INT_PTR
Definition: typedefs.h:64
const uint16_t * PCWSTR
Definition: typedefs.h:57
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
_In_z_ PCWSTR pwszValueName
Definition: ntuser.h:42
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:124
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3700
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
#define SURFACE_ShareUnlockSurface(pBMObj)
Definition: surface.h:102
#define SURFACE_ShareLockSurface(hBMObj)
Definition: surface.h:91
BOOL NTAPI GreSetObjectOwner(HGDIOBJ hobj, ULONG ulOwner)
Definition: gdiobj.c:1268
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1165
HBITMAP NTAPI UserLoadImage(PCWSTR)
Definition: file.c:159
BOOL NTAPI W32kDosPathNameToNtPathName(PCWSTR, PUNICODE_STRING)
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
Definition: rect.h:44
HDC ScreenDeviceContext
Definition: desktop.c:53
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1403
PKL gspklBaseLayout
Definition: kbdlayout.c:22
DWORD gdwLanguageToggleKey
Definition: keyboard.c:19
DWORD gdwLayoutToggleKey
Definition: keyboard.c:21
BOOL gbEnableHexNumpad
Definition: keyboard.c:36
BOOL NTAPI UserSetDefaultInputLang(HKL hKl)
Definition: kbdlayout.c:583
LRESULT FASTCALL co_IntSendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT uFlags, UINT uTimeout, ULONG_PTR *uResult)
Definition: message.c:1707
BOOL NTAPI InitMetrics(VOID)
Definition: metric.c:40
DWORD FASTCALL UserGetLanguageToggle(_In_ PCWSTR pszType, _In_ DWORD dwDefaultValue)
Definition: misc.c:84
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
Definition: monitor.c:469
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102
static INT SpiLoadInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:130
static const WCHAR * VAL_DBLCLKHEIGHT
Definition: sysparams.c:52
static const WCHAR * KEY_MDALIGN
Definition: sysparams.c:85
static const WCHAR * VAL_CLICKLOCKTIME
Definition: sysparams.c:74
static const WCHAR * KEY_DESKTOP
Definition: sysparams.c:61
static UINT_PTR SpiSet(PVOID pvData, PVOID pvParam, ULONG cbSize, FLONG fl)
Definition: sysparams.c:506
#define REG2METRIC(reg)
Definition: sysparams.c:25
static const WCHAR * KEY_MOUSE
Definition: sysparams.c:46
static DWORD SpiLoadUserPrefMask(DWORD dValue)
Definition: sysparams.c:145
static VOID SpiStoreFont(PCWSTR pwszValue, LOGFONTW *plogfont)
Definition: sysparams.c:451
static UINT_PTR SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:535
static const WCHAR * VAL_MOUSETRAILS
Definition: sysparams.c:50
static const WCHAR * VAL_FONTSMOOTHING
Definition: sysparams.c:69
static const WCHAR * VAL_BEEP
Definition: sysparams.c:95
static const WCHAR * VAL_SCRTO
Definition: sysparams.c:62
BOOL g_bWindowSnapEnabled
Definition: sysparams.c:20
static const WCHAR * VAL_FONTSMOOTHINGCONTRAST
Definition: sysparams.c:71
static const WCHAR * VAL_SWAP
Definition: sysparams.c:55
static VOID SpiFixupValues(VOID)
Definition: sysparams.c:205
static const WCHAR * VAL_USERPREFMASK
Definition: sysparams.c:81
static const WCHAR * KEY_SOUND
Definition: sysparams.c:94
BOOL g_PaintDesktopVersion
Definition: sysparams.c:19
static const WCHAR * VAL_HOVERWIDTH
Definition: sysparams.c:57
static const WCHAR * KEY_SHOWSNDS
Definition: sysparams.c:104
static const WCHAR * VAL_SNAP_ENABLED
Definition: sysparams.c:82
static const WCHAR * VAL_MOUSE3
Definition: sysparams.c:49
static UINT_PTR SpiGetInt(PVOID pvParam, PVOID piValue, FLONG fl)
Definition: sysparams.c:528
#define REQ_INTERACTIVE_WINSTA(err)
Definition: sysparams.c:28
static const WCHAR * VAL_HOVERTIME
Definition: sysparams.c:56
static const WCHAR * VAL_HOVERHEIGHT
Definition: sysparams.c:58
static VOID SpiUpdatePerUserSystemParameters(VOID)
Definition: sysparams.c:229
static const WCHAR * VAL_DRAGHEIGHT
Definition: sysparams.c:67
static INT SpiLoadMouse(PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:171
static const WCHAR * VAL_SNAP_DOCKMOVING
Definition: sysparams.c:83
static const WCHAR * VAL_MOUSE2
Definition: sysparams.c:48
static const WCHAR * VAL_FONTSMOOTHINGORIENTATION
Definition: sysparams.c:72
static UINT_PTR SpiSetDWord(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:561
static UINT_PTR SpiGetUserPref(DWORD dwMask, PVOID pvParam, FLONG fl)
Definition: sysparams.c:640
static const WCHAR * KEY_METRIC
Definition: sysparams.c:88
static const WCHAR * VAL_DBLCLKWIDTH
Definition: sysparams.c:51
static const WCHAR * VAL_MOUSEKEYS_TIMETOMAX
Definition: sysparams.c:112
static INT SpiLoadDWord(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:118
static const WCHAR * VAL_PAINTDESKVER
Definition: sysparams.c:75
BOOL gbSpiInitialized
Definition: sysparams.c:18
static const WCHAR * VAL_ON
Definition: sysparams.c:107
static const WCHAR * KEY_SCRREAD
Definition: sysparams.c:106
static const WCHAR * VAL_MDALIGN
Definition: sysparams.c:86
static VOID SpiStoreMetric(LPCWSTR pwszValue, INT iValue)
Definition: sysparams.c:444
static const WCHAR * VAL_DRAG
Definition: sysparams.c:66
static const WCHAR * KEY_MOUSEKEYS
Definition: sysparams.c:109
static const WCHAR * VAL_KBDDELAY
Definition: sysparams.c:99
static UINT_PTR SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl)
Definition: sysparams.c:823
static UINT_PTR SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:548
static const WCHAR * VAL_SCRACT
Definition: sysparams.c:64
static const WCHAR * VAL_SCRNSV
Definition: sysparams.c:63
static INT SpiLoadMetric(PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:178
static const WCHAR * VAL_SNAPDEFBTN
Definition: sysparams.c:54
static VOID SpiStoreDWord(PCWSTR pwszKey, PCWSTR pwszValue, DWORD Value)
Definition: sysparams.c:408
static const WCHAR * VAL_ICONVSPC
Definition: sysparams.c:91
BOOL APIENTRY NtUserUpdatePerUserSystemParameters(DWORD dwReserved, BOOL bEnable)
Definition: sysparams.c:381
static DWORD SpiLoadTimeOut(VOID)
Definition: sysparams.c:157
static VOID SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:430
static VOID SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz)
Definition: sysparams.c:419
static BOOL SpiGetSetProbeBuffer(UINT uiAction, UINT uiParam, PVOID pvParam)
Definition: sysparams.c:1852
static const WCHAR * VAL_SENSITIVITY
Definition: sysparams.c:59
static UINT_PTR SpiGetEx(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl)
Definition: sysparams.c:514
static UINT_PTR SpiSetUserPref(DWORD dwMask, PVOID pvValue, FLONG fl)
Definition: sysparams.c:600
static const WCHAR * VAL_DBLCLKTIME
Definition: sysparams.c:53
static const WCHAR * VAL_SCRLLLINES
Definition: sysparams.c:73
static UINT_PTR SpiGet(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl)
Definition: sysparams.c:498
static const WCHAR * KEY_KBD
Definition: sysparams.c:97
static const WCHAR * KEY_KDBPREF
Definition: sysparams.c:105
static const WCHAR * KEY_INPUT_METHOD
Definition: sysparams.c:101
static const WCHAR * VAL_KBDSPD
Definition: sysparams.c:98
static const WCHAR * VAL_ICONSPC
Definition: sysparams.c:90
static const WCHAR * VAL_DRAGWIDTH
Definition: sysparams.c:68
static const WCHAR * VAL_FONTSMOOTHINGTYPE
Definition: sysparams.c:70
static const WCHAR * VAL_GRID
Definition: sysparams.c:65
static const WCHAR * VAL_MOUSE1
Definition: sysparams.c:47
static BOOL SpiNotifyNCMetricsChanged(VOID)
Definition: sysparams.c:787
static const WCHAR * VAL_MOUSEKEYS_MAX
Definition: sysparams.c:111
static const WCHAR * VAL_ITWRAP
Definition: sysparams.c:92
static const WCHAR * VAL_CARETRATE
Definition: sysparams.c:76
static const WCHAR * VAL_CARETWIDTH
Definition: sysparams.c:77
static UINT_PTR SpiSetWallpaper(PVOID pvParam, FLONG fl)
Definition: sysparams.c:648
static const WCHAR * VAL_MOUSEKEYS_FLAGS
Definition: sysparams.c:110
SPIVALUES gspv
Definition: sysparams.c:17
static VOID SpiLoadFont(PLOGFONTW plfOut, LPWSTR pwszValueName, PLOGFONTW plfDefault)
Definition: sysparams.c:190
static UINT_PTR SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect)
Definition: sysparams.c:466
#define METRIC2REG(met)
Definition: sysparams.c:26
static const WCHAR * VAL_BORDER
Definition: sysparams.c:89
static UINT_PTR SpiSetMetric(PVOID pvData, INT iValue, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:587
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2123
BOOL APIENTRY NtUserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2186
static UINT_PTR SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:574
#define USERTAG_WINDOWLIST
Definition: tags.h:298
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:276
_In_ FLONG fl
Definition: winddi.h:1279
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
_In_ BOOL bEnable
Definition: winddi.h:3426
#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION
Definition: winerror.h:1285
#define ERROR_NOACCESS
Definition: winerror.h:902
#define VARIABLE_PITCH
Definition: wingdi.h:445
#define DEFAULT_QUALITY
Definition: wingdi.h:436
#define FW_BOLD
Definition: wingdi.h:378
#define ANSI_CHARSET
Definition: wingdi.h:383
#define FW_NORMAL
Definition: wingdi.h:373
#define BITSPIXEL
Definition: wingdi.h:720
#define FF_SWISS
Definition: wingdi.h:452
#define ARW_HIDE
Definition: winuser.h:1087
#define SPI_SETSTICKYKEYS
Definition: winuser.h:1419
#define SPI_GETFILTERKEYS
Definition: winuser.h:1410
#define SPI_GETACCESSTIMEOUT
Definition: winuser.h:1420
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define SWP_NOREDRAW
Definition: winuser.h:1257
SERIALKEYSA SERIALKEYS
Definition: winuser.h:5889
#define SPI_GETMOUSEKEYS
Definition: winuser.h:1414
#define SPI_SETBORDER
Definition: winuser.h:1369
#define SWP_FRAMECHANGED
Definition: winuser.h:1251
#define SPI_GETSHOWSOUNDS
Definition: winuser.h:1416
#define SPI_GETBORDER
Definition: winuser.h:1368
#define SPI_SETMOUSEKEYS
Definition: winuser.h:1415
struct tagHIGHCONTRASTW * LPHIGHCONTRASTW
#define SPI_SETMENUDROPALIGNMENT
Definition: winuser.h:1388
#define SPI_SETDESKWALLPAPER
Definition: winuser.h:1380
#define SPI_GETTOGGLEKEYS
Definition: winuser.h:1412
#define SPI_SETFASTTASKSWITCH
Definition: winuser.h:1396
#define SPI_ICONVERTICALSPACING
Definition: winuser.h:1384
#define HWND_BROADCAST
Definition: winuser.h:1215
#define SPI_SETDOUBLECLKWIDTH
Definition: winuser.h:1389
#define SWP_NOMOVE
Definition: winuser.h:1255
#define SPI_SETBEEP
Definition: winuser.h:1365
#define SPI_SETACCESSTIMEOUT
Definition: winuser.h:1421
#define SPI_GETGRIDGRANULARITY
Definition: winuser.h:1378
#define SPI_SETSCREENSAVEACTIVE
Definition: winuser.h:1377
struct tagSTICKYKEYS STICKYKEYS
#define SPI_SETDOUBLECLKHEIGHT
Definition: winuser.h:1390
struct tagMOUSEKEYS MOUSEKEYS
#define RDW_ERASE
Definition: winuser.h:1222
#define SPI_GETFASTTASKSWITCH
Definition: winuser.h:1395
struct tagFILTERKEYS FILTERKEYS
#define SPI_GETICONTITLELOGFONT
Definition: winuser.h:1391
struct tagFILTERKEYS * LPFILTERKEYS
#define SPI_SETFILTERKEYS
Definition: winuser.h:1411
#define SPI_GETMOUSE
Definition: winuser.h:1366
struct tagACCESSTIMEOUT * LPACCESSTIMEOUT
#define SPIF_SENDCHANGE
Definition: winuser.h:1600
#define SPI_LANGDRIVER
Definition: winuser.h:1372
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
struct tagSOUNDSENTRYW SOUNDSENTRYW
#define SPI_SETDESKPATTERN
Definition: winuser.h:1381
#define SPI_SETKEYBOARDSPEED
Definition: winuser.h:1371
#define SPIF_UPDATEINIFILE
Definition: winuser.h:1599
struct tagSTICKYKEYS * LPSTICKYKEYS
#define SPI_SETICONTITLELOGFONT
Definition: winuser.h:1394
#define SPI_SETTOGGLEKEYS
Definition: winuser.h:1413
#define SWP_NOCOPYBITS
Definition: winuser.h:1254
struct tagMINIMIZEDMETRICS MINIMIZEDMETRICS
#define SPI_GETKEYBOARDSPEED
Definition: winuser.h:1370
#define SPI_GETSTICKYKEYS
Definition: winuser.h:1418
struct tagTOGGLEKEYS * LPTOGGLEKEYS
#define SPI_SETDOUBLECLICKTIME
Definition: winuser.h:1392
struct tagHIGHCONTRASTW HIGHCONTRASTW
#define SPI_GETICONTITLEWRAP
Definition: winuser.h:1385
#define SPI_SETMOUSEBUTTONSWAP
Definition: winuser.h:1393
struct tagSOUNDSENTRYW * LPSOUNDSENTRYW
struct tagACCESSTIMEOUT ACCESSTIMEOUT
#define SPI_ICONHORIZONTALSPACING
Definition: winuser.h:1373
struct tagMOUSEKEYS * LPMOUSEKEYS
struct tagMINIMIZEDMETRICS * LPMINIMIZEDMETRICS
#define SPI_GETBEEP
Definition: winuser.h:1364
#define SPI_SETMOUSE
Definition: winuser.h:1367
#define SPI_GETKEYBOARDDELAY
Definition: winuser.h:1382
#define SPI_SETICONTITLEWRAP
Definition: winuser.h:1386
#define SWP_NOZORDER
Definition: winuser.h:1258
#define SPI_SETSOUNDSENTRY
Definition: winuser.h:1427
#define SPI_SETKEYBOARDDELAY
Definition: winuser.h:1383
#define SPI_GETSOUNDSENTRY
Definition: winuser.h:1426
SERIALKEYSA * LPSERIALKEYS
Definition: winuser.h:5889
#define SPI_SETSCREENSAVETIMEOUT
Definition: winuser.h:1375
#define SPI_SETSHOWSOUNDS
Definition: winuser.h:1417
#define SPI_SETGRIDGRANULARITY
Definition: winuser.h:1379
#define SPI_GETSCREENSAVETIMEOUT
Definition: winuser.h:1374
#define RDW_INVALIDATE
Definition: winuser.h:1225
struct tagANIMATIONINFO ANIMATIONINFO
struct tagTOGGLEKEYS TOGGLEKEYS
#define SPI_GETSCREENSAVEACTIVE
Definition: winuser.h:1376
#define SMTO_NORMAL
Definition: winuser.h:1236
#define SPI_GETMENUDROPALIGNMENT
Definition: winuser.h:1387
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char UCHAR
Definition: xmlstorage.h:181
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define SPI_SETWHEELSCROLLLINES
Definition: zmouse.h:30