ReactOS 0.4.16-dev-2332-g4cba65d
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_SHOWSNDS = L"Control Panel\\Accessibility\\ShowSounds";
102static const WCHAR* KEY_KDBPREF = L"Control Panel\\Accessibility\\Keyboard Preference";
103static const WCHAR* KEY_SCRREAD = L"Control Panel\\Accessibility\\Blind Access";
104static const WCHAR* VAL_ON = L"On";
105
106static const WCHAR* KEY_MOUSEKEYS = L"Control Panel\\Accessibility\\MouseKeys";
107static const WCHAR* VAL_MOUSEKEYS_FLAGS = L"Flags";
108static const WCHAR* VAL_MOUSEKEYS_MAX = L"MaximumSpeed";
109static const WCHAR* VAL_MOUSEKEYS_TIMETOMAX = L"TimeToMaximumSpeed";
110
113static
114INT
115SpiLoadDWord(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
116{
118 if (!RegReadUserSetting(pwszKey, pwszValue, REG_DWORD, &Result, sizeof(Result)))
119 {
120 return iValue;
121 }
122 return Result;
123}
124
125static
126INT
127SpiLoadInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
128{
129 WCHAR awcBuffer[12];
130 ULONG cbSize;
131
132 cbSize = sizeof(awcBuffer);
133 if (!RegReadUserSetting(pwszKey, pwszValue, REG_SZ, awcBuffer, cbSize))
134 {
135 return iValue;
136 }
137 return _wtoi(awcBuffer);
138}
139
140static
141DWORD
143{
145 if (!RegReadUserSetting(KEY_DESKTOP, VAL_USERPREFMASK, REG_BINARY, &Result, sizeof(Result)))
146 {
147 return dValue;
148 }
149 return Result;
150}
151
152static
153DWORD
155{ // Must have the string!
156 WCHAR szApplicationName[MAX_PATH];
157 RtlZeroMemory(&szApplicationName, sizeof(szApplicationName));
158 if (!RegReadUserSetting(KEY_DESKTOP, VAL_SCRNSV, REG_SZ, &szApplicationName, sizeof(szApplicationName)))
159 {
160 return 0;
161 }
162 if (szApplicationName[0] == 0) return 0;
163 return SpiLoadInt(KEY_DESKTOP, VAL_SCRTO, 600);
164}
165
166static
167INT
168SpiLoadMouse(PCWSTR pwszValue, INT iValue)
169{
170 return SpiLoadInt(KEY_MOUSE, pwszValue, iValue);
171}
172
173static
174INT
175SpiLoadMetric(PCWSTR pwszValue, INT iValue)
176{
177 INT iRegVal;
178
179 iRegVal = SpiLoadInt(KEY_METRIC, pwszValue, METRIC2REG(iValue));
180 TRACE("Loaded metric setting '%S', iValue=%d(reg:%d), ret=%d(reg:%d)\n",
181 pwszValue, iValue, METRIC2REG(iValue), REG2METRIC(iRegVal), iRegVal);
182 return REG2METRIC(iRegVal);
183}
184
185static
186VOID
188{
189 BOOL bResult;
190
191 bResult = RegReadUserSetting(KEY_METRIC,
194 plfOut,
195 sizeof(LOGFONTW));
196 if (!bResult)
197 *plfOut = *plfDefault;
198}
199
200static
201VOID
203{
204 /* Fixup values */
205 gspv.ncm.iCaptionWidth = max(gspv.ncm.iCaptionWidth, 8);
206 gspv.ncm.iBorderWidth = max(gspv.ncm.iBorderWidth, 1);
207 gspv.ncm.iScrollWidth = max(gspv.ncm.iScrollWidth, 8);
208 gspv.ncm.iScrollHeight = max(gspv.ncm.iScrollHeight, 8);
209// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight, gspv.tmMenuFont.tmHeight);
210// gspv.ncm.iMenuHeight = max(gspv.ncm.iMenuHeight,
211// 2 + gspv.tmMenuFont.tmHeight +
212// gspv.tmMenuFont.tmExternalLeading);
213 if (gspv.iDblClickTime == 0) gspv.iDblClickTime = 500;
214
215 // FIXME: Hack!!!
218
221
222}
223
224static
225VOID
227{
228 static LOGFONTW lf1 = {-11, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
230 VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"};
231 static LOGFONTW lf2 = {-11, 0, 0, 0, FW_BOLD, FALSE, FALSE,
233 VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif"};
234
235 TRACE("Enter SpiUpdatePerUserSystemParameters\n");
236
237 /* Clear the structure */
238 RtlZeroMemory(&gspv, sizeof(gspv));
239
240 /* Load mouse settings */
254
255 /* Load keyboard settings */
258
259 /* Load NONCLIENTMETRICS */
260 gspv.ncm.cbSize = sizeof(NONCLIENTMETRICSW);
261 gspv.ncm.iBorderWidth = SpiLoadMetric(VAL_BORDER, 1);
262 gspv.ncm.iScrollWidth = SpiLoadMetric(L"ScrollWidth", 16);
263 gspv.ncm.iScrollHeight = SpiLoadMetric(L"ScrollHeight", 16);
264 gspv.ncm.iCaptionWidth = SpiLoadMetric(L"CaptionWidth", 19);
265 gspv.ncm.iCaptionHeight = SpiLoadMetric(L"CaptionHeight", 19);
266 gspv.ncm.iSmCaptionWidth = SpiLoadMetric(L"SmCaptionWidth", 12);
267 gspv.ncm.iSmCaptionHeight = SpiLoadMetric(L"SmCaptionHeight", 15);
268 gspv.ncm.iMenuWidth = SpiLoadMetric(L"MenuWidth", 18);
269 gspv.ncm.iMenuHeight = SpiLoadMetric(L"MenuHeight", 18);
270#if (WINVER >= 0x0600)
271 gspv.ncm.iPaddedBorderWidth = SpiLoadMetric(L"PaddedBorderWidth", 18);
272#endif
273 SpiLoadFont(&gspv.ncm.lfCaptionFont, L"CaptionFont", &lf2);
274 SpiLoadFont(&gspv.ncm.lfSmCaptionFont, L"SmCaptionFont", &lf1);
275 SpiLoadFont(&gspv.ncm.lfMenuFont, L"MenuFont", &lf1);
276 SpiLoadFont(&gspv.ncm.lfStatusFont, L"StatusFont", &lf1);
277 SpiLoadFont(&gspv.ncm.lfMessageFont, L"MessageFont", &lf1);
278
279 /* Load MINIMIZEDMETRICS */
280 gspv.mm.cbSize = sizeof(MINIMIZEDMETRICS);
281 gspv.mm.iWidth = SpiLoadMetric(L"MinWidth", 160);
282 gspv.mm.iHorzGap = SpiLoadMetric(L"MinHorzGap", 160);
283 gspv.mm.iVertGap = SpiLoadMetric(L"MinVertGap", 24);
284 gspv.mm.iArrange = SpiLoadInt(KEY_METRIC, L"MinArrange", ARW_HIDE);
285
286 /* Load ICONMETRICS */
287 gspv.im.cbSize = sizeof(ICONMETRICSW);
288 gspv.im.iHorzSpacing = SpiLoadMetric(VAL_ICONSPC, 64);
289 gspv.im.iVertSpacing = SpiLoadMetric(VAL_ICONVSPC, 64);
290 gspv.im.iTitleWrap = SpiLoadMetric(VAL_ITWRAP, 1);
291 SpiLoadFont(&gspv.im.lfFont, L"IconFont", &lf1);
292
293 /* Load desktop settings */
297 if (gpsi)
298 gpsi->dtCaretBlink = SpiLoadInt(KEY_DESKTOP, VAL_CARETRATE, 530);
307#if (_WIN32_WINNT >= 0x0600)
308 gspv.uiWheelScrollChars = SpiLoadInt(KEY_DESKTOP, VAL_SCRLLCHARS, 3);
309#endif
310
311 /* Some hardcoded values for now */
312
314 gspv.bBeep = TRUE;
318 gspv.dwMenuShowDelay = SpiLoadInt(KEY_DESKTOP, L"MenuShowDelay", 400);
320
324#if(WINVER >= 0x0600)
325 gspv.bScrSaverSecure = FALSE;
326#endif
327
329
333 gspv.mousekeys.cbSize = sizeof(MOUSEKEYS);
337 gspv.mousekeys.iCtrlSpeed = 8; // FIXME
343
346
347 /* Make sure we don't use broken values */
349
350 /* Update SystemMetrics */
351 InitMetrics();
352
353 if (gbSpiInitialized && gpsi)
354 {
359 }
360 gdwLanguageToggleKey = UserGetLanguageToggle(L"Language Hotkey", 1);
361 gdwLayoutToggleKey = UserGetLanguageToggle(L"Layout Hotkey", 2);
362}
363
364BOOL
366{
369 return TRUE;
370}
371
372
373BOOL
378{
379 BOOL bResult;
380
381 TRACE("Enter NtUserUpdatePerUserSystemParameters\n");
383
385 if(bEnable)
387 else
389 bResult = TRUE;
390
391 TRACE("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult);
392 UserLeave();
393
394 return bResult;
395}
396
397
400static
401VOID
403{
404 RegWriteUserSetting(pwszKey,
405 pwszValue,
406 REG_DWORD,
407 &Value,
408 sizeof(Value));
409}
410
411static
412VOID
413SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz)
414{
415 RegWriteUserSetting(pwszKey,
416 pwszValue,
417 REG_SZ,
418 pwsz,
419 (wcslen(pwsz) + 1) * sizeof(WCHAR));
420}
421
422static
423VOID
424SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
425{
426 WCHAR awcBuffer[15];
427
428 _itow(iValue, awcBuffer, 10);
429 RegWriteUserSetting(pwszKey,
430 pwszValue,
431 REG_SZ,
432 awcBuffer,
433 (wcslen(awcBuffer) + 1) * sizeof(WCHAR));
434}
435
436static
437VOID
438SpiStoreMetric(LPCWSTR pwszValue, INT iValue)
439{
440 SpiStoreSzInt(KEY_METRIC, pwszValue, METRIC2REG(iValue));
441}
442
443static
444VOID
445SpiStoreFont(PCWSTR pwszValue, LOGFONTW* plogfont)
446{
447 RegWriteUserSetting(KEY_METRIC,
448 pwszValue,
450 plogfont,
451 sizeof(LOGFONTW));
452}
453
454
457// FIXME: get rid of the flags and only use this from um. kernel can access data directly.
458static
460SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect)
461{
463
464 if (bProtect)
465 {
467 {
468 RtlCopyMemory(pvDst, pvSrc, cbSize);
469 }
471 {
473 }
474 _SEH2_END;
475 }
476 else
477 {
478 RtlCopyMemory(pvDst, pvSrc, cbSize);
479 }
480
481 if (!NT_SUCCESS(Status))
482 {
484 ERR("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d\n", pvDst, pvSrc, bProtect);
485 }
486
487 return NT_SUCCESS(Status);
488}
489
490static inline
493{
495 return SpiMemCopy(pvParam, pvData, cbSize, fl & SPIF_PROTECT);
496}
497
498static inline
501{
503 return SpiMemCopy(pvData, pvParam, cbSize, fl & SPIF_PROTECT);
504}
505
506static inline
509{
511 /* Get the cbSite member from UM memory */
512 if (!SpiSet(&cbBufSize, pvParam, sizeof(ULONG), fl))
513 return 0;
514 /* Verify the correct size */
515 if (cbBufSize != cbSize)
516 return 0;
517 return SpiGet(pvParam, pvData, cbSize, fl);
518}
519
520static inline
522SpiGetInt(PVOID pvParam, PVOID piValue, FLONG fl)
523{
524 return SpiGet(pvParam, piValue, sizeof(INT), fl);
525}
526
527static inline
529SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
530{
532 *pbData = bValue ? TRUE : FALSE;
534 {
535 SpiStoreSz(pwszKey, pwszValue, bValue ? L"Yes" : L"No");
536 }
537 return (UINT_PTR)pwszKey;
538}
539
540static inline
542SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
543{
545 *pbData = iValue ? TRUE : FALSE;
547 {
548 SpiStoreSzInt(pwszKey, pwszValue, iValue);
549 }
550 return (UINT_PTR)pwszKey;
551}
552
553static inline
555SpiSetDWord(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
556{
558 *(INT*)pvData = iValue;
560 {
561 SpiStoreDWord(pwszKey, pwszValue, iValue);
562 }
563 return (UINT_PTR)pwszKey;
564}
565
566static inline
568SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
569{
571 *(INT*)pvData = iValue;
573 {
574 SpiStoreSzInt(pwszKey, pwszValue, iValue);
575 }
576 return (UINT_PTR)pwszKey;
577}
578
579static inline
582{
584 *(INT*)pvData = iValue;
586 {
587 SpiStoreMetric(pwszValue, iValue);
588 }
589 return (UINT_PTR)KEY_METRIC;
590}
591
592static inline
595{
596 DWORD dwRegMask;
597 BOOL bValue = PtrToUlong(pvValue);
598
600
601 /* Set or clear bit according to bValue */
602 gspv.dwUserPrefMask = bValue ? gspv.dwUserPrefMask | dwMask :
603 gspv.dwUserPrefMask & ~dwMask;
604
606 {
607 /* Read current value */
608 if (!RegReadUserSetting(KEY_DESKTOP,
611 &dwRegMask,
612 sizeof(DWORD)))
613 {
614 WARN("Failed to read UserPreferencesMask setting\n");
615 dwRegMask = 0;
616 }
617
618 /* Set or clear bit according to bValue */
619 dwRegMask = bValue ? (dwRegMask | dwMask) : (dwRegMask & ~dwMask);
620
621 /* write back value */
622 RegWriteUserSetting(KEY_DESKTOP,
625 &dwRegMask,
626 sizeof(DWORD));
627 }
628
629 return (UINT_PTR)KEY_DESKTOP;
630}
631
632static inline
635{
636 INT iValue = gspv.dwUserPrefMask & dwMask ? 1 : 0;
637 return SpiGetInt(pvParam, &iValue, fl);
638}
639
640static
643{
644 UNICODE_STRING ustr;
645 WCHAR awc[MAX_PATH];
646 BOOL bResult;
647 HBITMAP hbmp, hOldBitmap;
648 SURFACE *psurfBmp;
649 ULONG ulTile, ulStyle;
650
652
653 if (!pvParam)
654 {
655 /* FIXME: Reset Wallpaper to registry value */
656 return (UINT_PTR)KEY_DESKTOP;
657 }
658
659 /* Capture UNICODE_STRING */
660 bResult = SpiMemCopy(&ustr, pvParam, sizeof(ustr), fl & SPIF_PROTECT);
661 if (!bResult)
662 {
663 return 0;
664 }
665 if (ustr.Length > MAX_PATH * sizeof(WCHAR))
666 {
667 return 0;
668 }
669
670 /* Copy the string buffer name */
671 bResult = SpiMemCopy(gspv.awcWallpaper, ustr.Buffer, ustr.Length, fl & SPIF_PROTECT);
672 if (!bResult)
673 {
674 return 0;
675 }
676
677 /* Update the UNICODE_STRING */
681 gspv.awcWallpaper[ustr.Length / sizeof(WCHAR)] = 0;
682
683 TRACE("SpiSetWallpaper, name=%S\n", gspv.awcWallpaper);
684
685 /* Update registry */
687 {
689 }
690
691 /* Got a filename? */
692 if (gspv.awcWallpaper[0] != 0)
693 {
694 /* Convert file name to nt file name */
695 ustr.Buffer = awc;
696 ustr.MaximumLength = MAX_PATH * sizeof(WCHAR);
697 ustr.Length = 0;
699 {
700 ERR("RtlDosPathNameToNtPathName_U failed\n");
701 return 0;
702 }
703
704 /* Load the Bitmap */
705 hbmp = UserLoadImage(ustr.Buffer);
706 if (!hbmp)
707 {
708 ERR("UserLoadImage failed\n");
709 return 0;
710 }
711
712 /* Try to get the size of the wallpaper */
713 if (!(psurfBmp = SURFACE_ShareLockSurface(hbmp)))
714 {
716 return 0;
717 }
718
722
724
725 /* Change the bitmap's ownership */
727
728 /* Yes, Windows really loads the current setting from the registry. */
729 ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0);
730 ulStyle = SpiLoadInt(KEY_DESKTOP, L"WallpaperStyle", 0);
731 TRACE("SpiSetWallpaper: ulTile=%lu, ulStyle=%lu\n", ulTile, ulStyle);
732
733 /* Check the values we found in the registry */
734 if (ulTile && !ulStyle)
735 {
737 }
738 else if (!ulTile && ulStyle)
739 {
740 if (ulStyle == 2)
741 {
743 }
744 else if (ulStyle == 6)
745 {
747 }
748 else if (ulStyle == 10)
749 {
751 }
752 }
753 }
754 else
755 {
756 /* Remove wallpaper */
757 gspv.cxWallpaper = 0;
758 gspv.cyWallpaper = 0;
759 hbmp = 0;
760 }
761
762 /* Take care of the old wallpaper, if any */
763 hOldBitmap = gspv.hbmWallpaper;
764 if(hOldBitmap != NULL)
765 {
766 /* Delete the old wallpaper */
768 GreDeleteObject(hOldBitmap);
769 }
770
771 /* Set the new wallpaper */
773
775
776
777 return (UINT_PTR)KEY_DESKTOP;
778}
779
780static BOOL
782{
783 PWND pwndDesktop, pwndCurrent;
784 HWND *ahwnd;
786 int i;
787
788 pwndDesktop = UserGetDesktopWindow();
789 ASSERT(pwndDesktop);
790
791 ahwnd = IntWinListChildren(pwndDesktop);
792 if(!ahwnd)
793 return FALSE;
794
795 for (i = 0; ahwnd[i]; i++)
796 {
797 pwndCurrent = UserGetWindowObject(ahwnd[i]);
798 if(!pwndCurrent)
799 continue;
800
801 UserRefObjectCo(pwndCurrent, &Ref);
802 co_WinPosSetWindowPos(pwndCurrent, 0, pwndCurrent->rcWindow.left,pwndCurrent->rcWindow.top,
803 pwndCurrent->rcWindow.right-pwndCurrent->rcWindow.left
804 ,pwndCurrent->rcWindow.bottom - pwndCurrent->rcWindow.top,
807 UserDerefObjectCo(pwndCurrent);
808 }
809
811
812 return TRUE;
813}
814
815static
817SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl)
818{
819 switch (uiAction)
820 {
821 case SPI_GETBEEP:
822 return SpiGetInt(pvParam, &gspv.bBeep, fl);
823
824 case SPI_SETBEEP:
825 return SpiSetYesNo(&gspv.bBeep, uiParam, KEY_SOUND, VAL_BEEP, fl);
826
827 case SPI_GETMOUSE:
828 return SpiGet(pvParam, &gspv.caiMouse, 3 * sizeof(INT), fl);
829
830 case SPI_SETMOUSE:
831 if (!SpiSet(&gspv.caiMouse, pvParam, 3 * sizeof(INT), fl))
832 return 0;
834 {
838 }
839 return (UINT_PTR)KEY_MOUSE;
840
841 case SPI_GETBORDER:
842 return SpiGetInt(pvParam, &gspv.ncm.iBorderWidth, fl);
843
844 case SPI_SETBORDER:
845 uiParam = max(uiParam, 1);
846 return SpiSetInt(&gspv.ncm.iBorderWidth, uiParam, KEY_METRIC, VAL_BORDER, fl);
847
849 return SpiGetInt(pvParam, &gspv.dwKbdSpeed, fl);
850
852 return SpiSetInt(&gspv.dwKbdSpeed, uiParam, KEY_KBD, VAL_KBDSPD, fl);
853
854 case SPI_LANGDRIVER:
855 ERR("SPI_LANGDRIVER is unimplemented\n");
856 break;
857
859 return SpiGetInt(pvParam, &gspv.iScrSaverTimeout, fl);
860
863
865 return SpiGetInt(pvParam, &gspv.bScrSaverActive, fl);
866
869
871 return SpiGetInt(pvParam, &gspv.uiGridGranularity, fl);
872
875
877 uiParam = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
878 return SpiGet(pvParam, gspv.awcWallpaper, uiParam, fl);
879
881 return SpiSetWallpaper(pvParam, fl);
882
884 ERR("SPI_SETDESKPATTERN is unimplemented\n");
885 break;
886
888 return SpiGetInt(pvParam, &gspv.iKbdDelay, fl);
889
891 return SpiSetInt(&gspv.iKbdDelay, uiParam, KEY_KBD, VAL_KBDDELAY, fl);
892
894 if (pvParam)
895 {
896 return SpiGetInt(pvParam, &gspv.im.iHorzSpacing, fl);
897 }
898 uiParam = max(uiParam, 32);
899 return SpiSetMetric(&gspv.im.iHorzSpacing, uiParam, VAL_ICONSPC, fl);
900
902 if (pvParam)
903 {
904 return SpiGetInt(pvParam, &gspv.im.iVertSpacing, fl);
905 }
906 uiParam = max(uiParam, 32);
907 return SpiSetMetric(&gspv.im.iVertSpacing, uiParam, VAL_ICONVSPC, fl);
908
910 return SpiGetInt(pvParam, &gspv.im.iTitleWrap, fl);
911
913 return SpiSetInt(&gspv.im.iTitleWrap, uiParam, KEY_METRIC, VAL_ITWRAP, fl);
914
916 return SpiGetInt(pvParam, &gspv.bMenuDropAlign, fl);
917
920
923
926
928 return SpiGet(pvParam, &gspv.im.lfFont, sizeof(LOGFONTW), fl);
929
931 if (!SpiSet(&gspv.im.lfFont, pvParam, sizeof(LOGFONTW), fl))
932 return 0;
934 {
935 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
936 }
937 return (UINT_PTR)KEY_METRIC;
938
941
943 return SpiSetInt(&gspv.bMouseBtnSwap, uiParam, KEY_MOUSE, VAL_SWAP, fl);
944
946 return SpiGetInt(pvParam, &gspv.bFastTaskSwitch, fl);
947
949 /* According to Winetest this one is unimplemented */
950 return 1;
951
952 case SPI_GETDRAGFULLWINDOWS:
953 return SpiGetInt(pvParam, &gspv.bDragFullWindows, fl);
954
955 case SPI_SETDRAGFULLWINDOWS:
957
958 case SPI_GETNONCLIENTMETRICS:
959 {
960 return SpiGet(pvParam, &gspv.ncm, sizeof(NONCLIENTMETRICSW), fl);
961 }
962
963 case SPI_SETNONCLIENTMETRICS:
964 {
965 LPNONCLIENTMETRICSW metrics = (LPNONCLIENTMETRICSW)pvParam;
966
967 /* Fixup user's structure size */
968 metrics->cbSize = sizeof(NONCLIENTMETRICSW);
969
970 if (!SpiSet(&gspv.ncm, metrics, sizeof(NONCLIENTMETRICSW), fl))
971 return 0;
972
974 {
975 SpiStoreMetric(VAL_BORDER, gspv.ncm.iBorderWidth);
976 SpiStoreMetric(L"ScrollWidth", gspv.ncm.iScrollWidth);
977 SpiStoreMetric(L"ScrollHeight", gspv.ncm.iScrollHeight);
978 SpiStoreMetric(L"CaptionWidth", gspv.ncm.iCaptionWidth);
979 SpiStoreMetric(L"CaptionHeight", gspv.ncm.iCaptionHeight);
980 SpiStoreMetric(L"SmCaptionWidth", gspv.ncm.iSmCaptionWidth);
981 SpiStoreMetric(L"SmCaptionHeight", gspv.ncm.iSmCaptionHeight);
982 SpiStoreMetric(L"MenuWidth", gspv.ncm.iMenuWidth);
983 SpiStoreMetric(L"MenuHeight", gspv.ncm.iMenuHeight);
984#if (WINVER >= 0x0600)
985 SpiStoreMetric(L"PaddedBorderWidth", gspv.ncm.iPaddedBorderWidth);
986#endif
987 SpiStoreFont(L"CaptionFont", &gspv.ncm.lfCaptionFont);
988 SpiStoreFont(L"SmCaptionFont", &gspv.ncm.lfSmCaptionFont);
989 SpiStoreFont(L"MenuFont", &gspv.ncm.lfMenuFont);
990 SpiStoreFont(L"StatusFont", &gspv.ncm.lfStatusFont);
991 SpiStoreFont(L"MessageFont", &gspv.ncm.lfMessageFont);
992 }
993
995 return 0;
996
997 return (UINT_PTR)KEY_METRIC;
998 }
999
1000 case SPI_GETMINIMIZEDMETRICS:
1001 {
1002 return SpiGet(pvParam, &gspv.mm, sizeof(MINIMIZEDMETRICS), fl);
1003 }
1004
1005 case SPI_SETMINIMIZEDMETRICS:
1006 {
1008
1009 /* Fixup user's structure size */
1010 metrics->cbSize = sizeof(MINIMIZEDMETRICS);
1011
1012 if (!SpiSet(&gspv.mm, metrics, sizeof(MINIMIZEDMETRICS), fl))
1013 return 0;
1014
1015 gspv.mm.iWidth = max(0, gspv.mm.iWidth);
1018 gspv.mm.iArrange = gspv.mm.iArrange & 0xf;
1019
1020 if (fl & SPIF_UPDATEINIFILE)
1021 {
1022 SpiStoreMetric(L"MinWidth", gspv.mm.iWidth);
1023 SpiStoreMetric(L"MinHorzGap", gspv.mm.iHorzGap);
1024 SpiStoreMetric(L"MinVertGap", gspv.mm.iVertGap);
1025 SpiStoreMetric(L"MinArrange", gspv.mm.iArrange);
1026 }
1027
1028 return (UINT_PTR)KEY_METRIC;
1029 }
1030
1031 case SPI_GETICONMETRICS:
1032 {
1033 return SpiGet(pvParam, &gspv.im, sizeof(ICONMETRICSW), fl);
1034 }
1035
1036 case SPI_SETICONMETRICS:
1037 {
1038 LPICONMETRICSW metrics = (LPICONMETRICSW)pvParam;
1039
1040 /* Fixup user's structure size */
1041 metrics->cbSize = sizeof(ICONMETRICSW);
1042
1043 if (!SpiSet(&gspv.im, metrics, sizeof(ICONMETRICSW), fl))
1044 return 0;
1045
1046 if (fl & SPIF_UPDATEINIFILE)
1047 {
1048 SpiStoreMetric(VAL_ICONSPC, gspv.im.iHorzSpacing);
1049 SpiStoreMetric(VAL_ICONVSPC, gspv.im.iVertSpacing);
1050 SpiStoreMetric(VAL_ITWRAP, gspv.im.iTitleWrap);
1051 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
1052 }
1053 return (UINT_PTR)KEY_METRIC;
1054 }
1055
1056 case SPI_GETWORKAREA:
1057 {
1058 PMONITOR pmonitor = UserGetPrimaryMonitor();
1059
1060 if(!pmonitor)
1061 return 0;
1062
1063 return SpiGet(pvParam, &pmonitor->rcWork, sizeof(RECTL), fl);
1064 }
1065
1066 case SPI_SETWORKAREA:
1067 {
1068 PMONITOR pmonitor;
1069 RECTL rcWorkArea, rcIntersect;
1070
1071 if (!pvParam)
1072 return 0;
1073
1074 RtlCopyMemory(&rcWorkArea, pvParam, sizeof(rcWorkArea));
1075
1076 /* fail if empty */
1077 if (RECTL_bIsEmptyRect(&rcWorkArea))
1078 return 0;
1079
1080 /* get the nearest monitor */
1081 pmonitor = UserMonitorFromRect(&rcWorkArea, MONITOR_DEFAULTTONEAREST);
1082 if (!pmonitor)
1083 return 0;
1084
1085 /* fail unless work area is completely in monitor */
1086 if (!RECTL_bIntersectRect(&rcIntersect, &pmonitor->rcMonitor, &rcWorkArea) ||
1087 !RtlEqualMemory(&rcIntersect, &rcWorkArea, sizeof(rcIntersect)))
1088 {
1089 return 0;
1090 }
1091
1092 if (!SpiSet(&pmonitor->rcWork, pvParam, sizeof(RECTL), fl))
1093 return 0;
1094
1095 if (fl & SPIF_UPDATEINIFILE)
1096 {
1097 // FIXME: What to do?
1098 }
1099 return (UINT_PTR)KEY_DESKTOP;
1100 }
1101
1102 case SPI_SETPENWINDOWS:
1103 ERR("SPI_SETPENWINDOWS is unimplemented\n");
1104 break;
1105
1106 case SPI_GETFILTERKEYS:
1107 {
1108 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1109
1110 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1111 return 0;
1112
1113 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1114 return 0;
1115
1116 return SpiGet(pvParam, &gspv.filterkeys, sizeof(FILTERKEYS), fl);
1117 }
1118
1119 case SPI_SETFILTERKEYS:
1120 {
1121 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1122
1123 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1124 return 0;
1125
1126 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1127 return 0;
1128
1129 if (!SpiSet(&gspv.filterkeys, pvParam, sizeof(FILTERKEYS), fl))
1130 return 0;
1131
1132 if (fl & SPIF_UPDATEINIFILE)
1133 {
1134 // FIXME: What to do?
1135 }
1136 return (UINT_PTR)KEY_DESKTOP;
1137 }
1138
1139 case SPI_GETTOGGLEKEYS:
1140 {
1141 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1142
1143 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1144 return 0;
1145
1146 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1147 return 0;
1148
1149 return SpiGet(pvParam, &gspv.togglekeys, sizeof(TOGGLEKEYS), fl);
1150 }
1151
1152 case SPI_SETTOGGLEKEYS:
1153 {
1154 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1155
1156 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1157 return 0;
1158
1159 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1160 return 0;
1161
1162 if (!SpiSet(&gspv.togglekeys, pvParam, sizeof(TOGGLEKEYS), fl))
1163 return 0;
1164
1165 if (fl & SPIF_UPDATEINIFILE)
1166 {
1167 // FIXME: What to do?
1168 }
1169 return (UINT_PTR)KEY_DESKTOP;
1170 }
1171
1172 case SPI_GETMOUSEKEYS:
1173 {
1174 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1175
1176 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1177 return 0;
1178
1179 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1180 return 0;
1181
1182 return SpiGet(pvParam, &gspv.mousekeys, sizeof(MOUSEKEYS), fl);
1183 }
1184
1185 case SPI_SETMOUSEKEYS:
1186 {
1187 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1188
1189 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1190 return 0;
1191
1192 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1193 return 0;
1194
1195 if (!SpiSet(&gspv.mousekeys, pvParam, sizeof(MOUSEKEYS), fl))
1196 return 0;
1197
1198 if (fl & SPIF_UPDATEINIFILE)
1199 {
1203 }
1204 return (UINT_PTR)KEY_DESKTOP;
1205 }
1206
1207 case SPI_GETSHOWSOUNDS:
1208 return SpiGetInt(pvParam, &gspv.bShowSounds, fl);
1209
1210 case SPI_SETSHOWSOUNDS:
1211 return SpiSetBool(&gspv.bShowSounds, uiParam, KEY_SHOWSNDS, VAL_ON, fl);
1212
1213 case SPI_GETSTICKYKEYS:
1214 {
1215 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1216
1217 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1218 return 0;
1219
1220 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1221 return 0;
1222
1223 return SpiGetEx(pvParam, &gspv.stickykeys, sizeof(STICKYKEYS), fl);
1224 }
1225
1226 case SPI_SETSTICKYKEYS:
1227 {
1228 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1229
1230 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1231 return 0;
1232
1233 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1234 return 0;
1235
1236 if (!SpiSet(&gspv.stickykeys, pvParam, sizeof(STICKYKEYS), fl))
1237 return 0;
1238
1239 if (fl & SPIF_UPDATEINIFILE)
1240 {
1241 // FIXME: What to do?
1242 }
1243 return (UINT_PTR)KEY_DESKTOP;
1244 }
1245
1247 {
1248 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1249
1250 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1251 return 0;
1252
1253 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1254 return 0;
1255
1256 return SpiGetEx(pvParam, &gspv.accesstimeout, sizeof(ACCESSTIMEOUT), fl);
1257 }
1258
1260 {
1261 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1262
1263 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1264 {
1265 return 0;
1266 }
1267
1268 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1269 {
1270 return 0;
1271 }
1272
1273 if (!SpiSet(&gspv.accesstimeout, pvParam, sizeof(ACCESSTIMEOUT), fl))
1274 return 0;
1275
1276 if (fl & SPIF_UPDATEINIFILE)
1277 {
1278 // FIXME: What to do?
1279 }
1280 return (UINT_PTR)KEY_DESKTOP;
1281 }
1282
1283 case SPI_GETSERIALKEYS:
1284 {
1285 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1286
1287 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1288 return 0;
1289
1290 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1291 return 0;
1292
1293 return SpiGet(pvParam, &gspv.serialkeys, sizeof(SERIALKEYS), fl);
1294 }
1295
1296 case SPI_SETSERIALKEYS:
1297 {
1298 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1299
1300 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1301 return 0;
1302
1303 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1304 return 0;
1305
1306 if (!SpiSet(&gspv.serialkeys, pvParam, sizeof(SERIALKEYS), fl))
1307 return 0;
1308
1309 if (fl & SPIF_UPDATEINIFILE)
1310 {
1311 // FIXME: What to do?
1312 }
1313 return (UINT_PTR)KEY_DESKTOP;
1314 }
1315
1316 case SPI_GETSOUNDSENTRY:
1317 {
1318 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1319
1320 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1321 return 0;
1322
1323 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1324 return 0;
1325
1326 return SpiGet(pvParam, &gspv.soundsentry, sizeof(SOUNDSENTRYW), fl);
1327 }
1328
1329 case SPI_SETSOUNDSENTRY:
1330 {
1331 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1332
1333 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1334 return 0;
1335
1336 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1337 return 0;
1338
1339 if (!SpiSet(&gspv.soundsentry, pvParam, sizeof(SOUNDSENTRYW), fl))
1340 return 0;
1341
1342 if (fl & SPIF_UPDATEINIFILE)
1343 {
1344 // FIXME: What to do?
1345 }
1346 return (UINT_PTR)KEY_DESKTOP;
1347 }
1348
1349 case SPI_GETHIGHCONTRAST:
1350 {
1351 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1352
1353 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1354 return 0;
1355
1356 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1357 return 0;
1358
1359 return SpiGet(pvParam, &gspv.highcontrast, sizeof(HIGHCONTRASTW), fl);
1360 }
1361
1362 case SPI_SETHIGHCONTRAST:
1363 {
1364 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1365
1366 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1367 return 0;
1368
1369 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1370 return 0;
1371
1372 if (!SpiSet(&gspv.highcontrast, pvParam, sizeof(HIGHCONTRASTW), fl))
1373 return 0;
1374
1375 if (fl & SPIF_UPDATEINIFILE)
1376 {
1377 // FIXME: What to do?
1378 }
1379 return (UINT_PTR)KEY_DESKTOP;
1380 }
1381
1382 case SPI_GETKEYBOARDPREF:
1383 return SpiGetInt(pvParam, &gspv.bKbdPref, fl);
1384
1385 case SPI_SETKEYBOARDPREF:
1386 return SpiSetBool(&gspv.bKbdPref, uiParam, KEY_KDBPREF, VAL_ON, fl);
1387
1388 case SPI_GETSCREENREADER:
1389 return SpiGetInt(pvParam, &gspv.bScreenReader, fl);
1390
1391 case SPI_SETSCREENREADER:
1392 return SpiSetBool(&gspv.bScreenReader, uiParam, KEY_SCRREAD, VAL_ON, fl);
1393
1394 case SPI_GETANIMATION:
1395 return SpiGet(pvParam, &gspv.animationinfo, sizeof(ANIMATIONINFO), fl);
1396
1397 case SPI_SETANIMATION:
1398 if (!SpiSet(&gspv.animationinfo, pvParam, sizeof(ANIMATIONINFO), fl))
1399 return 0;
1400 if (fl & SPIF_UPDATEINIFILE)
1401 {
1402 // FIXME: What to do?
1403 }
1404 return (UINT_PTR)KEY_DESKTOP;
1405
1406 case SPI_GETFONTSMOOTHING:
1407 return SpiGetInt(pvParam, &gspv.bFontSmoothing, fl);
1408
1409 case SPI_SETFONTSMOOTHING:
1410 gspv.bFontSmoothing = !!uiParam;
1411 if (fl & SPIF_UPDATEINIFILE)
1412 {
1414 }
1415 return (UINT_PTR)KEY_DESKTOP;
1416
1417 case SPI_SETDRAGWIDTH:
1418 return SpiSetInt(&gspv.iDragWidth, uiParam, KEY_DESKTOP, VAL_DRAGWIDTH, fl);
1419
1420 case SPI_SETDRAGHEIGHT:
1422
1423 case SPI_SETHANDHELD:
1424 return SpiSetBool(&gspv.bHandHeld, uiParam, KEY_DESKTOP, L"HandHeld", fl);
1425
1426 case SPI_GETLOWPOWERTIMEOUT:
1427 return SpiGetInt(pvParam, &gspv.iLowPwrTimeout, fl);
1428
1429 case SPI_GETPOWEROFFTIMEOUT:
1430 return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl);
1431
1432 case SPI_SETLOWPOWERTIMEOUT:
1433 return SpiSetInt(&gspv.iLowPwrTimeout, uiParam, KEY_DESKTOP, L"LowPowerTimeOut", fl);
1434
1435 case SPI_SETPOWEROFFTIMEOUT:
1436 return SpiSetInt(&gspv.iPwrOffTimeout, uiParam, KEY_DESKTOP, L"PowerOffTimeOut", fl);
1437
1438 case SPI_GETLOWPOWERACTIVE:
1439 return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl);
1440
1441 case SPI_GETPOWEROFFACTIVE:
1442 return SpiGetInt(pvParam, &gspv.bPwrOffActive, fl);
1443
1444 case SPI_SETLOWPOWERACTIVE:
1445 return SpiSetBool(&gspv.bLowPwrActive, uiParam, KEY_DESKTOP, L"LowPowerActive", fl);
1446
1447 case SPI_SETPOWEROFFACTIVE:
1448 return SpiSetBool(&gspv.bPwrOffActive, uiParam, KEY_DESKTOP, L"PowerOffActive", fl);
1449
1450 case SPI_SETCURSORS:
1451 ERR("SPI_SETCURSORS is unimplemented\n");
1452 break;
1453
1454 case SPI_SETICONS:
1455 ERR("SPI_SETICONS is unimplemented\n");
1456 break;
1457
1458 case SPI_GETDEFAULTINPUTLANG:
1459 if (!gspklBaseLayout)
1460 return FALSE;
1461
1462 return SpiGet(pvParam, &gspklBaseLayout->hkl, sizeof(HKL), fl);
1463
1464 case SPI_SETDEFAULTINPUTLANG:
1465 {
1466 HKL hkl;
1467
1468 /* Note: SPIF_UPDATEINIFILE is not supported */
1469 if ((fl & SPIF_UPDATEINIFILE) || !SpiSet(&hkl, pvParam, sizeof(hkl), fl))
1470 return FALSE;
1471
1473 }
1474
1475 case SPI_SETLANGTOGGLE:
1476 gdwLayoutToggleKey = UserGetLanguageToggle(L"Layout Hotkey", 2);
1477 gdwLanguageToggleKey = UserGetLanguageToggle(L"Language Hotkey", 1);
1478 return gdwLanguageToggleKey;
1479
1480 case SPI_GETWINDOWSEXTENSION:
1481 ERR("SPI_GETWINDOWSEXTENSION is unimplemented\n");
1482 break;
1483
1484 case SPI_GETMOUSETRAILS:
1485 return SpiGetInt(pvParam, &gspv.iMouseTrails, fl);
1486
1487 case SPI_SETMOUSETRAILS:
1489
1490 case SPI_GETSNAPTODEFBUTTON:
1491 return SpiGetInt(pvParam, &gspv.bSnapToDefBtn, fl);
1492
1493 case SPI_SETSNAPTODEFBUTTON:
1495
1496 case SPI_GETMOUSEHOVERWIDTH:
1497 return SpiGetInt(pvParam, &gspv.iMouseHoverWidth, fl);
1498
1499 case SPI_SETMOUSEHOVERWIDTH:
1501
1502 case SPI_GETMOUSEHOVERHEIGHT:
1503 return SpiGetInt(pvParam, &gspv.iMouseHoverHeight, fl);
1504
1505 case SPI_SETMOUSEHOVERHEIGHT:
1507
1508 case SPI_GETMOUSEHOVERTIME:
1509 return SpiGetInt(pvParam, &gspv.iMouseHoverTime, fl);
1510
1511 case SPI_SETMOUSEHOVERTIME:
1512 /* See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
1513 * copy text from it, if some agument why xp and 2003 behovir diffent
1514 * only if they do not have SP install
1515 * " Windows Server 2003 and Windows XP: The operating system does not
1516 * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until
1517 * Windows Server 2003 SP1 and Windows XP SP2 "
1518 */
1520
1521 case SPI_GETWHEELSCROLLLINES:
1522 return SpiGetInt(pvParam, &gspv.iWheelScrollLines, fl);
1523
1526
1527 case SPI_GETMENUSHOWDELAY:
1528 return SpiGetInt(pvParam, &gspv.dwMenuShowDelay, fl);
1529
1530 case SPI_SETMENUSHOWDELAY:
1531 return SpiSetInt(&gspv.dwMenuShowDelay, uiParam, KEY_DESKTOP, L"MenuShowDelay", fl);
1532
1533#if (_WIN32_WINNT >= 0x0600)
1535 return SpiGetInt(pvParam, &gspv.uiWheelScrollChars, fl);
1536
1537 case SPI_SETWHEELSCROLLCHARS:
1538 return SpiSetInt(&gspv.uiWheelScrollChars, uiParam, KEY_DESKTOP, VAL_SCRLLCHARS, fl);
1539#endif
1540 case SPI_GETSHOWIMEUI:
1541 return SpiGetInt(pvParam, &gspv.bShowImeUi, fl);
1542
1543 case SPI_SETSHOWIMEUI:
1544 return SpiSetBool(&gspv.bShowImeUi, uiParam, KEY_DESKTOP, L"", fl);
1545
1546 case SPI_GETMOUSESPEED:
1547 return SpiGetInt(pvParam, &gspv.iMouseSpeed, fl);
1548
1549 case SPI_SETMOUSESPEED:
1550 {
1551 /* Allowed range is [1:20] */
1552 if ((INT_PTR)pvParam < 1 || (INT_PTR)pvParam > 20)
1553 return 0;
1554 else
1556 }
1557
1558 case SPI_GETSCREENSAVERRUNNING:
1559 return SpiGetInt(pvParam, &gspv.bScrSaverRunning, fl);
1560
1561 case SPI_SETSCREENSAVERRUNNING:
1562 // FIXME: also return value?
1563 return SpiSetBool(&gspv.bScrSaverRunning, uiParam, KEY_MOUSE, L"", fl);
1564
1565#if(WINVER >= 0x0600)
1566 case SPI_GETAUDIODESCRIPTION:
1567 return SpiGet(pvParam, &gspv.audiodescription, sizeof(AUDIODESCRIPTION), fl);
1568
1569 case SPI_SETAUDIODESCRIPTION:
1570 ERR("SPI_SETAUDIODESCRIPTION is unimplemented\n");
1571 break;
1572
1573 case SPI_GETSCREENSAVESECURE:
1574 return SpiGetInt(pvParam, &gspv.bScrSaverSecure, fl);
1575
1576 case SPI_SETSCREENSAVESECURE:
1577 return SpiSetBool(&gspv.bScrSaverSecure, uiParam, KEY_DESKTOP, L"ScreenSaverIsSecure", fl);
1578#endif
1579
1580 case SPI_GETACTIVEWINDOWTRACKING:
1581 return SpiGetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1582
1583 case SPI_SETACTIVEWINDOWTRACKING:
1584 return SpiSetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1585
1586 case SPI_GETMENUANIMATION:
1587 return SpiGetUserPref(UPM_MENUANIMATION, pvParam, fl);
1588
1589 case SPI_SETMENUANIMATION:
1590 return SpiSetUserPref(UPM_MENUANIMATION, pvParam, fl);
1591
1592 case SPI_GETCOMBOBOXANIMATION:
1593 return SpiGetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1594
1595 case SPI_SETCOMBOBOXANIMATION:
1596 return SpiSetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1597
1598 case SPI_GETLISTBOXSMOOTHSCROLLING:
1600
1601 case SPI_SETLISTBOXSMOOTHSCROLLING:
1603
1604 case SPI_GETGRADIENTCAPTIONS:
1605 {
1607 {
1608 INT iValue = 0;
1609 return SpiGetInt(pvParam, &iValue, fl);
1610 }
1611 else
1612 {
1613 return SpiGetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1614 }
1615 }
1616
1617 case SPI_SETGRADIENTCAPTIONS:
1618 return SpiSetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1619
1620 case SPI_GETKEYBOARDCUES:
1621 return SpiGetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1622
1623 case SPI_SETKEYBOARDCUES:
1624 return SpiSetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1625
1626 case SPI_GETACTIVEWNDTRKZORDER:
1627 return SpiGetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1628
1629 case SPI_SETACTIVEWNDTRKZORDER:
1630 return SpiSetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1631
1632 case SPI_GETHOTTRACKING:
1633 return SpiGetUserPref(UPM_HOTTRACKING, pvParam, fl);
1634
1635 case SPI_SETHOTTRACKING:
1636 return SpiSetUserPref(UPM_HOTTRACKING, pvParam, fl);
1637
1638 case SPI_GETMENUFADE:
1639 return SpiGetUserPref(UPM_MENUFADE, pvParam, fl);
1640
1641 case SPI_SETMENUFADE:
1642 return SpiSetUserPref(UPM_MENUFADE, pvParam, fl);
1643
1644 case SPI_GETSELECTIONFADE:
1645 return SpiGetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1646
1647 case SPI_SETSELECTIONFADE:
1648 return SpiSetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1649
1650 case SPI_GETTOOLTIPANIMATION:
1651 return SpiGetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1652
1653 case SPI_SETTOOLTIPANIMATION:
1654 return SpiSetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1655
1656 case SPI_GETTOOLTIPFADE:
1657 return SpiGetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1658
1659 case SPI_SETTOOLTIPFADE:
1660 return SpiSetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1661
1662 case SPI_GETCURSORSHADOW:
1663 return SpiGetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1664
1665 case SPI_SETCURSORSHADOW:
1667 return SpiSetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1668
1669 case SPI_GETUIEFFECTS:
1670 return SpiGetUserPref(UPM_UIEFFECTS, pvParam, fl);
1671
1672 case SPI_SETUIEFFECTS:
1673 return SpiSetUserPref(UPM_UIEFFECTS, pvParam, fl);
1674
1675 case SPI_GETMOUSESONAR:
1676 return SpiGetInt(pvParam, &gspv.bMouseSonar, fl);
1677
1678 case SPI_SETMOUSESONAR:
1679 return SpiSetBool(&gspv.bMouseSonar, uiParam, KEY_MOUSE, L"", fl);
1680
1681 case SPI_GETMOUSECLICKLOCK:
1682 return SpiGetUserPref(UPM_CLICKLOCK, pvParam, fl);
1683
1684 case SPI_SETMOUSECLICKLOCK:
1685 gspv.bMouseClickLock = PtrToUlong(pvParam);
1686 return SpiSetUserPref(UPM_CLICKLOCK, pvParam, fl);
1687
1688 case SPI_GETMOUSEVANISH:
1689 return SpiGetInt(pvParam, &gspv.bMouseVanish, fl);
1690
1691 case SPI_SETMOUSEVANISH:
1692 return SpiSetBool(&gspv.bMouseVanish, uiParam, KEY_MOUSE, L"", fl);
1693
1694 case SPI_GETFLATMENU:
1695 return SpiGetUserPref(UPM_FLATMENU, pvParam, fl);
1696
1697 case SPI_SETFLATMENU:
1698 return SpiSetUserPref(UPM_FLATMENU, pvParam, fl);
1699
1700 case SPI_GETDROPSHADOW:
1701 return SpiGetUserPref(UPM_DROPSHADOW, pvParam, fl);
1702
1703 case SPI_SETDROPSHADOW:
1704 return SpiSetUserPref(UPM_DROPSHADOW, pvParam, fl);
1705
1706 case SPI_GETBLOCKSENDINPUTRESETS:
1707 return SpiGetInt(pvParam, &gspv.bBlockSendInputResets, fl);
1708
1709 case SPI_SETBLOCKSENDINPUTRESETS:
1710 return SpiSetBool(&gspv.bBlockSendInputResets, uiParam, KEY_MOUSE, L"", fl);
1711
1712#if(_WIN32_WINNT >= 0x0600)
1713 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1714 return SpiGetInt(pvParam, &gspv.bDisableOverlappedContent, fl);
1715
1716 case SPI_SETDISABLEOVERLAPPEDCONTENT:
1717 return SpiSetBool(&gspv.bDisableOverlappedContent, uiParam, KEY_MOUSE, L"", fl);
1718
1719 case SPI_GETCLIENTAREAANIMATION:
1720 return SpiGetInt(pvParam, &gspv.bClientAreaAnimation, fl);
1721
1722 case SPI_SETCLIENTAREAANIMATION:
1723 return SpiSetBool(&gspv.bClientAreaAnimation, uiParam, KEY_MOUSE, L"", fl);
1724
1725 case SPI_GETCLEARTYPE:
1726 return SpiGetInt(pvParam, &gspv.bClearType, fl);
1727
1728 case SPI_SETCLEARTYPE:
1729 return SpiSetBool(&gspv.bClearType, uiParam, KEY_MOUSE, L"", fl);
1730
1731 case SPI_GETSPEECHRECOGNITION:
1732 return SpiGetInt(pvParam, &gspv.bSpeechRecognition, fl);
1733
1734 case SPI_SETSPEECHRECOGNITION:
1735 return SpiSetBool(&gspv.bSpeechRecognition, uiParam, KEY_MOUSE, L"", fl);
1736#endif
1737
1738 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1739 return SpiGetInt(pvParam, &gspv.dwForegroundLockTimeout, fl);
1740
1741 case SPI_SETFOREGROUNDLOCKTIMEOUT:
1742 return SpiSetInt(&gspv.dwForegroundLockTimeout, uiParam, KEY_MOUSE, L"", fl);
1743
1744 case SPI_GETACTIVEWNDTRKTIMEOUT:
1745 return SpiGetInt(pvParam, &gspv.dwActiveTrackingTimeout, fl);
1746
1747 case SPI_SETACTIVEWNDTRKTIMEOUT:
1748 return SpiSetInt(&gspv.dwActiveTrackingTimeout, uiParam, KEY_MOUSE, L"", fl);
1749
1750 case SPI_GETFOREGROUNDFLASHCOUNT:
1751 return SpiGetInt(pvParam, &gspv.dwForegroundFlashCount, fl);
1752
1753 case SPI_SETFOREGROUNDFLASHCOUNT:
1754 return SpiSetInt(&gspv.dwForegroundFlashCount, uiParam, KEY_MOUSE, L"", fl);
1755
1756 case SPI_GETCARETWIDTH:
1757 return SpiGetInt(pvParam, &gspv.dwCaretWidth, fl);
1758
1759 case SPI_SETCARETWIDTH:
1761
1762 case SPI_GETMOUSECLICKLOCKTIME:
1763 return SpiGetInt(pvParam, &gspv.dwMouseClickLockTime, fl);
1764
1765 case SPI_SETMOUSECLICKLOCKTIME:
1767
1768 case SPI_GETFONTSMOOTHINGTYPE:
1769 return SpiGetInt(pvParam, &gspv.uiFontSmoothingType, fl);
1770
1771 case SPI_SETFONTSMOOTHINGTYPE:
1773
1774 case SPI_GETFONTSMOOTHINGCONTRAST:
1775 return SpiGetInt(pvParam, &gspv.uiFontSmoothingContrast, fl);
1776
1777 case SPI_SETFONTSMOOTHINGCONTRAST:
1779
1780 case SPI_GETFOCUSBORDERWIDTH:
1781 return SpiGetInt(pvParam, &gspv.uiFocusBorderWidth, fl);
1782
1783 case SPI_SETFOCUSBORDERWIDTH:
1784 return SpiSetInt(&gspv.uiFocusBorderWidth, uiParam, KEY_MOUSE, L"", fl);
1785
1786 case SPI_GETFOCUSBORDERHEIGHT:
1787 return SpiGetInt(pvParam, &gspv.uiFocusBorderHeight, fl);
1788
1789 case SPI_SETFOCUSBORDERHEIGHT:
1790 return SpiSetInt(&gspv.uiFocusBorderHeight, uiParam, KEY_MOUSE, L"", fl);
1791
1792 case SPI_GETFONTSMOOTHINGORIENTATION:
1793 return SpiGetInt(pvParam, &gspv.uiFontSmoothingOrientation, fl);
1794
1795 case SPI_SETFONTSMOOTHINGORIENTATION:
1797
1798 case SPI_GETWINARRANGING:
1799 return SpiGetInt(pvParam, &g_bWindowSnapEnabled, fl);
1800 case SPI_SETWINARRANGING:
1802
1803 case SPI_GETDOCKMOVING:
1804 return SpiGetInt(pvParam, &gspv.bDockMoving, fl);
1805 case SPI_SETDOCKMOVING:
1807
1808 /* The following are undocumented, but valid SPI values */
1809 case 0x1010:
1810 case 0x1011:
1811 case 0x1028:
1812 case 0x1029:
1813 case 0x102A:
1814 case 0x102B:
1815 case 0x102C:
1816 case 0x102D:
1817 case 0x102E:
1818 case 0x102F:
1819 case 0x1030:
1820 case 0x1031:
1821 case 0x1032:
1822 case 0x1033:
1823 case 0x1034:
1824 case 0x1035:
1825 case 0x1036:
1826 case 0x1037:
1827 case 0x1038:
1828 case 0x1039:
1829 case 0x103A:
1830 case 0x103B:
1831 case 0x103C:
1832 case 0x103D:
1833 ERR("Undocumented SPI value %x is unimplemented\n", uiAction);
1834 break;
1835
1836 default:
1837 ERR("Invalid SPI value: %u\n", uiAction);
1839 return 0;
1840 }
1841
1842 return 0;
1843}
1844
1845static BOOL
1846SpiGetSetProbeBuffer(UINT uiAction, UINT uiParam, PVOID pvParam)
1847{
1848 BOOL bToUser = TRUE;
1849 ULONG cbSize = 0;
1850
1851 switch (uiAction)
1852 {
1853 case SPI_GETBEEP:
1854 case SPI_GETBORDER:
1863 case SPI_GETDRAGFULLWINDOWS:
1864 case SPI_GETSHOWSOUNDS:
1865 case SPI_GETKEYBOARDPREF:
1866 case SPI_GETSCREENREADER:
1867 case SPI_GETFONTSMOOTHING:
1868 case SPI_GETLOWPOWERTIMEOUT:
1869 case SPI_GETPOWEROFFTIMEOUT:
1870 case SPI_GETLOWPOWERACTIVE:
1871 case SPI_GETPOWEROFFACTIVE:
1872 case SPI_GETMOUSETRAILS:
1873 case SPI_GETSNAPTODEFBUTTON:
1874 case SPI_GETMOUSEHOVERWIDTH:
1875 case SPI_GETMOUSEHOVERHEIGHT:
1876 case SPI_GETMOUSEHOVERTIME:
1877 case SPI_GETWHEELSCROLLLINES:
1878 case SPI_GETMENUSHOWDELAY:
1879#if (_WIN32_WINNT >= 0x0600)
1881#endif
1882 case SPI_GETSHOWIMEUI:
1883 case SPI_GETMOUSESPEED:
1884 case SPI_GETSCREENSAVERRUNNING:
1885#if(WINVER >= 0x0600)
1886 case SPI_GETSCREENSAVESECURE:
1887#endif
1888 case SPI_GETACTIVEWINDOWTRACKING:
1889 case SPI_GETMENUANIMATION:
1890 case SPI_GETCOMBOBOXANIMATION:
1891 case SPI_GETLISTBOXSMOOTHSCROLLING:
1892 case SPI_GETGRADIENTCAPTIONS:
1893 case SPI_GETKEYBOARDCUES:
1894 case SPI_GETACTIVEWNDTRKZORDER:
1895 case SPI_GETHOTTRACKING:
1896 case SPI_GETMENUFADE:
1897 case SPI_GETSELECTIONFADE:
1898 case SPI_GETTOOLTIPANIMATION:
1899 case SPI_GETTOOLTIPFADE:
1900 case SPI_GETCURSORSHADOW:
1901 case SPI_GETUIEFFECTS:
1902 case SPI_GETMOUSESONAR:
1903 case SPI_GETMOUSECLICKLOCK:
1904 case SPI_GETMOUSEVANISH:
1905 case SPI_GETFLATMENU:
1906 case SPI_GETDROPSHADOW:
1907 case SPI_GETBLOCKSENDINPUTRESETS:
1908#if(_WIN32_WINNT >= 0x0600)
1909 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1910 case SPI_GETCLIENTAREAANIMATION:
1911 case SPI_GETCLEARTYPE:
1912 case SPI_GETSPEECHRECOGNITION:
1913#endif
1914 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1915 case SPI_GETACTIVEWNDTRKTIMEOUT:
1916 case SPI_GETFOREGROUNDFLASHCOUNT:
1917 case SPI_GETCARETWIDTH:
1918 case SPI_GETMOUSECLICKLOCKTIME:
1919 case SPI_GETFONTSMOOTHINGTYPE:
1920 case SPI_GETFONTSMOOTHINGCONTRAST:
1921 case SPI_GETFOCUSBORDERWIDTH:
1922 case SPI_GETFOCUSBORDERHEIGHT:
1923 case SPI_GETFONTSMOOTHINGORIENTATION:
1924 cbSize = sizeof(INT);
1925 break;
1926
1929 if (pvParam) cbSize = sizeof(INT);
1930 break;
1931
1932 case SPI_GETMOUSE:
1933 cbSize = 3 * sizeof(INT);
1934 break;
1935
1937 cbSize = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
1938 break;
1939
1941 cbSize = sizeof(LOGFONTW);
1942 break;
1943
1944 case SPI_GETNONCLIENTMETRICS:
1945 cbSize = sizeof(NONCLIENTMETRICSW);
1946 break;
1947
1948 case SPI_GETMINIMIZEDMETRICS:
1949 cbSize = sizeof(MINIMIZEDMETRICS);
1950 break;
1951
1952 case SPI_GETICONMETRICS:
1953 cbSize = sizeof(ICONMETRICSW);
1954 break;
1955
1956 case SPI_GETWORKAREA:
1957 cbSize = sizeof(RECTL);
1958 break;
1959
1960 case SPI_GETFILTERKEYS:
1961 cbSize = sizeof(FILTERKEYS);
1962 break;
1963
1964 case SPI_GETTOGGLEKEYS:
1965 cbSize = sizeof(TOGGLEKEYS);
1966 break;
1967
1968 case SPI_GETMOUSEKEYS:
1969 cbSize = sizeof(MOUSEKEYS);
1970 break;
1971
1972 case SPI_GETSTICKYKEYS:
1973 cbSize = sizeof(STICKYKEYS);
1974 break;
1975
1977 cbSize = sizeof(ACCESSTIMEOUT);
1978 break;
1979
1980 case SPI_GETSERIALKEYS:
1981 cbSize = sizeof(SERIALKEYS);
1982 break;
1983
1984 case SPI_GETSOUNDSENTRY:
1985 cbSize = sizeof(SOUNDSENTRYW);
1986 break;
1987
1988 case SPI_GETHIGHCONTRAST:
1989 cbSize = sizeof(HIGHCONTRASTW);
1990 break;
1991
1992 case SPI_GETANIMATION:
1993 cbSize = sizeof(ANIMATIONINFO);
1994 break;
1995
1996 case SPI_GETDEFAULTINPUTLANG:
1997 cbSize = sizeof(HKL);
1998 break;
1999
2000#if(WINVER >= 0x0600)
2001 case SPI_GETAUDIODESCRIPTION:
2002 cbSize = sizeof(AUDIODESCRIPTION);
2003 break;
2004#endif
2005
2006 case SPI_SETMOUSE:
2007 cbSize = 3 * sizeof(INT);
2008 bToUser = FALSE;
2009 break;
2010
2012 cbSize = sizeof(LOGFONTW);
2013 bToUser = FALSE;
2014 break;
2015
2016 case SPI_SETNONCLIENTMETRICS:
2017 cbSize = sizeof(NONCLIENTMETRICSW);
2018 bToUser = FALSE;
2019 break;
2020
2021 case SPI_SETMINIMIZEDMETRICS:
2022 cbSize = sizeof(MINIMIZEDMETRICS);
2023 bToUser = FALSE;
2024 break;
2025
2026 case SPI_SETICONMETRICS:
2027 cbSize = sizeof(ICONMETRICSW);
2028 bToUser = FALSE;
2029 break;
2030
2031 case SPI_SETWORKAREA:
2032 cbSize = sizeof(RECTL);
2033 bToUser = FALSE;
2034 break;
2035
2036 case SPI_SETFILTERKEYS:
2037 cbSize = sizeof(FILTERKEYS);
2038 bToUser = FALSE;
2039 break;
2040
2041 case SPI_SETTOGGLEKEYS:
2042 cbSize = sizeof(TOGGLEKEYS);
2043 bToUser = FALSE;
2044 break;
2045
2046 case SPI_SETMOUSEKEYS:
2047 cbSize = sizeof(MOUSEKEYS);
2048 bToUser = FALSE;
2049 break;
2050
2051 case SPI_SETSTICKYKEYS:
2052 cbSize = sizeof(STICKYKEYS);
2053 bToUser = FALSE;
2054 break;
2055
2057 cbSize = sizeof(ACCESSTIMEOUT);
2058 bToUser = FALSE;
2059 break;
2060
2061 case SPI_SETSERIALKEYS:
2062 cbSize = sizeof(SERIALKEYS);
2063 bToUser = FALSE;
2064 break;
2065
2066 case SPI_SETSOUNDSENTRY:
2067 cbSize = sizeof(SOUNDSENTRYW);
2068 bToUser = FALSE;
2069 break;
2070
2071 case SPI_SETHIGHCONTRAST:
2072 cbSize = sizeof(HIGHCONTRASTW);
2073 bToUser = FALSE;
2074 break;
2075
2076 case SPI_SETANIMATION:
2077 cbSize = sizeof(ANIMATIONINFO);
2078 bToUser = FALSE;
2079 break;
2080
2081 case SPI_SETDEFAULTINPUTLANG:
2082 cbSize = sizeof(HKL);
2083 bToUser = FALSE;
2084 break;
2085
2086 case SPI_SETMOUSESPEED:
2087 cbSize = sizeof(INT);
2088 bToUser = FALSE;
2089 break;
2090 }
2091
2092 if (cbSize)
2093 {
2094 _SEH2_TRY
2095 {
2096 if (bToUser)
2097 {
2098 ProbeForWrite(pvParam, cbSize, sizeof(UCHAR));
2099 }
2100 else
2101 {
2102 ProbeForRead(pvParam, cbSize, sizeof(UCHAR));
2103 }
2104 }
2106 {
2107 _SEH2_YIELD(return FALSE);
2108 }
2109 _SEH2_END;
2110 }
2111
2112 return TRUE;
2113}
2114
2115BOOL
2118 UINT uiAction,
2119 UINT uiParam,
2120 PVOID pvParam,
2121 UINT fWinIni)
2122{
2123 ULONG_PTR ulResult;
2125
2126 ASSERT(ppi);
2127
2128 if (!gbSpiInitialized)
2129 {
2131 //ASSERT(FALSE);
2132 return FALSE;
2133 }
2134
2135 /* Get a pointer to the current Windowstation */
2136 if (!ppi->prpwinsta)
2137 {
2138 ERR("UserSystemParametersInfo called without active window station.\n");
2139 //ASSERT(FALSE);
2140 //return FALSE;
2141 }
2142
2143 if ((fWinIni & SPIF_PROTECT) && !SpiGetSetProbeBuffer(uiAction, uiParam, pvParam))
2144 {
2146 return FALSE;
2147 }
2148
2149 /* Do the actual operation */
2150 ulResult = SpiGetSet(uiAction, uiParam, pvParam, fWinIni);
2151
2152 /* Did we change something? */
2153 if (ulResult > 1)
2154 {
2156
2157 /* Update system metrics */
2158 InitMetrics();
2159
2160 /* Send notification to toplevel windows, if requested */
2161 if (fWinIni & SPIF_SENDCHANGE)
2162 {
2163 /* Send WM_SETTINGCHANGE to all toplevel windows */
2166 (WPARAM)uiAction,
2167 (LPARAM)ulResult,
2169 100,
2170 &ulResult);
2171 }
2172 ulResult = 1;
2173 }
2174
2175 return ulResult;
2176}
2177
2178BOOL
2181 UINT uiAction,
2182 UINT uiParam,
2183 PVOID pvParam,
2184 UINT fWinIni)
2185{
2186 BOOL bResult;
2187
2188 TRACE("Enter NtUserSystemParametersInfo(%u)\n", uiAction);
2190
2191 // FIXME: Get rid of the flags and only use this from um. kernel can access data directly.
2192 /* Set UM memory protection flag */
2193 fWinIni |= SPIF_PROTECT;
2194
2195 /* Call internal function */
2196 bResult = UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
2197
2198 TRACE("Leave NtUserSystemParametersInfo, returning %d\n", bResult);
2199 UserLeave();
2200
2201 return bResult;
2202}
2203
2204/* 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 SPI_GETDESKWALLPAPER
Definition: sysparams.c:34
#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:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:184
#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:3515
DWORD iTimeToMaxSpeed
Definition: winuser.h:3516
UINT cbSize
Definition: winuser.h:3513
DWORD dwFlags
Definition: winuser.h:3514
DWORD iCtrlSpeed
Definition: winuser.h:3517
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:3631
LONG tmAveCharWidth
Definition: wingdi.h:2834
LONG tmExternalLeading
Definition: wingdi.h:2833
LONG tmHeight
Definition: wingdi.h:2829
DWORD cbSize
Definition: winuser.h:3636
#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 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:127
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:500
#define REG2METRIC(reg)
Definition: sysparams.c:25
static const WCHAR * KEY_MOUSE
Definition: sysparams.c:46
static DWORD SpiLoadUserPrefMask(DWORD dValue)
Definition: sysparams.c:142
static VOID SpiStoreFont(PCWSTR pwszValue, LOGFONTW *plogfont)
Definition: sysparams.c:445
static UINT_PTR SpiSetYesNo(BOOL *pbData, BOOL bValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:529
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:202
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:101
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:522
#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:226
static const WCHAR * VAL_DRAGHEIGHT
Definition: sysparams.c:67
static INT SpiLoadMouse(PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:168
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:555
static UINT_PTR SpiGetUserPref(DWORD dwMask, PVOID pvParam, FLONG fl)
Definition: sysparams.c:634
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:109
static INT SpiLoadDWord(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:115
static const WCHAR * VAL_PAINTDESKVER
Definition: sysparams.c:75
BOOL gbSpiInitialized
Definition: sysparams.c:18
static const WCHAR * VAL_ON
Definition: sysparams.c:104
static const WCHAR * KEY_SCRREAD
Definition: sysparams.c:103
static const WCHAR * VAL_MDALIGN
Definition: sysparams.c:86
static VOID SpiStoreMetric(LPCWSTR pwszValue, INT iValue)
Definition: sysparams.c:438
static const WCHAR * VAL_DRAG
Definition: sysparams.c:66
static const WCHAR * KEY_MOUSEKEYS
Definition: sysparams.c:106
static const WCHAR * VAL_KBDDELAY
Definition: sysparams.c:99
static UINT_PTR SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl)
Definition: sysparams.c:817
static UINT_PTR SpiSetBool(BOOL *pbData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:542
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:175
static const WCHAR * VAL_SNAPDEFBTN
Definition: sysparams.c:54
static VOID SpiStoreDWord(PCWSTR pwszKey, PCWSTR pwszValue, DWORD Value)
Definition: sysparams.c:402
static const WCHAR * VAL_ICONVSPC
Definition: sysparams.c:91
BOOL APIENTRY NtUserUpdatePerUserSystemParameters(DWORD dwReserved, BOOL bEnable)
Definition: sysparams.c:375
static DWORD SpiLoadTimeOut(VOID)
Definition: sysparams.c:154
static VOID SpiStoreSzInt(PCWSTR pwszKey, PCWSTR pwszValue, INT iValue)
Definition: sysparams.c:424
static VOID SpiStoreSz(PCWSTR pwszKey, PCWSTR pwszValue, PCWSTR pwsz)
Definition: sysparams.c:413
static BOOL SpiGetSetProbeBuffer(UINT uiAction, UINT uiParam, PVOID pvParam)
Definition: sysparams.c:1846
static const WCHAR * VAL_SENSITIVITY
Definition: sysparams.c:59
static UINT_PTR SpiGetEx(PVOID pvParam, PVOID pvData, ULONG cbSize, FLONG fl)
Definition: sysparams.c:508
static UINT_PTR SpiSetUserPref(DWORD dwMask, PVOID pvValue, FLONG fl)
Definition: sysparams.c:594
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:492
static const WCHAR * KEY_KBD
Definition: sysparams.c:97
static const WCHAR * KEY_KDBPREF
Definition: sysparams.c:102
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:781
static const WCHAR * VAL_MOUSEKEYS_MAX
Definition: sysparams.c:108
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:642
static const WCHAR * VAL_MOUSEKEYS_FLAGS
Definition: sysparams.c:107
SPIVALUES gspv
Definition: sysparams.c:17
static VOID SpiLoadFont(PLOGFONTW plfOut, LPWSTR pwszValueName, PLOGFONTW plfDefault)
Definition: sysparams.c:187
static UINT_PTR SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect)
Definition: sysparams.c:460
#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:581
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2117
BOOL APIENTRY NtUserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2180
static UINT_PTR SpiSetInt(PVOID pvData, INT iValue, PCWSTR pwszKey, PCWSTR pwszValue, FLONG fl)
Definition: sysparams.c:568
#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:5835
#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:5835
#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