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 0x0500 /* For SPI_GETMOUSEHOVERWIDTH and more */
28 #include "wine/test.h"
36 #ifndef SPI_GETDESKWALLPAPER
37 # define SPI_GETDESKWALLPAPER 0x0073
45 #define eq(received, expected, label, type) \
46 ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
49 #define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
50 #define SPI_SETBEEP_VALNAME "Beep"
51 #define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
52 #define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
53 #define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
54 #define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
55 #define SPI_SETBORDER_REGKEY "Control Panel\\Desktop\\WindowMetrics"
56 #define SPI_SETBORDER_REGKEY2 "Control Panel\\Desktop"
57 #define SPI_SETBORDER_VALNAME "BorderWidth"
58 #define SPI_METRIC_REGKEY "Control Panel\\Desktop\\WindowMetrics"
59 #define SPI_SCROLLWIDTH_VALNAME "ScrollWidth"
60 #define SPI_SCROLLHEIGHT_VALNAME "ScrollHeight"
61 #define SPI_CAPTIONWIDTH_VALNAME "CaptionWidth"
62 #define SPI_CAPTIONHEIGHT_VALNAME "CaptionHeight"
63 #define SPI_CAPTIONFONT_VALNAME "CaptionFont"
64 #define SPI_SMCAPTIONWIDTH_VALNAME "SmCaptionWidth"
65 #define SPI_SMCAPTIONHEIGHT_VALNAME "SmCaptionHeight"
66 #define SPI_SMCAPTIONFONT_VALNAME "SmCaptionFont"
67 #define SPI_MENUWIDTH_VALNAME "MenuWidth"
68 #define SPI_MENUHEIGHT_VALNAME "MenuHeight"
69 #define SPI_MENUFONT_VALNAME "MenuFont"
70 #define SPI_STATUSFONT_VALNAME "StatusFont"
71 #define SPI_MESSAGEFONT_VALNAME "MessageFont"
73 #define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
74 #define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
75 #define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
76 #define SPI_ICONHORIZONTALSPACING_REGKEY2 "Control Panel\\Desktop"
77 #define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
78 #define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
79 #define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
80 #define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
81 #define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
82 #define SPI_MINWIDTH_VALNAME "MinWidth"
83 #define SPI_MINHORZGAP_VALNAME "MinHorzGap"
84 #define SPI_MINVERTGAP_VALNAME "MinVertGap"
85 #define SPI_MINARRANGE_VALNAME "MinArrange"
86 #define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
87 #define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
88 #define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
89 #define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
90 #define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
91 #define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
92 #define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
93 #define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
94 #define SPI_SETICONTITLEWRAP_REGKEY1 "Control Panel\\Desktop\\WindowMetrics"
95 #define SPI_SETICONTITLEWRAP_REGKEY2 "Control Panel\\Desktop"
96 #define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
97 #define SPI_SETMENUDROPALIGNMENT_REGKEY1 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
98 #define SPI_SETMENUDROPALIGNMENT_REGKEY2 "Control Panel\\Desktop"
99 #define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
100 #define SPI_SETDOUBLECLKWIDTH_REGKEY1 "Control Panel\\Mouse"
101 #define SPI_SETDOUBLECLKWIDTH_REGKEY2 "Control Panel\\Desktop"
102 #define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
103 #define SPI_SETDOUBLECLKHEIGHT_REGKEY1 "Control Panel\\Mouse"
104 #define SPI_SETDOUBLECLKHEIGHT_REGKEY2 "Control Panel\\Desktop"
105 #define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
106 #define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
107 #define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
108 #define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
109 #define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
110 #define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
111 #define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
112 #define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
113 #define SPI_SETSHOWSOUNDS_VALNAME "On"
114 #define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Accessibility\\Keyboard Preference"
115 #define SPI_SETKEYBOARDPREF_VALNAME "On"
116 #define SPI_SETKEYBOARDPREF_REGKEY_LEGACY "Control Panel\\Accessibility"
117 #define SPI_SETKEYBOARDPREF_VALNAME_LEGACY "Keyboard Preference"
118 #define SPI_SETSCREENREADER_REGKEY "Control Panel\\Accessibility\\Blind Access"
119 #define SPI_SETSCREENREADER_VALNAME "On"
120 #define SPI_SETSCREENREADER_REGKEY_LEGACY "Control Panel\\Accessibility"
121 #define SPI_SETSCREENREADER_VALNAME_LEGACY "Blind Access"
122 #define SPI_SETFONTSMOOTHING_REGKEY "Control Panel\\Desktop"
123 #define SPI_SETFONTSMOOTHING_VALNAME "FontSmoothing"
124 #define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
125 #define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
126 #define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
127 #define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
128 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
129 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
130 #define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
131 #define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
132 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
133 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
134 #define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
135 #define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
136 #define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
137 #define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
138 #define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
139 #define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
140 #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
141 #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
143 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
144 #define WINE_CURRENT_USER_REGKEY "Wine"
146 static HWND ghTestWnd;
148 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
149 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
151 static int change_counter;
152 static int change_last_param;
154 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
159 case WM_SETTINGCHANGE:
160 if (change_counter>0) {
161 /* ignore these messages caused by resizing of toolbars */
162 if( wParam == SPI_SETWORKAREA) break;
163 if( change_last_param == SPI_SETWORKAREA) {
164 change_last_param = wParam;
167 ok(0,"too many changes counter=%d last change=%d\n",
168 change_counter,change_last_param);
171 change_last_param = wParam;
175 PostQuitMessage( 0 );
179 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
186 Performs testing for system parameters messages
188 - system parameter id
189 - supposed value of the registry key
191 static void test_change_message( int action, int optional )
193 if (change_counter==0 && optional==1)
195 ok( 1 == change_counter,
196 "Missed a message: change_counter=%d\n", change_counter );
198 ok( action == change_last_param,
199 "Wrong action got %d expected %d\n", change_last_param, action );
200 change_last_param = 0;
203 static BOOL test_error_msg ( int rc, const char *name )
205 DWORD last_error = GetLastError();
209 if (last_error==0xdeadbeef || last_error==ERROR_INVALID_SPI_VALUE)
211 trace("%s not supported on this platform. Skipping test\n", name);
213 else if (last_error==ERROR_ACCESS_DENIED)
215 trace("%s does not have privileges to run. Skipping test\n", name);
219 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name,last_error);
220 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
226 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
232 * Tests the HKEY_CURRENT_USER subkey value.
233 * The value should contain string value.
236 * lpsSubKey - subkey name
237 * lpsRegName - registry entry name
238 * lpsTestValue - value to test
240 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2, LPCSTR testValue )
242 CHAR value[MAX_PATH];
250 valueLen=sizeof(value);
251 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
252 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
254 if (rc==ERROR_SUCCESS)
256 ok( !strcmp( testValue, value ),
257 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
258 subKey1, valName1, testValue, value );
263 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
269 valueLen=sizeof(value);
270 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
271 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
273 if (rc==ERROR_SUCCESS)
275 ok( !strcmp( testValue, value ),
276 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
277 subKey1, valName2, testValue, value );
282 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
286 if (subKey2 && !strict)
289 valueLen=sizeof(value);
290 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
291 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
293 if (rc==ERROR_SUCCESS)
295 ok( !strcmp( testValue, value ),
296 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
297 subKey2, valName1, testValue, value );
302 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
308 valueLen=sizeof(value);
309 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
310 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
312 if (rc==ERROR_SUCCESS)
314 ok( !strcmp( testValue, value ),
315 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
316 subKey2, valName2, testValue, value );
321 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
326 ok(found,"Missing registry values: %s or %s in keys: %s or %s\n",
327 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
330 #define test_reg_key( subKey, valName, testValue ) \
331 _test_reg_key( subKey, NULL, valName, NULL, testValue )
332 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
333 _test_reg_key( subKey1, subKey2, valName, NULL, testValue )
334 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
335 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue )
337 /* get a metric from the registry. If the value is negative
338 * it is assumed to be in twips and converted to pixels */
339 static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
347 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
349 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
351 if( ret != ERROR_SUCCESS) return -1;
354 value = ( -value * dpi + 720) / 1440;
370 BYTE lfClipPrecision;
372 BYTE lfPitchAndFamily;
373 CHAR lfFaceName[LF_FACESIZE];
374 } LOGFONT16, *LPLOGFONT16;
376 /* get logfont from the registry */
377 static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
381 DWORD ret, size, type;
383 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
385 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
387 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
388 if( ret != ERROR_SUCCESS)
390 if( size <= sizeof( LOGFONT16)) {
391 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
392 plf->lfHeight = plf16->lfHeight;
393 plf->lfWidth = plf16->lfWidth;
394 plf->lfEscapement = plf16->lfEscapement;
395 plf->lfOrientation = plf16->lfOrientation;
396 plf->lfWeight = plf16->lfWeight;
397 plf->lfItalic = plf16->lfItalic;
398 plf->lfUnderline = plf16->lfUnderline;
399 plf->lfStrikeOut = plf16->lfStrikeOut;
400 plf->lfCharSet = plf16->lfCharSet;
401 plf->lfOutPrecision = plf16->lfOutPrecision;
402 plf->lfClipPrecision = plf16->lfClipPrecision;
403 plf->lfQuality = plf16->lfQuality;
404 plf->lfPitchAndFamily = plf16->lfPitchAndFamily;
405 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
406 } else if( size <= sizeof( LOGFONTA)) {
407 plf = (LOGFONTA*) &lfw;
409 plf->lfHeight = lfw.lfHeight;
410 plf->lfWidth = lfw.lfWidth;
411 plf->lfEscapement = lfw.lfEscapement;
412 plf->lfOrientation = lfw.lfOrientation;
413 plf->lfWeight = lfw.lfWeight;
414 plf->lfItalic = lfw.lfItalic;
415 plf->lfUnderline = lfw.lfUnderline;
416 plf->lfStrikeOut = lfw.lfStrikeOut;
417 plf->lfCharSet = lfw.lfCharSet;
418 plf->lfOutPrecision = lfw.lfOutPrecision;
419 plf->lfClipPrecision = lfw.lfClipPrecision;
420 plf->lfQuality = lfw.lfQuality;
421 plf->lfPitchAndFamily = lfw.lfPitchAndFamily;
422 WideCharToMultiByte( CP_ACP, 0, lfw.lfFaceName, -1, plf->lfFaceName,
423 LF_FACESIZE, NULL, NULL);
429 static void test_SPI_SETBEEP( void ) /* 2 */
436 trace("testing SPI_{GET,SET}BEEP\n");
437 SetLastError(0xdeadbeef);
438 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
439 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
443 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
444 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
445 test_change_message( SPI_SETBEEP, 0 );
446 test_reg_key( SPI_SETBEEP_REGKEY,
448 curr_val ? "Yes" : "No" );
449 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
450 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
451 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
452 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
453 if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
455 ok(rc!=0,"SystemParametersInfoW: rc=%d err=%d\n",rc,GetLastError());
456 eq( b, curr_val, "SystemParametersInfoW", "%d" );
459 /* is a message sent for the second change? */
460 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
461 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
462 test_change_message( SPI_SETBEEP, 0 );
465 rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
466 if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
467 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
468 ok(rc!=0,"SystemParametersInfo: 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" );
482 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
484 rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
485 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
488 static const char *setmouse_valuenames[3] = {
489 SPI_SETMOUSE_VALNAME1,
490 SPI_SETMOUSE_VALNAME2,
491 SPI_SETMOUSE_VALNAME3
495 * Runs check for one setting of spi_setmouse.
497 static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change,
502 static int aw_turn = 0;
503 static BOOL w_implemented = 1;
510 if ((aw_turn % 2!=0) && (w_implemented))
512 /* call unicode on odd (non even) calls */
513 SetLastError(0xdeadbeef);
514 rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
515 if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
518 trace("SystemParametersInfoW not supported on this platform\n");
522 if ((aw_turn % 2==0) || (!w_implemented))
524 /* call ascii version on even calls or if unicode is not available */
525 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
528 ok(rc!=0,"SystemParametersInfo: rc=%d err=%d\n",rc,GetLastError());
529 test_change_message( SPI_SETMOUSE, 0 );
530 for (i = 0; i < 3; i++)
532 sprintf( buf, "%d", curr_val[i] );
533 test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
536 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
537 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
538 for (i = 0; i < 3; i++)
540 ok(mi[i] == curr_val[i],
541 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
546 rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
547 ok(rc!=0,"SystemParametersInfoW: rc=%d err=%d\n",rc,GetLastError());
548 for (i = 0; i < 3; i++)
550 ok(mi[i] == curr_val[i],
551 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
555 #if 0 /* FIXME: this always fails for me - AJ */
556 for (i = 0; i < nchange; i++)
559 mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
560 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
562 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
563 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
568 static void test_SPI_SETMOUSE( void ) /* 4 */
573 /* win nt default values - 6, 10, 1 */
574 INT curr_val[3] = {6, 10, 1};
576 /* requested and projected mouse movements */
577 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
578 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
579 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
580 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
581 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
582 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
583 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
584 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
585 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
587 int nchange = sizeof( req_change ) / sizeof( POINT );
589 trace("testing SPI_{GET,SET}MOUSE\n");
590 SetLastError(0xdeadbeef);
591 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
592 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
595 run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange );
597 /* acceleration change */
599 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
601 /* acceleration change */
603 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
605 /* acceleration change */
607 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
609 /* threshold change */
612 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
614 /* threshold change */
618 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
620 /* threshold change */
622 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
624 /* threshold change */
626 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
628 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
629 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
632 static void test_setborder(UINT curr_val, int usesetborder, int dpi)
637 NONCLIENTMETRICSA ncm;
639 ncm.cbSize = sizeof( ncm);
640 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
641 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
643 rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
644 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
645 test_change_message( SPI_SETBORDER, 1 );
646 } else { /* set non client metrics */
647 ncm.iBorderWidth = curr_val;
648 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
650 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
651 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
653 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
654 regval = metricfromreg( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_VALNAME, dpi);
655 if( regval != curr_val)
656 regval = metricfromreg( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, dpi);
657 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
659 /* minimum border width is 1 */
660 if (curr_val == 0) curr_val = 1;
661 /* should be the same as the non client metrics */
662 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
663 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
664 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
665 /* and from SPI_GETBORDER */
666 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
667 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
668 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
669 /* test some SystemMetrics */
670 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
671 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
672 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
673 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
674 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
677 static void test_SPI_SETBORDER( void ) /* 6 */
681 NONCLIENTMETRICSA ncmsave;
684 ncmsave.cbSize = sizeof( ncmsave);
685 rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
686 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
687 /* CaptionWidth from the registry may have different value of iCaptionWidth
688 * from the non client metrics (observed on WinXP).
689 * Fix this so we can safely restore settings with the nonclientmetrics */
690 CaptionWidth = metricfromreg(
691 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
692 ncmsave.iCaptionWidth = CaptionWidth;
694 /* These tests hang when XFree86 4.0 for Windows is running (tested on
695 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
698 if (FindWindowA( NULL, "Cygwin/XFree86" ))
701 trace("testing SPI_{GET,SET}BORDER\n");
703 SetLastError(0xdeadbeef);
704 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
705 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
707 /* This will restore sane values if the test hang previous run. */
708 if ( old_border == 7 || old_border == 20 )
711 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
712 * do it twice to make the intended change). So skip parts of the tests on
715 test_setborder(1, 1, dpi);
716 test_setborder(0, 1, dpi);
717 test_setborder(2, 1, dpi);
719 test_setborder(1, 0, dpi);
720 test_setborder(0, 0, dpi);
721 test_setborder(3, 0, dpi);
723 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
724 SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);
725 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
726 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",
730 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
734 const UINT vals[]={0,20,31};
737 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
738 SetLastError(0xdeadbeef);
739 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
740 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
743 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
748 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
749 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
750 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
751 test_change_message( SPI_SETKEYBOARDSPEED, 0 );
752 sprintf( buf, "%d", vals[i] );
753 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
755 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
756 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
757 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
760 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
761 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
764 /* test_SPI_ICONHORIZONTALSPACING helper */
765 static void dotest_spi_iconhorizontalspacing( INT curr_val)
771 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
772 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
773 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
774 test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
775 if( curr_val < 32) curr_val = 32;
776 /* The registry keys depend on the Windows version and the values too
777 * let's test (works on win95,ME,NT4,2k,XP)
779 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
780 if( regval != curr_val)
781 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
782 ok( curr_val == regval,
783 "wrong value in registry %d, expected %d\n", regval, curr_val);
784 /* compare with what SPI_ICONHORIZONTALSPACING returns */
785 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
786 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
787 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
788 /* and with a system metrics */
789 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
790 /* and with what SPI_GETICONMETRICS returns */
791 im.cbSize = sizeof(ICONMETRICSA);
792 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
793 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
794 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
797 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
802 trace("testing SPI_ICONHORIZONTALSPACING\n");
803 SetLastError(0xdeadbeef);
804 /* default value: 75 */
805 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
806 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
808 /* do not increase the value as it would upset the user's icon layout */
809 dotest_spi_iconhorizontalspacing( old_spacing - 1);
810 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
812 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
813 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
816 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
820 const UINT vals[]={0,32767};
823 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
824 SetLastError(0xdeadbeef);
825 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
826 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
829 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
834 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
835 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
836 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
837 test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
838 sprintf( buf, "%d", vals[i] );
839 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
840 SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
842 SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
843 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
844 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
847 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
848 SPIF_UPDATEINIFILE );
849 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
852 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
856 const UINT vals[]={TRUE,FALSE};
859 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
860 SetLastError(0xdeadbeef);
861 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
862 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
865 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
869 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
870 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
871 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
872 test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
873 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
874 SPI_SETSCREENSAVEACTIVE_VALNAME,
875 vals[i] ? "1" : "0" );
877 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
878 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
879 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVEACTIVE", "%d" );
882 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
883 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
886 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
891 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
895 const UINT vals[]={0,3};
898 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
899 SetLastError(0xdeadbeef);
900 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
901 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
904 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
909 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
910 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
911 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
912 test_change_message( SPI_SETKEYBOARDDELAY, 0 );
913 sprintf( buf, "%d", vals[i] );
914 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
915 SPI_SETKEYBOARDDELAY_VALNAME, buf );
917 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
918 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
919 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
922 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
923 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
927 /* test_SPI_ICONVERTICALSPACING helper */
928 static void dotest_spi_iconverticalspacing( INT curr_val)
934 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
935 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
936 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
937 test_change_message( SPI_ICONVERTICALSPACING, 0 );
938 if( curr_val < 32) curr_val = 32;
939 /* The registry keys depend on the Windows version and the values too
940 * let's test (works on win95,ME,NT4,2k,XP)
942 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2, SPI_ICONVERTICALSPACING_VALNAME, dpi);
943 if( regval != curr_val)
944 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
945 ok( curr_val == regval,
946 "wrong value in registry %d, expected %d\n", regval, curr_val);
947 /* compare with what SPI_ICONVERTICALSPACING returns */
948 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
949 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
950 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
951 /* and with a system metrics */
952 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
953 /* and with what SPI_GETICONMETRICS returns */
954 im.cbSize = sizeof(ICONMETRICSA);
955 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
956 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
957 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
960 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
965 trace("testing SPI_ICONVERTICALSPACING\n");
966 SetLastError(0xdeadbeef);
967 /* default value: 75 */
968 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
969 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
971 /* do not increase the value as it would upset the user's icon layout */
972 dotest_spi_iconverticalspacing( old_spacing - 1);
973 /* same tests with a value less than the minimum 32 */
974 dotest_spi_iconverticalspacing( 10);
976 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
977 SPIF_UPDATEINIFILE );
978 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",
982 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
986 const UINT vals[]={TRUE,FALSE};
990 /* These tests hang when XFree86 4.0 for Windows is running (tested on
991 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
994 if (FindWindowA( NULL, "Cygwin/XFree86" ))
997 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
998 SetLastError(0xdeadbeef);
999 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1000 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1003 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1008 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
1009 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1010 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1011 test_change_message( SPI_SETICONTITLEWRAP, 1 );
1012 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
1013 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1014 if( regval != vals[i])
1015 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
1016 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1017 ok( regval == vals[i],
1018 "wrong value in registry %d, expected %d\n", regval, vals[i] );
1020 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
1021 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1022 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1023 /* and test with what SPI_GETICONMETRICS returns */
1024 im.cbSize = sizeof(ICONMETRICSA);
1025 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1026 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1027 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1030 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
1031 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1034 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1038 const UINT vals[]={TRUE,FALSE};
1041 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1042 SetLastError(0xdeadbeef);
1043 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
1044 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1047 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1051 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
1052 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1053 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1054 test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
1055 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
1056 SPI_SETMENUDROPALIGNMENT_REGKEY2,
1057 SPI_SETMENUDROPALIGNMENT_VALNAME,
1058 vals[i] ? "1" : "0" );
1060 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
1061 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1062 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1063 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1064 "SM_MENUDROPALIGNMENT", "%d" );
1067 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
1068 SPIF_UPDATEINIFILE );
1069 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1072 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1076 const UINT vals[]={0,10000};
1079 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1080 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1082 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1086 SetLastError(0xdeadbeef);
1087 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
1088 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1089 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1092 test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
1093 sprintf( buf, "%d", vals[i] );
1094 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
1095 SPI_SETDOUBLECLKWIDTH_REGKEY2,
1096 SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
1097 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1098 "SM_CXDOUBLECLK", "%d" );
1101 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
1102 SPIF_UPDATEINIFILE );
1103 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1106 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1110 const UINT vals[]={0,10000};
1113 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1114 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1116 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1120 SetLastError(0xdeadbeef);
1121 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
1122 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1123 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1126 test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
1127 sprintf( buf, "%d", vals[i] );
1128 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
1129 SPI_SETDOUBLECLKHEIGHT_REGKEY2,
1130 SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
1131 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1132 "SM_CYDOUBLECLK", "%d" );
1135 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
1136 SPIF_UPDATEINIFILE );
1137 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1140 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1148 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1149 old_time = GetDoubleClickTime();
1152 SetLastError(0xdeadbeef);
1153 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1154 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1155 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1158 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1159 sprintf( buf, "%d", curr_val );
1160 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1161 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1162 curr_val = 500; /* used value for 0 */
1163 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1166 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1167 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1168 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1169 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1170 sprintf( buf, "%d", curr_val );
1171 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1172 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1173 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1175 saved_val = curr_val;
1178 SetDoubleClickTime( curr_val );
1179 sprintf( buf, "%d", saved_val );
1180 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1181 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1182 curr_val = 500; /* used value for 0 */
1183 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1186 SetDoubleClickTime( curr_val );
1187 sprintf( buf, "%d", saved_val );
1188 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1189 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1190 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1192 rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
1193 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1196 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1200 const UINT vals[]={TRUE,FALSE};
1203 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1204 old_b = GetSystemMetrics( SM_SWAPBUTTON );
1206 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1208 SetLastError(0xdeadbeef);
1209 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
1210 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1211 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEBUTTONSWAP"))
1214 test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
1215 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
1216 SPI_SETMOUSEBUTTONSWAP_VALNAME,
1217 vals[i] ? "1" : "0" );
1218 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1219 "SM_SWAPBUTTON", "%d" );
1220 rc=SwapMouseButton((BOOL)vals[i^1]);
1221 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1222 "SwapMouseButton", "%d" );
1223 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1226 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
1227 SPIF_UPDATEINIFILE );
1228 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1231 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1236 trace("testing SPI_GETFASTTASKSWITCH\n");
1237 SetLastError(0xdeadbeef);
1238 rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
1239 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1242 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1243 * works. That sure simplifies testing!
1247 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1251 const UINT vals[]={TRUE,FALSE};
1254 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1255 SetLastError(0xdeadbeef);
1256 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1258 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1259 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1262 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1266 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1267 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1268 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1269 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1270 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
1271 SPI_SETDRAGFULLWINDOWS_VALNAME,
1272 vals[i] ? "1" : "0" );
1274 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1275 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1276 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1279 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1280 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1283 #define test_reg_metric( KEY, VAL, val) \
1285 regval = metricfromreg( KEY, VAL, dpi);\
1286 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1289 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1291 regval = metricfromreg( KEY1, VAL, dpi);\
1292 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1293 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1296 #define test_reg_font( KEY, VAL, LF) \
1298 lffromreg( KEY, VAL, &lfreg);\
1299 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == lfreg.lfHeight :\
1300 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1301 (LF).lfWidth == lfreg.lfWidth &&\
1302 (LF).lfWeight == lfreg.lfWeight &&\
1303 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1304 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1307 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1308 test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);\
1309 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1310 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1311 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1312 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1313 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1314 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1315 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1316 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1317 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1318 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1319 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1320 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1321 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1323 /* get text metric height value for the specified logfont */
1324 static int get_tmheight( LOGFONTA *plf, int flag)
1327 HFONT hfont = CreateFontIndirectA( plf);
1328 hfont = SelectObject( hdc, hfont);
1329 GetTextMetricsA( hdc, &tm);
1330 hfont = SelectObject( hdc, hfont);
1331 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1334 void test_GetSystemMetrics( void);
1336 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1340 NONCLIENTMETRICSA Ncmorig;
1341 NONCLIENTMETRICSA Ncmnew;
1342 NONCLIENTMETRICSA Ncmcur;
1343 NONCLIENTMETRICSA Ncmstart;
1345 Ncmorig.cbSize = sizeof(NONCLIENTMETRICSA);
1346 Ncmnew.cbSize = sizeof(NONCLIENTMETRICSA);
1347 Ncmcur.cbSize = sizeof(NONCLIENTMETRICSA);
1348 Ncmstart.cbSize = sizeof(NONCLIENTMETRICSA);
1350 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1351 SetLastError(0xdeadbeef);
1352 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmorig, FALSE );
1353 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1356 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1357 the caption font height is higher than the CaptionHeight field,
1358 the latter is adjusted accordingly. To be able to restore these setting
1359 accurately be restore the raw values. */
1360 Ncmorig.iCaptionWidth = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, dpi);
1361 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1362 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1363 Ncmorig.iMenuHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, dpi);
1364 /* test registry entries */
1365 TEST_NONCLIENTMETRICS_REG( Ncmorig)
1366 /* make small changes */
1368 Ncmnew.iBorderWidth += 1;
1369 Ncmnew.iScrollWidth += 1;
1370 Ncmnew.iScrollHeight -= 1;
1371 Ncmnew.iCaptionWidth -= 2;
1372 Ncmnew.iCaptionHeight += 2;
1373 Ncmnew.lfCaptionFont.lfHeight +=1;
1374 Ncmnew.lfCaptionFont.lfWidth +=2;
1375 Ncmnew.lfCaptionFont.lfWeight +=1;
1376 Ncmnew.iSmCaptionWidth += 1;
1377 Ncmnew.iSmCaptionHeight += 2;
1378 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1379 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1380 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1381 Ncmnew.iMenuWidth += 1;
1382 Ncmnew.iMenuHeight += 2;
1383 Ncmnew.lfMenuFont.lfHeight +=1;
1384 Ncmnew.lfMenuFont.lfWidth +=1;
1385 Ncmnew.lfMenuFont.lfWeight +=2;
1386 Ncmnew.lfStatusFont.lfHeight -=1;
1387 Ncmnew.lfStatusFont.lfWidth -=1;
1388 Ncmnew.lfStatusFont.lfWeight +=3;
1389 Ncmnew.lfMessageFont.lfHeight -=2;
1390 Ncmnew.lfMessageFont.lfWidth -=1;
1391 Ncmnew.lfMessageFont.lfWeight +=4;
1393 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1395 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1396 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1398 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmcur, FALSE );
1399 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1400 /* test registry entries */
1401 TEST_NONCLIENTMETRICS_REG( Ncmcur)
1402 /* test the systemm metrics with these settings */
1403 test_GetSystemMetrics();
1404 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1405 by a large amount will increase the {menu|caption|smcaption} height*/
1407 Ncmnew.lfMenuFont.lfHeight -= 8;
1408 Ncmnew.lfCaptionFont.lfHeight =-4;
1409 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1410 /* also show that a few values are lo limited */
1411 Ncmnew.iCaptionWidth = 0;
1412 Ncmnew.iCaptionHeight = 0;
1413 Ncmnew.iScrollHeight = 0;
1414 Ncmnew.iScrollWidth = 0;
1416 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1418 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1419 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1420 /* raw values are in registry */
1421 TEST_NONCLIENTMETRICS_REG( Ncmnew)
1423 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &Ncmcur, FALSE );
1424 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1425 /* cooked values are returned */
1426 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1427 ok( Ncmcur.iMenuHeight == expect,
1428 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1429 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1430 ok( Ncmcur.iCaptionHeight == expect,
1431 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1432 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1433 ok( Ncmcur.iSmCaptionHeight == expect,
1434 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1436 ok( Ncmcur.iCaptionWidth == 8 ||
1437 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1438 "CaptionWidth: %d expected 8\n", Ncmcur.iCaptionWidth);
1439 ok( Ncmcur.iScrollWidth == 8,
1440 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1441 ok( Ncmcur.iScrollHeight == 8,
1442 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1443 /* test the systemm metrics with these settings */
1444 test_GetSystemMetrics();
1446 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),
1447 &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1448 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1449 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1452 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1456 MINIMIZEDMETRICS lpMm_orig;
1457 MINIMIZEDMETRICS lpMm_new;
1458 MINIMIZEDMETRICS lpMm_cur;
1460 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1461 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1462 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1464 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1465 SetLastError(0xdeadbeef);
1466 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1467 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1469 /* Test registry. Note that it is perfectly valid for some fields to
1472 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1473 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1474 regval, lpMm_orig.iWidth);
1475 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1476 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1477 regval, lpMm_orig.iHorzGap);
1478 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1479 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1480 regval, lpMm_orig.iVertGap);
1481 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1482 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1483 regval, lpMm_orig.iArrange);
1484 /* set some new values */
1485 lpMm_cur.iWidth = 180;
1486 lpMm_cur.iHorzGap = 1;
1487 lpMm_cur.iVertGap = 1;
1488 lpMm_cur.iArrange = 5;
1489 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1490 &lpMm_cur, SPIF_UPDATEINIFILE );
1491 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1492 /* read them back */
1493 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1494 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1496 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1497 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1498 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1499 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1501 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1502 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1503 regval, lpMm_new.iWidth);
1504 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1505 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1506 regval, lpMm_new.iHorzGap);
1507 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1508 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1509 regval, lpMm_new.iVertGap);
1510 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1511 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1512 regval, lpMm_new.iArrange);
1513 /* test some system metrics */
1514 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1515 lpMm_new.iWidth, "iWidth", "%d" );
1516 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1517 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1518 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1519 lpMm_new.iVertGap, "iVertGap", "%d" );
1520 eq( GetSystemMetrics( SM_ARRANGE ),
1521 lpMm_new.iArrange, "iArrange", "%d" );
1522 /* now some realy invalid settings */
1523 lpMm_cur.iWidth = -1;
1524 lpMm_cur.iHorzGap = -1;
1525 lpMm_cur.iVertGap = -1;
1526 lpMm_cur.iArrange = - 1;
1527 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1528 &lpMm_cur, SPIF_UPDATEINIFILE );
1529 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1531 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1532 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1533 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1534 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1535 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1536 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1537 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1539 #if 0 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1540 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1541 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1542 regval, lpMm_new.iWidth);
1543 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1544 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1545 regval, lpMm_new.iHorzGap);
1546 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1547 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1548 regval, lpMm_new.iVertGap);
1549 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1550 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1551 regval, lpMm_new.iArrange);
1553 /* test some system metrics */
1554 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1555 lpMm_new.iWidth, "iWidth", "%d" );
1556 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1557 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1558 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1559 lpMm_new.iVertGap, "iVertGap", "%d" );
1560 eq( GetSystemMetrics( SM_ARRANGE ),
1561 lpMm_new.iArrange, "iArrange", "%d" );
1563 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1564 &lpMm_orig, SPIF_UPDATEINIFILE );
1565 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1567 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1568 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1569 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1570 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1571 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1572 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1575 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1579 ICONMETRICSA im_orig;
1580 ICONMETRICSA im_new;
1581 ICONMETRICSA im_cur;
1584 im_orig.cbSize = sizeof(ICONMETRICSA);
1585 im_new.cbSize = sizeof(ICONMETRICSA);
1586 im_cur.cbSize = sizeof(ICONMETRICSA);
1588 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1589 SetLastError(0xdeadbeef);
1590 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1591 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1593 /* check some registry values */
1594 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1595 ok( regval==im_orig.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1596 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1597 ok( regval==im_orig.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1598 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1599 if( regval != im_orig.iTitleWrap)
1600 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1601 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1603 /* change everything without creating something invalid ( Win9x would ignore
1604 * an invalid font for instance) */
1606 im_cur.iHorzSpacing += 10;
1607 im_cur.iVertSpacing += 6;
1608 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1609 im_cur.lfFont.lfHeight += 1;
1610 im_cur.lfFont.lfWidth += 2;
1611 im_cur.lfFont.lfEscapement = 1;
1612 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1613 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1614 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1615 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1616 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1617 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1618 OUT_TT_PRECIS : OUT_DEFAULT_PRECIS;
1619 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1620 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1621 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1622 DRAFT_QUALITY : DEFAULT_QUALITY;
1623 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1624 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1626 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1628 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1629 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1631 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1632 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1633 /* test GET <-> SETICONMETRICS */
1634 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1635 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1636 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1637 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%d" );
1638 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%d" );
1639 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%d" );
1640 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%d" );
1641 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1642 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1643 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1644 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1645 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1646 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1647 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1648 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1649 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1650 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1651 im_cur.lfFont.lfFaceName);
1652 /* test some system metrics */
1653 eq( GetSystemMetrics( SM_CXICONSPACING ),
1654 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1655 eq( GetSystemMetrics( SM_CYICONSPACING ),
1656 im_new.iVertSpacing, "iVertSpacing", "%d" );
1657 /* check some registry values */
1658 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1659 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1660 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1661 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1662 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1663 if( regval != im_cur.iTitleWrap)
1664 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1665 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1666 /* test some values from other SPI_GETxxx calls */
1667 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1668 ok( rc && spacing == im_cur.iHorzSpacing,
1669 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1670 spacing, im_cur.iHorzSpacing);
1671 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1672 ok( rc && spacing == im_cur.iVertSpacing,
1673 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1674 spacing, im_cur.iVertSpacing);
1675 rc = SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &wrap, 0 );
1676 ok( rc && wrap == im_cur.iTitleWrap,
1677 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1678 wrap, im_cur.iTitleWrap);
1679 /* restore old values */
1680 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1681 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1683 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1684 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1686 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1687 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1688 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1691 static void test_SPI_SETWORKAREA( void ) /* 47 */
1698 trace("testing SPI_{GET,SET}WORKAREA\n");
1699 SetLastError(0xdeadbeef);
1700 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1701 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1704 /* Modify the work area only minimally as this causes the icons that
1705 * fall outside it to be moved around thus requiring the user to
1706 * reposition them manually one by one.
1707 * Changing the work area by just one pixel should make this occurrence
1708 * reasonably unlikely.
1710 curr_val.left = old_area.left;
1711 curr_val.top = old_area.top;
1712 curr_val.right = old_area.right-1;
1713 curr_val.bottom = old_area.bottom-1;
1714 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1715 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1716 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1717 test_change_message( SPI_SETWORKAREA, 0 );
1718 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1719 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1720 eq( area.left, curr_val.left, "left", "%d" );
1721 eq( area.top, curr_val.top, "top", "%d" );
1722 eq( area.right, curr_val.right, "right", "%d" );
1723 eq( area.bottom, curr_val.bottom, "bottom", "%d" );
1725 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1726 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1727 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1728 test_change_message( SPI_SETWORKAREA, 0 );
1729 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1730 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
1731 eq( area.left, old_area.left, "left", "%d" );
1732 eq( area.top, old_area.top, "top", "%d" );
1733 eq( area.right, old_area.right, "right", "%d" );
1734 eq( area.bottom, old_area.bottom, "bottom", "%d" );
1737 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1741 const UINT vals[]={TRUE,FALSE};
1744 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1745 SetLastError(0xdeadbeef);
1746 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1747 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1748 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1751 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1755 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1756 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1757 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1758 test_change_message( SPI_SETSHOWSOUNDS, 0 );
1759 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1760 SPI_SETSHOWSOUNDS_VALNAME,
1761 vals[i] ? "1" : "0" );
1763 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1764 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1765 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1766 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1767 "SM_SHOWSOUNDS", "%d" );
1770 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1771 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1774 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1778 const UINT vals[]={TRUE,FALSE};
1781 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1782 SetLastError(0xdeadbeef);
1783 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1784 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1787 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1791 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1792 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1793 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1794 test_change_message( SPI_SETKEYBOARDPREF, 0 );
1795 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY,
1796 SPI_SETKEYBOARDPREF_VALNAME, SPI_SETKEYBOARDPREF_VALNAME_LEGACY,
1797 vals[i] ? "1" : "0" );
1799 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1800 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1801 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1804 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1805 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1808 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1812 const UINT vals[]={TRUE,FALSE};
1815 trace("testing SPI_{GET,SET}SCREENREADER\n");
1816 SetLastError(0xdeadbeef);
1817 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1818 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
1821 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1825 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
1826 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1827 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1828 test_change_message( SPI_SETSCREENREADER, 0 );
1829 test_reg_key_ex2( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY,
1830 SPI_SETSCREENREADER_VALNAME, SPI_SETSCREENREADER_VALNAME_LEGACY,
1831 vals[i] ? "1" : "0" );
1833 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
1834 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1835 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
1838 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
1839 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1842 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
1846 const UINT vals[]={0xffffffff,0,1,2};
1849 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
1850 if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */
1851 SetLastError(0xdeadbeef);
1852 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
1853 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
1856 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1860 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
1861 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1862 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1863 test_change_message( SPI_SETFONTSMOOTHING, 0 );
1864 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
1865 SPI_SETFONTSMOOTHING_VALNAME,
1866 vals[i] ? "2" : "0" );
1868 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
1869 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1870 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
1873 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
1874 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1877 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
1881 const UINT vals[]={TRUE,FALSE};
1884 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
1885 SetLastError(0xdeadbeef);
1886 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
1887 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
1890 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1894 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
1895 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1896 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1897 test_change_message( SPI_SETLOWPOWERACTIVE, 0 );
1898 test_reg_key( SPI_SETLOWPOWERACTIVE_REGKEY,
1899 SPI_SETLOWPOWERACTIVE_VALNAME,
1900 vals[i] ? "1" : "0" );
1902 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
1903 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1904 eq( v, vals[i], "SPI_GETLOWPOWERACTIVE", "%d" );
1907 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1908 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1911 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
1915 const UINT vals[]={TRUE,FALSE};
1918 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
1919 SetLastError(0xdeadbeef);
1920 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
1921 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
1924 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1928 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
1929 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1930 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1931 test_change_message( SPI_SETPOWEROFFACTIVE, 0 );
1932 test_reg_key( SPI_SETPOWEROFFACTIVE_REGKEY,
1933 SPI_SETPOWEROFFACTIVE_VALNAME,
1934 vals[i] ? "1" : "0" );
1936 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
1937 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1938 eq( v, vals[i], "SPI_GETPOWEROFFACTIVE", "%d" );
1941 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1942 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1945 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
1949 const UINT vals[]={0,32767};
1952 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
1953 SetLastError(0xdeadbeef);
1954 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
1955 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
1956 * what MSDN states (Verified on Win98SE)
1958 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
1961 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1966 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
1967 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1968 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1969 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
1970 sprintf( buf, "%d", vals[i] );
1971 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
1972 SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
1974 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
1975 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
1976 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
1979 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
1980 SPIF_UPDATEINIFILE );
1981 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
1984 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
1988 const UINT vals[]={0,32767};
1991 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
1992 SetLastError(0xdeadbeef);
1993 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
1994 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
1995 * what MSDN states (Verified on Win98SE)
1997 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2000 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2005 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2006 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2007 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2008 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2009 sprintf( buf, "%d", vals[i] );
2010 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
2011 SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
2013 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2014 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2015 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2018 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2019 SPIF_UPDATEINIFILE );
2020 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2023 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2028 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2029 * defaulted to a value of 10 automatically.
2031 const UINT vals[]={10,32767};
2034 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2035 SetLastError(0xdeadbeef);
2036 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2037 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2038 * what MSDN states (Verified on Win98SE)
2040 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2043 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2048 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2049 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2050 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2051 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2052 sprintf( buf, "%d", vals[i] );
2053 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
2054 SPI_SETMOUSEHOVERTIME_VALNAME, buf );
2056 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2057 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2058 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2061 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2062 SPIF_UPDATEINIFILE );
2063 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2066 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2070 const UINT vals[]={0,32767};
2073 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2074 SetLastError(0xdeadbeef);
2075 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2077 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2078 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2081 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2086 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
2087 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2088 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2089 test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
2090 sprintf( buf, "%d", vals[i] );
2091 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
2092 SPI_SETMOUSESCROLLLINES_VALNAME, buf );
2094 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2095 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2096 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2099 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
2100 SPIF_UPDATEINIFILE );
2101 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2104 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2108 const UINT vals[]={0,32767};
2111 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2112 SetLastError(0xdeadbeef);
2113 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2115 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2116 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2119 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2124 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2125 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2126 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2127 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2128 sprintf( buf, "%d", vals[i] );
2129 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
2130 SPI_SETMENUSHOWDELAY_VALNAME, buf );
2132 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2133 ok(rc!=0,"%d: rc=%d err=%d\n",i,rc,GetLastError());
2134 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2137 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2138 SPIF_UPDATEINIFILE );
2139 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2142 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2148 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2149 SetLastError(0xdeadbeef);
2150 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2151 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2152 * unimplemented on NT4
2154 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2158 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
2159 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
2160 test_change_message(SPI_SETDESKWALLPAPER, 0);
2162 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
2163 ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%d\n",rc,GetLastError());
2165 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
2169 * Registry entries for the system parameters.
2170 * Names are created by 'SET' flags names.
2171 * We assume that corresponding 'GET' entries use the same registry keys.
2173 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
2175 test_SPI_SETBEEP(); /* 1 */
2176 test_SPI_SETMOUSE(); /* 4 */
2177 test_SPI_SETBORDER(); /* 6 */
2178 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2179 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2180 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2181 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2182 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2183 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2184 test_SPI_ICONVERTICALSPACING(); /* 24 */
2185 test_SPI_SETICONTITLEWRAP(); /* 26 */
2186 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2187 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2188 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2189 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2190 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2191 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2192 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2193 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2194 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2195 test_SPI_SETICONMETRICS(); /* 46 */
2196 test_SPI_SETWORKAREA(); /* 47 */
2197 test_SPI_SETSHOWSOUNDS(); /* 57 */
2198 test_SPI_SETKEYBOARDPREF(); /* 69 */
2199 test_SPI_SETSCREENREADER(); /* 71 */
2200 test_SPI_SETFONTSMOOTHING(); /* 75 */
2201 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2202 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2203 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2204 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2205 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2206 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2207 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2208 test_SPI_SETWALLPAPER(); /* 115 */
2209 SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
2213 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2214 * icon metrics and minimized metrics.
2217 /* copied from wine's GdiGetCharDimensions, which is not available on most
2218 * windows versions */
2219 static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
2222 static const CHAR alphabet[] = {
2223 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2224 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2225 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2227 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2229 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2231 if (height) *height = sz.cy;
2232 return (sz.cx / 26 + 1) / 2;
2235 /* get text metrics and/or "average" char width of the specified logfont
2236 * for the specified dc */
2237 void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2239 HFONT hfont, hfontsav;
2241 if( !ptm) ptm = &tm;
2242 hfont = CreateFontIndirectA( plf);
2243 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2246 if( hfont) DeleteObject( hfont);
2249 GetTextMetricsA( hdc, ptm);
2251 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2253 SelectObject( hdc, hfontsav);
2254 DeleteObject( hfont);
2257 static int gsm_error_ctr;
2258 static UINT smcxsmsize = 999999999;
2260 #define ok_gsm( i, e)\
2263 int act = GetSystemMetrics( (i));\
2264 if( exp != act) gsm_error_ctr++;\
2265 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2267 #define ok_gsm_2( i, e1, e2)\
2271 int act = GetSystemMetrics( (i));\
2272 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2273 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2275 #define ok_gsm_3( i, e1, e2, e3)\
2280 int act = GetSystemMetrics( (i));\
2281 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2282 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2285 void test_GetSystemMetrics( void)
2287 TEXTMETRICA tmMenuFont;
2288 UINT IconSpacing, IconVerticalSpacing;
2290 HDC hdc = CreateIC( "Display", 0, 0, 0);
2293 MINIMIZEDMETRICS minim;
2294 NONCLIENTMETRICS ncm;
2295 minim.cbSize = sizeof( minim);
2296 ncm.cbSize = sizeof( ncm);
2297 SystemParametersInfo( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2298 SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2300 /* CaptionWidth from the registry may have different value of iCaptionWidth
2301 * from the non client metrics (observed on WinXP) */
2302 CaptionWidth = metricfromreg(
2303 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2304 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2305 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2306 /* FIXME: use icon metric */
2307 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2308 IconVerticalSpacing = 0;
2309 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2311 /* reset error counters */
2316 /* SM_CXSCREEN, cannot test these two */
2318 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2319 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2320 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2321 ok_gsm( SM_CXBORDER, 1);
2322 ok_gsm( SM_CYBORDER, 1);
2323 ok_gsm( SM_CXDLGFRAME, 3);
2324 ok_gsm( SM_CYDLGFRAME, 3);
2325 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2326 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2331 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2332 ok_gsm( SM_CXFULLSCREEN,
2333 GetSystemMetrics( SM_CXMAXIMIZED) - 2 * GetSystemMetrics( SM_CXFRAME));
2334 ok_gsm( SM_CYFULLSCREEN,
2335 GetSystemMetrics( SM_CYMAXIMIZED) - GetSystemMetrics( SM_CYMIN));
2336 /* SM_CYKANJIWINDOW */
2337 /* SM_MOUSEPRESENT */
2338 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2339 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2346 ok_gsm( SM_CXMIN, 3 * max( CaptionWidth, 8) + GetSystemMetrics( SM_CYSIZE) +
2347 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2348 ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) +
2349 2 * GetSystemMetrics( SM_CYFRAME));
2350 ok_gsm_2( SM_CXSIZE,
2351 ncm.iCaptionWidth, /* classic/standard windows style */
2352 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2354 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2355 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2356 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2357 ok_gsm( SM_CXMINTRACK, GetSystemMetrics( SM_CXMIN));
2358 ok_gsm( SM_CYMINTRACK, GetSystemMetrics( SM_CYMIN));
2359 /* SM_CXDOUBLECLK */
2360 /* SM_CYDOUBLECLK */
2361 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2362 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2363 /* SM_MENUDROPALIGNMENT */
2365 /* SM_DBCSENABLED */
2366 /* SM_CMOUSEBUTTONS */
2368 ok_gsm( SM_CXEDGE, 2);
2369 ok_gsm( SM_CYEDGE, 2);
2370 ok_gsm( SM_CXMINSPACING, GetSystemMetrics( SM_CXMINIMIZED) + minim.iHorzGap );
2371 ok_gsm( SM_CYMINSPACING, GetSystemMetrics( SM_CYMINIMIZED) + minim.iVertGap );
2374 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2375 ok_gsm_3( SM_CXSMSIZE,
2376 ncm.iSmCaptionWidth, /* classic/standard windows style */
2377 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2378 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2379 does not change it */
2381 ok_gsm( SM_CYSMSIZE, GetSystemMetrics( SM_CYSMCAPTION) - 1);
2382 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2383 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2385 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2386 ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
2387 ok_gsm( SM_CXMAXTRACK, GetSystemMetrics( SM_CXSCREEN) +
2388 4 + 2 * GetSystemMetrics( SM_CXFRAME));
2389 ok_gsm( SM_CYMAXTRACK, GetSystemMetrics( SM_CYSCREEN) +
2390 4 + 2 * GetSystemMetrics( SM_CYFRAME));
2391 /* the next two cannot really be tested as they depend on (application)
2393 /* SM_CXMAXIMIZED */
2394 /* SM_CYMAXIMIZED */
2403 ok_gsm( SM_CXMENUCHECK,
2404 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2405 ok_gsm( SM_CYMENUCHECK,
2406 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2407 /* SM_SLOWMACHINE */
2408 /* SM_MIDEASTENABLED */
2409 /* SM_MOUSEWHEELPRESENT */
2410 /* SM_XVIRTUALSCREEN */
2411 /* SM_YVIRTUALSCREEN */
2412 /* SM_CXVIRTUALSCREEN */
2413 /* SM_CYVIRTUALSCREEN */
2415 /* SM_SAMEDISPLAYFORMAT */
2417 /* SM_CXFOCUSBORDER */
2418 /* SM_CYFOCUSBORDER */
2420 /* SM_MEDIACENTER */
2423 if( gsm_error_ctr ) { /* if any errors where found */
2424 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2425 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2426 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2427 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2428 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d\n",
2429 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidth);
2434 START_TEST(sysparams)
2442 HANDLE hInstance = GetModuleHandleA( NULL );
2445 dpi = GetDeviceCaps( hdc, LOGPIXELSY);
2446 iswin9x = GetVersion() & 0x80000000;
2448 /* This test requires interactivity, if we don't have it, give up */
2449 if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
2450 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
2452 argc = winetest_get_mainargs(&argv);
2453 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
2454 trace("strict=%d\n",strict);
2456 trace("testing GetSystemMetrics with your current desktop settings\n");
2457 test_GetSystemMetrics( );
2460 change_last_param = 0;
2462 wc.lpszClassName = "SysParamsTestClass";
2463 wc.lpfnWndProc = SysParamsTestWndProc;
2464 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
2465 wc.hInstance = hInstance;
2466 wc.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION );
2467 wc.hCursor = LoadCursorA( 0, (LPSTR)IDC_ARROW );
2468 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1 );
2469 wc.lpszMenuName = 0;
2472 RegisterClassA( &wc );
2474 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
2475 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
2477 hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
2479 CloseHandle( hThread );
2481 while( GetMessageA( &msg, 0, 0, 0 )) {
2482 TranslateMessage( &msg );
2483 DispatchMessageA( &msg );