ReactOS 0.4.17-dev-923-g4c9a150
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
648 _In_ PWND pwndDesktop,
650
651static
654{
655 UNICODE_STRING ustr;
656 WCHAR awc[MAX_PATH];
657 BOOL bResult;
658 HBITMAP hbmp, hOldBitmap;
659 SURFACE *psurfBmp;
660 ULONG ulTile, ulStyle;
661
663
664 if (!pvParam)
665 {
666 /* FIXME: Reset Wallpaper to registry value */
667 return (UINT_PTR)KEY_DESKTOP;
668 }
669
670 /* Capture UNICODE_STRING */
671 bResult = SpiMemCopy(&ustr, pvParam, sizeof(ustr), fl & SPIF_PROTECT);
672 if (!bResult)
673 {
674 return 0;
675 }
676 if (ustr.Length > MAX_PATH * sizeof(WCHAR))
677 {
678 return 0;
679 }
680
681 /* Copy the string buffer name */
682 bResult = SpiMemCopy(gspv.awcWallpaper, ustr.Buffer, ustr.Length, fl & SPIF_PROTECT);
683 if (!bResult)
684 {
685 return 0;
686 }
687
688 /* Update the UNICODE_STRING */
692 gspv.awcWallpaper[ustr.Length / sizeof(WCHAR)] = 0;
693
694 TRACE("SpiSetWallpaper, name=%S\n", gspv.awcWallpaper);
695
696 /* Update registry */
698 {
700 }
701
702 /* Got a filename? */
703 if (gspv.awcWallpaper[0] != 0)
704 {
705 /* Convert file name to nt file name */
706 ustr.Buffer = awc;
707 ustr.MaximumLength = MAX_PATH * sizeof(WCHAR);
708 ustr.Length = 0;
710 {
711 ERR("W32kDosPathNameToNtPathName failed\n");
712 return 0;
713 }
714
715 /* Load the Bitmap */
716 hbmp = UserLoadImage(ustr.Buffer);
717 if (!hbmp)
718 {
719 ERR("UserLoadImage failed\n");
720 return 0;
721 }
722
723 /* Try to get the size of the wallpaper */
724 if (!(psurfBmp = SURFACE_ShareLockSurface(hbmp)))
725 {
727 return 0;
728 }
729
733
735
736 /* Change the bitmap's ownership */
738
739 /* Yes, Windows really loads the current setting from the registry. */
740 ulTile = SpiLoadInt(KEY_DESKTOP, L"TileWallpaper", 0);
741 ulStyle = SpiLoadInt(KEY_DESKTOP, L"WallpaperStyle", 0);
742 TRACE("SpiSetWallpaper: ulTile=%lu, ulStyle=%lu\n", ulTile, ulStyle);
743
744 /* Check the values we found in the registry */
745 if (ulTile && !ulStyle)
746 {
748 }
749 else if (!ulTile && ulStyle)
750 {
751 if (ulStyle == 2)
752 {
754 }
755 else if (ulStyle == 6)
756 {
758 }
759 else if (ulStyle == 10)
760 {
762 }
763 }
764 }
765 else
766 {
767 /* Remove wallpaper */
768 gspv.cxWallpaper = 0;
769 gspv.cyWallpaper = 0;
770 hbmp = NULL;
771 }
772
773 /* Take care of the old wallpaper, if any */
774 hOldBitmap = gspv.hbmWallpaper;
775 if(hOldBitmap != NULL)
776 {
777 /* Delete the old wallpaper */
779 GreDeleteObject(hOldBitmap);
780 }
781
782 /* Set the new wallpaper */
786 {
788 }
789 else
790 {
792 }
793
795
796
797 return (UINT_PTR)KEY_DESKTOP;
798}
799
800static BOOL
802{
803 PWND pwndDesktop, pwndCurrent;
804 HWND *ahwnd;
806 int i;
807
808 pwndDesktop = UserGetDesktopWindow();
809 ASSERT(pwndDesktop);
810
811 ahwnd = IntWinListChildren(pwndDesktop);
812 if(!ahwnd)
813 return FALSE;
814
815 for (i = 0; ahwnd[i]; i++)
816 {
817 pwndCurrent = UserGetWindowObject(ahwnd[i]);
818 if(!pwndCurrent)
819 continue;
820
821 UserRefObjectCo(pwndCurrent, &Ref);
822 co_WinPosSetWindowPos(pwndCurrent, 0, pwndCurrent->rcWindow.left,pwndCurrent->rcWindow.top,
823 pwndCurrent->rcWindow.right-pwndCurrent->rcWindow.left
824 ,pwndCurrent->rcWindow.bottom - pwndCurrent->rcWindow.top,
827 UserDerefObjectCo(pwndCurrent);
828 }
829
831
832 return TRUE;
833}
834
835static
837SpiGetSet(UINT uiAction, UINT uiParam, PVOID pvParam, FLONG fl)
838{
839 switch (uiAction)
840 {
841 case SPI_GETBEEP:
842 return SpiGetInt(pvParam, &gspv.bBeep, fl);
843
844 case SPI_SETBEEP:
845 return SpiSetYesNo(&gspv.bBeep, uiParam, KEY_SOUND, VAL_BEEP, fl);
846
847 case SPI_GETMOUSE:
848 return SpiGet(pvParam, &gspv.caiMouse, 3 * sizeof(INT), fl);
849
850 case SPI_SETMOUSE:
851 if (!SpiSet(&gspv.caiMouse, pvParam, 3 * sizeof(INT), fl))
852 return 0;
854 {
858 }
859 return (UINT_PTR)KEY_MOUSE;
860
861 case SPI_GETBORDER:
862 return SpiGetInt(pvParam, &gspv.ncm.iBorderWidth, fl);
863
864 case SPI_SETBORDER:
865 uiParam = max(uiParam, 1);
866 return SpiSetInt(&gspv.ncm.iBorderWidth, uiParam, KEY_METRIC, VAL_BORDER, fl);
867
869 return SpiGetInt(pvParam, &gspv.dwKbdSpeed, fl);
870
872 return SpiSetInt(&gspv.dwKbdSpeed, uiParam, KEY_KBD, VAL_KBDSPD, fl);
873
874 case SPI_LANGDRIVER:
875 ERR("SPI_LANGDRIVER is unimplemented\n");
876 break;
877
879 return SpiGetInt(pvParam, &gspv.iScrSaverTimeout, fl);
880
883
885 return SpiGetInt(pvParam, &gspv.bScrSaverActive, fl);
886
889
891 return SpiGetInt(pvParam, &gspv.uiGridGranularity, fl);
892
895
896 case SPI_GETDESKWALLPAPER:
897 uiParam = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
898 return SpiGet(pvParam, gspv.awcWallpaper, uiParam, fl);
899
901 return SpiSetWallpaper(pvParam, fl);
902
904 ERR("SPI_SETDESKPATTERN is unimplemented\n");
905 break;
906
908 return SpiGetInt(pvParam, &gspv.iKbdDelay, fl);
909
911 return SpiSetInt(&gspv.iKbdDelay, uiParam, KEY_KBD, VAL_KBDDELAY, fl);
912
914 if (pvParam)
915 {
916 return SpiGetInt(pvParam, &gspv.im.iHorzSpacing, fl);
917 }
918 uiParam = max(uiParam, 32);
919 return SpiSetMetric(&gspv.im.iHorzSpacing, uiParam, VAL_ICONSPC, fl);
920
922 if (pvParam)
923 {
924 return SpiGetInt(pvParam, &gspv.im.iVertSpacing, fl);
925 }
926 uiParam = max(uiParam, 32);
927 return SpiSetMetric(&gspv.im.iVertSpacing, uiParam, VAL_ICONVSPC, fl);
928
930 return SpiGetInt(pvParam, &gspv.im.iTitleWrap, fl);
931
933 return SpiSetInt(&gspv.im.iTitleWrap, uiParam, KEY_METRIC, VAL_ITWRAP, fl);
934
936 return SpiGetInt(pvParam, &gspv.bMenuDropAlign, fl);
937
940
943
946
948 return SpiGet(pvParam, &gspv.im.lfFont, sizeof(LOGFONTW), fl);
949
951 if (!SpiSet(&gspv.im.lfFont, pvParam, sizeof(LOGFONTW), fl))
952 return 0;
954 {
955 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
956 }
957 return (UINT_PTR)KEY_METRIC;
958
961
963 return SpiSetInt(&gspv.bMouseBtnSwap, uiParam, KEY_MOUSE, VAL_SWAP, fl);
964
966 return SpiGetInt(pvParam, &gspv.bFastTaskSwitch, fl);
967
969 /* According to Winetest this one is unimplemented */
970 return 1;
971
972 case SPI_GETDRAGFULLWINDOWS:
973 return SpiGetInt(pvParam, &gspv.bDragFullWindows, fl);
974
975 case SPI_SETDRAGFULLWINDOWS:
977
978 case SPI_GETNONCLIENTMETRICS:
979 {
980 return SpiGet(pvParam, &gspv.ncm, sizeof(NONCLIENTMETRICSW), fl);
981 }
982
983 case SPI_SETNONCLIENTMETRICS:
984 {
985 LPNONCLIENTMETRICSW metrics = (LPNONCLIENTMETRICSW)pvParam;
986
987 /* Fixup user's structure size */
988 metrics->cbSize = sizeof(NONCLIENTMETRICSW);
989
990 if (!SpiSet(&gspv.ncm, metrics, sizeof(NONCLIENTMETRICSW), fl))
991 return 0;
992
994 {
995 SpiStoreMetric(VAL_BORDER, gspv.ncm.iBorderWidth);
996 SpiStoreMetric(L"ScrollWidth", gspv.ncm.iScrollWidth);
997 SpiStoreMetric(L"ScrollHeight", gspv.ncm.iScrollHeight);
998 SpiStoreMetric(L"CaptionWidth", gspv.ncm.iCaptionWidth);
999 SpiStoreMetric(L"CaptionHeight", gspv.ncm.iCaptionHeight);
1000 SpiStoreMetric(L"SmCaptionWidth", gspv.ncm.iSmCaptionWidth);
1001 SpiStoreMetric(L"SmCaptionHeight", gspv.ncm.iSmCaptionHeight);
1002 SpiStoreMetric(L"MenuWidth", gspv.ncm.iMenuWidth);
1003 SpiStoreMetric(L"MenuHeight", gspv.ncm.iMenuHeight);
1004#if (WINVER >= 0x0600)
1005 SpiStoreMetric(L"PaddedBorderWidth", gspv.ncm.iPaddedBorderWidth);
1006#endif
1007 SpiStoreFont(L"CaptionFont", &gspv.ncm.lfCaptionFont);
1008 SpiStoreFont(L"SmCaptionFont", &gspv.ncm.lfSmCaptionFont);
1009 SpiStoreFont(L"MenuFont", &gspv.ncm.lfMenuFont);
1010 SpiStoreFont(L"StatusFont", &gspv.ncm.lfStatusFont);
1011 SpiStoreFont(L"MessageFont", &gspv.ncm.lfMessageFont);
1012 }
1013
1015 return 0;
1016
1017 return (UINT_PTR)KEY_METRIC;
1018 }
1019
1020 case SPI_GETMINIMIZEDMETRICS:
1021 {
1022 return SpiGet(pvParam, &gspv.mm, sizeof(MINIMIZEDMETRICS), fl);
1023 }
1024
1025 case SPI_SETMINIMIZEDMETRICS:
1026 {
1028
1029 /* Fixup user's structure size */
1030 metrics->cbSize = sizeof(MINIMIZEDMETRICS);
1031
1032 if (!SpiSet(&gspv.mm, metrics, sizeof(MINIMIZEDMETRICS), fl))
1033 return 0;
1034
1035 gspv.mm.iWidth = max(0, gspv.mm.iWidth);
1038 gspv.mm.iArrange = gspv.mm.iArrange & 0xf;
1039
1040 if (fl & SPIF_UPDATEINIFILE)
1041 {
1042 SpiStoreMetric(L"MinWidth", gspv.mm.iWidth);
1043 SpiStoreMetric(L"MinHorzGap", gspv.mm.iHorzGap);
1044 SpiStoreMetric(L"MinVertGap", gspv.mm.iVertGap);
1045 SpiStoreMetric(L"MinArrange", gspv.mm.iArrange);
1046 }
1047
1048 return (UINT_PTR)KEY_METRIC;
1049 }
1050
1051 case SPI_GETICONMETRICS:
1052 {
1053 return SpiGet(pvParam, &gspv.im, sizeof(ICONMETRICSW), fl);
1054 }
1055
1056 case SPI_SETICONMETRICS:
1057 {
1058 LPICONMETRICSW metrics = (LPICONMETRICSW)pvParam;
1059
1060 /* Fixup user's structure size */
1061 metrics->cbSize = sizeof(ICONMETRICSW);
1062
1063 if (!SpiSet(&gspv.im, metrics, sizeof(ICONMETRICSW), fl))
1064 return 0;
1065
1066 if (fl & SPIF_UPDATEINIFILE)
1067 {
1068 SpiStoreMetric(VAL_ICONSPC, gspv.im.iHorzSpacing);
1069 SpiStoreMetric(VAL_ICONVSPC, gspv.im.iVertSpacing);
1070 SpiStoreMetric(VAL_ITWRAP, gspv.im.iTitleWrap);
1071 SpiStoreFont(L"IconFont", &gspv.im.lfFont);
1072 }
1073 return (UINT_PTR)KEY_METRIC;
1074 }
1075
1076 case SPI_GETWORKAREA:
1077 {
1078 PMONITOR pmonitor = UserGetPrimaryMonitor();
1079
1080 if(!pmonitor)
1081 return 0;
1082
1083 return SpiGet(pvParam, &pmonitor->rcWork, sizeof(RECTL), fl);
1084 }
1085
1086 case SPI_SETWORKAREA:
1087 {
1088 PMONITOR pmonitor;
1089 RECTL rcWorkArea, rcIntersect;
1090
1091 if (!pvParam)
1092 return 0;
1093
1094 RtlCopyMemory(&rcWorkArea, pvParam, sizeof(rcWorkArea));
1095
1096 /* fail if empty */
1097 if (RECTL_bIsEmptyRect(&rcWorkArea))
1098 return 0;
1099
1100 /* get the nearest monitor */
1101 pmonitor = UserMonitorFromRect(&rcWorkArea, MONITOR_DEFAULTTONEAREST);
1102 if (!pmonitor)
1103 return 0;
1104
1105 /* fail unless work area is completely in monitor */
1106 if (!RECTL_bIntersectRect(&rcIntersect, &pmonitor->rcMonitor, &rcWorkArea) ||
1107 !RtlEqualMemory(&rcIntersect, &rcWorkArea, sizeof(rcIntersect)))
1108 {
1109 return 0;
1110 }
1111
1112 if (!SpiSet(&pmonitor->rcWork, pvParam, sizeof(RECTL), fl))
1113 return 0;
1114
1115 if (fl & SPIF_UPDATEINIFILE)
1116 {
1117 // FIXME: What to do?
1118 }
1119 return (UINT_PTR)KEY_DESKTOP;
1120 }
1121
1122 case SPI_SETPENWINDOWS:
1123 ERR("SPI_SETPENWINDOWS is unimplemented\n");
1124 break;
1125
1126 case SPI_GETFILTERKEYS:
1127 {
1128 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1129
1130 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1131 return 0;
1132
1133 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1134 return 0;
1135
1136 return SpiGet(pvParam, &gspv.filterkeys, sizeof(FILTERKEYS), fl);
1137 }
1138
1139 case SPI_SETFILTERKEYS:
1140 {
1141 LPFILTERKEYS FilterKeys = (LPFILTERKEYS)pvParam;
1142
1143 if (uiParam != 0 && uiParam != sizeof(FILTERKEYS))
1144 return 0;
1145
1146 if (!FilterKeys || FilterKeys->cbSize != sizeof(FILTERKEYS))
1147 return 0;
1148
1149 if (!SpiSet(&gspv.filterkeys, pvParam, sizeof(FILTERKEYS), fl))
1150 return 0;
1151
1152 if (fl & SPIF_UPDATEINIFILE)
1153 {
1154 // FIXME: What to do?
1155 }
1156 return (UINT_PTR)KEY_DESKTOP;
1157 }
1158
1159 case SPI_GETTOGGLEKEYS:
1160 {
1161 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1162
1163 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1164 return 0;
1165
1166 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1167 return 0;
1168
1169 return SpiGet(pvParam, &gspv.togglekeys, sizeof(TOGGLEKEYS), fl);
1170 }
1171
1172 case SPI_SETTOGGLEKEYS:
1173 {
1174 LPTOGGLEKEYS ToggleKeys = (LPTOGGLEKEYS)pvParam;
1175
1176 if (uiParam != 0 && uiParam != sizeof(TOGGLEKEYS))
1177 return 0;
1178
1179 if (!ToggleKeys || ToggleKeys->cbSize != sizeof(TOGGLEKEYS))
1180 return 0;
1181
1182 if (!SpiSet(&gspv.togglekeys, pvParam, sizeof(TOGGLEKEYS), fl))
1183 return 0;
1184
1185 if (fl & SPIF_UPDATEINIFILE)
1186 {
1187 // FIXME: What to do?
1188 }
1189 return (UINT_PTR)KEY_DESKTOP;
1190 }
1191
1192 case SPI_GETMOUSEKEYS:
1193 {
1194 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1195
1196 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1197 return 0;
1198
1199 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1200 return 0;
1201
1202 return SpiGet(pvParam, &gspv.mousekeys, sizeof(MOUSEKEYS), fl);
1203 }
1204
1205 case SPI_SETMOUSEKEYS:
1206 {
1207 LPMOUSEKEYS MouseKeys = (LPMOUSEKEYS)pvParam;
1208
1209 if (uiParam != 0 && uiParam != sizeof(MOUSEKEYS))
1210 return 0;
1211
1212 if (!MouseKeys || MouseKeys->cbSize != sizeof(MOUSEKEYS))
1213 return 0;
1214
1215 if (!SpiSet(&gspv.mousekeys, pvParam, sizeof(MOUSEKEYS), fl))
1216 return 0;
1217
1218 if (fl & SPIF_UPDATEINIFILE)
1219 {
1223 }
1224 return (UINT_PTR)KEY_DESKTOP;
1225 }
1226
1227 case SPI_GETSHOWSOUNDS:
1228 return SpiGetInt(pvParam, &gspv.bShowSounds, fl);
1229
1230 case SPI_SETSHOWSOUNDS:
1231 return SpiSetBool(&gspv.bShowSounds, uiParam, KEY_SHOWSNDS, VAL_ON, fl);
1232
1233 case SPI_GETSTICKYKEYS:
1234 {
1235 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1236
1237 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1238 return 0;
1239
1240 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1241 return 0;
1242
1243 return SpiGetEx(pvParam, &gspv.stickykeys, sizeof(STICKYKEYS), fl);
1244 }
1245
1246 case SPI_SETSTICKYKEYS:
1247 {
1248 LPSTICKYKEYS StickyKeys = (LPSTICKYKEYS)pvParam;
1249
1250 if (uiParam != 0 && uiParam != sizeof(STICKYKEYS))
1251 return 0;
1252
1253 if (!StickyKeys || StickyKeys->cbSize != sizeof(STICKYKEYS))
1254 return 0;
1255
1256 if (!SpiSet(&gspv.stickykeys, pvParam, sizeof(STICKYKEYS), fl))
1257 return 0;
1258
1259 if (fl & SPIF_UPDATEINIFILE)
1260 {
1261 // FIXME: What to do?
1262 }
1263 return (UINT_PTR)KEY_DESKTOP;
1264 }
1265
1267 {
1268 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1269
1270 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1271 return 0;
1272
1273 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1274 return 0;
1275
1276 return SpiGetEx(pvParam, &gspv.accesstimeout, sizeof(ACCESSTIMEOUT), fl);
1277 }
1278
1280 {
1281 LPACCESSTIMEOUT AccessTimeout = (LPACCESSTIMEOUT)pvParam;
1282
1283 if (uiParam != 0 && uiParam != sizeof(ACCESSTIMEOUT))
1284 {
1285 return 0;
1286 }
1287
1288 if (!AccessTimeout || AccessTimeout->cbSize != sizeof(ACCESSTIMEOUT))
1289 {
1290 return 0;
1291 }
1292
1293 if (!SpiSet(&gspv.accesstimeout, pvParam, sizeof(ACCESSTIMEOUT), fl))
1294 return 0;
1295
1296 if (fl & SPIF_UPDATEINIFILE)
1297 {
1298 // FIXME: What to do?
1299 }
1300 return (UINT_PTR)KEY_DESKTOP;
1301 }
1302
1303 case SPI_GETSERIALKEYS:
1304 {
1305 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1306
1307 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1308 return 0;
1309
1310 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1311 return 0;
1312
1313 return SpiGet(pvParam, &gspv.serialkeys, sizeof(SERIALKEYS), fl);
1314 }
1315
1316 case SPI_SETSERIALKEYS:
1317 {
1318 LPSERIALKEYS SerialKeys = (LPSERIALKEYS)pvParam;
1319
1320 if (uiParam != 0 && uiParam != sizeof(SERIALKEYS))
1321 return 0;
1322
1323 if (!SerialKeys || SerialKeys->cbSize != sizeof(SERIALKEYS))
1324 return 0;
1325
1326 if (!SpiSet(&gspv.serialkeys, pvParam, sizeof(SERIALKEYS), fl))
1327 return 0;
1328
1329 if (fl & SPIF_UPDATEINIFILE)
1330 {
1331 // FIXME: What to do?
1332 }
1333 return (UINT_PTR)KEY_DESKTOP;
1334 }
1335
1336 case SPI_GETSOUNDSENTRY:
1337 {
1338 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1339
1340 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1341 return 0;
1342
1343 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1344 return 0;
1345
1346 return SpiGet(pvParam, &gspv.soundsentry, sizeof(SOUNDSENTRYW), fl);
1347 }
1348
1349 case SPI_SETSOUNDSENTRY:
1350 {
1351 LPSOUNDSENTRYW SoundsEntry = (LPSOUNDSENTRYW)pvParam;
1352
1353 if (uiParam != 0 && uiParam != sizeof(SOUNDSENTRYW))
1354 return 0;
1355
1356 if (!SoundsEntry || SoundsEntry->cbSize != sizeof(SOUNDSENTRYW))
1357 return 0;
1358
1359 if (!SpiSet(&gspv.soundsentry, pvParam, sizeof(SOUNDSENTRYW), fl))
1360 return 0;
1361
1362 if (fl & SPIF_UPDATEINIFILE)
1363 {
1364 // FIXME: What to do?
1365 }
1366 return (UINT_PTR)KEY_DESKTOP;
1367 }
1368
1369 case SPI_GETHIGHCONTRAST:
1370 {
1371 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1372
1373 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1374 return 0;
1375
1376 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1377 return 0;
1378
1379 return SpiGet(pvParam, &gspv.highcontrast, sizeof(HIGHCONTRASTW), fl);
1380 }
1381
1382 case SPI_SETHIGHCONTRAST:
1383 {
1384 LPHIGHCONTRASTW highcontrast = (LPHIGHCONTRASTW)pvParam;
1385
1386 if (uiParam != 0 && uiParam != sizeof(HIGHCONTRASTW))
1387 return 0;
1388
1389 if (!highcontrast || highcontrast->cbSize != sizeof(HIGHCONTRASTW))
1390 return 0;
1391
1392 if (!SpiSet(&gspv.highcontrast, pvParam, sizeof(HIGHCONTRASTW), fl))
1393 return 0;
1394
1395 if (fl & SPIF_UPDATEINIFILE)
1396 {
1397 // FIXME: What to do?
1398 }
1399 return (UINT_PTR)KEY_DESKTOP;
1400 }
1401
1402 case SPI_GETKEYBOARDPREF:
1403 return SpiGetInt(pvParam, &gspv.bKbdPref, fl);
1404
1405 case SPI_SETKEYBOARDPREF:
1406 return SpiSetBool(&gspv.bKbdPref, uiParam, KEY_KDBPREF, VAL_ON, fl);
1407
1408 case SPI_GETSCREENREADER:
1409 return SpiGetInt(pvParam, &gspv.bScreenReader, fl);
1410
1411 case SPI_SETSCREENREADER:
1412 return SpiSetBool(&gspv.bScreenReader, uiParam, KEY_SCRREAD, VAL_ON, fl);
1413
1414 case SPI_GETANIMATION:
1415 return SpiGet(pvParam, &gspv.animationinfo, sizeof(ANIMATIONINFO), fl);
1416
1417 case SPI_SETANIMATION:
1418 if (!SpiSet(&gspv.animationinfo, pvParam, sizeof(ANIMATIONINFO), fl))
1419 return 0;
1420 if (fl & SPIF_UPDATEINIFILE)
1421 {
1422 // FIXME: What to do?
1423 }
1424 return (UINT_PTR)KEY_DESKTOP;
1425
1426 case SPI_GETFONTSMOOTHING:
1427 return SpiGetInt(pvParam, &gspv.bFontSmoothing, fl);
1428
1429 case SPI_SETFONTSMOOTHING:
1430 gspv.bFontSmoothing = !!uiParam;
1431 if (fl & SPIF_UPDATEINIFILE)
1432 {
1434 }
1435 return (UINT_PTR)KEY_DESKTOP;
1436
1437 case SPI_SETDRAGWIDTH:
1438 return SpiSetInt(&gspv.iDragWidth, uiParam, KEY_DESKTOP, VAL_DRAGWIDTH, fl);
1439
1440 case SPI_SETDRAGHEIGHT:
1442
1443 case SPI_SETHANDHELD:
1444 return SpiSetBool(&gspv.bHandHeld, uiParam, KEY_DESKTOP, L"HandHeld", fl);
1445
1446 case SPI_GETLOWPOWERTIMEOUT:
1447 return SpiGetInt(pvParam, &gspv.iLowPwrTimeout, fl);
1448
1449 case SPI_GETPOWEROFFTIMEOUT:
1450 return SpiGetInt(pvParam, &gspv.iPwrOffTimeout, fl);
1451
1452 case SPI_SETLOWPOWERTIMEOUT:
1453 return SpiSetInt(&gspv.iLowPwrTimeout, uiParam, KEY_DESKTOP, L"LowPowerTimeOut", fl);
1454
1455 case SPI_SETPOWEROFFTIMEOUT:
1456 return SpiSetInt(&gspv.iPwrOffTimeout, uiParam, KEY_DESKTOP, L"PowerOffTimeOut", fl);
1457
1458 case SPI_GETLOWPOWERACTIVE:
1459 return SpiGetInt(pvParam, &gspv.bLowPwrActive, fl);
1460
1461 case SPI_GETPOWEROFFACTIVE:
1462 return SpiGetInt(pvParam, &gspv.bPwrOffActive, fl);
1463
1464 case SPI_SETLOWPOWERACTIVE:
1465 return SpiSetBool(&gspv.bLowPwrActive, uiParam, KEY_DESKTOP, L"LowPowerActive", fl);
1466
1467 case SPI_SETPOWEROFFACTIVE:
1468 return SpiSetBool(&gspv.bPwrOffActive, uiParam, KEY_DESKTOP, L"PowerOffActive", fl);
1469
1470 case SPI_SETCURSORS:
1471 ERR("SPI_SETCURSORS is unimplemented\n");
1472 break;
1473
1474 case SPI_SETICONS:
1475 ERR("SPI_SETICONS is unimplemented\n");
1476 break;
1477
1478 case SPI_GETDEFAULTINPUTLANG:
1479 if (!gspklBaseLayout)
1480 return FALSE;
1481
1482 return SpiGet(pvParam, &gspklBaseLayout->hkl, sizeof(HKL), fl);
1483
1484 case SPI_SETDEFAULTINPUTLANG:
1485 {
1486 HKL hkl;
1487
1488 /* Note: SPIF_UPDATEINIFILE is not supported */
1489 if ((fl & SPIF_UPDATEINIFILE) || !SpiSet(&hkl, pvParam, sizeof(hkl), fl))
1490 return FALSE;
1491
1493 }
1494
1495 case SPI_SETLANGTOGGLE:
1496 gdwLayoutToggleKey = UserGetLanguageToggle(L"Layout Hotkey", 2);
1497 gdwLanguageToggleKey = UserGetLanguageToggle(L"Language Hotkey", 1);
1498 return gdwLanguageToggleKey;
1499
1500 case SPI_GETWINDOWSEXTENSION:
1501 ERR("SPI_GETWINDOWSEXTENSION is unimplemented\n");
1502 break;
1503
1504 case SPI_GETMOUSETRAILS:
1505 return SpiGetInt(pvParam, &gspv.iMouseTrails, fl);
1506
1507 case SPI_SETMOUSETRAILS:
1509
1510 case SPI_GETSNAPTODEFBUTTON:
1511 return SpiGetInt(pvParam, &gspv.bSnapToDefBtn, fl);
1512
1513 case SPI_SETSNAPTODEFBUTTON:
1515
1516 case SPI_GETMOUSEHOVERWIDTH:
1517 return SpiGetInt(pvParam, &gspv.iMouseHoverWidth, fl);
1518
1519 case SPI_SETMOUSEHOVERWIDTH:
1521
1522 case SPI_GETMOUSEHOVERHEIGHT:
1523 return SpiGetInt(pvParam, &gspv.iMouseHoverHeight, fl);
1524
1525 case SPI_SETMOUSEHOVERHEIGHT:
1527
1528 case SPI_GETMOUSEHOVERTIME:
1529 return SpiGetInt(pvParam, &gspv.iMouseHoverTime, fl);
1530
1531 case SPI_SETMOUSEHOVERTIME:
1532 /* See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
1533 * copy text from it, if some agument why xp and 2003 behovir diffent
1534 * only if they do not have SP install
1535 * " Windows Server 2003 and Windows XP: The operating system does not
1536 * enforce the use of USER_TIMER_MAXIMUM and USER_TIMER_MINIMUM until
1537 * Windows Server 2003 SP1 and Windows XP SP2 "
1538 */
1540
1541 case SPI_GETWHEELSCROLLLINES:
1542 return SpiGetInt(pvParam, &gspv.iWheelScrollLines, fl);
1543
1546
1547 case SPI_GETMENUSHOWDELAY:
1548 return SpiGetInt(pvParam, &gspv.dwMenuShowDelay, fl);
1549
1550 case SPI_SETMENUSHOWDELAY:
1551 return SpiSetInt(&gspv.dwMenuShowDelay, uiParam, KEY_DESKTOP, L"MenuShowDelay", fl);
1552
1553#if (_WIN32_WINNT >= 0x0600)
1555 return SpiGetInt(pvParam, &gspv.uiWheelScrollChars, fl);
1556
1557 case SPI_SETWHEELSCROLLCHARS:
1558 return SpiSetInt(&gspv.uiWheelScrollChars, uiParam, KEY_DESKTOP, VAL_SCRLLCHARS, fl);
1559#endif
1560 case SPI_GETSHOWIMEUI:
1561 return SpiGetInt(pvParam, &gspv.bShowImeUi, fl);
1562
1563 case SPI_SETSHOWIMEUI:
1564 return SpiSetBool(&gspv.bShowImeUi, uiParam, KEY_DESKTOP, L"", fl);
1565
1566 case SPI_GETMOUSESPEED:
1567 return SpiGetInt(pvParam, &gspv.iMouseSpeed, fl);
1568
1569 case SPI_SETMOUSESPEED:
1570 {
1571 /* Allowed range is [1:20] */
1572 if ((INT_PTR)pvParam < 1 || (INT_PTR)pvParam > 20)
1573 return 0;
1574 else
1576 }
1577
1578 case SPI_GETSCREENSAVERRUNNING:
1579 return SpiGetInt(pvParam, &gspv.bScrSaverRunning, fl);
1580
1581 case SPI_SETSCREENSAVERRUNNING:
1582 // FIXME: also return value?
1583 return SpiSetBool(&gspv.bScrSaverRunning, uiParam, KEY_MOUSE, L"", fl);
1584
1585#if(WINVER >= 0x0600)
1586 case SPI_GETAUDIODESCRIPTION:
1587 return SpiGet(pvParam, &gspv.audiodescription, sizeof(AUDIODESCRIPTION), fl);
1588
1589 case SPI_SETAUDIODESCRIPTION:
1590 ERR("SPI_SETAUDIODESCRIPTION is unimplemented\n");
1591 break;
1592
1593 case SPI_GETSCREENSAVESECURE:
1594 return SpiGetInt(pvParam, &gspv.bScrSaverSecure, fl);
1595
1596 case SPI_SETSCREENSAVESECURE:
1597 return SpiSetBool(&gspv.bScrSaverSecure, uiParam, KEY_DESKTOP, L"ScreenSaverIsSecure", fl);
1598#endif
1599
1600 case SPI_GETACTIVEWINDOWTRACKING:
1601 return SpiGetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1602
1603 case SPI_SETACTIVEWINDOWTRACKING:
1604 return SpiSetUserPref(UPM_ACTIVEWINDOWTRACKING, pvParam, fl);
1605
1606 case SPI_GETMENUANIMATION:
1607 return SpiGetUserPref(UPM_MENUANIMATION, pvParam, fl);
1608
1609 case SPI_SETMENUANIMATION:
1610 return SpiSetUserPref(UPM_MENUANIMATION, pvParam, fl);
1611
1612 case SPI_GETCOMBOBOXANIMATION:
1613 return SpiGetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1614
1615 case SPI_SETCOMBOBOXANIMATION:
1616 return SpiSetUserPref(UPM_COMBOBOXANIMATION, pvParam, fl);
1617
1618 case SPI_GETLISTBOXSMOOTHSCROLLING:
1620
1621 case SPI_SETLISTBOXSMOOTHSCROLLING:
1623
1624 case SPI_GETGRADIENTCAPTIONS:
1625 {
1627 {
1628 INT iValue = 0;
1629 return SpiGetInt(pvParam, &iValue, fl);
1630 }
1631 else
1632 {
1633 return SpiGetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1634 }
1635 }
1636
1637 case SPI_SETGRADIENTCAPTIONS:
1638 return SpiSetUserPref(UPM_GRADIENTCAPTIONS, pvParam, fl);
1639
1640 case SPI_GETKEYBOARDCUES:
1641 return SpiGetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1642
1643 case SPI_SETKEYBOARDCUES:
1644 return SpiSetUserPref(UPM_KEYBOARDCUES, pvParam, fl);
1645
1646 case SPI_GETACTIVEWNDTRKZORDER:
1647 return SpiGetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1648
1649 case SPI_SETACTIVEWNDTRKZORDER:
1650 return SpiSetUserPref(UPM_ACTIVEWNDTRKZORDER, pvParam, fl);
1651
1652 case SPI_GETHOTTRACKING:
1653 return SpiGetUserPref(UPM_HOTTRACKING, pvParam, fl);
1654
1655 case SPI_SETHOTTRACKING:
1656 return SpiSetUserPref(UPM_HOTTRACKING, pvParam, fl);
1657
1658 case SPI_GETMENUFADE:
1659 return SpiGetUserPref(UPM_MENUFADE, pvParam, fl);
1660
1661 case SPI_SETMENUFADE:
1662 return SpiSetUserPref(UPM_MENUFADE, pvParam, fl);
1663
1664 case SPI_GETSELECTIONFADE:
1665 return SpiGetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1666
1667 case SPI_SETSELECTIONFADE:
1668 return SpiSetUserPref(UPM_SELECTIONFADE, pvParam, fl);
1669
1670 case SPI_GETTOOLTIPANIMATION:
1671 return SpiGetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1672
1673 case SPI_SETTOOLTIPANIMATION:
1674 return SpiSetUserPref(UPM_TOOLTIPANIMATION, pvParam, fl);
1675
1676 case SPI_GETTOOLTIPFADE:
1677 return SpiGetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1678
1679 case SPI_SETTOOLTIPFADE:
1680 return SpiSetUserPref(UPM_TOOLTIPFADE, pvParam, fl);
1681
1682 case SPI_GETCURSORSHADOW:
1683 return SpiGetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1684
1685 case SPI_SETCURSORSHADOW:
1687 return SpiSetUserPref(UPM_CURSORSHADOW, pvParam, fl);
1688
1689 case SPI_GETUIEFFECTS:
1690 return SpiGetUserPref(UPM_UIEFFECTS, pvParam, fl);
1691
1692 case SPI_SETUIEFFECTS:
1693 return SpiSetUserPref(UPM_UIEFFECTS, pvParam, fl);
1694
1695 case SPI_GETMOUSESONAR:
1696 return SpiGetInt(pvParam, &gspv.bMouseSonar, fl);
1697
1698 case SPI_SETMOUSESONAR:
1699 return SpiSetBool(&gspv.bMouseSonar, uiParam, KEY_MOUSE, L"", fl);
1700
1701 case SPI_GETMOUSECLICKLOCK:
1702 return SpiGetUserPref(UPM_CLICKLOCK, pvParam, fl);
1703
1704 case SPI_SETMOUSECLICKLOCK:
1705 gspv.bMouseClickLock = PtrToUlong(pvParam);
1706 return SpiSetUserPref(UPM_CLICKLOCK, pvParam, fl);
1707
1708 case SPI_GETMOUSEVANISH:
1709 return SpiGetInt(pvParam, &gspv.bMouseVanish, fl);
1710
1711 case SPI_SETMOUSEVANISH:
1712 return SpiSetBool(&gspv.bMouseVanish, uiParam, KEY_MOUSE, L"", fl);
1713
1714 case SPI_GETFLATMENU:
1715 return SpiGetUserPref(UPM_FLATMENU, pvParam, fl);
1716
1717 case SPI_SETFLATMENU:
1718 return SpiSetUserPref(UPM_FLATMENU, pvParam, fl);
1719
1720 case SPI_GETDROPSHADOW:
1721 return SpiGetUserPref(UPM_DROPSHADOW, pvParam, fl);
1722
1723 case SPI_SETDROPSHADOW:
1724 return SpiSetUserPref(UPM_DROPSHADOW, pvParam, fl);
1725
1726 case SPI_GETBLOCKSENDINPUTRESETS:
1727 return SpiGetInt(pvParam, &gspv.bBlockSendInputResets, fl);
1728
1729 case SPI_SETBLOCKSENDINPUTRESETS:
1730 return SpiSetBool(&gspv.bBlockSendInputResets, uiParam, KEY_MOUSE, L"", fl);
1731
1732#if(_WIN32_WINNT >= 0x0600)
1733 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1734 return SpiGetInt(pvParam, &gspv.bDisableOverlappedContent, fl);
1735
1736 case SPI_SETDISABLEOVERLAPPEDCONTENT:
1737 return SpiSetBool(&gspv.bDisableOverlappedContent, uiParam, KEY_MOUSE, L"", fl);
1738
1739 case SPI_GETCLIENTAREAANIMATION:
1740 return SpiGetInt(pvParam, &gspv.bClientAreaAnimation, fl);
1741
1742 case SPI_SETCLIENTAREAANIMATION:
1743 return SpiSetBool(&gspv.bClientAreaAnimation, uiParam, KEY_MOUSE, L"", fl);
1744
1745 case SPI_GETCLEARTYPE:
1746 return SpiGetInt(pvParam, &gspv.bClearType, fl);
1747
1748 case SPI_SETCLEARTYPE:
1749 return SpiSetBool(&gspv.bClearType, uiParam, KEY_MOUSE, L"", fl);
1750
1751 case SPI_GETSPEECHRECOGNITION:
1752 return SpiGetInt(pvParam, &gspv.bSpeechRecognition, fl);
1753
1754 case SPI_SETSPEECHRECOGNITION:
1755 return SpiSetBool(&gspv.bSpeechRecognition, uiParam, KEY_MOUSE, L"", fl);
1756#endif
1757
1758 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1759 return SpiGetInt(pvParam, &gspv.dwForegroundLockTimeout, fl);
1760
1761 case SPI_SETFOREGROUNDLOCKTIMEOUT:
1762 return SpiSetInt(&gspv.dwForegroundLockTimeout, uiParam, KEY_MOUSE, L"", fl);
1763
1764 case SPI_GETACTIVEWNDTRKTIMEOUT:
1765 return SpiGetInt(pvParam, &gspv.dwActiveTrackingTimeout, fl);
1766
1767 case SPI_SETACTIVEWNDTRKTIMEOUT:
1768 return SpiSetInt(&gspv.dwActiveTrackingTimeout, uiParam, KEY_MOUSE, L"", fl);
1769
1770 case SPI_GETFOREGROUNDFLASHCOUNT:
1771 return SpiGetInt(pvParam, &gspv.dwForegroundFlashCount, fl);
1772
1773 case SPI_SETFOREGROUNDFLASHCOUNT:
1774 return SpiSetInt(&gspv.dwForegroundFlashCount, uiParam, KEY_MOUSE, L"", fl);
1775
1776 case SPI_GETCARETWIDTH:
1777 return SpiGetInt(pvParam, &gspv.dwCaretWidth, fl);
1778
1779 case SPI_SETCARETWIDTH:
1781
1782 case SPI_GETMOUSECLICKLOCKTIME:
1783 return SpiGetInt(pvParam, &gspv.dwMouseClickLockTime, fl);
1784
1785 case SPI_SETMOUSECLICKLOCKTIME:
1787
1788 case SPI_GETFONTSMOOTHINGTYPE:
1789 return SpiGetInt(pvParam, &gspv.uiFontSmoothingType, fl);
1790
1791 case SPI_SETFONTSMOOTHINGTYPE:
1793
1794 case SPI_GETFONTSMOOTHINGCONTRAST:
1795 return SpiGetInt(pvParam, &gspv.uiFontSmoothingContrast, fl);
1796
1797 case SPI_SETFONTSMOOTHINGCONTRAST:
1799
1800 case SPI_GETFOCUSBORDERWIDTH:
1801 return SpiGetInt(pvParam, &gspv.uiFocusBorderWidth, fl);
1802
1803 case SPI_SETFOCUSBORDERWIDTH:
1804 return SpiSetInt(&gspv.uiFocusBorderWidth, uiParam, KEY_MOUSE, L"", fl);
1805
1806 case SPI_GETFOCUSBORDERHEIGHT:
1807 return SpiGetInt(pvParam, &gspv.uiFocusBorderHeight, fl);
1808
1809 case SPI_SETFOCUSBORDERHEIGHT:
1810 return SpiSetInt(&gspv.uiFocusBorderHeight, uiParam, KEY_MOUSE, L"", fl);
1811
1812 case SPI_GETFONTSMOOTHINGORIENTATION:
1813 return SpiGetInt(pvParam, &gspv.uiFontSmoothingOrientation, fl);
1814
1815 case SPI_SETFONTSMOOTHINGORIENTATION:
1817
1818 case SPI_GETWINARRANGING:
1819 return SpiGetInt(pvParam, &g_bWindowSnapEnabled, fl);
1820 case SPI_SETWINARRANGING:
1822
1823 case SPI_GETDOCKMOVING:
1824 return SpiGetInt(pvParam, &gspv.bDockMoving, fl);
1825 case SPI_SETDOCKMOVING:
1827
1828 /* The following are undocumented, but valid SPI values */
1829 case 0x1010:
1830 case 0x1011:
1831 case 0x1028:
1832 case 0x1029:
1833 case 0x102A:
1834 case 0x102B:
1835 case 0x102C:
1836 case 0x102D:
1837 case 0x102E:
1838 case 0x102F:
1839 case 0x1030:
1840 case 0x1031:
1841 case 0x1032:
1842 case 0x1033:
1843 case 0x1034:
1844 case 0x1035:
1845 case 0x1036:
1846 case 0x1037:
1847 case 0x1038:
1848 case 0x1039:
1849 case 0x103A:
1850 case 0x103B:
1851 case 0x103C:
1852 case 0x103D:
1853 ERR("Undocumented SPI value %x is unimplemented\n", uiAction);
1854 break;
1855
1856 default:
1857 ERR("Invalid SPI value: %u\n", uiAction);
1859 return 0;
1860 }
1861
1862 return 0;
1863}
1864
1865static BOOL
1866SpiGetSetProbeBuffer(UINT uiAction, UINT uiParam, PVOID pvParam)
1867{
1868 BOOL bToUser = TRUE;
1869 ULONG cbSize = 0;
1870
1871 switch (uiAction)
1872 {
1873 case SPI_GETBEEP:
1874 case SPI_GETBORDER:
1883 case SPI_GETDRAGFULLWINDOWS:
1884 case SPI_GETSHOWSOUNDS:
1885 case SPI_GETKEYBOARDPREF:
1886 case SPI_GETSCREENREADER:
1887 case SPI_GETFONTSMOOTHING:
1888 case SPI_GETLOWPOWERTIMEOUT:
1889 case SPI_GETPOWEROFFTIMEOUT:
1890 case SPI_GETLOWPOWERACTIVE:
1891 case SPI_GETPOWEROFFACTIVE:
1892 case SPI_GETMOUSETRAILS:
1893 case SPI_GETSNAPTODEFBUTTON:
1894 case SPI_GETMOUSEHOVERWIDTH:
1895 case SPI_GETMOUSEHOVERHEIGHT:
1896 case SPI_GETMOUSEHOVERTIME:
1897 case SPI_GETWHEELSCROLLLINES:
1898 case SPI_GETMENUSHOWDELAY:
1899#if (_WIN32_WINNT >= 0x0600)
1901#endif
1902 case SPI_GETSHOWIMEUI:
1903 case SPI_GETMOUSESPEED:
1904 case SPI_GETSCREENSAVERRUNNING:
1905#if(WINVER >= 0x0600)
1906 case SPI_GETSCREENSAVESECURE:
1907#endif
1908 case SPI_GETACTIVEWINDOWTRACKING:
1909 case SPI_GETMENUANIMATION:
1910 case SPI_GETCOMBOBOXANIMATION:
1911 case SPI_GETLISTBOXSMOOTHSCROLLING:
1912 case SPI_GETGRADIENTCAPTIONS:
1913 case SPI_GETKEYBOARDCUES:
1914 case SPI_GETACTIVEWNDTRKZORDER:
1915 case SPI_GETHOTTRACKING:
1916 case SPI_GETMENUFADE:
1917 case SPI_GETSELECTIONFADE:
1918 case SPI_GETTOOLTIPANIMATION:
1919 case SPI_GETTOOLTIPFADE:
1920 case SPI_GETCURSORSHADOW:
1921 case SPI_GETUIEFFECTS:
1922 case SPI_GETMOUSESONAR:
1923 case SPI_GETMOUSECLICKLOCK:
1924 case SPI_GETMOUSEVANISH:
1925 case SPI_GETFLATMENU:
1926 case SPI_GETDROPSHADOW:
1927 case SPI_GETBLOCKSENDINPUTRESETS:
1928#if(_WIN32_WINNT >= 0x0600)
1929 case SPI_GETDISABLEOVERLAPPEDCONTENT:
1930 case SPI_GETCLIENTAREAANIMATION:
1931 case SPI_GETCLEARTYPE:
1932 case SPI_GETSPEECHRECOGNITION:
1933#endif
1934 case SPI_GETFOREGROUNDLOCKTIMEOUT:
1935 case SPI_GETACTIVEWNDTRKTIMEOUT:
1936 case SPI_GETFOREGROUNDFLASHCOUNT:
1937 case SPI_GETCARETWIDTH:
1938 case SPI_GETMOUSECLICKLOCKTIME:
1939 case SPI_GETFONTSMOOTHINGTYPE:
1940 case SPI_GETFONTSMOOTHINGCONTRAST:
1941 case SPI_GETFOCUSBORDERWIDTH:
1942 case SPI_GETFOCUSBORDERHEIGHT:
1943 case SPI_GETFONTSMOOTHINGORIENTATION:
1944 cbSize = sizeof(INT);
1945 break;
1946
1949 if (pvParam) cbSize = sizeof(INT);
1950 break;
1951
1952 case SPI_GETMOUSE:
1953 cbSize = 3 * sizeof(INT);
1954 break;
1955
1956 case SPI_GETDESKWALLPAPER:
1957 cbSize = min(uiParam, gspv.ustrWallpaper.Length + 1UL);
1958 break;
1959
1961 cbSize = sizeof(LOGFONTW);
1962 break;
1963
1964 case SPI_GETNONCLIENTMETRICS:
1965 cbSize = sizeof(NONCLIENTMETRICSW);
1966 break;
1967
1968 case SPI_GETMINIMIZEDMETRICS:
1969 cbSize = sizeof(MINIMIZEDMETRICS);
1970 break;
1971
1972 case SPI_GETICONMETRICS:
1973 cbSize = sizeof(ICONMETRICSW);
1974 break;
1975
1976 case SPI_GETWORKAREA:
1977 cbSize = sizeof(RECTL);
1978 break;
1979
1980 case SPI_GETFILTERKEYS:
1981 cbSize = sizeof(FILTERKEYS);
1982 break;
1983
1984 case SPI_GETTOGGLEKEYS:
1985 cbSize = sizeof(TOGGLEKEYS);
1986 break;
1987
1988 case SPI_GETMOUSEKEYS:
1989 cbSize = sizeof(MOUSEKEYS);
1990 break;
1991
1992 case SPI_GETSTICKYKEYS:
1993 cbSize = sizeof(STICKYKEYS);
1994 break;
1995
1997 cbSize = sizeof(ACCESSTIMEOUT);
1998 break;
1999
2000 case SPI_GETSERIALKEYS:
2001 cbSize = sizeof(SERIALKEYS);
2002 break;
2003
2004 case SPI_GETSOUNDSENTRY:
2005 cbSize = sizeof(SOUNDSENTRYW);
2006 break;
2007
2008 case SPI_GETHIGHCONTRAST:
2009 cbSize = sizeof(HIGHCONTRASTW);
2010 break;
2011
2012 case SPI_GETANIMATION:
2013 cbSize = sizeof(ANIMATIONINFO);
2014 break;
2015
2016 case SPI_GETDEFAULTINPUTLANG:
2017 cbSize = sizeof(HKL);
2018 break;
2019
2020#if(WINVER >= 0x0600)
2021 case SPI_GETAUDIODESCRIPTION:
2022 cbSize = sizeof(AUDIODESCRIPTION);
2023 break;
2024#endif
2025
2026 case SPI_SETMOUSE:
2027 cbSize = 3 * sizeof(INT);
2028 bToUser = FALSE;
2029 break;
2030
2032 cbSize = sizeof(LOGFONTW);
2033 bToUser = FALSE;
2034 break;
2035
2036 case SPI_SETNONCLIENTMETRICS:
2037 cbSize = sizeof(NONCLIENTMETRICSW);
2038 bToUser = FALSE;
2039 break;
2040
2041 case SPI_SETMINIMIZEDMETRICS:
2042 cbSize = sizeof(MINIMIZEDMETRICS);
2043 bToUser = FALSE;
2044 break;
2045
2046 case SPI_SETICONMETRICS:
2047 cbSize = sizeof(ICONMETRICSW);
2048 bToUser = FALSE;
2049 break;
2050
2051 case SPI_SETWORKAREA:
2052 cbSize = sizeof(RECTL);
2053 bToUser = FALSE;
2054 break;
2055
2056 case SPI_SETFILTERKEYS:
2057 cbSize = sizeof(FILTERKEYS);
2058 bToUser = FALSE;
2059 break;
2060
2061 case SPI_SETTOGGLEKEYS:
2062 cbSize = sizeof(TOGGLEKEYS);
2063 bToUser = FALSE;
2064 break;
2065
2066 case SPI_SETMOUSEKEYS:
2067 cbSize = sizeof(MOUSEKEYS);
2068 bToUser = FALSE;
2069 break;
2070
2071 case SPI_SETSTICKYKEYS:
2072 cbSize = sizeof(STICKYKEYS);
2073 bToUser = FALSE;
2074 break;
2075
2077 cbSize = sizeof(ACCESSTIMEOUT);
2078 bToUser = FALSE;
2079 break;
2080
2081 case SPI_SETSERIALKEYS:
2082 cbSize = sizeof(SERIALKEYS);
2083 bToUser = FALSE;
2084 break;
2085
2086 case SPI_SETSOUNDSENTRY:
2087 cbSize = sizeof(SOUNDSENTRYW);
2088 bToUser = FALSE;
2089 break;
2090
2091 case SPI_SETHIGHCONTRAST:
2092 cbSize = sizeof(HIGHCONTRASTW);
2093 bToUser = FALSE;
2094 break;
2095
2096 case SPI_SETANIMATION:
2097 cbSize = sizeof(ANIMATIONINFO);
2098 bToUser = FALSE;
2099 break;
2100
2101 case SPI_SETDEFAULTINPUTLANG:
2102 cbSize = sizeof(HKL);
2103 bToUser = FALSE;
2104 break;
2105
2106 case SPI_SETMOUSESPEED:
2107 cbSize = sizeof(INT);
2108 bToUser = FALSE;
2109 break;
2110 }
2111
2112 if (cbSize)
2113 {
2114 _SEH2_TRY
2115 {
2116 if (bToUser)
2117 {
2118 ProbeForWrite(pvParam, cbSize, sizeof(UCHAR));
2119 }
2120 else
2121 {
2122 ProbeForRead(pvParam, cbSize, sizeof(UCHAR));
2123 }
2124 }
2126 {
2127 _SEH2_YIELD(return FALSE);
2128 }
2129 _SEH2_END;
2130 }
2131
2132 return TRUE;
2133}
2134
2135BOOL
2138 UINT uiAction,
2139 UINT uiParam,
2140 PVOID pvParam,
2141 UINT fWinIni)
2142{
2143 ULONG_PTR ulResult;
2145
2146 ASSERT(ppi);
2147
2148 if (!gbSpiInitialized)
2149 {
2151 //ASSERT(FALSE);
2152 return FALSE;
2153 }
2154
2155 /* Get a pointer to the current Windowstation */
2156 if (!ppi->prpwinsta)
2157 {
2158 ERR("UserSystemParametersInfo called without active window station.\n");
2159 //ASSERT(FALSE);
2160 //return FALSE;
2161 }
2162
2163 if ((fWinIni & SPIF_PROTECT) && !SpiGetSetProbeBuffer(uiAction, uiParam, pvParam))
2164 {
2166 return FALSE;
2167 }
2168
2169 /* Do the actual operation */
2170 ulResult = SpiGetSet(uiAction, uiParam, pvParam, fWinIni);
2171
2172 /* Did we change something? */
2173 if (ulResult > 1)
2174 {
2176
2177 /* Update system metrics */
2178 InitMetrics();
2179
2180 /* Send notification to toplevel windows, if requested */
2181 if (fWinIni & SPIF_SENDCHANGE)
2182 {
2183 /* Send WM_SETTINGCHANGE to all toplevel windows */
2186 (WPARAM)uiAction,
2187 (LPARAM)ulResult,
2189 100,
2190 &ulResult);
2191 }
2192 ulResult = 1;
2193 }
2194
2195 return ulResult;
2196}
2197
2198BOOL
2201 UINT uiAction,
2202 UINT uiParam,
2203 PVOID pvParam,
2204 UINT fWinIni)
2205{
2206 BOOL bResult;
2207
2208 TRACE("Enter NtUserSystemParametersInfo(%u)\n", uiAction);
2210
2211 // FIXME: Get rid of the flags and only use this from um. kernel can access data directly.
2212 /* Set UM memory protection flag */
2213 fWinIni |= SPIF_PROTECT;
2214
2215 /* Call internal function */
2216 bResult = UserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
2217
2218 TRACE("Leave NtUserSystemParametersInfo, returning %d\n", bResult);
2219 UserLeave();
2220
2221 return bResult;
2222}
2223
2224/* EOF */
@ UPM_TOOLTIPANIMATION
@ UPM_COMBOBOXANIMATION
@ UPM_ACTIVEWINDOWTRACKING
@ UPM_GRADIENTCAPTIONS
@ UPM_LISTBOXSMOOTHSCROLLING
@ UPM_ACTIVEWNDTRKZORDER
#define REG_SZ
Definition: layer.c:22
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
static HBITMAP hBitmap
Definition: timezone.c:26
#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:2140
_ACRTIMP int __cdecl _wtoi(const wchar_t *)
Definition: wcs.c:2778
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
#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:24
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
unsigned int UINT
Definition: sysinfo.c:13
PSERVERINFO gpsi
Definition: imm.c:18
#define SRVINFO_KBDPREF
Definition: ntuser.h:956
#define PUSIF_COMBOBOXANIMATION
Definition: ntuser.h:999
#define PUSIF_KEYBOARDCUES
Definition: ntuser.h:1001
BOOL NTAPI NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags)
Definition: painting.c:2002
#define PUSIF_LISTBOXSMOOTHSCROLLING
Definition: ntuser.h:1000
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define RtlEqualMemory(dst, src, len)
Definition: kdvm.h:18
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
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define _In_
Definition: no_sal2.h:158
#define REG_BINARY
Definition: nt_native.h:1499
#define FASTCALL
Definition: nt_native.h:50
unsigned long FLONG
Definition: ntbasedef.h:378
#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:1213
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:255
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:44
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:28
short WCHAR
Definition: pedump.c:58
#define INT
Definition: polytest.cpp:20
__kernel_entry W32KAPI INT APIENTRY NtGdiGetDeviceCaps(_In_ HDC hdc, _In_ INT i)
_In_ DWORD _In_ DWORD cbBufSize
Definition: winsvc.h:430
#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:5890
#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:5890
#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
#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
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
RECT rcWork
Definition: monitor.h:19
RECT rcMonitor
Definition: monitor.h:18
struct _WINSTATION_OBJECT * prpwinsta
Definition: win32.h:268
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:698
RECT rcWindow
Definition: ntuser.h:720
HKL hkl
Definition: input.h:33
DWORD iMaxSpeed
Definition: winuser.h:3521
DWORD iTimeToMaxSpeed
Definition: winuser.h:3522
UINT cbSize
Definition: winuser.h:3519
DWORD dwFlags
Definition: winuser.h:3520
DWORD iCtrlSpeed
Definition: winuser.h:3523
DWORD dwSRVIFlags
Definition: ntuser.h:1055
DWORD cbSize
Definition: winuser.h:3637
LONG tmAveCharWidth
Definition: wingdi.h:2834
LONG tmExternalLeading
Definition: wingdi.h:2833
LONG tmHeight
Definition: wingdi.h:2829
DWORD cbSize
Definition: winuser.h:3642
#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
const uint16_t * LPCWSTR
Definition: typedefs.h:57
unsigned char UCHAR
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
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:123
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3684
_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:30
#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:1261
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
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:52
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1413
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:83
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:837
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:1866
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
HBITMAP IntStretchWallpaper(_In_ PWND pwndDesktop, _In_ HBITMAP hBitmap)
Definition: desktop.c:1988
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:801
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:653
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:2137
BOOL APIENTRY NtUserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2200
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:275
_In_ FLONG fl
Definition: winddi.h:1279
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
_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
_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
#define SPI_SETWHEELSCROLLLINES
Definition: zmouse.h:30