user32/tests: Fix a few failures in DPI scaling mode.
[wine.git] / dlls / user32 / tests / sysparams.c
blob055060e43782b30e88337db2f68ed066bb765dcb
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
20 #define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */
21 #define _WIN32_IE 0x0700
22 #define WINVER 0x0600 /* For COLOR_MENUBAR, NONCLIENTMETRICS with padding */
24 #include <assert.h>
25 #include <stdlib.h>
26 #include <stdarg.h>
27 #include <stdio.h>
29 #include "wine/test.h"
30 #include "windef.h"
31 #include "winbase.h"
32 #include "wingdi.h"
33 #include "winreg.h"
34 #include "winuser.h"
35 #include "winnls.h"
37 #ifndef SPI_GETDESKWALLPAPER
38 # define SPI_GETDESKWALLPAPER 0x0073
39 #endif
41 static LONG (WINAPI *pChangeDisplaySettingsExA)(LPCSTR, LPDEVMODEA, HWND, DWORD, LPVOID);
43 static BOOL strict;
44 static int dpi, real_dpi;
45 static BOOL iswin9x;
46 static HDC hdc;
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_SETFONTSMOOTHINGTYPE_VALNAME "FontSmoothingType"
128 #define SPI_SETFONTSMOOTHINGCONTRAST_VALNAME "FontSmoothingGamma"
129 #define SPI_SETFONTSMOOTHINGORIENTATION_VALNAME "FontSmoothingOrientation"
130 #define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
131 #define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
132 #define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
133 #define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
134 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
135 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
136 #define SPI_SETSNAPTODEFBUTTON_REGKEY "Control Panel\\Mouse"
137 #define SPI_SETSNAPTODEFBUTTON_VALNAME "SnapToDefaultButton"
138 #define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
139 #define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
140 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
141 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
142 #define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
143 #define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
144 #define SPI_SETMOUSESCROLLCHARS_REGKEY "Control Panel\\Desktop"
145 #define SPI_SETMOUSESCROLLCHARS_VALNAME "WheelScrollChars"
146 #define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
147 #define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
148 #define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
149 #define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
150 #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
151 #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
153 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
154 #define WINE_CURRENT_USER_REGKEY "Wine"
156 static HWND ghTestWnd;
158 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
159 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
160 LPARAM lParam );
161 static int change_counter;
162 static int change_setworkarea_param, change_iconverticalspacing_param;
163 static int change_last_param;
164 static int last_bpp;
165 static BOOL displaychange_ok = FALSE, displaychange_test_active = FALSE;
166 static HANDLE displaychange_sem = 0;
168 static int get_real_dpi(void)
170 HKEY key;
171 DWORD value = USER_DEFAULT_SCREEN_DPI, size = sizeof(value);
173 if (!RegOpenKeyA(HKEY_CURRENT_USER, "Control Panel\\Desktop", &key))
175 RegQueryValueExA(key, "LogPixels", NULL, NULL, (BYTE *)&value, &size);
176 RegCloseKey(key);
178 return value;
181 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
182 LPARAM lParam )
184 switch (msg) {
186 case WM_DISPLAYCHANGE:
187 ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
188 last_bpp = wParam;
189 displaychange_ok = FALSE;
190 ReleaseSemaphore(displaychange_sem, 1, 0);
191 break;
193 case WM_SETTINGCHANGE:
194 if (change_counter>0) {
195 /* ignore these messages caused by resizing of toolbars */
196 if( wParam == SPI_SETWORKAREA){
197 change_setworkarea_param = 1;
198 break;
199 } else if( wParam == SPI_ICONVERTICALSPACING) {
200 change_iconverticalspacing_param = 1;
201 break;
202 } else if( displaychange_test_active)
203 break;
204 if( !change_last_param){
205 change_last_param = wParam;
206 break;
208 ok(0,"too many changes counter=%d last change=%d\n",
209 change_counter,change_last_param);
210 change_counter++;
211 change_last_param = wParam;
212 break;
214 change_counter++;
215 change_last_param = change_setworkarea_param = change_iconverticalspacing_param =0;
216 if( wParam == SPI_SETWORKAREA)
217 change_setworkarea_param = 1;
218 else if( wParam == SPI_ICONVERTICALSPACING)
219 change_iconverticalspacing_param = 1;
220 else
221 change_last_param = wParam;
222 break;
224 case WM_DESTROY:
225 PostQuitMessage( 0 );
226 break;
228 /* drop through */
229 default:
230 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
233 return 0;
237 Performs testing for system parameters messages
238 params:
239 - system parameter id
240 - supposed value of the registry key
242 static void test_change_message( int action, int optional )
244 if (change_counter==0 && optional==1)
245 return;
246 ok( 1 == change_counter,
247 "Missed a message: change_counter=%d\n", change_counter );
248 change_counter = 0;
249 ok( action == change_last_param ||
250 ( change_setworkarea_param && action == SPI_SETWORKAREA) ||
251 ( change_iconverticalspacing_param && action == SPI_ICONVERTICALSPACING),
252 "Wrong action got %d expected %d\n", change_last_param, action );
253 change_last_param = 0;
256 static BOOL test_error_msg ( int rc, const char *name )
258 DWORD last_error = GetLastError();
260 if (rc==0)
262 if (last_error==0xdeadbeef || last_error==ERROR_INVALID_SPI_VALUE || last_error==ERROR_INVALID_PARAMETER)
264 skip("%s not supported on this platform\n", name);
266 else if (last_error==ERROR_ACCESS_DENIED)
268 skip("%s does not have privileges to run\n", name);
270 else
272 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name,last_error);
273 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
275 return FALSE;
277 else
279 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
280 return TRUE;
285 * Tests the HKEY_CURRENT_USER subkey value.
286 * The value should contain string value.
288 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2,
289 const void *exp_value, DWORD exp_type, BOOL optional )
291 CHAR value[MAX_PATH];
292 DWORD valueLen;
293 DWORD type;
294 HKEY hKey;
295 LONG rc;
296 int found=0;
298 *value='\0';
299 valueLen=sizeof(value);
300 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
301 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
302 RegCloseKey( hKey );
303 if (rc==ERROR_SUCCESS)
305 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
306 switch (exp_type)
308 case REG_DWORD:
309 ok( *(DWORD *)value == *(DWORD *)exp_value,
310 "Wrong value in registry: %s %s %08x/%08x\n",
311 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
312 break;
313 case REG_SZ:
314 ok( !strcmp( exp_value, value ),
315 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
316 subKey1, valName1, value, (const char *)exp_value );
317 break;
319 found++;
321 else if (strict)
323 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
324 subKey1, valName1);
326 if (valName2)
328 *value='\0';
329 valueLen=sizeof(value);
330 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
331 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
332 RegCloseKey( hKey );
333 if (rc==ERROR_SUCCESS)
335 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
336 switch (exp_type)
338 case REG_DWORD:
339 ok( *(DWORD *)value == *(DWORD *)exp_value,
340 "Wrong value in registry: %s %s %08x/%08x\n",
341 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
342 break;
343 case REG_SZ:
344 ok( !strcmp( exp_value, value ),
345 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
346 subKey1, valName1, value, (const char *)exp_value );
347 break;
349 found++;
351 else if (strict)
353 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
354 subKey1, valName2 );
357 if (subKey2 && !strict)
359 *value='\0';
360 valueLen=sizeof(value);
361 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
362 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
363 RegCloseKey( hKey );
364 if (rc==ERROR_SUCCESS)
366 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
367 switch (exp_type)
369 case REG_DWORD:
370 ok( *(DWORD *)value == *(DWORD *)exp_value,
371 "Wrong value in registry: %s %s %08x/%08x\n",
372 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
373 break;
374 case REG_SZ:
375 ok( !strcmp( exp_value, value ),
376 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
377 subKey1, valName1, value, (const char *)exp_value );
378 break;
380 found++;
382 else if (strict)
384 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
385 subKey2, valName1 );
387 if (valName2)
389 *value='\0';
390 valueLen=sizeof(value);
391 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
392 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
393 RegCloseKey( hKey );
394 if (rc==ERROR_SUCCESS)
396 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
397 switch (exp_type)
399 case REG_DWORD:
400 ok( *(DWORD *)value == *(DWORD *)exp_value,
401 "Wrong value in registry: %s %s %08x/%08x\n",
402 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
403 break;
404 case REG_SZ:
405 ok( !strcmp( exp_value, value ),
406 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
407 subKey1, valName1, value, (const char *)exp_value );
408 break;
410 found++;
412 else if (strict)
414 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
415 subKey2, valName2 );
419 ok(found || optional,
420 "Missing registry values: %s or %s in keys: %s or %s\n",
421 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
424 #define test_reg_key( subKey, valName, testValue ) \
425 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, FALSE )
426 #define test_reg_key_optional( subKey, valName, testValue ) \
427 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, TRUE )
428 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
429 _test_reg_key( subKey1, subKey2, valName, NULL, testValue, REG_SZ, FALSE )
430 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
431 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, FALSE )
432 #define test_reg_key_ex2_optional( subKey1, subKey2, valName1, valName2, testValue ) \
433 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, TRUE )
434 #define test_reg_key_dword( subKey, valName, testValue ) \
435 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_DWORD, FALSE )
437 /* get a metric from the registry. If the value is negative
438 * it is assumed to be in twips and converted to pixels */
439 static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
441 HKEY hkey;
442 char buf[64];
443 DWORD ret;
444 DWORD size, type;
445 int value;
447 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
448 size = sizeof(buf);
449 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
450 RegCloseKey( hkey );
451 if( ret != ERROR_SUCCESS) return -1;
452 value = atoi( buf);
453 if( value < 0)
454 value = ( -value * dpi + 720) / 1440;
455 return value;
458 typedef struct
460 INT16 lfHeight;
461 INT16 lfWidth;
462 INT16 lfEscapement;
463 INT16 lfOrientation;
464 INT16 lfWeight;
465 BYTE lfItalic;
466 BYTE lfUnderline;
467 BYTE lfStrikeOut;
468 BYTE lfCharSet;
469 BYTE lfOutPrecision;
470 BYTE lfClipPrecision;
471 BYTE lfQuality;
472 BYTE lfPitchAndFamily;
473 CHAR lfFaceName[LF_FACESIZE];
474 } LOGFONT16, *LPLOGFONT16;
476 /* get logfont from the registry */
477 static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
479 HKEY hkey;
480 LOGFONTW lfw;
481 DWORD ret, size, type;
483 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
484 size = sizeof( lfw);
485 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
486 RegCloseKey( hkey );
487 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
488 if( ret != ERROR_SUCCESS)
489 return FALSE;
490 if( size <= sizeof( LOGFONT16)) {
491 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
492 plf->lfHeight = plf16->lfHeight;
493 plf->lfWidth = plf16->lfWidth;
494 plf->lfEscapement = plf16->lfEscapement;
495 plf->lfOrientation = plf16->lfOrientation;
496 plf->lfWeight = plf16->lfWeight;
497 plf->lfItalic = plf16->lfItalic;
498 plf->lfUnderline = plf16->lfUnderline;
499 plf->lfStrikeOut = plf16->lfStrikeOut;
500 plf->lfCharSet = plf16->lfCharSet;
501 plf->lfOutPrecision = plf16->lfOutPrecision;
502 plf->lfClipPrecision = plf16->lfClipPrecision;
503 plf->lfQuality = plf16->lfQuality;
504 plf->lfPitchAndFamily = plf16->lfPitchAndFamily;
505 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
506 } else if( size <= sizeof( LOGFONTA)) {
507 plf = (LOGFONTA*) &lfw;
508 } else {
509 plf->lfHeight = lfw.lfHeight;
510 plf->lfWidth = lfw.lfWidth;
511 plf->lfEscapement = lfw.lfEscapement;
512 plf->lfOrientation = lfw.lfOrientation;
513 plf->lfWeight = lfw.lfWeight;
514 plf->lfItalic = lfw.lfItalic;
515 plf->lfUnderline = lfw.lfUnderline;
516 plf->lfStrikeOut = lfw.lfStrikeOut;
517 plf->lfCharSet = lfw.lfCharSet;
518 plf->lfOutPrecision = lfw.lfOutPrecision;
519 plf->lfClipPrecision = lfw.lfClipPrecision;
520 plf->lfQuality = lfw.lfQuality;
521 plf->lfPitchAndFamily = lfw.lfPitchAndFamily;
522 WideCharToMultiByte( CP_ACP, 0, lfw.lfFaceName, -1, plf->lfFaceName,
523 LF_FACESIZE, NULL, NULL);
526 return TRUE;
529 static void test_SPI_SETBEEP( void ) /* 2 */
531 BOOL rc;
532 BOOL old_b;
533 BOOL b;
534 BOOL curr_val;
536 trace("testing SPI_{GET,SET}BEEP\n");
537 SetLastError(0xdeadbeef);
538 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
539 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
540 return;
542 curr_val = TRUE;
543 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
544 if (!test_error_msg(rc,"SPI_SETBEEP")) return;
545 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
546 test_change_message( SPI_SETBEEP, 0 );
547 test_reg_key( SPI_SETBEEP_REGKEY,
548 SPI_SETBEEP_VALNAME,
549 curr_val ? "Yes" : "No" );
550 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
551 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
552 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
553 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
554 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
556 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
557 eq( b, curr_val, "SystemParametersInfoW", "%d" );
560 /* is a message sent for the second change? */
561 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
562 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
563 test_change_message( SPI_SETBEEP, 0 );
565 curr_val = FALSE;
566 rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
567 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
568 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
569 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
570 test_change_message( SPI_SETBEEP, 0 );
571 test_reg_key( SPI_SETBEEP_REGKEY,
572 SPI_SETBEEP_VALNAME,
573 curr_val ? "Yes" : "No" );
574 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
575 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
576 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
577 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
578 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
580 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
581 eq( b, curr_val, "SystemParametersInfoW", "%d" );
583 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
585 rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
586 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
589 static const char *setmouse_valuenames[3] = {
590 SPI_SETMOUSE_VALNAME1,
591 SPI_SETMOUSE_VALNAME2,
592 SPI_SETMOUSE_VALNAME3
596 * Runs check for one setting of spi_setmouse.
598 static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange )
600 BOOL rc;
601 INT mi[3];
602 static int aw_turn = 0;
603 static BOOL w_implemented = TRUE;
605 char buf[20];
606 int i;
608 aw_turn++;
609 rc = FALSE;
610 if ((aw_turn % 2!=0) && (w_implemented))
612 /* call unicode on odd (non even) calls */
613 SetLastError(0xdeadbeef);
614 rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
615 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
617 w_implemented = FALSE;
618 trace("SystemParametersInfoW not supported on this platform\n");
622 if ((aw_turn % 2==0) || (!w_implemented))
624 /* call ascii version on even calls or if unicode is not available */
625 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
627 if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE;
629 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
630 test_change_message( SPI_SETMOUSE, 0 );
631 for (i = 0; i < 3; i++)
633 sprintf( buf, "%d", curr_val[i] );
634 test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
637 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
638 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
639 for (i = 0; i < 3; i++)
641 ok(mi[i] == curr_val[i],
642 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
645 if (w_implemented)
647 rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
648 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
649 for (i = 0; i < 3; i++)
651 ok(mi[i] == curr_val[i],
652 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
656 if (0)
658 /* FIXME: this always fails for me - AJ */
659 for (i = 0; i < nchange; i++)
661 POINT mv;
662 mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
663 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
664 GetCursorPos( &mv );
665 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
666 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
669 return TRUE;
672 static void test_SPI_SETMOUSE( void ) /* 4 */
674 BOOL rc;
675 INT old_mi[3];
677 /* win nt default values - 6, 10, 1 */
678 INT curr_val[3] = {6, 10, 1};
680 /* requested and projected mouse movements */
681 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
682 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
683 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
684 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
685 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
686 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
687 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
688 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
689 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
691 int nchange = sizeof( req_change ) / sizeof( POINT );
693 trace("testing SPI_{GET,SET}MOUSE\n");
694 SetLastError(0xdeadbeef);
695 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
696 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
697 return;
699 if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return;
701 /* acceleration change */
702 curr_val[2] = 2;
703 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
705 /* acceleration change */
706 curr_val[2] = 3;
707 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
709 /* acceleration change */
710 curr_val[2] = 0;
711 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
713 /* threshold change */
714 curr_val[2] = 1;
715 curr_val[0] = 7;
716 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
718 /* threshold change */
719 curr_val[2] = 2;
720 curr_val[0] = 6;
721 curr_val[1] = 6;
722 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
724 /* threshold change */
725 curr_val[1] = 7;
726 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
728 /* threshold change */
729 curr_val[1] = 5;
730 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
732 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
733 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
736 static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
738 BOOL rc;
739 UINT border, regval;
740 INT frame;
741 NONCLIENTMETRICSA ncm;
743 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
744 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
745 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
746 if( usesetborder) {
747 rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
748 if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE;
749 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
750 test_change_message( SPI_SETBORDER, 1 );
751 } else { /* set non client metrics */
752 ncm.iBorderWidth = curr_val;
753 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
754 SPIF_SENDCHANGE);
755 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE;
756 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
757 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
759 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
760 regval = metricfromreg( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_VALNAME, dpi);
761 if( regval != curr_val)
762 regval = metricfromreg( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, dpi);
763 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
765 /* minimum border width is 1 */
766 if (curr_val == 0) curr_val = 1;
767 /* should be the same as the non client metrics */
768 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
769 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
770 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
771 /* and from SPI_GETBORDER */
772 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
773 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
774 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
775 /* test some SystemMetrics */
776 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
777 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
778 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
779 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
780 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
781 return TRUE;
784 static void test_SPI_SETBORDER( void ) /* 6 */
786 BOOL rc;
787 UINT old_border;
788 NONCLIENTMETRICSA ncmsave;
789 INT CaptionWidth,
790 PaddedBorderWidth;
792 ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
793 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
794 if( !rc) {
795 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
796 return;
798 /* CaptionWidth from the registry may have different value of iCaptionWidth
799 * from the non client metrics (observed on WinXP).
800 * Fix this so we can safely restore settings with the nonclientmetrics */
801 CaptionWidth = metricfromreg(
802 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
803 ncmsave.iCaptionWidth = CaptionWidth;
805 /* These tests hang when XFree86 4.0 for Windows is running (tested on
806 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
807 * running.
809 if (FindWindowA( NULL, "Cygwin/XFree86" ))
810 return;
812 trace("testing SPI_{GET,SET}BORDER\n");
814 SetLastError(0xdeadbeef);
815 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
816 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
817 return;
818 /* FIXME: include new PaddedBorderWidth parameter */
819 PaddedBorderWidth = ncmsave.iBorderWidth - old_border;
820 if( PaddedBorderWidth){
821 win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n",
822 PaddedBorderWidth);
823 return;
825 /* This will restore sane values if the test hang previous run. */
826 if ( old_border == 7 || old_border == 20 )
827 old_border = 1;
829 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
830 * do it twice to make the intended change). So skip parts of the tests on
831 * those platforms */
832 if( !iswin9x) {
833 /* win2k3 fails if you set the same border twice, or if size is 0 */
834 if (!test_setborder(2, 1, dpi)) return;
835 test_setborder(1, 1, dpi);
836 test_setborder(3, 1, dpi);
838 if (!test_setborder(1, 0, dpi)) return;
839 test_setborder(0, 0, dpi);
840 test_setborder(3, 0, dpi);
842 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
843 SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);
844 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
845 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
848 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
850 BOOL rc;
851 UINT old_speed;
852 const UINT vals[]={0,20,31};
853 unsigned int i;
855 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
856 SetLastError(0xdeadbeef);
857 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
858 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
859 return;
861 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
863 UINT v;
864 char buf[10];
866 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
867 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
868 if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return;
869 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
870 test_change_message( SPI_SETKEYBOARDSPEED, 0 );
871 sprintf( buf, "%d", vals[i] );
872 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
874 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
875 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
876 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
879 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
880 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
883 /* test_SPI_ICONHORIZONTALSPACING helper */
884 static BOOL dotest_spi_iconhorizontalspacing( INT curr_val)
886 BOOL rc;
887 INT spacing, regval;
888 ICONMETRICSA im;
890 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
891 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
892 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE;
893 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
894 test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
895 if( curr_val < 32) curr_val = 32;
896 /* The registry keys depend on the Windows version and the values too
897 * let's test (works on win95,ME,NT4,2k,XP)
899 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
900 if( regval != curr_val)
901 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
902 ok( curr_val == regval,
903 "wrong value in registry %d, expected %d\n", regval, curr_val);
904 /* compare with what SPI_ICONHORIZONTALSPACING returns */
905 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
906 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
907 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
908 /* and with a system metrics */
909 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
910 /* and with what SPI_GETICONMETRICS returns */
911 im.cbSize = sizeof(ICONMETRICSA);
912 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
913 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
914 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
915 return TRUE;
918 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
920 BOOL rc;
921 INT old_spacing;
923 trace("testing SPI_ICONHORIZONTALSPACING\n");
924 SetLastError(0xdeadbeef);
925 /* default value: 75 */
926 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
927 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
928 return;
929 /* do not increase the value as it would upset the user's icon layout */
930 if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return;
931 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
932 /* restore */
933 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
934 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
937 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
939 BOOL rc;
940 UINT old_timeout;
941 const UINT vals[]={0,32767};
942 unsigned int i;
944 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
945 SetLastError(0xdeadbeef);
946 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
947 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
948 return;
950 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
952 UINT v;
953 char buf[10];
955 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
956 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
957 if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return;
958 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
959 test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
960 sprintf( buf, "%d", vals[i] );
961 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
962 SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
964 rc = SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
965 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
966 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
969 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
970 SPIF_UPDATEINIFILE );
971 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
974 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
976 BOOL rc;
977 BOOL old_b;
978 const UINT vals[]={TRUE,FALSE};
979 unsigned int i;
981 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
982 SetLastError(0xdeadbeef);
983 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
984 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
985 return;
987 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
989 UINT v;
991 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
992 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
993 if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return;
994 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
995 test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
996 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
997 SPI_SETSCREENSAVEACTIVE_VALNAME,
998 vals[i] ? "1" : "0" );
1000 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
1001 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1002 ok(v == vals[i] || broken(! v) /* Win 7 */,
1003 "SPI_{GET,SET}SCREENSAVEACTIVE: got %d instead of %d\n", v, vals[i]);
1006 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1007 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1010 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
1012 /* ??? */;
1015 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1017 BOOL rc;
1018 UINT old_delay;
1019 const UINT vals[]={0,3};
1020 unsigned int i;
1022 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
1023 SetLastError(0xdeadbeef);
1024 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
1025 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
1026 return;
1028 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1030 UINT delay;
1031 char buf[10];
1033 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
1034 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1035 if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return;
1036 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1037 test_change_message( SPI_SETKEYBOARDDELAY, 0 );
1038 sprintf( buf, "%d", vals[i] );
1039 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
1040 SPI_SETKEYBOARDDELAY_VALNAME, buf );
1042 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
1043 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1044 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
1047 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
1048 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1052 /* test_SPI_ICONVERTICALSPACING helper */
1053 static BOOL dotest_spi_iconverticalspacing( INT curr_val)
1055 BOOL rc;
1056 INT spacing, regval;
1057 ICONMETRICSA im;
1059 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
1060 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1061 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE;
1062 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1063 test_change_message( SPI_ICONVERTICALSPACING, 0 );
1064 if( curr_val < 32) curr_val = 32;
1065 /* The registry keys depend on the Windows version and the values too
1066 * let's test (works on win95,ME,NT4,2k,XP)
1068 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1069 if( regval != curr_val)
1070 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1071 ok( curr_val == regval,
1072 "wrong value in registry %d, expected %d\n", regval, curr_val);
1073 /* compare with what SPI_ICONVERTICALSPACING returns */
1074 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1075 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1076 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
1077 /* and with a system metrics */
1078 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
1079 /* and with what SPI_GETICONMETRICS returns */
1080 im.cbSize = sizeof(ICONMETRICSA);
1081 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1082 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1083 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
1084 return TRUE;
1087 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1089 BOOL rc;
1090 INT old_spacing;
1092 trace("testing SPI_ICONVERTICALSPACING\n");
1093 SetLastError(0xdeadbeef);
1094 /* default value: 75 */
1095 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
1096 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
1097 return;
1098 /* do not increase the value as it would upset the user's icon layout */
1099 if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return;
1100 /* same tests with a value less than the minimum 32 */
1101 dotest_spi_iconverticalspacing( 10);
1102 /* restore */
1103 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
1104 SPIF_UPDATEINIFILE );
1105 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1108 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1110 BOOL rc;
1111 BOOL old_b;
1112 const UINT vals[]={TRUE,FALSE};
1113 unsigned int i;
1114 ICONMETRICSA im;
1116 /* These tests hang when XFree86 4.0 for Windows is running (tested on
1117 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
1118 * running.
1120 if (FindWindowA( NULL, "Cygwin/XFree86" ))
1121 return;
1123 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1124 SetLastError(0xdeadbeef);
1125 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1126 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1127 return;
1129 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1131 UINT v;
1132 UINT regval;
1134 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
1135 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1136 if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return;
1137 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1138 test_change_message( SPI_SETICONTITLEWRAP, 1 );
1139 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
1140 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1141 if( regval != vals[i])
1142 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
1143 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1144 ok( regval == vals[i] || broken(regval == -1), /* win9x */
1145 "wrong value in registry %d, expected %d\n", regval, vals[i] );
1147 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
1148 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1149 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1150 /* and test with what SPI_GETICONMETRICS returns */
1151 im.cbSize = sizeof(ICONMETRICSA);
1152 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1153 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1154 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1157 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
1158 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1161 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1163 BOOL rc;
1164 BOOL old_b;
1165 const UINT vals[]={TRUE,FALSE};
1166 unsigned int i;
1168 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1169 SetLastError(0xdeadbeef);
1170 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
1171 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1172 return;
1174 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1176 UINT v;
1178 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
1179 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1180 if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return;
1181 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1182 test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
1183 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
1184 SPI_SETMENUDROPALIGNMENT_REGKEY2,
1185 SPI_SETMENUDROPALIGNMENT_VALNAME,
1186 vals[i] ? "1" : "0" );
1188 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
1189 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1190 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1191 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1192 "SM_MENUDROPALIGNMENT", "%d" );
1195 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
1196 SPIF_UPDATEINIFILE );
1197 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1200 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1202 BOOL rc;
1203 INT old_width;
1204 const UINT vals[]={0,10000};
1205 unsigned int i;
1207 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1208 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1210 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1212 char buf[10];
1214 SetLastError(0xdeadbeef);
1215 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
1216 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1217 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1218 return;
1220 test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
1221 sprintf( buf, "%d", vals[i] );
1222 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
1223 SPI_SETDOUBLECLKWIDTH_REGKEY2,
1224 SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
1225 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1226 "SM_CXDOUBLECLK", "%d" );
1229 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
1230 SPIF_UPDATEINIFILE );
1231 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1234 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1236 BOOL rc;
1237 INT old_height;
1238 const UINT vals[]={0,10000};
1239 unsigned int i;
1241 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1242 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1244 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1246 char buf[10];
1248 SetLastError(0xdeadbeef);
1249 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
1250 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1251 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1252 return;
1254 test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
1255 sprintf( buf, "%d", vals[i] );
1256 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
1257 SPI_SETDOUBLECLKHEIGHT_REGKEY2,
1258 SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
1259 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1260 "SM_CYDOUBLECLK", "%d" );
1263 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
1264 SPIF_UPDATEINIFILE );
1265 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1268 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1270 BOOL rc;
1271 UINT curr_val;
1272 UINT saved_val;
1273 UINT old_time;
1274 char buf[10];
1276 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1277 old_time = GetDoubleClickTime();
1279 curr_val = 0;
1280 SetLastError(0xdeadbeef);
1281 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1282 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1283 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1284 return;
1286 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1287 sprintf( buf, "%d", curr_val );
1288 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1289 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1290 curr_val = 500; /* used value for 0 */
1291 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1293 curr_val = 1000;
1294 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1295 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1296 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1297 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1298 sprintf( buf, "%d", curr_val );
1299 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1300 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1301 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1303 saved_val = curr_val;
1305 curr_val = 0;
1306 SetDoubleClickTime( curr_val );
1307 sprintf( buf, "%d", saved_val );
1308 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1309 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1310 curr_val = 500; /* used value for 0 */
1311 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1313 curr_val = 1000;
1314 SetDoubleClickTime( curr_val );
1315 sprintf( buf, "%d", saved_val );
1316 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1317 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1318 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1320 rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
1321 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1324 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1326 BOOL rc;
1327 BOOL old_b;
1328 const UINT vals[]={TRUE,FALSE};
1329 unsigned int i;
1331 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1332 old_b = GetSystemMetrics( SM_SWAPBUTTON );
1334 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1336 SetLastError(0xdeadbeef);
1337 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
1338 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1339 if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) return;
1341 test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
1342 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
1343 SPI_SETMOUSEBUTTONSWAP_VALNAME,
1344 vals[i] ? "1" : "0" );
1345 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1346 "SM_SWAPBUTTON", "%d" );
1347 rc=SwapMouseButton((BOOL)vals[i^1]);
1348 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1349 "SwapMouseButton", "%d" );
1350 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1353 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
1354 SPIF_UPDATEINIFILE );
1355 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1358 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1360 BOOL rc;
1361 BOOL v;
1363 trace("testing SPI_GETFASTTASKSWITCH\n");
1364 SetLastError(0xdeadbeef);
1365 rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
1366 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1367 return;
1369 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1370 * works. That sure simplifies testing!
1374 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1376 BOOL rc;
1377 BOOL old_b;
1378 const UINT vals[]={TRUE,FALSE};
1379 unsigned int i;
1381 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1382 SetLastError(0xdeadbeef);
1383 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1385 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1386 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1387 return;
1389 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1391 UINT v;
1393 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1394 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1395 if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return;
1396 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1397 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1398 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
1399 SPI_SETDRAGFULLWINDOWS_VALNAME,
1400 vals[i] ? "1" : "0" );
1402 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1403 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1404 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1407 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1408 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1411 #define test_reg_metric( KEY, VAL, val) \
1412 { INT regval;\
1413 regval = metricfromreg( KEY, VAL, dpi);\
1414 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1417 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1418 { INT regval;\
1419 regval = metricfromreg( KEY1, VAL, dpi);\
1420 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1421 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1424 #define test_reg_font( KEY, VAL, LF) \
1425 { LOGFONTA lfreg;\
1426 lffromreg( KEY, VAL, &lfreg);\
1427 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == MulDiv( lfreg.lfHeight, dpi, real_dpi ) : \
1428 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1429 (LF).lfWidth == lfreg.lfWidth &&\
1430 (LF).lfWeight == lfreg.lfWeight &&\
1431 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1432 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1435 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1436 /*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1437 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1438 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1439 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1440 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1441 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1442 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1443 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1444 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1445 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1446 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1447 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1448 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1449 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1451 /* get text metric height value for the specified logfont */
1452 static int get_tmheight( LOGFONTA *plf, int flag)
1454 TEXTMETRICA tm;
1455 HFONT hfont = CreateFontIndirectA( plf);
1456 hfont = SelectObject( hdc, hfont);
1457 GetTextMetricsA( hdc, &tm);
1458 hfont = SelectObject( hdc, hfont);
1459 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1462 static void test_GetSystemMetrics( void);
1463 static UINT smcxsmsize = 999999999;
1465 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1467 BOOL rc;
1468 INT expect;
1469 NONCLIENTMETRICSA Ncmorig;
1470 NONCLIENTMETRICSA Ncmnew;
1471 NONCLIENTMETRICSA Ncmcur;
1472 NONCLIENTMETRICSA Ncmstart;
1474 Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1475 Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1476 Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1477 Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1479 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1480 change_counter = 0;
1481 SetLastError(0xdeadbeef);
1482 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmorig, FALSE );
1483 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1484 return;
1485 Ncmstart = Ncmorig;
1486 smcxsmsize = Ncmstart.iSmCaptionWidth;
1487 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1488 the caption font height is higher than the CaptionHeight field,
1489 the latter is adjusted accordingly. To be able to restore these setting
1490 accurately be restore the raw values. */
1491 Ncmorig.iCaptionWidth = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, real_dpi);
1492 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1493 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1494 Ncmorig.iMenuHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, dpi);
1495 /* test registry entries */
1496 TEST_NONCLIENTMETRICS_REG( Ncmorig)
1497 Ncmorig.lfCaptionFont.lfHeight = MulDiv( Ncmorig.lfCaptionFont.lfHeight, real_dpi, dpi );
1499 /* make small changes */
1500 Ncmnew = Ncmstart;
1501 Ncmnew.iBorderWidth += 1;
1502 Ncmnew.iScrollWidth += 1;
1503 Ncmnew.iScrollHeight -= 1;
1504 Ncmnew.iCaptionWidth -= 2;
1505 Ncmnew.iCaptionHeight += 2;
1506 Ncmnew.lfCaptionFont.lfHeight +=1;
1507 Ncmnew.lfCaptionFont.lfWidth +=2;
1508 Ncmnew.lfCaptionFont.lfWeight +=1;
1509 Ncmnew.iSmCaptionWidth += 1;
1510 Ncmnew.iSmCaptionHeight += 2;
1511 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1512 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1513 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1514 Ncmnew.iMenuWidth += 1;
1515 Ncmnew.iMenuHeight += 2;
1516 Ncmnew.lfMenuFont.lfHeight +=1;
1517 Ncmnew.lfMenuFont.lfWidth +=1;
1518 Ncmnew.lfMenuFont.lfWeight +=2;
1519 Ncmnew.lfStatusFont.lfHeight -=1;
1520 Ncmnew.lfStatusFont.lfWidth -=1;
1521 Ncmnew.lfStatusFont.lfWeight +=3;
1522 Ncmnew.lfMessageFont.lfHeight -=2;
1523 Ncmnew.lfMessageFont.lfWidth -=1;
1524 Ncmnew.lfMessageFont.lfWeight +=4;
1526 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1527 SPIF_SENDCHANGE);
1528 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return;
1529 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1530 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1531 /* get them back */
1532 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1533 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1534 /* test registry entries */
1535 TEST_NONCLIENTMETRICS_REG( Ncmcur)
1536 /* test the system metrics with these settings */
1537 test_GetSystemMetrics();
1538 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1539 by a large amount will increase the {menu|caption|smcaption} height*/
1540 Ncmnew = Ncmstart;
1541 Ncmnew.lfMenuFont.lfHeight -= 8;
1542 Ncmnew.lfCaptionFont.lfHeight =-4;
1543 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1544 /* also show that a few values are lo limited */
1545 Ncmnew.iCaptionWidth = 0;
1546 Ncmnew.iCaptionHeight = 0;
1547 Ncmnew.iScrollHeight = 0;
1548 Ncmnew.iScrollWidth = 0;
1550 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1551 SPIF_SENDCHANGE);
1552 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1553 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1554 /* raw values are in registry */
1555 TEST_NONCLIENTMETRICS_REG( Ncmnew)
1556 /* get them back */
1557 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1558 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1559 /* cooked values are returned */
1560 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1561 ok( Ncmcur.iMenuHeight == expect,
1562 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1563 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1564 ok( Ncmcur.iCaptionHeight == expect,
1565 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1566 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1567 ok( Ncmcur.iSmCaptionHeight == expect,
1568 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1570 /* iCaptionWidth depends on a version, could be 8, 12 (Vista, Win7), 13 */
1571 ok( (Ncmcur.iCaptionWidth >= 8 && Ncmcur.iCaptionWidth <= 13) ||
1572 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1573 "CaptionWidth: %d expected from [8, 13] or %d\n", Ncmcur.iCaptionWidth, Ncmstart.iCaptionWidth);
1574 ok( Ncmcur.iScrollWidth == 8,
1575 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1576 ok( Ncmcur.iScrollHeight == 8,
1577 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1578 /* test the system metrics with these settings */
1579 test_GetSystemMetrics();
1580 /* restore */
1581 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA),
1582 &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1583 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1584 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1585 /* test the system metrics with these settings */
1586 test_GetSystemMetrics();
1589 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1591 BOOL rc;
1592 INT regval;
1593 MINIMIZEDMETRICS lpMm_orig;
1594 MINIMIZEDMETRICS lpMm_new;
1595 MINIMIZEDMETRICS lpMm_cur;
1597 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1598 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1599 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1601 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1602 SetLastError(0xdeadbeef);
1603 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1604 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1605 return;
1606 /* Test registry. Note that it is perfectly valid for some fields to
1607 * not be set.
1609 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1610 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1611 regval, lpMm_orig.iWidth);
1612 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1613 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1614 regval, lpMm_orig.iHorzGap);
1615 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1616 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1617 regval, lpMm_orig.iVertGap);
1618 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1619 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1620 regval, lpMm_orig.iArrange);
1621 /* set some new values */
1622 lpMm_cur.iWidth = 180;
1623 lpMm_cur.iHorzGap = 1;
1624 lpMm_cur.iVertGap = 1;
1625 lpMm_cur.iArrange = 5;
1626 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1627 &lpMm_cur, SPIF_UPDATEINIFILE );
1628 if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return;
1629 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1630 /* read them back */
1631 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1632 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1633 /* and compare */
1634 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1635 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1636 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1637 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1638 /* test registry */
1639 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1640 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1641 regval, lpMm_new.iWidth);
1642 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1643 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1644 regval, lpMm_new.iHorzGap);
1645 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1646 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1647 regval, lpMm_new.iVertGap);
1648 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1649 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1650 regval, lpMm_new.iArrange);
1651 /* test some system metrics */
1652 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1653 lpMm_new.iWidth, "iWidth", "%d" );
1654 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1655 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1656 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1657 lpMm_new.iVertGap, "iVertGap", "%d" );
1658 eq( GetSystemMetrics( SM_ARRANGE ),
1659 lpMm_new.iArrange, "iArrange", "%d" );
1660 /* now some really invalid settings */
1661 lpMm_cur.iWidth = -1;
1662 lpMm_cur.iHorzGap = -1;
1663 lpMm_cur.iVertGap = -1;
1664 lpMm_cur.iArrange = - 1;
1665 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1666 &lpMm_cur, SPIF_UPDATEINIFILE );
1667 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1668 /* read back */
1669 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1670 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1671 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1672 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1673 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1674 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1675 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1676 /* test registry */
1677 if (0)
1679 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1680 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1681 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1682 regval, lpMm_new.iWidth);
1683 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1684 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1685 regval, lpMm_new.iHorzGap);
1686 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1687 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1688 regval, lpMm_new.iVertGap);
1689 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1690 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1691 regval, lpMm_new.iArrange);
1693 /* test some system metrics */
1694 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1695 lpMm_new.iWidth, "iWidth", "%d" );
1696 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1697 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1698 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1699 lpMm_new.iVertGap, "iVertGap", "%d" );
1700 eq( GetSystemMetrics( SM_ARRANGE ),
1701 lpMm_new.iArrange, "iArrange", "%d" );
1702 /* restore */
1703 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1704 &lpMm_orig, SPIF_UPDATEINIFILE );
1705 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1706 /* check that */
1707 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1708 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1709 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1710 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1711 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1712 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1715 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1717 BOOL rc, wrap;
1718 INT spacing;
1719 ICONMETRICSA im_orig;
1720 ICONMETRICSA im_new;
1721 ICONMETRICSA im_cur;
1722 INT regval;
1724 im_orig.cbSize = sizeof(ICONMETRICSA);
1725 im_new.cbSize = sizeof(ICONMETRICSA);
1726 im_cur.cbSize = sizeof(ICONMETRICSA);
1728 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1729 SetLastError(0xdeadbeef);
1730 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1731 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1732 return;
1733 /* check some registry values */
1734 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1735 ok( regval==im_orig.iHorzSpacing || broken(regval == -1), /* nt4 */
1736 "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1737 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1738 ok( regval==im_orig.iVertSpacing || broken(regval == -1), /* nt4 */
1739 "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1740 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1741 if( regval != im_orig.iTitleWrap)
1742 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1743 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1745 /* change everything without creating something invalid ( Win9x would ignore
1746 * an invalid font for instance) */
1747 im_cur = im_orig;
1748 im_cur.iHorzSpacing += 10;
1749 im_cur.iVertSpacing += 6;
1750 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1751 im_cur.lfFont.lfHeight += 1;
1752 im_cur.lfFont.lfWidth += 2;
1753 im_cur.lfFont.lfEscapement = 1;
1754 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1755 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1756 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1757 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1758 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1759 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1760 OUT_TT_PRECIS : OUT_DEFAULT_PRECIS;
1761 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1762 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1763 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1764 DRAFT_QUALITY : DEFAULT_QUALITY;
1765 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1766 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1767 else
1768 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1770 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1771 if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return;
1772 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1774 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1775 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1776 /* test GET <-> SETICONMETRICS */
1777 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1778 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1779 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1780 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%d" );
1781 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%d" );
1782 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%d" );
1783 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%d" );
1784 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1785 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1786 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1787 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1788 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1789 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1790 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1791 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1792 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1793 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1794 im_cur.lfFont.lfFaceName);
1795 /* test some system metrics */
1796 eq( GetSystemMetrics( SM_CXICONSPACING ),
1797 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1798 eq( GetSystemMetrics( SM_CYICONSPACING ),
1799 im_new.iVertSpacing, "iVertSpacing", "%d" );
1800 /* check some registry values */
1801 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1802 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1803 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1804 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1805 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1806 if( regval != im_cur.iTitleWrap)
1807 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1808 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1809 /* test some values from other SPI_GETxxx calls */
1810 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1811 ok( rc && spacing == im_cur.iHorzSpacing,
1812 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1813 spacing, im_cur.iHorzSpacing);
1814 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1815 ok( rc && spacing == im_cur.iVertSpacing,
1816 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1817 spacing, im_cur.iVertSpacing);
1818 rc = SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &wrap, 0 );
1819 ok( rc && wrap == im_cur.iTitleWrap,
1820 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1821 wrap, im_cur.iTitleWrap);
1822 /* restore old values */
1823 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1824 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1826 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1827 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1829 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1830 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1831 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1834 static void test_SPI_SETWORKAREA( void ) /* 47 */
1836 BOOL rc;
1837 RECT old_area;
1838 RECT area;
1839 RECT curr_val;
1841 trace("testing SPI_{GET,SET}WORKAREA\n");
1842 SetLastError(0xdeadbeef);
1843 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1844 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1845 return;
1847 /* Modify the work area only minimally as this causes the icons that
1848 * fall outside it to be moved around thus requiring the user to
1849 * reposition them manually one by one.
1850 * Changing the work area by just one pixel should make this occurrence
1851 * reasonably unlikely.
1853 SetRect(&curr_val, old_area.left, old_area.top, old_area.right - 1, old_area.bottom - 1);
1854 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1855 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1856 if (!test_error_msg(rc,"SPI_SETWORKAREA")) return;
1857 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1858 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1859 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1860 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1861 test_change_message( SPI_SETWORKAREA, 0);
1862 eq( area.left, curr_val.left, "left", "%d" );
1863 eq( area.top, curr_val.top, "top", "%d" );
1864 /* size may be rounded */
1865 ok( area.right >= curr_val.right - 16 && area.right < curr_val.right + 16,
1866 "right: got %d instead of %d\n", area.right, curr_val.right );
1867 ok( area.bottom >= curr_val.bottom - 16 && area.bottom < curr_val.bottom + 16,
1868 "bottom: got %d instead of %d\n", area.bottom, curr_val.bottom );
1869 curr_val = area;
1870 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1871 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1872 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1873 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1874 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1875 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1876 test_change_message( SPI_SETWORKAREA, 0 );
1877 eq( area.left, old_area.left, "left", "%d" );
1878 eq( area.top, old_area.top, "top", "%d" );
1879 /* size may be rounded */
1880 ok( area.right >= old_area.right - 16 && area.right < old_area.right + 16,
1881 "right: got %d instead of %d\n", area.right, old_area.right );
1882 ok( area.bottom >= old_area.bottom - 16 && area.bottom < old_area.bottom + 16,
1883 "bottom: got %d instead of %d\n", area.bottom, old_area.bottom );
1886 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1888 BOOL rc;
1889 BOOL old_b;
1890 const UINT vals[]={TRUE,FALSE};
1891 unsigned int i;
1893 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1894 SetLastError(0xdeadbeef);
1895 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1896 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1897 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1898 return;
1900 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1902 UINT v;
1904 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1905 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1906 if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return;
1907 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1908 test_change_message( SPI_SETSHOWSOUNDS, 1 );
1909 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1910 SPI_SETSHOWSOUNDS_VALNAME,
1911 vals[i] ? "1" : "0" );
1913 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1914 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1915 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1916 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1917 "SM_SHOWSOUNDS", "%d" );
1920 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1921 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1924 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1926 BOOL rc;
1927 BOOL old_b;
1928 const UINT vals[]={TRUE,FALSE};
1929 unsigned int i;
1931 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1932 SetLastError(0xdeadbeef);
1933 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1934 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1935 return;
1937 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1939 BOOL v;
1941 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1942 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1943 if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) return;
1944 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1945 test_change_message( SPI_SETKEYBOARDPREF, 1 );
1946 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY,
1947 SPI_SETKEYBOARDPREF_VALNAME, SPI_SETKEYBOARDPREF_VALNAME_LEGACY,
1948 vals[i] ? "1" : "0" );
1950 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1951 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1952 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1955 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1956 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1959 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1961 BOOL rc;
1962 BOOL old_b;
1963 const UINT vals[]={TRUE,FALSE};
1964 unsigned int i;
1966 trace("testing SPI_{GET,SET}SCREENREADER\n");
1967 SetLastError(0xdeadbeef);
1968 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1969 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
1970 return;
1972 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1974 BOOL v;
1976 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
1977 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1978 if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return;
1979 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1980 test_change_message( SPI_SETSCREENREADER, 1 );
1981 test_reg_key_ex2_optional( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY,
1982 SPI_SETSCREENREADER_VALNAME, SPI_SETSCREENREADER_VALNAME_LEGACY,
1983 vals[i] ? "1" : "0" );
1985 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
1986 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1987 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
1990 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
1991 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1994 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
1996 BOOL rc;
1997 BOOL old_b;
1998 DWORD old_type, old_contrast, old_orient;
1999 const UINT vals[]={0xffffffff,0,1,2};
2000 unsigned int i;
2002 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
2003 if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */
2004 SetLastError(0xdeadbeef);
2005 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
2006 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
2007 return;
2008 SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &old_type, 0 );
2009 SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &old_contrast, 0 );
2010 SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &old_orient, 0 );
2012 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2014 UINT v;
2016 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
2017 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2018 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return;
2019 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2020 test_change_message( SPI_SETFONTSMOOTHING, 0 );
2021 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
2022 SPI_SETFONTSMOOTHING_VALNAME,
2023 vals[i] ? "2" : "0" );
2025 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, 0, UlongToPtr(vals[i]),
2026 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2027 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGTYPE")) return;
2028 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2029 test_change_message( SPI_SETFONTSMOOTHINGTYPE, 0 );
2030 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2031 SPI_SETFONTSMOOTHINGTYPE_VALNAME, &vals[i] );
2033 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, 0, UlongToPtr(vals[i]),
2034 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2035 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGCONTRAST")) return;
2036 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2037 test_change_message( SPI_SETFONTSMOOTHINGCONTRAST, 0 );
2038 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2039 SPI_SETFONTSMOOTHINGCONTRAST_VALNAME, &vals[i] );
2041 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, 0, UlongToPtr(vals[i]),
2042 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2043 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGORIENTATION")) return;
2044 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2045 test_change_message( SPI_SETFONTSMOOTHINGORIENTATION, 0 );
2046 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2047 SPI_SETFONTSMOOTHINGORIENTATION_VALNAME, &vals[i] );
2049 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
2050 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2051 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
2053 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &v, 0 );
2054 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2055 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2057 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &v, 0 );
2058 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2059 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2061 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &v, 0 );
2062 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2063 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2066 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
2067 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2068 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, old_type, 0, SPIF_UPDATEINIFILE );
2069 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2070 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, old_contrast, 0, SPIF_UPDATEINIFILE );
2071 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2072 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, old_orient, 0, SPIF_UPDATEINIFILE );
2073 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2076 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
2078 BOOL rc;
2079 BOOL old_b;
2080 const UINT vals[]={TRUE,FALSE};
2081 unsigned int i;
2083 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
2084 SetLastError(0xdeadbeef);
2085 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
2086 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
2087 return;
2089 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2091 UINT v;
2093 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
2094 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2095 if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return;
2096 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2097 test_change_message( SPI_SETLOWPOWERACTIVE, 1 );
2098 test_reg_key_optional( SPI_SETLOWPOWERACTIVE_REGKEY,
2099 SPI_SETLOWPOWERACTIVE_VALNAME,
2100 vals[i] ? "1" : "0" );
2102 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
2103 v = 0xdeadbeef;
2104 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
2105 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2106 ok(v == vals[i] ||
2107 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2108 v == 0, /* win2k3 */
2109 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2112 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2113 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2116 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
2118 BOOL rc;
2119 BOOL old_b;
2120 const UINT vals[]={TRUE,FALSE};
2121 unsigned int i;
2123 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
2124 SetLastError(0xdeadbeef);
2125 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
2126 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
2127 return;
2129 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2131 UINT v;
2133 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
2134 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2135 if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return;
2136 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2137 test_change_message( SPI_SETPOWEROFFACTIVE, 1 );
2138 test_reg_key_optional( SPI_SETPOWEROFFACTIVE_REGKEY,
2139 SPI_SETPOWEROFFACTIVE_VALNAME,
2140 vals[i] ? "1" : "0" );
2142 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2143 v = 0xdeadbeef;
2144 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
2145 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2146 ok(v == vals[i] ||
2147 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2148 v == 0, /* win2k3 */
2149 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2152 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2153 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2156 static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2158 BOOL rc;
2159 BOOL old_b;
2160 const UINT vals[]={TRUE,FALSE};
2161 unsigned int i;
2163 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2164 SetLastError(0xdeadbeef);
2165 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &old_b, 0 );
2166 if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
2167 return;
2169 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2171 UINT v;
2173 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0,
2174 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2175 if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return;
2176 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2177 test_change_message( SPI_SETSNAPTODEFBUTTON, 0 );
2178 test_reg_key_optional( SPI_SETSNAPTODEFBUTTON_REGKEY,
2179 SPI_SETSNAPTODEFBUTTON_VALNAME,
2180 vals[i] ? "1" : "0" );
2182 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &v, 0 );
2183 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2184 eq( v, vals[i], "SPI_GETSNAPTODEFBUTTON", "%d" );
2187 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, old_b, 0, SPIF_UPDATEINIFILE );
2188 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2191 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2193 BOOL rc;
2194 UINT old_width;
2195 const UINT vals[]={0,32767};
2196 unsigned int i;
2198 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2199 SetLastError(0xdeadbeef);
2200 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
2201 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2202 * what MSDN states (Verified on Win98SE)
2204 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2205 return;
2207 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2209 UINT v;
2210 char buf[10];
2212 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
2213 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2214 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return;
2215 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2216 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
2217 sprintf( buf, "%d", vals[i] );
2218 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
2219 SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
2221 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
2222 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2223 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2226 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
2227 SPIF_UPDATEINIFILE );
2228 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2231 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2233 BOOL rc;
2234 UINT old_height;
2235 const UINT vals[]={0,32767};
2236 unsigned int i;
2238 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2239 SetLastError(0xdeadbeef);
2240 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
2241 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2242 * what MSDN states (Verified on Win98SE)
2244 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2245 return;
2247 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2249 UINT v;
2250 char buf[10];
2252 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2253 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2254 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return;
2255 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2256 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2257 sprintf( buf, "%d", vals[i] );
2258 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
2259 SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
2261 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2262 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2263 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2266 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2267 SPIF_UPDATEINIFILE );
2268 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2271 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2273 BOOL rc;
2274 UINT old_time;
2276 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2277 * defaulted to a value of 10 automatically.
2279 const UINT vals[]={10,32767};
2280 unsigned int i;
2282 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2283 SetLastError(0xdeadbeef);
2284 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2285 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2286 * what MSDN states (Verified on Win98SE)
2288 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2289 return;
2291 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2293 UINT v;
2294 char buf[10];
2296 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2297 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2298 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return;
2299 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2300 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2301 sprintf( buf, "%d", vals[i] );
2302 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
2303 SPI_SETMOUSEHOVERTIME_VALNAME, buf );
2305 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2306 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2307 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2310 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2311 SPIF_UPDATEINIFILE );
2312 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2315 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2317 BOOL rc;
2318 UINT old_lines;
2319 const UINT vals[]={0,32767};
2320 unsigned int i;
2322 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2323 SetLastError(0xdeadbeef);
2324 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2326 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2327 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2328 return;
2330 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2332 UINT v;
2333 char buf[10];
2335 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
2336 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2337 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return;
2338 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2339 test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
2340 sprintf( buf, "%d", vals[i] );
2341 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
2342 SPI_SETMOUSESCROLLLINES_VALNAME, buf );
2344 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2345 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2346 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2349 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
2350 SPIF_UPDATEINIFILE );
2351 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2354 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2356 BOOL rc;
2357 UINT old_delay;
2358 const UINT vals[]={0,32767};
2359 unsigned int i;
2361 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2362 SetLastError(0xdeadbeef);
2363 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2365 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2366 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2367 return;
2369 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2371 UINT v;
2372 char buf[10];
2374 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2375 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2376 if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return;
2377 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2378 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2379 sprintf( buf, "%d", vals[i] );
2380 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
2381 SPI_SETMENUSHOWDELAY_VALNAME, buf );
2383 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2384 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2385 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2388 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2389 SPIF_UPDATEINIFILE );
2390 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2393 static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2395 BOOL rc;
2396 UINT old_chars;
2397 const UINT vals[]={32767,0};
2398 unsigned int i;
2400 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2401 SetLastError(0xdeadbeef);
2402 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &old_chars, 0 );
2404 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2405 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2406 return;
2408 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2410 UINT v;
2411 char buf[10];
2413 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, vals[i], 0,
2414 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2415 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLCHARS")) return;
2416 test_change_message( SPI_SETWHEELSCROLLCHARS, 0 );
2417 sprintf( buf, "%d", vals[i] );
2418 test_reg_key( SPI_SETMOUSESCROLLCHARS_REGKEY,
2419 SPI_SETMOUSESCROLLCHARS_VALNAME, buf );
2421 SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &v, 0 );
2422 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2423 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2426 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, old_chars, 0,
2427 SPIF_UPDATEINIFILE );
2428 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2431 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2433 BOOL rc;
2434 char oldval[260];
2435 char newval[260];
2437 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2438 SetLastError(0xdeadbeef);
2439 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2440 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2441 * unimplemented on NT4
2443 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2444 return;
2446 strcpy(newval, "");
2447 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
2448 if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return;
2449 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
2450 test_change_message(SPI_SETDESKWALLPAPER, 0);
2452 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
2453 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2455 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
2458 static void test_WM_DISPLAYCHANGE(void)
2460 DEVMODEA mode, startmode;
2461 int start_bpp, last_set_bpp = 0;
2462 int test_bpps[] = {8, 16, 24, 32}, i;
2463 LONG change_ret;
2464 DWORD wait_ret;
2466 if (!pChangeDisplaySettingsExA)
2468 win_skip("ChangeDisplaySettingsExA is not available\n");
2469 return;
2472 displaychange_test_active = TRUE;
2474 memset(&startmode, 0, sizeof(startmode));
2475 startmode.dmSize = sizeof(startmode);
2476 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &startmode);
2477 start_bpp = startmode.dmBitsPerPel;
2479 displaychange_sem = CreateSemaphoreW(NULL, 0, 1, NULL);
2481 for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
2482 last_bpp = -1;
2484 memset(&mode, 0, sizeof(mode));
2485 mode.dmSize = sizeof(mode);
2486 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2487 mode.dmBitsPerPel = test_bpps[i];
2488 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2489 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2491 change_counter = 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
2492 displaychange_ok = TRUE;
2493 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2494 /* Wait quite long for the message, screen setting changes can take some time */
2495 if(change_ret == DISP_CHANGE_SUCCESSFUL) {
2496 wait_ret = WaitForSingleObject(displaychange_sem, 10000);
2497 /* we may not get a notification if nothing changed */
2498 if (wait_ret == WAIT_TIMEOUT && !last_set_bpp && start_bpp == test_bpps[i])
2499 continue;
2500 ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
2502 displaychange_ok = FALSE;
2504 if(change_ret != DISP_CHANGE_SUCCESSFUL) {
2505 skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret);
2506 ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp);
2507 continue;
2510 todo_wine_if(start_bpp != test_bpps[i]) {
2511 ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2513 last_set_bpp = test_bpps[i];
2516 if(start_bpp != last_set_bpp && last_set_bpp != 0) {
2517 memset(&mode, 0, sizeof(mode));
2518 mode.dmSize = sizeof(mode);
2519 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2520 mode.dmBitsPerPel = start_bpp;
2521 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2522 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2524 displaychange_ok = TRUE;
2525 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2526 WaitForSingleObject(displaychange_sem, 10000);
2527 displaychange_ok = FALSE;
2528 CloseHandle(displaychange_sem);
2529 displaychange_sem = 0;
2532 displaychange_test_active = FALSE;
2536 * Registry entries for the system parameters.
2537 * Names are created by 'SET' flags names.
2538 * We assume that corresponding 'GET' entries use the same registry keys.
2540 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
2542 test_SPI_SETBEEP(); /* 1 */
2543 test_SPI_SETMOUSE(); /* 4 */
2544 test_SPI_SETBORDER(); /* 6 */
2545 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2546 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2547 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2548 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2549 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2550 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2551 test_SPI_ICONVERTICALSPACING(); /* 24 */
2552 test_SPI_SETICONTITLEWRAP(); /* 26 */
2553 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2554 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2555 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2556 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2557 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2558 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2559 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2560 /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on
2561 * some versions of Windows (Vista, Win2k8, Win7B) in that
2562 * not all metrics are properly restored. Problems are
2563 * SM_CXMAXTRACK, SM_CYMAXTRACK
2564 * Fortunately setting the Non-Client metrics like in
2565 * test_SPI_SETNONCLIENTMETRICS will correct this. That is why
2566 * we do the DISPLAY change now... */
2567 test_WM_DISPLAYCHANGE();
2568 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2569 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2570 test_SPI_SETICONMETRICS(); /* 46 */
2571 test_SPI_SETWORKAREA(); /* 47 */
2572 test_SPI_SETSHOWSOUNDS(); /* 57 */
2573 test_SPI_SETKEYBOARDPREF(); /* 69 */
2574 test_SPI_SETSCREENREADER(); /* 71 */
2575 test_SPI_SETFONTSMOOTHING(); /* 75 */
2576 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2577 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2578 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2579 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2580 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2581 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2582 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2583 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2584 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2585 test_SPI_SETWALLPAPER(); /* 115 */
2588 SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
2589 return 0;
2592 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2593 * icon metrics and minimized metrics.
2596 /* copied from wine's GdiGetCharDimensions, which is not available on most
2597 * windows versions */
2598 static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
2600 SIZE sz;
2601 static const CHAR alphabet[] = {
2602 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2603 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2604 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2606 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2608 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2610 if (height) *height = sz.cy;
2611 return (sz.cx / 26 + 1) / 2;
2614 /* get text metrics and/or "average" char width of the specified logfont
2615 * for the specified dc */
2616 static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2618 HFONT hfont, hfontsav;
2619 TEXTMETRICA tm;
2620 if( !ptm) ptm = &tm;
2621 hfont = CreateFontIndirectA( plf);
2622 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2623 ptm->tmHeight = -1;
2624 if( psz) *psz = 10;
2625 if( hfont) DeleteObject( hfont);
2626 return;
2628 GetTextMetricsA( hdc, ptm);
2629 if( psz)
2630 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2631 *psz = 10;
2632 SelectObject( hdc, hfontsav);
2633 DeleteObject( hfont);
2636 static int gsm_error_ctr;
2638 #define ok_gsm( i, e)\
2640 int exp = (e);\
2641 int act = GetSystemMetrics( (i));\
2642 if( exp != act) gsm_error_ctr++;\
2643 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2645 #define ok_gsm_2( i, e1, e2)\
2647 int exp1 = (e1);\
2648 int exp2 = (e2);\
2649 int act = GetSystemMetrics( (i));\
2650 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2651 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2653 #define ok_gsm_3( i, e1, e2, e3)\
2655 int exp1 = (e1);\
2656 int exp2 = (e2);\
2657 int exp3 = (e3);\
2658 int act = GetSystemMetrics( (i));\
2659 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2660 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2663 static INT CALLBACK enum_all_fonts_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm, DWORD type, LPARAM lparam)
2665 return lstrcmpiA(elf->lfFaceName, (const char *)lparam);
2668 static BOOL is_font_enumerated(const char *name)
2670 HDC hdc = CreateCompatibleDC(0);
2671 BOOL ret = FALSE;
2673 if (!EnumFontFamiliesA(hdc, NULL, enum_all_fonts_proc, (LPARAM)name))
2674 ret = TRUE;
2676 DeleteDC(hdc);
2677 return ret;
2680 static void test_GetSystemMetrics( void)
2682 TEXTMETRICA tmMenuFont;
2683 UINT IconSpacing, IconVerticalSpacing;
2684 BOOL rc;
2686 HDC hdc = CreateICA( "Display", 0, 0, 0);
2687 UINT avcwCaption;
2688 INT CaptionWidthfromreg;
2689 MINIMIZEDMETRICS minim;
2690 NONCLIENTMETRICSA ncm;
2691 SIZE screen;
2693 assert(sizeof(ncm) == 344);
2695 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2696 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2697 ok(rc, "SystemParametersInfoA failed\n");
2699 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) - 1;
2700 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2701 ok(!rc, "SystemParametersInfoA should fail\n");
2703 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) + 1;
2704 SetLastError(0xdeadbeef);
2705 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2706 ok(!rc, "SystemParametersInfoA should fail\n");
2708 ncm.cbSize = sizeof(ncm); /* Vista added padding */
2709 SetLastError(0xdeadbeef);
2710 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2711 ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n");
2713 minim.cbSize = sizeof( minim);
2714 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2715 SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2716 rc = SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2717 if( !rc) {
2718 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
2719 return;
2722 ok(is_font_enumerated(ncm.lfCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfCaptionFont.lfFaceName);
2723 ok(is_font_enumerated(ncm.lfSmCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfSmCaptionFont.lfFaceName);
2724 ok(is_font_enumerated(ncm.lfMenuFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMenuFont.lfFaceName);
2725 ok(is_font_enumerated(ncm.lfStatusFont.lfFaceName), "font %s should be enumerated\n", ncm.lfStatusFont.lfFaceName);
2726 ok(is_font_enumerated(ncm.lfMessageFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMessageFont.lfFaceName);
2728 /* CaptionWidth from the registry may have different value of iCaptionWidth
2729 * from the non client metrics (observed on WinXP) */
2730 CaptionWidthfromreg = metricfromreg(
2731 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2732 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2733 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2734 /* FIXME: use icon metric */
2735 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2736 IconVerticalSpacing = 0;
2737 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2738 IconSpacing = 0;
2739 /* reset error counters */
2740 gsm_error_ctr = 0;
2742 /* the tests: */
2744 /* SM_CXSCREEN, cannot test these two */
2745 /* SM_CYSCREEN */
2746 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2747 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2748 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2749 ok_gsm( SM_CXBORDER, 1);
2750 ok_gsm( SM_CYBORDER, 1);
2751 ok_gsm( SM_CXDLGFRAME, 3);
2752 ok_gsm( SM_CYDLGFRAME, 3);
2753 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2754 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2755 /* SM_CXICON */
2756 /* SM_CYICON */
2757 /* SM_CXCURSOR */
2758 /* SM_CYCURSOR */
2759 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2760 ok_gsm( SM_CXFULLSCREEN,
2761 GetSystemMetrics( SM_CXMAXIMIZED) - 2 * GetSystemMetrics( SM_CXFRAME));
2762 ok_gsm( SM_CYFULLSCREEN,
2763 GetSystemMetrics( SM_CYMAXIMIZED) - GetSystemMetrics( SM_CYMIN));
2764 /* SM_CYKANJIWINDOW */
2765 /* SM_MOUSEPRESENT */
2766 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2767 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2768 /* SM_DEBUG */
2769 /* SM_SWAPBUTTON */
2770 /* SM_RESERVED1 */
2771 /* SM_RESERVED2 */
2772 /* SM_RESERVED3 */
2773 /* SM_RESERVED4 */
2774 ok_gsm( SM_CXMIN, 3 * max( CaptionWidthfromreg >= 0 ? CaptionWidthfromreg : ncm.iCaptionWidth, 8) +
2775 GetSystemMetrics( SM_CYSIZE) + 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2776 ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) +
2777 2 * GetSystemMetrics( SM_CYFRAME));
2778 ok_gsm_2( SM_CXSIZE,
2779 ncm.iCaptionWidth, /* classic/standard windows style */
2780 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2782 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2783 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2784 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2785 ok_gsm( SM_CXMINTRACK, GetSystemMetrics( SM_CXMIN));
2786 ok_gsm( SM_CYMINTRACK, GetSystemMetrics( SM_CYMIN));
2787 /* SM_CXDOUBLECLK */
2788 /* SM_CYDOUBLECLK */
2789 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2790 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2791 /* SM_MENUDROPALIGNMENT */
2792 /* SM_PENWINDOWS */
2793 /* SM_DBCSENABLED */
2794 /* SM_CMOUSEBUTTONS */
2795 /* SM_SECURE */
2796 ok_gsm( SM_CXEDGE, 2);
2797 ok_gsm( SM_CYEDGE, 2);
2798 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2799 ok_gsm( SM_CXMINSPACING, GetSystemMetrics( SM_CXMINIMIZED) + (short)minim.iHorzGap );
2800 ok_gsm( SM_CYMINSPACING, GetSystemMetrics( SM_CYMINIMIZED) + (short)minim.iVertGap );
2801 /* SM_CXSMICON */
2802 /* SM_CYSMICON */
2803 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2804 ok_gsm_3( SM_CXSMSIZE,
2805 ncm.iSmCaptionWidth, /* classic/standard windows style */
2806 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2807 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2808 does not change it */
2810 ok_gsm( SM_CYSMSIZE, GetSystemMetrics( SM_CYSMCAPTION) - 1);
2811 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2812 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2813 /* SM_ARRANGE */
2814 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2815 ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
2816 screen.cx = GetSystemMetrics( SM_CXVIRTUALSCREEN );
2817 screen.cy = GetSystemMetrics( SM_CYVIRTUALSCREEN );
2818 if (!screen.cx || !screen.cy) /* not supported on NT4 */
2820 screen.cx = GetSystemMetrics( SM_CXSCREEN );
2821 screen.cy = GetSystemMetrics( SM_CYSCREEN );
2823 ok_gsm_3( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME),
2824 screen.cx - 4 + 2 * GetSystemMetrics(SM_CXFRAME), /* Vista */
2825 screen.cx + 2 * GetSystemMetrics(SM_CXFRAME)); /* Win8 */
2826 ok_gsm_3( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME),
2827 screen.cy - 4 + 2 * GetSystemMetrics(SM_CYFRAME), /* Vista */
2828 screen.cy + 2 * GetSystemMetrics(SM_CYFRAME)); /* Win8 */
2829 /* the next two cannot really be tested as they depend on (application)
2830 * toolbars */
2831 /* SM_CXMAXIMIZED */
2832 /* SM_CYMAXIMIZED */
2833 /* SM_NETWORK */
2834 /* */
2835 /* */
2836 /* */
2837 /* SM_CLEANBOOT */
2838 /* SM_CXDRAG */
2839 /* SM_CYDRAG */
2840 /* SM_SHOWSOUNDS */
2841 ok_gsm( SM_CXMENUCHECK,
2842 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2843 ok_gsm( SM_CYMENUCHECK,
2844 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2845 /* SM_SLOWMACHINE */
2846 /* SM_MIDEASTENABLED */
2847 /* SM_MOUSEWHEELPRESENT */
2848 /* SM_XVIRTUALSCREEN */
2849 /* SM_YVIRTUALSCREEN */
2850 /* SM_CXVIRTUALSCREEN */
2851 /* SM_CYVIRTUALSCREEN */
2852 /* SM_CMONITORS */
2853 /* SM_SAMEDISPLAYFORMAT */
2854 /* SM_IMMENABLED */
2855 /* SM_CXFOCUSBORDER */
2856 /* SM_CYFOCUSBORDER */
2857 /* SM_TABLETPC */
2858 /* SM_MEDIACENTER */
2859 /* SM_CMETRICS */
2860 /* end of tests */
2861 if( gsm_error_ctr ) { /* if any errors where found */
2862 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2863 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2864 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2865 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2866 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d screen %d,%d\n",
2867 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidthfromreg, screen.cx, screen.cy);
2869 ReleaseDC( 0, hdc);
2872 static void test_EnumDisplaySettings(void)
2874 DEVMODEA devmode;
2875 DWORD val;
2876 HDC hdc;
2877 DWORD num;
2879 memset(&devmode, 0, sizeof(devmode));
2880 /* Win95 doesn't handle ENUM_CURRENT_SETTINGS correctly */
2881 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode);
2883 hdc = GetDC(0);
2884 val = GetDeviceCaps(hdc, BITSPIXEL);
2885 ok(devmode.dmBitsPerPel == val ||
2886 broken(devmode.dmDeviceName[0] == 0), /* Win95 */
2887 "GetDeviceCaps(BITSPIXEL) returned %d, EnumDisplaySettings returned %d\n",
2888 val, devmode.dmBitsPerPel);
2890 val = GetDeviceCaps(hdc, NUMCOLORS);
2891 if(devmode.dmBitsPerPel <= 8) {
2892 ok(val == 256, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2893 } else {
2894 ok(val == -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2897 ReleaseDC(0, hdc);
2899 num = 1;
2900 while (1) {
2901 SetLastError (0xdeadbeef);
2902 if (!EnumDisplaySettingsA(NULL, num, &devmode)) {
2903 DWORD le = GetLastError();
2904 ok(le == ERROR_NO_MORE_FILES ||
2905 le == ERROR_MOD_NOT_FOUND /* Win8 */ ||
2906 le == 0xdeadbeef, /* XP, 2003 */
2907 "Expected ERROR_NO_MORE_FILES, ERROR_MOD_NOT_FOUND or 0xdeadbeef, got %d for %d\n", le, num);
2908 break;
2910 num++;
2914 static void test_GetSysColorBrush(void)
2916 HBRUSH hbr;
2918 SetLastError(0xdeadbeef);
2919 hbr = GetSysColorBrush(-1);
2920 ok(hbr == NULL, "Expected NULL brush\n");
2921 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2922 /* greater than max index */
2923 hbr = GetSysColorBrush(COLOR_MENUBAR);
2924 if (hbr)
2926 SetLastError(0xdeadbeef);
2927 hbr = GetSysColorBrush(COLOR_MENUBAR + 1);
2928 ok(hbr == NULL, "Expected NULL brush\n");
2929 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2931 else
2932 win_skip("COLOR_MENUBAR unsupported\n");
2935 START_TEST(sysparams)
2937 int argc;
2938 char** argv;
2939 WNDCLASSA wc;
2940 MSG msg;
2941 HANDLE hThread;
2942 DWORD dwThreadId;
2943 HANDLE hInstance, hdll;
2945 hdll = GetModuleHandleA("user32.dll");
2946 pChangeDisplaySettingsExA=(void*)GetProcAddress(hdll, "ChangeDisplaySettingsExA");
2948 hInstance = GetModuleHandleA( NULL );
2949 hdc = GetDC(0);
2950 dpi = GetDeviceCaps( hdc, LOGPIXELSY);
2951 real_dpi = get_real_dpi();
2952 trace("dpi %d real_dpi %d\n", dpi, real_dpi);
2953 iswin9x = GetVersion() & 0x80000000;
2955 /* This test requires interactivity, if we don't have it, give up */
2956 if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
2957 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
2959 argc = winetest_get_mainargs(&argv);
2960 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
2961 trace("strict=%d\n",strict);
2963 trace("testing GetSystemMetrics with your current desktop settings\n");
2964 test_GetSystemMetrics( );
2965 trace("testing EnumDisplaySettings vs GetDeviceCaps\n");
2966 test_EnumDisplaySettings( );
2967 test_GetSysColorBrush( );
2969 change_counter = 0;
2970 change_last_param = 0;
2972 wc.lpszClassName = "SysParamsTestClass";
2973 wc.lpfnWndProc = SysParamsTestWndProc;
2974 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
2975 wc.hInstance = hInstance;
2976 wc.hIcon = LoadIconA( 0, (LPCSTR)IDI_APPLICATION );
2977 wc.hCursor = LoadCursorA( 0, (LPCSTR)IDC_ARROW );
2978 wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
2979 wc.lpszMenuName = 0;
2980 wc.cbClsExtra = 0;
2981 wc.cbWndExtra = 0;
2982 RegisterClassA( &wc );
2984 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
2985 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
2987 hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
2988 assert( hThread );
2989 CloseHandle( hThread );
2991 while( GetMessageA( &msg, 0, 0, 0 )) {
2992 TranslateMessage( &msg );
2993 DispatchMessageA( &msg );
2995 ReleaseDC( 0, hdc);