1 /* Unit test suite for functions SystemParametersInfo and GetSystemMetrics.
3 * Copyright 2002 Andriy Palamarchuk
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */
27 #define _WIN32_IE 0x0700
29 #include "wine/test.h"
37 #ifndef SPI_GETDESKWALLPAPER
38 # define SPI_GETDESKWALLPAPER 0x0073
41 static LONG (WINAPI *pChangeDisplaySettingsExA)(LPCSTR, LPDEVMODEA, HWND, DWORD, LPVOID);
48 #define eq(received, expected, label, type) \
49 ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
52 #define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
53 #define SPI_SETBEEP_VALNAME "Beep"
54 #define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
55 #define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
56 #define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
57 #define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
58 #define SPI_SETBORDER_REGKEY "Control Panel\\Desktop\\WindowMetrics"
59 #define SPI_SETBORDER_REGKEY2 "Control Panel\\Desktop"
60 #define SPI_SETBORDER_VALNAME "BorderWidth"
61 #define SPI_METRIC_REGKEY "Control Panel\\Desktop\\WindowMetrics"
62 #define SPI_SCROLLWIDTH_VALNAME "ScrollWidth"
63 #define SPI_SCROLLHEIGHT_VALNAME "ScrollHeight"
64 #define SPI_CAPTIONWIDTH_VALNAME "CaptionWidth"
65 #define SPI_CAPTIONHEIGHT_VALNAME "CaptionHeight"
66 #define SPI_CAPTIONFONT_VALNAME "CaptionFont"
67 #define SPI_SMCAPTIONWIDTH_VALNAME "SmCaptionWidth"
68 #define SPI_SMCAPTIONHEIGHT_VALNAME "SmCaptionHeight"
69 #define SPI_SMCAPTIONFONT_VALNAME "SmCaptionFont"
70 #define SPI_MENUWIDTH_VALNAME "MenuWidth"
71 #define SPI_MENUHEIGHT_VALNAME "MenuHeight"
72 #define SPI_MENUFONT_VALNAME "MenuFont"
73 #define SPI_STATUSFONT_VALNAME "StatusFont"
74 #define SPI_MESSAGEFONT_VALNAME "MessageFont"
76 #define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
77 #define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
78 #define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
79 #define SPI_ICONHORIZONTALSPACING_REGKEY2 "Control Panel\\Desktop"
80 #define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
81 #define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
82 #define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
83 #define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
84 #define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
85 #define SPI_MINWIDTH_VALNAME "MinWidth"
86 #define SPI_MINHORZGAP_VALNAME "MinHorzGap"
87 #define SPI_MINVERTGAP_VALNAME "MinVertGap"
88 #define SPI_MINARRANGE_VALNAME "MinArrange"
89 #define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
90 #define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
91 #define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
92 #define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
93 #define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
94 #define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
95 #define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
96 #define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
97 #define SPI_SETICONTITLEWRAP_REGKEY1 "Control Panel\\Desktop\\WindowMetrics"
98 #define SPI_SETICONTITLEWRAP_REGKEY2 "Control Panel\\Desktop"
99 #define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
100 #define SPI_SETMENUDROPALIGNMENT_REGKEY1 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
101 #define SPI_SETMENUDROPALIGNMENT_REGKEY2 "Control Panel\\Desktop"
102 #define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
103 #define SPI_SETDOUBLECLKWIDTH_REGKEY1 "Control Panel\\Mouse"
104 #define SPI_SETDOUBLECLKWIDTH_REGKEY2 "Control Panel\\Desktop"
105 #define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
106 #define SPI_SETDOUBLECLKHEIGHT_REGKEY1 "Control Panel\\Mouse"
107 #define SPI_SETDOUBLECLKHEIGHT_REGKEY2 "Control Panel\\Desktop"
108 #define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
109 #define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
110 #define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
111 #define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
112 #define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
113 #define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
114 #define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
115 #define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
116 #define SPI_SETSHOWSOUNDS_VALNAME "On"
117 #define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Accessibility\\Keyboard Preference"
118 #define SPI_SETKEYBOARDPREF_VALNAME "On"
119 #define SPI_SETKEYBOARDPREF_REGKEY_LEGACY "Control Panel\\Accessibility"
120 #define SPI_SETKEYBOARDPREF_VALNAME_LEGACY "Keyboard Preference"
121 #define SPI_SETSCREENREADER_REGKEY "Control Panel\\Accessibility\\Blind Access"
122 #define SPI_SETSCREENREADER_VALNAME "On"
123 #define SPI_SETSCREENREADER_REGKEY_LEGACY "Control Panel\\Accessibility"
124 #define SPI_SETSCREENREADER_VALNAME_LEGACY "Blind Access"
125 #define SPI_SETFONTSMOOTHING_REGKEY "Control Panel\\Desktop"
126 #define SPI_SETFONTSMOOTHING_VALNAME "FontSmoothing"
127 #define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
128 #define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
129 #define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
130 #define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
131 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
132 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
133 #define SPI_SETSNAPTODEFBUTTON_REGKEY "Control Panel\\Mouse"
134 #define SPI_SETSNAPTODEFBUTTON_VALNAME "SnapToDefaultButton"
135 #define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
136 #define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
137 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
138 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
139 #define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
140 #define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
141 #define SPI_SETMOUSESCROLLCHARS_REGKEY "Control Panel\\Desktop"
142 #define SPI_SETMOUSESCROLLCHARS_VALNAME "WheelScrollChars"
143 #define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
144 #define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
145 #define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
146 #define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
147 #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
148 #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
150 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
151 #define WINE_CURRENT_USER_REGKEY "Wine"
153 static HWND ghTestWnd;
155 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
156 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
158 static int change_counter;
159 static int change_last_param;
161 static BOOL displaychange_ok = FALSE, displaychange_test_active = FALSE;
162 static HANDLE displaychange_sem = 0;
164 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
169 case WM_DISPLAYCHANGE:
170 ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
172 displaychange_ok = FALSE;
173 ReleaseSemaphore(displaychange_sem, 1, 0);
176 case WM_SETTINGCHANGE:
177 if (change_counter>0) {
178 /* ignore these messages caused by resizing of toolbars */
179 if( wParam == SPI_SETWORKAREA ||
180 wParam == SPI_ICONVERTICALSPACING ||
181 displaychange_test_active)
183 if( change_last_param == SPI_SETWORKAREA ||
184 change_last_param == SPI_ICONVERTICALSPACING)
186 change_last_param = wParam;
189 ok(0,"too many changes counter=%d last change=%d\n",
190 change_counter,change_last_param);
193 change_last_param = wParam;
197 PostQuitMessage( 0 );
202 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
209 Performs testing for system parameters messages
211 - system parameter id
212 - supposed value of the registry key
214 static void test_change_message( int action, int optional )
216 if (change_counter==0 && optional==1)
218 ok( 1 == change_counter,
219 "Missed a message: change_counter=%d\n", change_counter );
221 ok( action == change_last_param,
222 "Wrong action got %d expected %d\n", change_last_param, action );
223 change_last_param = 0;
226 static BOOL test_error_msg ( int rc, const char *name )
228 DWORD last_error = GetLastError();
232 if (last_error==0xdeadbeef || last_error==ERROR_INVALID_SPI_VALUE || last_error==ERROR_INVALID_PARAMETER)
234 trace("%s not supported on this platform. Skipping test\n", name);
236 else if (last_error==ERROR_ACCESS_DENIED)
238 trace("%s does not have privileges to run. Skipping test\n", name);
242 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name,last_error);
243 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
249 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
255 * Tests the HKEY_CURRENT_USER subkey value.
256 * The value should contain string value.
259 * lpsSubKey - subkey name
260 * lpsRegName - registry entry name
261 * lpsTestValue - value to test
263 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2, LPCSTR testValue )
265 CHAR value[MAX_PATH];
273 valueLen=sizeof(value);
274 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
275 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
277 if (rc==ERROR_SUCCESS)
279 ok( !strcmp( testValue, value ),
280 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
281 subKey1, valName1, testValue, value );
286 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
292 valueLen=sizeof(value);
293 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
294 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
296 if (rc==ERROR_SUCCESS)
298 ok( !strcmp( testValue, value ),
299 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
300 subKey1, valName2, testValue, value );
305 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
309 if (subKey2 && !strict)
312 valueLen=sizeof(value);
313 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
314 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
316 if (rc==ERROR_SUCCESS)
318 ok( !strcmp( testValue, value ),
319 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
320 subKey2, valName1, testValue, value );
325 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
331 valueLen=sizeof(value);
332 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
333 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
335 if (rc==ERROR_SUCCESS)
337 ok( !strcmp( testValue, value ),
338 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
339 subKey2, valName2, testValue, value );
344 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
349 ok(found,"Missing registry values: %s or %s in keys: %s or %s\n",
350 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
353 #define test_reg_key( subKey, valName, testValue ) \
354 _test_reg_key( subKey, NULL, valName, NULL, testValue )
355 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
356 _test_reg_key( subKey1, subKey2, valName, NULL, testValue )
357 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
358 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue )
360 /* get a metric from the registry. If the value is negative
361 * it is assumed to be in twips and converted to pixels */
362 static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
370 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
372 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
374 if( ret != ERROR_SUCCESS) return -1;
377 value = ( -value * dpi + 720) / 1440;
393 BYTE lfClipPrecision;
395 BYTE lfPitchAndFamily;
396 CHAR lfFaceName[LF_FACESIZE];
397 } LOGFONT16, *LPLOGFONT16;
399 /* get logfont from the registry */
400 static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
404 DWORD ret, size, type;
406 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
408 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
410 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
411 if( ret != ERROR_SUCCESS)
413 if( size <= sizeof( LOGFONT16)) {
414 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
415 plf->lfHeight = plf16->lfHeight;
416 plf->lfWidth = plf16->lfWidth;
417 plf->lfEscapement = plf16->lfEscapement;
418 plf->lfOrientation = plf16->lfOrientation;
419 plf->lfWeight = plf16->lfWeight;
420 plf->lfItalic = plf16->lfItalic;
421 plf->lfUnderline = plf16->lfUnderline;
422 plf->lfStrikeOut = plf16->lfStrikeOut;
423 plf->lfCharSet = plf16->lfCharSet;
424 plf->lfOutPrecision = plf16->lfOutPrecision;
425 plf->lfClipPrecision = plf16->lfClipPrecision;
426 plf->lfQuality = plf16->lfQuality;
427 plf->lfPitchAndFamily = plf16->lfPitchAndFamily;
428 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
429 } else if( size <= sizeof( LOGFONTA)) {
430 plf = (LOGFONTA*) &lfw;
432 plf->lfHeight = lfw.lfHeight;
433 plf->lfWidth = lfw.lfWidth;
434 plf->lfEscapement = lfw.lfEscapement;
435 plf->lfOrientation = lfw.lfOrientation;
436 plf->lfWeight = lfw.lfWeight;
437 plf->lfItalic = lfw.lfItalic;
438 plf->lfUnderline = lfw.lfUnderline;
439 plf->lfStrikeOut = lfw.lfStrikeOut;
440 plf->lfCharSet = lfw.lfCharSet;
441 plf->lfOutPrecision = lfw.lfOutPrecision;
442 plf->lfClipPrecision = lfw.lfClipPrecision;
443 plf->lfQuality = lfw.lfQuality;
444 plf->lfPitchAndFamily = lfw.lfPitchAndFamily;
445 WideCharToMultiByte( CP_ACP, 0, lfw.lfFaceName, -1, plf->lfFaceName,
446 LF_FACESIZE, NULL, NULL);
452 static void test_SPI_SETBEEP( void ) /* 2 */
459 trace("testing SPI_{GET,SET}BEEP\n");
460 SetLastError(0xdeadbeef);
461 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
462 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
466 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
467 if (!test_error_msg(rc,"SPI_SETBEEP")) return;
468 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
469 test_change_message( SPI_SETBEEP, 0 );
470 test_reg_key( SPI_SETBEEP_REGKEY,
472 curr_val ? "Yes" : "No" );
473 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
474 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
475 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
476 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
477 if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
479 ok(rc!=0,"SystemParametersInfoW: rc=%d err=%d\n",rc,GetLastError());
480 eq( b, curr_val, "SystemParametersInfoW", "%d" );
483 /* is a message sent for the second change? */
484 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
485 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
486 test_change_message( SPI_SETBEEP, 0 );
489 rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
490 if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
491 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
492 ok(rc!=0,"SystemParametersInfo: rc=%d err=%d\n",rc,GetLastError());
493 test_change_message( SPI_SETBEEP, 0 );
494 test_reg_key( SPI_SETBEEP_REGKEY,
496 curr_val ? "Yes" : "No" );
497 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
498 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
499 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
500 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
501 if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
503 ok(rc!=0,"SystemParametersInfoW: rc=%d err=%d\n",rc,GetLastError());
504 eq( b, curr_val, "SystemParametersInfoW", "%d" );
506 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
508 rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
509 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
512 static const char *setmouse_valuenames[3] = {
513 SPI_SETMOUSE_VALNAME1,
514 SPI_SETMOUSE_VALNAME2,
515 SPI_SETMOUSE_VALNAME3
519 * Runs check for one setting of spi_setmouse.
521 static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange )
525 static int aw_turn = 0;
526 static BOOL w_implemented = 1;
533 if ((aw_turn % 2!=0) && (w_implemented))
535 /* call unicode on odd (non even) calls */
536 SetLastError(0xdeadbeef);
537 rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
538 if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
541 trace("SystemParametersInfoW not supported on this platform\n");
545 if ((aw_turn % 2==0) || (!w_implemented))
547 /* call ascii version on even calls or if unicode is not available */
548 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
550 if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE;
552 ok(rc!=0,"SystemParametersInfo: rc=%d err=%d\n",rc,GetLastError());
553 test_change_message( SPI_SETMOUSE, 0 );
554 for (i = 0; i < 3; i++)
556 sprintf( buf, "%d", curr_val[i] );
557 test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
560 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
561 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
562 for (i = 0; i < 3; i++)
564 ok(mi[i] == curr_val[i],
565 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
570 rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
571 ok(rc!=0,"SystemParametersInfoW: rc=%d err=%d\n",rc,GetLastError());
572 for (i = 0; i < 3; i++)
574 ok(mi[i] == curr_val[i],
575 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
581 /* FIXME: this always fails for me - AJ */
582 for (i = 0; i < nchange; i++)
585 mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
586 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
588 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
589 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
595 static void test_SPI_SETMOUSE( void ) /* 4 */
600 /* win nt default values - 6, 10, 1 */
601 INT curr_val[3] = {6, 10, 1};
603 /* requested and projected mouse movements */
604 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
605 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
606 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
607 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
608 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
609 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
610 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
611 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
612 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
614 int nchange = sizeof( req_change ) / sizeof( POINT );
616 trace("testing SPI_{GET,SET}MOUSE\n");
617 SetLastError(0xdeadbeef);
618 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
619 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
622 if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return;
624 /* acceleration change */
626 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
628 /* acceleration change */
630 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
632 /* acceleration change */
634 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
636 /* threshold change */
639 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
641 /* threshold change */
645 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
647 /* threshold change */
649 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
651 /* threshold change */
653 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
655 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
656 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
659 static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
664 NONCLIENTMETRICSA ncm;
666 ncm.cbSize = sizeof( ncm);
667 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
668 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
670 rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
671 if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE;
672 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
673 test_change_message( SPI_SETBORDER, 1 );
674 } else { /* set non client metrics */
675 ncm.iBorderWidth = curr_val;
676 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
678 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE;
679 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
680 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
682 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
683 regval = metricfromreg( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_VALNAME, dpi);
684 if( regval != curr_val)
685 regval = metricfromreg( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, dpi);
686 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
688 /* minimum border width is 1 */
689 if (curr_val == 0) curr_val = 1;
690 /* should be the same as the non client metrics */
691 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
692 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
693 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
694 /* and from SPI_GETBORDER */
695 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
696 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
697 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
698 /* test some SystemMetrics */
699 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
700 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
701 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
702 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
703 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
707 static void test_SPI_SETBORDER( void ) /* 6 */
711 NONCLIENTMETRICSA ncmsave;
714 ncmsave.cbSize = sizeof( ncmsave);
715 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
716 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
717 /* CaptionWidth from the registry may have different value of iCaptionWidth
718 * from the non client metrics (observed on WinXP).
719 * Fix this so we can safely restore settings with the nonclientmetrics */
720 CaptionWidth = metricfromreg(
721 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
722 ncmsave.iCaptionWidth = CaptionWidth;
724 /* These tests hang when XFree86 4.0 for Windows is running (tested on
725 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
728 if (FindWindowA( NULL, "Cygwin/XFree86" ))
731 trace("testing SPI_{GET,SET}BORDER\n");
733 SetLastError(0xdeadbeef);
734 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
735 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
737 /* FIXME: include new PaddedBorderWidth parameter */
738 if( old_border != ncmsave.iBorderWidth){
739 win_skip( "Can not reliable restore border width yet\n");
742 /* This will restore sane values if the test hang previous run. */
743 if ( old_border == 7 || old_border == 20 )
746 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
747 * do it twice to make the intended change). So skip parts of the tests on
750 /* win2k3 fails if you set the same border twice, or if size is 0 */
751 if (!test_setborder(2, 1, dpi)) return;
752 test_setborder(1, 1, dpi);
753 test_setborder(3, 1, dpi);
755 if (!test_setborder(1, 0, dpi)) return;
756 test_setborder(0, 0, dpi);
757 test_setborder(3, 0, dpi);
759 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
760 SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);
761 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
762 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",
766 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
770 const UINT vals[]={0,20,31};
773 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
774 SetLastError(0xdeadbeef);
775 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
776 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
779 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
784 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
785 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
786 if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return;
787 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
788 test_change_message( SPI_SETKEYBOARDSPEED, 0 );
789 sprintf( buf, "%d", vals[i] );
790 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
792 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
793 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
794 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
797 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
798 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
801 /* test_SPI_ICONHORIZONTALSPACING helper */
802 static BOOL dotest_spi_iconhorizontalspacing( INT curr_val)
808 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
809 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
810 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE;
811 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
812 test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
813 if( curr_val < 32) curr_val = 32;
814 /* The registry keys depend on the Windows version and the values too
815 * let's test (works on win95,ME,NT4,2k,XP)
817 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
818 if( regval != curr_val)
819 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
820 ok( curr_val == regval,
821 "wrong value in registry %d, expected %d\n", regval, curr_val);
822 /* compare with what SPI_ICONHORIZONTALSPACING returns */
823 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
824 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
825 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
826 /* and with a system metrics */
827 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
828 /* and with what SPI_GETICONMETRICS returns */
829 im.cbSize = sizeof(ICONMETRICSA);
830 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
831 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
832 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
836 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
841 trace("testing SPI_ICONHORIZONTALSPACING\n");
842 SetLastError(0xdeadbeef);
843 /* default value: 75 */
844 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
845 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
847 /* do not increase the value as it would upset the user's icon layout */
848 if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return;
849 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
851 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
852 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
855 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
859 const UINT vals[]={0,32767};
862 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
863 SetLastError(0xdeadbeef);
864 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
865 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
868 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
873 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
874 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
875 if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return;
876 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
877 test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
878 sprintf( buf, "%d", vals[i] );
879 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
880 SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
882 SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
883 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
884 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
887 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
888 SPIF_UPDATEINIFILE );
889 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
892 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
896 const UINT vals[]={TRUE,FALSE};
899 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
900 SetLastError(0xdeadbeef);
901 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
902 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
905 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
909 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
910 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
911 if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return;
912 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
913 test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
914 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
915 SPI_SETSCREENSAVEACTIVE_VALNAME,
916 vals[i] ? "1" : "0" );
918 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
919 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
920 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVEACTIVE", "%d" );
923 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
924 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
927 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
932 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
936 const UINT vals[]={0,3};
939 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
940 SetLastError(0xdeadbeef);
941 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
942 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
945 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
950 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
951 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
952 if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return;
953 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
954 test_change_message( SPI_SETKEYBOARDDELAY, 0 );
955 sprintf( buf, "%d", vals[i] );
956 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
957 SPI_SETKEYBOARDDELAY_VALNAME, buf );
959 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
960 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
961 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
964 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
965 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
969 /* test_SPI_ICONVERTICALSPACING helper */
970 static BOOL dotest_spi_iconverticalspacing( INT curr_val)
976 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
977 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
978 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE;
979 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
980 test_change_message( SPI_ICONVERTICALSPACING, 0 );
981 if( curr_val < 32) curr_val = 32;
982 /* The registry keys depend on the Windows version and the values too
983 * let's test (works on win95,ME,NT4,2k,XP)
985 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2, SPI_ICONVERTICALSPACING_VALNAME, dpi);
986 if( regval != curr_val)
987 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
988 ok( curr_val == regval,
989 "wrong value in registry %d, expected %d\n", regval, curr_val);
990 /* compare with what SPI_ICONVERTICALSPACING returns */
991 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
992 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
993 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
994 /* and with a system metrics */
995 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
996 /* and with what SPI_GETICONMETRICS returns */
997 im.cbSize = sizeof(ICONMETRICSA);
998 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
999 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1000 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
1004 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1009 trace("testing SPI_ICONVERTICALSPACING\n");
1010 SetLastError(0xdeadbeef);
1011 /* default value: 75 */
1012 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
1013 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
1015 /* do not increase the value as it would upset the user's icon layout */
1016 if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return;
1017 /* same tests with a value less than the minimum 32 */
1018 dotest_spi_iconverticalspacing( 10);
1020 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
1021 SPIF_UPDATEINIFILE );
1022 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",
1026 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1030 const UINT vals[]={TRUE,FALSE};
1034 /* These tests hang when XFree86 4.0 for Windows is running (tested on
1035 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
1038 if (FindWindowA( NULL, "Cygwin/XFree86" ))
1041 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1042 SetLastError(0xdeadbeef);
1043 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1044 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1047 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1052 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
1053 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1054 if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return;
1055 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1056 test_change_message( SPI_SETICONTITLEWRAP, 1 );
1057 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
1058 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1059 if( regval != vals[i])
1060 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
1061 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1062 ok( regval == vals[i],
1063 "wrong value in registry %d, expected %d\n", regval, vals[i] );
1065 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
1066 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1067 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1068 /* and test with what SPI_GETICONMETRICS returns */
1069 im.cbSize = sizeof(ICONMETRICSA);
1070 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1071 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1072 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1075 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
1076 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1079 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1083 const UINT vals[]={TRUE,FALSE};
1086 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1087 SetLastError(0xdeadbeef);
1088 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
1089 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1092 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1096 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
1097 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1098 if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return;
1099 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1100 test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
1101 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
1102 SPI_SETMENUDROPALIGNMENT_REGKEY2,
1103 SPI_SETMENUDROPALIGNMENT_VALNAME,
1104 vals[i] ? "1" : "0" );
1106 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
1107 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1108 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1109 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1110 "SM_MENUDROPALIGNMENT", "%d" );
1113 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
1114 SPIF_UPDATEINIFILE );
1115 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1118 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1122 const UINT vals[]={0,10000};
1125 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1126 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1128 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1132 SetLastError(0xdeadbeef);
1133 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
1134 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1135 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1138 test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
1139 sprintf( buf, "%d", vals[i] );
1140 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
1141 SPI_SETDOUBLECLKWIDTH_REGKEY2,
1142 SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
1143 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1144 "SM_CXDOUBLECLK", "%d" );
1147 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
1148 SPIF_UPDATEINIFILE );
1149 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1152 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1156 const UINT vals[]={0,10000};
1159 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1160 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1162 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1166 SetLastError(0xdeadbeef);
1167 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
1168 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1169 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1172 test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
1173 sprintf( buf, "%d", vals[i] );
1174 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
1175 SPI_SETDOUBLECLKHEIGHT_REGKEY2,
1176 SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
1177 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1178 "SM_CYDOUBLECLK", "%d" );
1181 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
1182 SPIF_UPDATEINIFILE );
1183 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1186 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1194 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1195 old_time = GetDoubleClickTime();
1198 SetLastError(0xdeadbeef);
1199 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1200 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1201 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1204 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1205 sprintf( buf, "%d", curr_val );
1206 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1207 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1208 curr_val = 500; /* used value for 0 */
1209 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1212 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1213 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1214 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1215 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1216 sprintf( buf, "%d", curr_val );
1217 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1218 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1219 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1221 saved_val = curr_val;
1224 SetDoubleClickTime( curr_val );
1225 sprintf( buf, "%d", saved_val );
1226 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1227 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1228 curr_val = 500; /* used value for 0 */
1229 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1232 SetDoubleClickTime( curr_val );
1233 sprintf( buf, "%d", saved_val );
1234 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1235 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1236 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1238 rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
1239 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1242 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1246 const UINT vals[]={TRUE,FALSE};
1249 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1250 old_b = GetSystemMetrics( SM_SWAPBUTTON );
1252 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1254 SetLastError(0xdeadbeef);
1255 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
1256 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1257 if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) return;
1259 test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
1260 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
1261 SPI_SETMOUSEBUTTONSWAP_VALNAME,
1262 vals[i] ? "1" : "0" );
1263 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1264 "SM_SWAPBUTTON", "%d" );
1265 rc=SwapMouseButton((BOOL)vals[i^1]);
1266 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1267 "SwapMouseButton", "%d" );
1268 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1271 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
1272 SPIF_UPDATEINIFILE );
1273 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1276 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1281 trace("testing SPI_GETFASTTASKSWITCH\n");
1282 SetLastError(0xdeadbeef);
1283 rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
1284 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1287 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1288 * works. That sure simplifies testing!
1292 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1296 const UINT vals[]={TRUE,FALSE};
1299 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1300 SetLastError(0xdeadbeef);
1301 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1303 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1304 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1307 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1311 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1312 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1313 if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return;
1314 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1315 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1316 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
1317 SPI_SETDRAGFULLWINDOWS_VALNAME,
1318 vals[i] ? "1" : "0" );
1320 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1321 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1322 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1325 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1326 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1329 #define test_reg_metric( KEY, VAL, val) \
1331 regval = metricfromreg( KEY, VAL, dpi);\
1332 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1335 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1337 regval = metricfromreg( KEY1, VAL, dpi);\
1338 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1339 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1342 #define test_reg_font( KEY, VAL, LF) \
1344 lffromreg( KEY, VAL, &lfreg);\
1345 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == lfreg.lfHeight :\
1346 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1347 (LF).lfWidth == lfreg.lfWidth &&\
1348 (LF).lfWeight == lfreg.lfWeight &&\
1349 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1350 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1353 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1354 /*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1355 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1356 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1357 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1358 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1359 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1360 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1361 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1362 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1363 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1364 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1365 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1366 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1367 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1369 /* get text metric height value for the specified logfont */
1370 static int get_tmheight( LOGFONTA *plf, int flag)
1373 HFONT hfont = CreateFontIndirectA( plf);
1374 hfont = SelectObject( hdc, hfont);
1375 GetTextMetricsA( hdc, &tm);
1376 hfont = SelectObject( hdc, hfont);
1377 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1380 static void test_GetSystemMetrics( void);
1381 static UINT smcxsmsize = 999999999;
1383 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1387 NONCLIENTMETRICSA Ncmorig;
1388 NONCLIENTMETRICSA Ncmnew;
1389 NONCLIENTMETRICSA Ncmcur;
1390 NONCLIENTMETRICSA Ncmstart;
1392 Ncmorig.cbSize = sizeof(NONCLIENTMETRICSA);
1393 Ncmnew.cbSize = sizeof(NONCLIENTMETRICSA);
1394 Ncmcur.cbSize = sizeof(NONCLIENTMETRICSA);
1395 Ncmstart.cbSize = sizeof(NONCLIENTMETRICSA);
1397 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1398 SetLastError(0xdeadbeef);
1399 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmorig, FALSE );
1400 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1403 smcxsmsize = Ncmstart.iSmCaptionWidth;
1404 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1405 the caption font height is higher than the CaptionHeight field,
1406 the latter is adjusted accordingly. To be able to restore these setting
1407 accurately be restore the raw values. */
1408 Ncmorig.iCaptionWidth = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, dpi);
1409 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1410 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1411 Ncmorig.iMenuHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, dpi);
1412 /* test registry entries */
1413 TEST_NONCLIENTMETRICS_REG( Ncmorig)
1414 /* make small changes */
1416 Ncmnew.iBorderWidth += 1;
1417 Ncmnew.iScrollWidth += 1;
1418 Ncmnew.iScrollHeight -= 1;
1419 Ncmnew.iCaptionWidth -= 2;
1420 Ncmnew.iCaptionHeight += 2;
1421 Ncmnew.lfCaptionFont.lfHeight +=1;
1422 Ncmnew.lfCaptionFont.lfWidth +=2;
1423 Ncmnew.lfCaptionFont.lfWeight +=1;
1424 Ncmnew.iSmCaptionWidth += 1;
1425 Ncmnew.iSmCaptionHeight += 2;
1426 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1427 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1428 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1429 Ncmnew.iMenuWidth += 1;
1430 Ncmnew.iMenuHeight += 2;
1431 Ncmnew.lfMenuFont.lfHeight +=1;
1432 Ncmnew.lfMenuFont.lfWidth +=1;
1433 Ncmnew.lfMenuFont.lfWeight +=2;
1434 Ncmnew.lfStatusFont.lfHeight -=1;
1435 Ncmnew.lfStatusFont.lfWidth -=1;
1436 Ncmnew.lfStatusFont.lfWeight +=3;
1437 Ncmnew.lfMessageFont.lfHeight -=2;
1438 Ncmnew.lfMessageFont.lfWidth -=1;
1439 Ncmnew.lfMessageFont.lfWeight +=4;
1441 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1443 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return;
1444 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1445 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1447 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmcur, FALSE );
1448 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1449 /* test registry entries */
1450 TEST_NONCLIENTMETRICS_REG( Ncmcur)
1451 /* test the systemm metrics with these settings */
1452 test_GetSystemMetrics();
1453 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1454 by a large amount will increase the {menu|caption|smcaption} height*/
1456 Ncmnew.lfMenuFont.lfHeight -= 8;
1457 Ncmnew.lfCaptionFont.lfHeight =-4;
1458 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1459 /* also show that a few values are lo limited */
1460 Ncmnew.iCaptionWidth = 0;
1461 Ncmnew.iCaptionHeight = 0;
1462 Ncmnew.iScrollHeight = 0;
1463 Ncmnew.iScrollWidth = 0;
1465 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1467 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1468 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1469 /* raw values are in registry */
1470 TEST_NONCLIENTMETRICS_REG( Ncmnew)
1472 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmcur, FALSE );
1473 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1474 /* cooked values are returned */
1475 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1476 ok( Ncmcur.iMenuHeight == expect,
1477 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1478 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1479 ok( Ncmcur.iCaptionHeight == expect,
1480 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1481 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1482 ok( Ncmcur.iSmCaptionHeight == expect,
1483 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1485 ok( Ncmcur.iCaptionWidth == 8 ||
1486 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1487 "CaptionWidth: %d expected 8\n", Ncmcur.iCaptionWidth);
1488 ok( Ncmcur.iScrollWidth == 8,
1489 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1490 ok( Ncmcur.iScrollHeight == 8,
1491 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1492 /* test the systemm metrics with these settings */
1493 test_GetSystemMetrics();
1495 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
1496 &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1497 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1498 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1501 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1505 MINIMIZEDMETRICS lpMm_orig;
1506 MINIMIZEDMETRICS lpMm_new;
1507 MINIMIZEDMETRICS lpMm_cur;
1509 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1510 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1511 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1513 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1514 SetLastError(0xdeadbeef);
1515 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1516 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1518 /* Test registry. Note that it is perfectly valid for some fields to
1521 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1522 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1523 regval, lpMm_orig.iWidth);
1524 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1525 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1526 regval, lpMm_orig.iHorzGap);
1527 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1528 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1529 regval, lpMm_orig.iVertGap);
1530 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1531 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1532 regval, lpMm_orig.iArrange);
1533 /* set some new values */
1534 lpMm_cur.iWidth = 180;
1535 lpMm_cur.iHorzGap = 1;
1536 lpMm_cur.iVertGap = 1;
1537 lpMm_cur.iArrange = 5;
1538 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1539 &lpMm_cur, SPIF_UPDATEINIFILE );
1540 if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return;
1541 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1542 /* read them back */
1543 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1544 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1546 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1547 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1548 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1549 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1551 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1552 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1553 regval, lpMm_new.iWidth);
1554 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1555 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1556 regval, lpMm_new.iHorzGap);
1557 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1558 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1559 regval, lpMm_new.iVertGap);
1560 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1561 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1562 regval, lpMm_new.iArrange);
1563 /* test some system metrics */
1564 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1565 lpMm_new.iWidth, "iWidth", "%d" );
1566 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1567 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1568 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1569 lpMm_new.iVertGap, "iVertGap", "%d" );
1570 eq( GetSystemMetrics( SM_ARRANGE ),
1571 lpMm_new.iArrange, "iArrange", "%d" );
1572 /* now some really invalid settings */
1573 lpMm_cur.iWidth = -1;
1574 lpMm_cur.iHorzGap = -1;
1575 lpMm_cur.iVertGap = -1;
1576 lpMm_cur.iArrange = - 1;
1577 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1578 &lpMm_cur, SPIF_UPDATEINIFILE );
1579 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1581 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1582 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1583 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1584 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1585 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1586 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1587 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1591 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1592 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1593 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1594 regval, lpMm_new.iWidth);
1595 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1596 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1597 regval, lpMm_new.iHorzGap);
1598 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1599 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1600 regval, lpMm_new.iVertGap);
1601 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1602 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1603 regval, lpMm_new.iArrange);
1605 /* test some system metrics */
1606 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1607 lpMm_new.iWidth, "iWidth", "%d" );
1608 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1609 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1610 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1611 lpMm_new.iVertGap, "iVertGap", "%d" );
1612 eq( GetSystemMetrics( SM_ARRANGE ),
1613 lpMm_new.iArrange, "iArrange", "%d" );
1615 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1616 &lpMm_orig, SPIF_UPDATEINIFILE );
1617 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1619 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1620 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1621 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1622 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1623 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1624 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1627 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1631 ICONMETRICSA im_orig;
1632 ICONMETRICSA im_new;
1633 ICONMETRICSA im_cur;
1636 im_orig.cbSize = sizeof(ICONMETRICSA);
1637 im_new.cbSize = sizeof(ICONMETRICSA);
1638 im_cur.cbSize = sizeof(ICONMETRICSA);
1640 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1641 SetLastError(0xdeadbeef);
1642 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1643 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1645 /* check some registry values */
1646 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1647 ok( regval==im_orig.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1648 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1649 ok( regval==im_orig.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1650 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1651 if( regval != im_orig.iTitleWrap)
1652 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1653 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1655 /* change everything without creating something invalid ( Win9x would ignore
1656 * an invalid font for instance) */
1658 im_cur.iHorzSpacing += 10;
1659 im_cur.iVertSpacing += 6;
1660 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1661 im_cur.lfFont.lfHeight += 1;
1662 im_cur.lfFont.lfWidth += 2;
1663 im_cur.lfFont.lfEscapement = 1;
1664 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1665 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1666 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1667 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1668 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1669 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1670 OUT_TT_PRECIS : OUT_DEFAULT_PRECIS;
1671 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1672 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1673 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1674 DRAFT_QUALITY : DEFAULT_QUALITY;
1675 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1676 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1678 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1680 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1681 if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return;
1682 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1684 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1685 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1686 /* test GET <-> SETICONMETRICS */
1687 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1688 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1689 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1690 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%d" );
1691 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%d" );
1692 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%d" );
1693 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%d" );
1694 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1695 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1696 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1697 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1698 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1699 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1700 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1701 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1702 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1703 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1704 im_cur.lfFont.lfFaceName);
1705 /* test some system metrics */
1706 eq( GetSystemMetrics( SM_CXICONSPACING ),
1707 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1708 eq( GetSystemMetrics( SM_CYICONSPACING ),
1709 im_new.iVertSpacing, "iVertSpacing", "%d" );
1710 /* check some registry values */
1711 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1712 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1713 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1714 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1715 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1716 if( regval != im_cur.iTitleWrap)
1717 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1718 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1719 /* test some values from other SPI_GETxxx calls */
1720 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1721 ok( rc && spacing == im_cur.iHorzSpacing,
1722 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1723 spacing, im_cur.iHorzSpacing);
1724 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1725 ok( rc && spacing == im_cur.iVertSpacing,
1726 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1727 spacing, im_cur.iVertSpacing);
1728 rc = SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &wrap, 0 );
1729 ok( rc && wrap == im_cur.iTitleWrap,
1730 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1731 wrap, im_cur.iTitleWrap);
1732 /* restore old values */
1733 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1734 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1736 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1737 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1739 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1740 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1741 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1744 static void test_SPI_SETWORKAREA( void ) /* 47 */
1751 trace("testing SPI_{GET,SET}WORKAREA\n");
1752 SetLastError(0xdeadbeef);
1753 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1754 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1757 /* Modify the work area only minimally as this causes the icons that
1758 * fall outside it to be moved around thus requiring the user to
1759 * reposition them manually one by one.
1760 * Changing the work area by just one pixel should make this occurrence
1761 * reasonably unlikely.
1763 curr_val.left = old_area.left;
1764 curr_val.top = old_area.top;
1765 curr_val.right = old_area.right-1;
1766 curr_val.bottom = old_area.bottom-1;
1767 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1768 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1769 if (!test_error_msg(rc,"SPI_SETWORKAREA")) return;
1770 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1771 test_change_message( SPI_SETWORKAREA, 0 );
1772 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1773 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1774 eq( area.left, curr_val.left, "left", "%d" );
1775 eq( area.top, curr_val.top, "top", "%d" );
1776 eq( area.right, curr_val.right, "right", "%d" );
1777 eq( area.bottom, curr_val.bottom, "bottom", "%d" );
1779 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1780 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1781 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1782 test_change_message( SPI_SETWORKAREA, 0 );
1783 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1784 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1785 eq( area.left, old_area.left, "left", "%d" );
1786 eq( area.top, old_area.top, "top", "%d" );
1787 eq( area.right, old_area.right, "right", "%d" );
1788 eq( area.bottom, old_area.bottom, "bottom", "%d" );
1791 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1795 const UINT vals[]={TRUE,FALSE};
1798 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1799 SetLastError(0xdeadbeef);
1800 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1801 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1802 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1805 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1809 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1810 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1811 if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return;
1812 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1813 test_change_message( SPI_SETSHOWSOUNDS, 1 );
1814 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1815 SPI_SETSHOWSOUNDS_VALNAME,
1816 vals[i] ? "1" : "0" );
1818 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1819 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1820 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1821 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1822 "SM_SHOWSOUNDS", "%d" );
1825 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1826 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1829 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1833 const UINT vals[]={TRUE,FALSE};
1836 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1837 SetLastError(0xdeadbeef);
1838 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1839 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1842 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1846 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1847 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1848 if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) return;
1849 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1850 test_change_message( SPI_SETKEYBOARDPREF, 1 );
1851 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY,
1852 SPI_SETKEYBOARDPREF_VALNAME, SPI_SETKEYBOARDPREF_VALNAME_LEGACY,
1853 vals[i] ? "1" : "0" );
1855 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1856 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1857 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1860 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1861 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1864 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1868 const UINT vals[]={TRUE,FALSE};
1871 trace("testing SPI_{GET,SET}SCREENREADER\n");
1872 SetLastError(0xdeadbeef);
1873 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1874 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
1877 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1881 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
1882 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1883 if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return;
1884 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1885 test_change_message( SPI_SETSCREENREADER, 1 );
1886 test_reg_key_ex2( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY,
1887 SPI_SETSCREENREADER_VALNAME, SPI_SETSCREENREADER_VALNAME_LEGACY,
1888 vals[i] ? "1" : "0" );
1890 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
1891 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1892 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
1895 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
1896 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1899 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
1903 const UINT vals[]={0xffffffff,0,1,2};
1906 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
1907 if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */
1908 SetLastError(0xdeadbeef);
1909 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
1910 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
1913 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1917 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
1918 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1919 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return;
1920 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1921 test_change_message( SPI_SETFONTSMOOTHING, 0 );
1922 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
1923 SPI_SETFONTSMOOTHING_VALNAME,
1924 vals[i] ? "2" : "0" );
1926 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
1927 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1928 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
1931 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
1932 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1935 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
1939 const UINT vals[]={TRUE,FALSE};
1942 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
1943 SetLastError(0xdeadbeef);
1944 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
1945 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
1948 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1952 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
1953 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1954 if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return;
1955 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1956 test_change_message( SPI_SETLOWPOWERACTIVE, 1 );
1957 test_reg_key( SPI_SETLOWPOWERACTIVE_REGKEY,
1958 SPI_SETLOWPOWERACTIVE_VALNAME,
1959 vals[i] ? "1" : "0" );
1961 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
1962 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
1963 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1965 v == 0, /* win2k3 */
1966 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
1969 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1970 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1973 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
1977 const UINT vals[]={TRUE,FALSE};
1980 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
1981 SetLastError(0xdeadbeef);
1982 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
1983 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
1986 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1990 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
1991 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1992 if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return;
1993 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1994 test_change_message( SPI_SETPOWEROFFACTIVE, 1 );
1995 test_reg_key( SPI_SETPOWEROFFACTIVE_REGKEY,
1996 SPI_SETPOWEROFFACTIVE_VALNAME,
1997 vals[i] ? "1" : "0" );
1999 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2000 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
2001 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2003 v == 0, /* win2k3 */
2004 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2007 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2008 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2011 static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2015 const UINT vals[]={TRUE,FALSE};
2018 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2019 SetLastError(0xdeadbeef);
2020 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &old_b, 0 );
2021 if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
2024 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2028 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0,
2029 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2030 if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return;
2031 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2032 test_change_message( SPI_SETSNAPTODEFBUTTON, 0 );
2033 test_reg_key( SPI_SETSNAPTODEFBUTTON_REGKEY,
2034 SPI_SETSNAPTODEFBUTTON_VALNAME,
2035 vals[i] ? "1" : "0" );
2037 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &v, 0 );
2038 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2039 eq( v, vals[i], "SPI_GETSNAPTODEFBUTTON", "%d" );
2042 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, old_b, 0, SPIF_UPDATEINIFILE );
2043 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2046 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2050 const UINT vals[]={0,32767};
2053 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2054 SetLastError(0xdeadbeef);
2055 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
2056 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2057 * what MSDN states (Verified on Win98SE)
2059 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2062 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2067 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
2068 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2069 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return;
2070 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2071 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
2072 sprintf( buf, "%d", vals[i] );
2073 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
2074 SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
2076 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
2077 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2078 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2081 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
2082 SPIF_UPDATEINIFILE );
2083 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2086 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2090 const UINT vals[]={0,32767};
2093 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2094 SetLastError(0xdeadbeef);
2095 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
2096 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2097 * what MSDN states (Verified on Win98SE)
2099 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2102 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2107 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2108 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2109 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return;
2110 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2111 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2112 sprintf( buf, "%d", vals[i] );
2113 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
2114 SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
2116 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2117 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2118 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2121 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2122 SPIF_UPDATEINIFILE );
2123 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2126 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2131 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2132 * defaulted to a value of 10 automatically.
2134 const UINT vals[]={10,32767};
2137 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2138 SetLastError(0xdeadbeef);
2139 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2140 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2141 * what MSDN states (Verified on Win98SE)
2143 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2146 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2151 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2152 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2153 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return;
2154 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2155 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2156 sprintf( buf, "%d", vals[i] );
2157 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
2158 SPI_SETMOUSEHOVERTIME_VALNAME, buf );
2160 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2161 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2162 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2165 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2166 SPIF_UPDATEINIFILE );
2167 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2170 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2174 const UINT vals[]={0,32767};
2177 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2178 SetLastError(0xdeadbeef);
2179 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2181 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2182 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2185 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2190 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
2191 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2192 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return;
2193 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2194 test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
2195 sprintf( buf, "%d", vals[i] );
2196 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
2197 SPI_SETMOUSESCROLLLINES_VALNAME, buf );
2199 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2200 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2201 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2204 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
2205 SPIF_UPDATEINIFILE );
2206 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2209 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2213 const UINT vals[]={0,32767};
2216 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2217 SetLastError(0xdeadbeef);
2218 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2220 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2221 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2224 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2229 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2230 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2231 if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return;
2232 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2233 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2234 sprintf( buf, "%d", vals[i] );
2235 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
2236 SPI_SETMENUSHOWDELAY_VALNAME, buf );
2238 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2239 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2240 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2243 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2244 SPIF_UPDATEINIFILE );
2245 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2248 static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2252 const UINT vals[]={32767,0};
2255 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2256 SetLastError(0xdeadbeef);
2257 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &old_chars, 0 );
2259 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2260 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2263 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2268 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, vals[i], 0,
2269 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2270 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLCHARS")) return;
2271 test_change_message( SPI_SETWHEELSCROLLCHARS, 0 );
2272 sprintf( buf, "%d", vals[i] );
2273 test_reg_key( SPI_SETMOUSESCROLLCHARS_REGKEY,
2274 SPI_SETMOUSESCROLLCHARS_VALNAME, buf );
2276 SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &v, 0 );
2277 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2278 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2281 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, old_chars, 0,
2282 SPIF_UPDATEINIFILE );
2283 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2286 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2292 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2293 SetLastError(0xdeadbeef);
2294 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2295 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2296 * unimplemented on NT4
2298 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2302 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
2303 if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return;
2304 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
2305 test_change_message(SPI_SETDESKWALLPAPER, 0);
2307 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
2308 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2310 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
2313 static void test_WM_DISPLAYCHANGE(void)
2315 DEVMODE mode, startmode;
2316 int start_bpp, last_set_bpp = 0;
2317 int test_bpps[] = {8, 16, 24, 32}, i;
2321 if (!pChangeDisplaySettingsExA)
2323 win_skip("ChangeDisplaySettingsExA is not available\n");
2327 displaychange_test_active = TRUE;
2329 memset(&startmode, 0, sizeof(startmode));
2330 startmode.dmSize = sizeof(startmode);
2331 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &startmode);
2332 start_bpp = startmode.dmBitsPerPel;
2334 displaychange_sem = CreateSemaphore(NULL, 0, 1, NULL);
2336 for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
2339 memset(&mode, 0, sizeof(mode));
2340 mode.dmSize = sizeof(mode);
2341 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2342 mode.dmBitsPerPel = test_bpps[i];
2343 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2344 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2346 change_counter = 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
2347 displaychange_ok = TRUE;
2348 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2349 /* Wait quite long for the message, screen setting changes can take some time */
2350 if(change_ret == DISP_CHANGE_SUCCESSFUL) {
2351 wait_ret = WaitForSingleObject(displaychange_sem, 10000);
2352 /* we may not get a notification if nothing changed */
2353 if (wait_ret == WAIT_TIMEOUT && !last_set_bpp && start_bpp == test_bpps[i])
2355 ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
2357 displaychange_ok = FALSE;
2359 if(change_ret != DISP_CHANGE_SUCCESSFUL) {
2360 skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret);
2361 ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp);
2365 if(start_bpp != test_bpps[i]) {
2366 todo_wine ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2368 ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2370 last_set_bpp = test_bpps[i];
2373 if(start_bpp != last_set_bpp && last_set_bpp != 0) {
2374 memset(&mode, 0, sizeof(mode));
2375 mode.dmSize = sizeof(mode);
2376 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2377 mode.dmBitsPerPel = start_bpp;
2378 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2379 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2381 displaychange_ok = TRUE;
2382 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2383 WaitForSingleObject(displaychange_sem, 10000);
2384 displaychange_ok = FALSE;
2385 CloseHandle(displaychange_sem);
2386 displaychange_sem = 0;
2389 displaychange_test_active = FALSE;
2393 * Registry entries for the system parameters.
2394 * Names are created by 'SET' flags names.
2395 * We assume that corresponding 'GET' entries use the same registry keys.
2397 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
2399 test_SPI_SETBEEP(); /* 1 */
2400 test_SPI_SETMOUSE(); /* 4 */
2401 test_SPI_SETBORDER(); /* 6 */
2402 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2403 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2404 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2405 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2406 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2407 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2408 test_SPI_ICONVERTICALSPACING(); /* 24 */
2409 test_SPI_SETICONTITLEWRAP(); /* 26 */
2410 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2411 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2412 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2413 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2414 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2415 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2416 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2417 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2418 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2419 test_SPI_SETICONMETRICS(); /* 46 */
2420 test_SPI_SETWORKAREA(); /* 47 */
2421 test_SPI_SETSHOWSOUNDS(); /* 57 */
2422 test_SPI_SETKEYBOARDPREF(); /* 69 */
2423 test_SPI_SETSCREENREADER(); /* 71 */
2424 test_SPI_SETFONTSMOOTHING(); /* 75 */
2425 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2426 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2427 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2428 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2429 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2430 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2431 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2432 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2433 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2434 test_SPI_SETWALLPAPER(); /* 115 */
2436 test_WM_DISPLAYCHANGE();
2438 SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
2442 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2443 * icon metrics and minimized metrics.
2446 /* copied from wine's GdiGetCharDimensions, which is not available on most
2447 * windows versions */
2448 static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
2451 static const CHAR alphabet[] = {
2452 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2453 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2454 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2456 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2458 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2460 if (height) *height = sz.cy;
2461 return (sz.cx / 26 + 1) / 2;
2464 /* get text metrics and/or "average" char width of the specified logfont
2465 * for the specified dc */
2466 static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2468 HFONT hfont, hfontsav;
2470 if( !ptm) ptm = &tm;
2471 hfont = CreateFontIndirectA( plf);
2472 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2475 if( hfont) DeleteObject( hfont);
2478 GetTextMetricsA( hdc, ptm);
2480 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2482 SelectObject( hdc, hfontsav);
2483 DeleteObject( hfont);
2486 static int gsm_error_ctr;
2488 #define ok_gsm( i, e)\
2491 int act = GetSystemMetrics( (i));\
2492 if( exp != act) gsm_error_ctr++;\
2493 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2495 #define ok_gsm_2( i, e1, e2)\
2499 int act = GetSystemMetrics( (i));\
2500 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2501 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2503 #define ok_gsm_3( i, e1, e2, e3)\
2508 int act = GetSystemMetrics( (i));\
2509 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2510 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2513 static void test_GetSystemMetrics( void)
2515 TEXTMETRICA tmMenuFont;
2516 UINT IconSpacing, IconVerticalSpacing;
2518 HDC hdc = CreateIC( "Display", 0, 0, 0);
2521 MINIMIZEDMETRICS minim;
2522 NONCLIENTMETRICS ncm;
2525 minim.cbSize = sizeof( minim);
2526 ncm.cbSize = sizeof( ncm);
2527 SystemParametersInfo( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2528 SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2530 /* CaptionWidth from the registry may have different value of iCaptionWidth
2531 * from the non client metrics (observed on WinXP) */
2532 CaptionWidth = metricfromreg(
2533 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2534 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2535 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2536 /* FIXME: use icon metric */
2537 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2538 IconVerticalSpacing = 0;
2539 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2541 /* reset error counters */
2546 /* SM_CXSCREEN, cannot test these two */
2548 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2549 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2550 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2551 ok_gsm( SM_CXBORDER, 1);
2552 ok_gsm( SM_CYBORDER, 1);
2553 ok_gsm( SM_CXDLGFRAME, 3);
2554 ok_gsm( SM_CYDLGFRAME, 3);
2555 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2556 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2561 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2562 ok_gsm( SM_CXFULLSCREEN,
2563 GetSystemMetrics( SM_CXMAXIMIZED) - 2 * GetSystemMetrics( SM_CXFRAME));
2564 ok_gsm( SM_CYFULLSCREEN,
2565 GetSystemMetrics( SM_CYMAXIMIZED) - GetSystemMetrics( SM_CYMIN));
2566 /* SM_CYKANJIWINDOW */
2567 /* SM_MOUSEPRESENT */
2568 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2569 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2576 ok_gsm( SM_CXMIN, 3 * max( CaptionWidth, 8) + GetSystemMetrics( SM_CYSIZE) +
2577 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2578 ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) +
2579 2 * GetSystemMetrics( SM_CYFRAME));
2580 ok_gsm_2( SM_CXSIZE,
2581 ncm.iCaptionWidth, /* classic/standard windows style */
2582 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2584 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2585 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2586 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2587 ok_gsm( SM_CXMINTRACK, GetSystemMetrics( SM_CXMIN));
2588 ok_gsm( SM_CYMINTRACK, GetSystemMetrics( SM_CYMIN));
2589 /* SM_CXDOUBLECLK */
2590 /* SM_CYDOUBLECLK */
2591 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2592 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2593 /* SM_MENUDROPALIGNMENT */
2595 /* SM_DBCSENABLED */
2596 /* SM_CMOUSEBUTTONS */
2598 ok_gsm( SM_CXEDGE, 2);
2599 ok_gsm( SM_CYEDGE, 2);
2600 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2601 ok_gsm( SM_CXMINSPACING, GetSystemMetrics( SM_CXMINIMIZED) + (short)minim.iHorzGap );
2602 ok_gsm( SM_CYMINSPACING, GetSystemMetrics( SM_CYMINIMIZED) + (short)minim.iVertGap );
2605 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2606 ok_gsm_3( SM_CXSMSIZE,
2607 ncm.iSmCaptionWidth, /* classic/standard windows style */
2608 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2609 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2610 does not change it */
2612 ok_gsm( SM_CYSMSIZE, GetSystemMetrics( SM_CYSMCAPTION) - 1);
2613 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2614 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2616 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2617 ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
2618 screen.cx = GetSystemMetrics( SM_CXVIRTUALSCREEN );
2619 screen.cy = GetSystemMetrics( SM_CYVIRTUALSCREEN );
2620 if (!screen.cx || !screen.cy) /* not supported on NT4 */
2622 screen.cx = GetSystemMetrics( SM_CXSCREEN );
2623 screen.cy = GetSystemMetrics( SM_CYSCREEN );
2625 ok_gsm( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME));
2626 ok_gsm( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME));
2627 /* the next two cannot really be tested as they depend on (application)
2629 /* SM_CXMAXIMIZED */
2630 /* SM_CYMAXIMIZED */
2639 ok_gsm( SM_CXMENUCHECK,
2640 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2641 ok_gsm( SM_CYMENUCHECK,
2642 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2643 /* SM_SLOWMACHINE */
2644 /* SM_MIDEASTENABLED */
2645 /* SM_MOUSEWHEELPRESENT */
2646 /* SM_XVIRTUALSCREEN */
2647 /* SM_YVIRTUALSCREEN */
2648 /* SM_CXVIRTUALSCREEN */
2649 /* SM_CYVIRTUALSCREEN */
2651 /* SM_SAMEDISPLAYFORMAT */
2653 /* SM_CXFOCUSBORDER */
2654 /* SM_CYFOCUSBORDER */
2656 /* SM_MEDIACENTER */
2659 if( gsm_error_ctr ) { /* if any errors where found */
2660 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2661 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2662 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2663 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2664 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d\n",
2665 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidth);
2670 static void test_EnumDisplaySettings(void)
2677 memset(&devmode, 0, sizeof(devmode));
2678 devmode.dmSize = sizeof(devmode);
2679 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
2682 val = GetDeviceCaps(hdc, BITSPIXEL);
2683 ok(devmode.dmBitsPerPel == val, "GetDeviceCaps(BITSPIXEL) returned %d, EnumDisplaySettings returned %d\n",
2684 val, devmode.dmBitsPerPel);
2686 val = GetDeviceCaps(hdc, NUMCOLORS);
2687 if(devmode.dmBitsPerPel <= 8) {
2688 ok(val == 256, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2690 ok(val == -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2697 SetLastError (0xdeadbeef);
2698 if (!EnumDisplaySettings(NULL, num++, &devmode)) {
2699 DWORD le = GetLastError();
2700 ok(le == ERROR_NO_MORE_FILES ||
2701 le == 0xdeadbeef, /* XP, 2003 */
2702 "Expected ERROR_NO_MORE_FILES or 0xdeadbeef, got %d\n", le);
2708 START_TEST(sysparams)
2716 HANDLE hInstance, hdll;
2718 hdll = GetModuleHandleA("user32.dll");
2719 pChangeDisplaySettingsExA=(void*)GetProcAddress(hdll, "ChangeDisplaySettingsExA");
2721 hInstance = GetModuleHandleA( NULL );
2723 dpi = GetDeviceCaps( hdc, LOGPIXELSY);
2724 iswin9x = GetVersion() & 0x80000000;
2726 /* This test requires interactivity, if we don't have it, give up */
2727 if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
2728 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
2730 argc = winetest_get_mainargs(&argv);
2731 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
2732 trace("strict=%d\n",strict);
2734 trace("testing GetSystemMetrics with your current desktop settings\n");
2735 test_GetSystemMetrics( );
2736 trace("testing EnumDisplaySettings vs GetDeviceCaps\n");
2737 test_EnumDisplaySettings( );
2740 change_last_param = 0;
2742 wc.lpszClassName = "SysParamsTestClass";
2743 wc.lpfnWndProc = SysParamsTestWndProc;
2744 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
2745 wc.hInstance = hInstance;
2746 wc.hIcon = LoadIconA( 0, IDI_APPLICATION );
2747 wc.hCursor = LoadCursorA( 0, IDC_ARROW );
2748 wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
2749 wc.lpszMenuName = 0;
2752 RegisterClassA( &wc );
2754 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
2755 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
2757 hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
2759 CloseHandle( hThread );
2761 while( GetMessageA( &msg, 0, 0, 0 )) {
2762 TranslateMessage( &msg );
2763 DispatchMessageA( &msg );