rsaenh/tests: Add more AES encrypt/decrypt tests.
[wine.git] / dlls / user32 / tests / sysparams.c
blob31d1a8eef975f48f009caf3855439b7ff58adb54
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;
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 LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
169 LPARAM lParam )
171 switch (msg) {
173 case WM_DISPLAYCHANGE:
174 ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
175 last_bpp = wParam;
176 displaychange_ok = FALSE;
177 ReleaseSemaphore(displaychange_sem, 1, 0);
178 break;
180 case WM_SETTINGCHANGE:
181 if (change_counter>0) {
182 /* ignore these messages caused by resizing of toolbars */
183 if( wParam == SPI_SETWORKAREA){
184 change_setworkarea_param = 1;
185 break;
186 } else if( wParam == SPI_ICONVERTICALSPACING) {
187 change_iconverticalspacing_param = 1;
188 break;
189 } else if( displaychange_test_active)
190 break;
191 if( !change_last_param){
192 change_last_param = wParam;
193 break;
195 ok(0,"too many changes counter=%d last change=%d\n",
196 change_counter,change_last_param);
197 change_counter++;
198 change_last_param = wParam;
199 break;
201 change_counter++;
202 change_last_param = change_setworkarea_param = change_iconverticalspacing_param =0;
203 if( wParam == SPI_SETWORKAREA)
204 change_setworkarea_param = 1;
205 else if( wParam == SPI_ICONVERTICALSPACING)
206 change_iconverticalspacing_param = 1;
207 else
208 change_last_param = wParam;
209 break;
211 case WM_DESTROY:
212 PostQuitMessage( 0 );
213 break;
215 /* drop through */
216 default:
217 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
220 return 0;
224 Performs testing for system parameters messages
225 params:
226 - system parameter id
227 - supposed value of the registry key
229 static void test_change_message( int action, int optional )
231 if (change_counter==0 && optional==1)
232 return;
233 ok( 1 == change_counter,
234 "Missed a message: change_counter=%d\n", change_counter );
235 change_counter = 0;
236 ok( action == change_last_param ||
237 ( change_setworkarea_param && action == SPI_SETWORKAREA) ||
238 ( change_iconverticalspacing_param && action == SPI_ICONVERTICALSPACING),
239 "Wrong action got %d expected %d\n", change_last_param, action );
240 change_last_param = 0;
243 static BOOL test_error_msg ( int rc, const char *name )
245 DWORD last_error = GetLastError();
247 if (rc==0)
249 if (last_error==0xdeadbeef || last_error==ERROR_INVALID_SPI_VALUE || last_error==ERROR_INVALID_PARAMETER)
251 skip("%s not supported on this platform\n", name);
253 else if (last_error==ERROR_ACCESS_DENIED)
255 skip("%s does not have privileges to run\n", name);
257 else
259 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name,last_error);
260 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
262 return FALSE;
264 else
266 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
267 return TRUE;
272 * Tests the HKEY_CURRENT_USER subkey value.
273 * The value should contain string value.
275 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2,
276 const void *exp_value, DWORD exp_type, BOOL optional )
278 CHAR value[MAX_PATH];
279 DWORD valueLen;
280 DWORD type;
281 HKEY hKey;
282 LONG rc;
283 int found=0;
285 *value='\0';
286 valueLen=sizeof(value);
287 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
288 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
289 RegCloseKey( hKey );
290 if (rc==ERROR_SUCCESS)
292 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
293 switch (exp_type)
295 case REG_DWORD:
296 ok( *(DWORD *)value == *(DWORD *)exp_value,
297 "Wrong value in registry: %s %s %08x/%08x\n",
298 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
299 break;
300 case REG_SZ:
301 ok( !strcmp( exp_value, value ),
302 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
303 subKey1, valName1, value, (const char *)exp_value );
304 break;
306 found++;
308 else if (strict)
310 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
311 subKey1, valName1);
313 if (valName2)
315 *value='\0';
316 valueLen=sizeof(value);
317 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
318 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
319 RegCloseKey( hKey );
320 if (rc==ERROR_SUCCESS)
322 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
323 switch (exp_type)
325 case REG_DWORD:
326 ok( *(DWORD *)value == *(DWORD *)exp_value,
327 "Wrong value in registry: %s %s %08x/%08x\n",
328 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
329 break;
330 case REG_SZ:
331 ok( !strcmp( exp_value, value ),
332 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
333 subKey1, valName1, value, (const char *)exp_value );
334 break;
336 found++;
338 else if (strict)
340 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
341 subKey1, valName2 );
344 if (subKey2 && !strict)
346 *value='\0';
347 valueLen=sizeof(value);
348 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
349 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
350 RegCloseKey( hKey );
351 if (rc==ERROR_SUCCESS)
353 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
354 switch (exp_type)
356 case REG_DWORD:
357 ok( *(DWORD *)value == *(DWORD *)exp_value,
358 "Wrong value in registry: %s %s %08x/%08x\n",
359 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
360 break;
361 case REG_SZ:
362 ok( !strcmp( exp_value, value ),
363 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
364 subKey1, valName1, value, (const char *)exp_value );
365 break;
367 found++;
369 else if (strict)
371 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
372 subKey2, valName1 );
374 if (valName2)
376 *value='\0';
377 valueLen=sizeof(value);
378 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
379 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
380 RegCloseKey( hKey );
381 if (rc==ERROR_SUCCESS)
383 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
384 switch (exp_type)
386 case REG_DWORD:
387 ok( *(DWORD *)value == *(DWORD *)exp_value,
388 "Wrong value in registry: %s %s %08x/%08x\n",
389 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
390 break;
391 case REG_SZ:
392 ok( !strcmp( exp_value, value ),
393 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
394 subKey1, valName1, value, (const char *)exp_value );
395 break;
397 found++;
399 else if (strict)
401 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
402 subKey2, valName2 );
406 ok(found || optional,
407 "Missing registry values: %s or %s in keys: %s or %s\n",
408 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
411 #define test_reg_key( subKey, valName, testValue ) \
412 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, FALSE )
413 #define test_reg_key_optional( subKey, valName, testValue ) \
414 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, TRUE )
415 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
416 _test_reg_key( subKey1, subKey2, valName, NULL, testValue, REG_SZ, FALSE )
417 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
418 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, FALSE )
419 #define test_reg_key_ex2_optional( subKey1, subKey2, valName1, valName2, testValue ) \
420 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, TRUE )
421 #define test_reg_key_dword( subKey, valName, testValue ) \
422 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_DWORD, FALSE )
424 /* get a metric from the registry. If the value is negative
425 * it is assumed to be in twips and converted to pixels */
426 static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
428 HKEY hkey;
429 char buf[64];
430 DWORD ret;
431 DWORD size, type;
432 int value;
434 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
435 size = sizeof(buf);
436 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
437 RegCloseKey( hkey );
438 if( ret != ERROR_SUCCESS) return -1;
439 value = atoi( buf);
440 if( value < 0)
441 value = ( -value * dpi + 720) / 1440;
442 return value;
445 typedef struct
447 INT16 lfHeight;
448 INT16 lfWidth;
449 INT16 lfEscapement;
450 INT16 lfOrientation;
451 INT16 lfWeight;
452 BYTE lfItalic;
453 BYTE lfUnderline;
454 BYTE lfStrikeOut;
455 BYTE lfCharSet;
456 BYTE lfOutPrecision;
457 BYTE lfClipPrecision;
458 BYTE lfQuality;
459 BYTE lfPitchAndFamily;
460 CHAR lfFaceName[LF_FACESIZE];
461 } LOGFONT16, *LPLOGFONT16;
463 /* get logfont from the registry */
464 static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
466 HKEY hkey;
467 LOGFONTW lfw;
468 DWORD ret, size, type;
470 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
471 size = sizeof( lfw);
472 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
473 RegCloseKey( hkey );
474 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
475 if( ret != ERROR_SUCCESS)
476 return FALSE;
477 if( size <= sizeof( LOGFONT16)) {
478 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
479 plf->lfHeight = plf16->lfHeight;
480 plf->lfWidth = plf16->lfWidth;
481 plf->lfEscapement = plf16->lfEscapement;
482 plf->lfOrientation = plf16->lfOrientation;
483 plf->lfWeight = plf16->lfWeight;
484 plf->lfItalic = plf16->lfItalic;
485 plf->lfUnderline = plf16->lfUnderline;
486 plf->lfStrikeOut = plf16->lfStrikeOut;
487 plf->lfCharSet = plf16->lfCharSet;
488 plf->lfOutPrecision = plf16->lfOutPrecision;
489 plf->lfClipPrecision = plf16->lfClipPrecision;
490 plf->lfQuality = plf16->lfQuality;
491 plf->lfPitchAndFamily = plf16->lfPitchAndFamily;
492 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
493 } else if( size <= sizeof( LOGFONTA)) {
494 plf = (LOGFONTA*) &lfw;
495 } else {
496 plf->lfHeight = lfw.lfHeight;
497 plf->lfWidth = lfw.lfWidth;
498 plf->lfEscapement = lfw.lfEscapement;
499 plf->lfOrientation = lfw.lfOrientation;
500 plf->lfWeight = lfw.lfWeight;
501 plf->lfItalic = lfw.lfItalic;
502 plf->lfUnderline = lfw.lfUnderline;
503 plf->lfStrikeOut = lfw.lfStrikeOut;
504 plf->lfCharSet = lfw.lfCharSet;
505 plf->lfOutPrecision = lfw.lfOutPrecision;
506 plf->lfClipPrecision = lfw.lfClipPrecision;
507 plf->lfQuality = lfw.lfQuality;
508 plf->lfPitchAndFamily = lfw.lfPitchAndFamily;
509 WideCharToMultiByte( CP_ACP, 0, lfw.lfFaceName, -1, plf->lfFaceName,
510 LF_FACESIZE, NULL, NULL);
513 return TRUE;
516 static void test_SPI_SETBEEP( void ) /* 2 */
518 BOOL rc;
519 BOOL old_b;
520 BOOL b;
521 BOOL curr_val;
523 trace("testing SPI_{GET,SET}BEEP\n");
524 SetLastError(0xdeadbeef);
525 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
526 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
527 return;
529 curr_val = TRUE;
530 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
531 if (!test_error_msg(rc,"SPI_SETBEEP")) return;
532 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
533 test_change_message( SPI_SETBEEP, 0 );
534 test_reg_key( SPI_SETBEEP_REGKEY,
535 SPI_SETBEEP_VALNAME,
536 curr_val ? "Yes" : "No" );
537 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
538 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
539 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
540 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
541 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
543 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
544 eq( b, curr_val, "SystemParametersInfoW", "%d" );
547 /* is a message sent for the second change? */
548 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
549 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
550 test_change_message( SPI_SETBEEP, 0 );
552 curr_val = FALSE;
553 rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
554 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
555 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
556 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
557 test_change_message( SPI_SETBEEP, 0 );
558 test_reg_key( SPI_SETBEEP_REGKEY,
559 SPI_SETBEEP_VALNAME,
560 curr_val ? "Yes" : "No" );
561 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
562 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
563 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
564 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
565 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
567 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
568 eq( b, curr_val, "SystemParametersInfoW", "%d" );
570 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
572 rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
573 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
576 static const char *setmouse_valuenames[3] = {
577 SPI_SETMOUSE_VALNAME1,
578 SPI_SETMOUSE_VALNAME2,
579 SPI_SETMOUSE_VALNAME3
583 * Runs check for one setting of spi_setmouse.
585 static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange )
587 BOOL rc;
588 INT mi[3];
589 static int aw_turn = 0;
590 static BOOL w_implemented = TRUE;
592 char buf[20];
593 int i;
595 aw_turn++;
596 rc = FALSE;
597 if ((aw_turn % 2!=0) && (w_implemented))
599 /* call unicode on odd (non even) calls */
600 SetLastError(0xdeadbeef);
601 rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
602 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
604 w_implemented = FALSE;
605 trace("SystemParametersInfoW not supported on this platform\n");
609 if ((aw_turn % 2==0) || (!w_implemented))
611 /* call ascii version on even calls or if unicode is not available */
612 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
614 if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE;
616 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
617 test_change_message( SPI_SETMOUSE, 0 );
618 for (i = 0; i < 3; i++)
620 sprintf( buf, "%d", curr_val[i] );
621 test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
624 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
625 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
626 for (i = 0; i < 3; i++)
628 ok(mi[i] == curr_val[i],
629 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
632 if (w_implemented)
634 rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
635 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
636 for (i = 0; i < 3; i++)
638 ok(mi[i] == curr_val[i],
639 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
643 if (0)
645 /* FIXME: this always fails for me - AJ */
646 for (i = 0; i < nchange; i++)
648 POINT mv;
649 mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
650 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
651 GetCursorPos( &mv );
652 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
653 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
656 return TRUE;
659 static void test_SPI_SETMOUSE( void ) /* 4 */
661 BOOL rc;
662 INT old_mi[3];
664 /* win nt default values - 6, 10, 1 */
665 INT curr_val[3] = {6, 10, 1};
667 /* requested and projected mouse movements */
668 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
669 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
670 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
671 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
672 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
673 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
674 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
675 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
676 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
678 int nchange = sizeof( req_change ) / sizeof( POINT );
680 trace("testing SPI_{GET,SET}MOUSE\n");
681 SetLastError(0xdeadbeef);
682 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
683 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
684 return;
686 if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return;
688 /* acceleration change */
689 curr_val[2] = 2;
690 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
692 /* acceleration change */
693 curr_val[2] = 3;
694 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
696 /* acceleration change */
697 curr_val[2] = 0;
698 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
700 /* threshold change */
701 curr_val[2] = 1;
702 curr_val[0] = 7;
703 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
705 /* threshold change */
706 curr_val[2] = 2;
707 curr_val[0] = 6;
708 curr_val[1] = 6;
709 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
711 /* threshold change */
712 curr_val[1] = 7;
713 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
715 /* threshold change */
716 curr_val[1] = 5;
717 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
719 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
720 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
723 static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
725 BOOL rc;
726 UINT border, regval;
727 INT frame;
728 NONCLIENTMETRICSA ncm;
730 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
731 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
732 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
733 if( usesetborder) {
734 rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
735 if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE;
736 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
737 test_change_message( SPI_SETBORDER, 1 );
738 } else { /* set non client metrics */
739 ncm.iBorderWidth = curr_val;
740 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
741 SPIF_SENDCHANGE);
742 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE;
743 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
744 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
746 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
747 regval = metricfromreg( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_VALNAME, dpi);
748 if( regval != curr_val)
749 regval = metricfromreg( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, dpi);
750 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
752 /* minimum border width is 1 */
753 if (curr_val == 0) curr_val = 1;
754 /* should be the same as the non client metrics */
755 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
756 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
757 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
758 /* and from SPI_GETBORDER */
759 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
760 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
761 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
762 /* test some SystemMetrics */
763 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
764 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
765 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
766 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
767 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
768 return TRUE;
771 static void test_SPI_SETBORDER( void ) /* 6 */
773 BOOL rc;
774 UINT old_border;
775 NONCLIENTMETRICSA ncmsave;
776 INT CaptionWidth,
777 PaddedBorderWidth;
779 ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
780 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
781 if( !rc) {
782 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
783 return;
785 /* CaptionWidth from the registry may have different value of iCaptionWidth
786 * from the non client metrics (observed on WinXP).
787 * Fix this so we can safely restore settings with the nonclientmetrics */
788 CaptionWidth = metricfromreg(
789 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
790 ncmsave.iCaptionWidth = CaptionWidth;
792 /* These tests hang when XFree86 4.0 for Windows is running (tested on
793 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
794 * running.
796 if (FindWindowA( NULL, "Cygwin/XFree86" ))
797 return;
799 trace("testing SPI_{GET,SET}BORDER\n");
801 SetLastError(0xdeadbeef);
802 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
803 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
804 return;
805 /* FIXME: include new PaddedBorderWidth parameter */
806 PaddedBorderWidth = ncmsave.iBorderWidth - old_border;
807 if( PaddedBorderWidth){
808 win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n",
809 PaddedBorderWidth);
810 return;
812 /* This will restore sane values if the test hang previous run. */
813 if ( old_border == 7 || old_border == 20 )
814 old_border = 1;
816 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
817 * do it twice to make the intended change). So skip parts of the tests on
818 * those platforms */
819 if( !iswin9x) {
820 /* win2k3 fails if you set the same border twice, or if size is 0 */
821 if (!test_setborder(2, 1, dpi)) return;
822 test_setborder(1, 1, dpi);
823 test_setborder(3, 1, dpi);
825 if (!test_setborder(1, 0, dpi)) return;
826 test_setborder(0, 0, dpi);
827 test_setborder(3, 0, dpi);
829 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
830 SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);
831 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
832 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
835 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
837 BOOL rc;
838 UINT old_speed;
839 const UINT vals[]={0,20,31};
840 unsigned int i;
842 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
843 SetLastError(0xdeadbeef);
844 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
845 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
846 return;
848 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
850 UINT v;
851 char buf[10];
853 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
854 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
855 if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return;
856 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
857 test_change_message( SPI_SETKEYBOARDSPEED, 0 );
858 sprintf( buf, "%d", vals[i] );
859 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
861 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
862 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
863 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
866 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
867 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
870 /* test_SPI_ICONHORIZONTALSPACING helper */
871 static BOOL dotest_spi_iconhorizontalspacing( INT curr_val)
873 BOOL rc;
874 INT spacing, regval;
875 ICONMETRICSA im;
877 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
878 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
879 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE;
880 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
881 test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
882 if( curr_val < 32) curr_val = 32;
883 /* The registry keys depend on the Windows version and the values too
884 * let's test (works on win95,ME,NT4,2k,XP)
886 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
887 if( regval != curr_val)
888 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
889 ok( curr_val == regval,
890 "wrong value in registry %d, expected %d\n", regval, curr_val);
891 /* compare with what SPI_ICONHORIZONTALSPACING returns */
892 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
893 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
894 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
895 /* and with a system metrics */
896 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
897 /* and with what SPI_GETICONMETRICS returns */
898 im.cbSize = sizeof(ICONMETRICSA);
899 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
900 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
901 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
902 return TRUE;
905 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
907 BOOL rc;
908 INT old_spacing;
910 trace("testing SPI_ICONHORIZONTALSPACING\n");
911 SetLastError(0xdeadbeef);
912 /* default value: 75 */
913 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
914 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
915 return;
916 /* do not increase the value as it would upset the user's icon layout */
917 if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return;
918 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
919 /* restore */
920 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
921 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
924 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
926 BOOL rc;
927 UINT old_timeout;
928 const UINT vals[]={0,32767};
929 unsigned int i;
931 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
932 SetLastError(0xdeadbeef);
933 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
934 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
935 return;
937 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
939 UINT v;
940 char buf[10];
942 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
943 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
944 if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return;
945 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
946 test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
947 sprintf( buf, "%d", vals[i] );
948 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
949 SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
951 rc = SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
952 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
953 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
956 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
957 SPIF_UPDATEINIFILE );
958 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
961 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
963 BOOL rc;
964 BOOL old_b;
965 const UINT vals[]={TRUE,FALSE};
966 unsigned int i;
968 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
969 SetLastError(0xdeadbeef);
970 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
971 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
972 return;
974 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
976 UINT v;
978 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
979 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
980 if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return;
981 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
982 test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
983 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
984 SPI_SETSCREENSAVEACTIVE_VALNAME,
985 vals[i] ? "1" : "0" );
987 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
988 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
989 ok(v == vals[i] || broken(! v) /* Win 7 */,
990 "SPI_{GET,SET}SCREENSAVEACTIVE: got %d instead of %d\n", v, vals[i]);
993 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
994 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
997 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
999 /* ??? */;
1002 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1004 BOOL rc;
1005 UINT old_delay;
1006 const UINT vals[]={0,3};
1007 unsigned int i;
1009 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
1010 SetLastError(0xdeadbeef);
1011 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
1012 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
1013 return;
1015 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1017 UINT delay;
1018 char buf[10];
1020 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
1021 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1022 if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return;
1023 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1024 test_change_message( SPI_SETKEYBOARDDELAY, 0 );
1025 sprintf( buf, "%d", vals[i] );
1026 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
1027 SPI_SETKEYBOARDDELAY_VALNAME, buf );
1029 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
1030 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1031 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
1034 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
1035 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1039 /* test_SPI_ICONVERTICALSPACING helper */
1040 static BOOL dotest_spi_iconverticalspacing( INT curr_val)
1042 BOOL rc;
1043 INT spacing, regval;
1044 ICONMETRICSA im;
1046 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
1047 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1048 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE;
1049 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1050 test_change_message( SPI_ICONVERTICALSPACING, 0 );
1051 if( curr_val < 32) curr_val = 32;
1052 /* The registry keys depend on the Windows version and the values too
1053 * let's test (works on win95,ME,NT4,2k,XP)
1055 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1056 if( regval != curr_val)
1057 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1058 ok( curr_val == regval,
1059 "wrong value in registry %d, expected %d\n", regval, curr_val);
1060 /* compare with what SPI_ICONVERTICALSPACING returns */
1061 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1062 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1063 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
1064 /* and with a system metrics */
1065 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
1066 /* and with what SPI_GETICONMETRICS returns */
1067 im.cbSize = sizeof(ICONMETRICSA);
1068 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1069 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1070 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
1071 return TRUE;
1074 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1076 BOOL rc;
1077 INT old_spacing;
1079 trace("testing SPI_ICONVERTICALSPACING\n");
1080 SetLastError(0xdeadbeef);
1081 /* default value: 75 */
1082 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
1083 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
1084 return;
1085 /* do not increase the value as it would upset the user's icon layout */
1086 if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return;
1087 /* same tests with a value less than the minimum 32 */
1088 dotest_spi_iconverticalspacing( 10);
1089 /* restore */
1090 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
1091 SPIF_UPDATEINIFILE );
1092 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1095 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1097 BOOL rc;
1098 BOOL old_b;
1099 const UINT vals[]={TRUE,FALSE};
1100 unsigned int i;
1101 ICONMETRICSA im;
1103 /* These tests hang when XFree86 4.0 for Windows is running (tested on
1104 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
1105 * running.
1107 if (FindWindowA( NULL, "Cygwin/XFree86" ))
1108 return;
1110 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1111 SetLastError(0xdeadbeef);
1112 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1113 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1114 return;
1116 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1118 UINT v;
1119 UINT regval;
1121 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
1122 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1123 if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return;
1124 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1125 test_change_message( SPI_SETICONTITLEWRAP, 1 );
1126 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
1127 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1128 if( regval != vals[i])
1129 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
1130 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1131 ok( regval == vals[i] || broken(regval == -1), /* win9x */
1132 "wrong value in registry %d, expected %d\n", regval, vals[i] );
1134 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
1135 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1136 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1137 /* and test with what SPI_GETICONMETRICS returns */
1138 im.cbSize = sizeof(ICONMETRICSA);
1139 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1140 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1141 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1144 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
1145 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1148 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1150 BOOL rc;
1151 BOOL old_b;
1152 const UINT vals[]={TRUE,FALSE};
1153 unsigned int i;
1155 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1156 SetLastError(0xdeadbeef);
1157 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
1158 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1159 return;
1161 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1163 UINT v;
1165 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
1166 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1167 if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return;
1168 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1169 test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
1170 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
1171 SPI_SETMENUDROPALIGNMENT_REGKEY2,
1172 SPI_SETMENUDROPALIGNMENT_VALNAME,
1173 vals[i] ? "1" : "0" );
1175 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
1176 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1177 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1178 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1179 "SM_MENUDROPALIGNMENT", "%d" );
1182 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
1183 SPIF_UPDATEINIFILE );
1184 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1187 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1189 BOOL rc;
1190 INT old_width;
1191 const UINT vals[]={0,10000};
1192 unsigned int i;
1194 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1195 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1197 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1199 char buf[10];
1201 SetLastError(0xdeadbeef);
1202 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
1203 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1204 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1205 return;
1207 test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
1208 sprintf( buf, "%d", vals[i] );
1209 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
1210 SPI_SETDOUBLECLKWIDTH_REGKEY2,
1211 SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
1212 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1213 "SM_CXDOUBLECLK", "%d" );
1216 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
1217 SPIF_UPDATEINIFILE );
1218 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1221 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1223 BOOL rc;
1224 INT old_height;
1225 const UINT vals[]={0,10000};
1226 unsigned int i;
1228 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1229 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1231 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1233 char buf[10];
1235 SetLastError(0xdeadbeef);
1236 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
1237 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1238 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1239 return;
1241 test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
1242 sprintf( buf, "%d", vals[i] );
1243 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
1244 SPI_SETDOUBLECLKHEIGHT_REGKEY2,
1245 SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
1246 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1247 "SM_CYDOUBLECLK", "%d" );
1250 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
1251 SPIF_UPDATEINIFILE );
1252 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1255 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1257 BOOL rc;
1258 UINT curr_val;
1259 UINT saved_val;
1260 UINT old_time;
1261 char buf[10];
1263 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1264 old_time = GetDoubleClickTime();
1266 curr_val = 0;
1267 SetLastError(0xdeadbeef);
1268 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1269 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1270 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1271 return;
1273 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1274 sprintf( buf, "%d", curr_val );
1275 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1276 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1277 curr_val = 500; /* used value for 0 */
1278 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1280 curr_val = 1000;
1281 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1282 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1283 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1284 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1285 sprintf( buf, "%d", curr_val );
1286 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1287 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1288 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1290 saved_val = curr_val;
1292 curr_val = 0;
1293 SetDoubleClickTime( curr_val );
1294 sprintf( buf, "%d", saved_val );
1295 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1296 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1297 curr_val = 500; /* used value for 0 */
1298 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1300 curr_val = 1000;
1301 SetDoubleClickTime( curr_val );
1302 sprintf( buf, "%d", saved_val );
1303 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1304 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1305 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1307 rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
1308 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1311 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1313 BOOL rc;
1314 BOOL old_b;
1315 const UINT vals[]={TRUE,FALSE};
1316 unsigned int i;
1318 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1319 old_b = GetSystemMetrics( SM_SWAPBUTTON );
1321 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1323 SetLastError(0xdeadbeef);
1324 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
1325 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1326 if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) return;
1328 test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
1329 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
1330 SPI_SETMOUSEBUTTONSWAP_VALNAME,
1331 vals[i] ? "1" : "0" );
1332 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1333 "SM_SWAPBUTTON", "%d" );
1334 rc=SwapMouseButton((BOOL)vals[i^1]);
1335 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1336 "SwapMouseButton", "%d" );
1337 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1340 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
1341 SPIF_UPDATEINIFILE );
1342 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1345 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1347 BOOL rc;
1348 BOOL v;
1350 trace("testing SPI_GETFASTTASKSWITCH\n");
1351 SetLastError(0xdeadbeef);
1352 rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
1353 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1354 return;
1356 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1357 * works. That sure simplifies testing!
1361 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1363 BOOL rc;
1364 BOOL old_b;
1365 const UINT vals[]={TRUE,FALSE};
1366 unsigned int i;
1368 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1369 SetLastError(0xdeadbeef);
1370 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1372 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1373 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1374 return;
1376 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1378 UINT v;
1380 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1381 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1382 if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return;
1383 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1384 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1385 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
1386 SPI_SETDRAGFULLWINDOWS_VALNAME,
1387 vals[i] ? "1" : "0" );
1389 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1390 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1391 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1394 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1395 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1398 #define test_reg_metric( KEY, VAL, val) \
1399 { INT regval;\
1400 regval = metricfromreg( KEY, VAL, dpi);\
1401 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1404 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1405 { INT regval;\
1406 regval = metricfromreg( KEY1, VAL, dpi);\
1407 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1408 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1411 #define test_reg_font( KEY, VAL, LF) \
1412 { LOGFONTA lfreg;\
1413 lffromreg( KEY, VAL, &lfreg);\
1414 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == lfreg.lfHeight :\
1415 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1416 (LF).lfWidth == lfreg.lfWidth &&\
1417 (LF).lfWeight == lfreg.lfWeight &&\
1418 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1419 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1422 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1423 /*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1424 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1425 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1426 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1427 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1428 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1429 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1430 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1431 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1432 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1433 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1434 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1435 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1436 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1438 /* get text metric height value for the specified logfont */
1439 static int get_tmheight( LOGFONTA *plf, int flag)
1441 TEXTMETRICA tm;
1442 HFONT hfont = CreateFontIndirectA( plf);
1443 hfont = SelectObject( hdc, hfont);
1444 GetTextMetricsA( hdc, &tm);
1445 hfont = SelectObject( hdc, hfont);
1446 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1449 static void test_GetSystemMetrics( void);
1450 static UINT smcxsmsize = 999999999;
1452 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1454 BOOL rc;
1455 INT expect;
1456 NONCLIENTMETRICSA Ncmorig;
1457 NONCLIENTMETRICSA Ncmnew;
1458 NONCLIENTMETRICSA Ncmcur;
1459 NONCLIENTMETRICSA Ncmstart;
1461 Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1462 Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1463 Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1464 Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1466 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1467 change_counter = 0;
1468 SetLastError(0xdeadbeef);
1469 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmorig, FALSE );
1470 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1471 return;
1472 Ncmstart = Ncmorig;
1473 smcxsmsize = Ncmstart.iSmCaptionWidth;
1474 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1475 the caption font height is higher than the CaptionHeight field,
1476 the latter is adjusted accordingly. To be able to restore these setting
1477 accurately be restore the raw values. */
1478 Ncmorig.iCaptionWidth = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, dpi);
1479 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1480 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1481 Ncmorig.iMenuHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, dpi);
1482 /* test registry entries */
1483 TEST_NONCLIENTMETRICS_REG( Ncmorig)
1484 /* make small changes */
1485 Ncmnew = Ncmstart;
1486 Ncmnew.iBorderWidth += 1;
1487 Ncmnew.iScrollWidth += 1;
1488 Ncmnew.iScrollHeight -= 1;
1489 Ncmnew.iCaptionWidth -= 2;
1490 Ncmnew.iCaptionHeight += 2;
1491 Ncmnew.lfCaptionFont.lfHeight +=1;
1492 Ncmnew.lfCaptionFont.lfWidth +=2;
1493 Ncmnew.lfCaptionFont.lfWeight +=1;
1494 Ncmnew.iSmCaptionWidth += 1;
1495 Ncmnew.iSmCaptionHeight += 2;
1496 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1497 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1498 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1499 Ncmnew.iMenuWidth += 1;
1500 Ncmnew.iMenuHeight += 2;
1501 Ncmnew.lfMenuFont.lfHeight +=1;
1502 Ncmnew.lfMenuFont.lfWidth +=1;
1503 Ncmnew.lfMenuFont.lfWeight +=2;
1504 Ncmnew.lfStatusFont.lfHeight -=1;
1505 Ncmnew.lfStatusFont.lfWidth -=1;
1506 Ncmnew.lfStatusFont.lfWeight +=3;
1507 Ncmnew.lfMessageFont.lfHeight -=2;
1508 Ncmnew.lfMessageFont.lfWidth -=1;
1509 Ncmnew.lfMessageFont.lfWeight +=4;
1511 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1512 SPIF_SENDCHANGE);
1513 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return;
1514 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1515 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1516 /* get them back */
1517 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1518 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1519 /* test registry entries */
1520 TEST_NONCLIENTMETRICS_REG( Ncmcur)
1521 /* test the system metrics with these settings */
1522 test_GetSystemMetrics();
1523 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1524 by a large amount will increase the {menu|caption|smcaption} height*/
1525 Ncmnew = Ncmstart;
1526 Ncmnew.lfMenuFont.lfHeight -= 8;
1527 Ncmnew.lfCaptionFont.lfHeight =-4;
1528 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1529 /* also show that a few values are lo limited */
1530 Ncmnew.iCaptionWidth = 0;
1531 Ncmnew.iCaptionHeight = 0;
1532 Ncmnew.iScrollHeight = 0;
1533 Ncmnew.iScrollWidth = 0;
1535 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1536 SPIF_SENDCHANGE);
1537 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1538 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1539 /* raw values are in registry */
1540 TEST_NONCLIENTMETRICS_REG( Ncmnew)
1541 /* get them back */
1542 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1543 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1544 /* cooked values are returned */
1545 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1546 ok( Ncmcur.iMenuHeight == expect,
1547 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1548 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1549 ok( Ncmcur.iCaptionHeight == expect,
1550 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1551 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1552 ok( Ncmcur.iSmCaptionHeight == expect,
1553 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1555 ok( Ncmcur.iCaptionWidth == 8 ||
1556 Ncmcur.iCaptionWidth == 12 || /* Vista, W7b */
1557 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1558 "CaptionWidth: %d expected 8, 12 or %d\n", Ncmcur.iCaptionWidth, Ncmstart.iCaptionWidth);
1559 ok( Ncmcur.iScrollWidth == 8,
1560 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1561 ok( Ncmcur.iScrollHeight == 8,
1562 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1563 /* test the system metrics with these settings */
1564 test_GetSystemMetrics();
1565 /* restore */
1566 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA),
1567 &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1568 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1569 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1570 /* test the system metrics with these settings */
1571 test_GetSystemMetrics();
1574 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1576 BOOL rc;
1577 INT regval;
1578 MINIMIZEDMETRICS lpMm_orig;
1579 MINIMIZEDMETRICS lpMm_new;
1580 MINIMIZEDMETRICS lpMm_cur;
1582 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1583 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1584 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1586 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1587 SetLastError(0xdeadbeef);
1588 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1589 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1590 return;
1591 /* Test registry. Note that it is perfectly valid for some fields to
1592 * not be set.
1594 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1595 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1596 regval, lpMm_orig.iWidth);
1597 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1598 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1599 regval, lpMm_orig.iHorzGap);
1600 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1601 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1602 regval, lpMm_orig.iVertGap);
1603 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1604 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1605 regval, lpMm_orig.iArrange);
1606 /* set some new values */
1607 lpMm_cur.iWidth = 180;
1608 lpMm_cur.iHorzGap = 1;
1609 lpMm_cur.iVertGap = 1;
1610 lpMm_cur.iArrange = 5;
1611 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1612 &lpMm_cur, SPIF_UPDATEINIFILE );
1613 if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return;
1614 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1615 /* read them back */
1616 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1617 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1618 /* and compare */
1619 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1620 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1621 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1622 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1623 /* test registry */
1624 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1625 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1626 regval, lpMm_new.iWidth);
1627 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1628 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1629 regval, lpMm_new.iHorzGap);
1630 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1631 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1632 regval, lpMm_new.iVertGap);
1633 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1634 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1635 regval, lpMm_new.iArrange);
1636 /* test some system metrics */
1637 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1638 lpMm_new.iWidth, "iWidth", "%d" );
1639 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1640 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1641 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1642 lpMm_new.iVertGap, "iVertGap", "%d" );
1643 eq( GetSystemMetrics( SM_ARRANGE ),
1644 lpMm_new.iArrange, "iArrange", "%d" );
1645 /* now some really invalid settings */
1646 lpMm_cur.iWidth = -1;
1647 lpMm_cur.iHorzGap = -1;
1648 lpMm_cur.iVertGap = -1;
1649 lpMm_cur.iArrange = - 1;
1650 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1651 &lpMm_cur, SPIF_UPDATEINIFILE );
1652 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1653 /* read back */
1654 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1655 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1656 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1657 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1658 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1659 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1660 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1661 /* test registry */
1662 if (0)
1664 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1665 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1666 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1667 regval, lpMm_new.iWidth);
1668 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1669 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1670 regval, lpMm_new.iHorzGap);
1671 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1672 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1673 regval, lpMm_new.iVertGap);
1674 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1675 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1676 regval, lpMm_new.iArrange);
1678 /* test some system metrics */
1679 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1680 lpMm_new.iWidth, "iWidth", "%d" );
1681 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1682 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1683 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1684 lpMm_new.iVertGap, "iVertGap", "%d" );
1685 eq( GetSystemMetrics( SM_ARRANGE ),
1686 lpMm_new.iArrange, "iArrange", "%d" );
1687 /* restore */
1688 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1689 &lpMm_orig, SPIF_UPDATEINIFILE );
1690 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1691 /* check that */
1692 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1693 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1694 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1695 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1696 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1697 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1700 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1702 BOOL rc, wrap;
1703 INT spacing;
1704 ICONMETRICSA im_orig;
1705 ICONMETRICSA im_new;
1706 ICONMETRICSA im_cur;
1707 INT regval;
1709 im_orig.cbSize = sizeof(ICONMETRICSA);
1710 im_new.cbSize = sizeof(ICONMETRICSA);
1711 im_cur.cbSize = sizeof(ICONMETRICSA);
1713 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1714 SetLastError(0xdeadbeef);
1715 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1716 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1717 return;
1718 /* check some registry values */
1719 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1720 ok( regval==im_orig.iHorzSpacing || broken(regval == -1), /* nt4 */
1721 "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1722 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1723 ok( regval==im_orig.iVertSpacing || broken(regval == -1), /* nt4 */
1724 "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1725 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1726 if( regval != im_orig.iTitleWrap)
1727 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1728 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1730 /* change everything without creating something invalid ( Win9x would ignore
1731 * an invalid font for instance) */
1732 im_cur = im_orig;
1733 im_cur.iHorzSpacing += 10;
1734 im_cur.iVertSpacing += 6;
1735 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1736 im_cur.lfFont.lfHeight += 1;
1737 im_cur.lfFont.lfWidth += 2;
1738 im_cur.lfFont.lfEscapement = 1;
1739 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1740 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1741 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1742 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1743 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1744 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1745 OUT_TT_PRECIS : OUT_DEFAULT_PRECIS;
1746 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1747 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1748 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1749 DRAFT_QUALITY : DEFAULT_QUALITY;
1750 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1751 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1752 else
1753 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1755 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1756 if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return;
1757 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1759 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1760 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1761 /* test GET <-> SETICONMETRICS */
1762 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1763 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1764 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1765 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%d" );
1766 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%d" );
1767 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%d" );
1768 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%d" );
1769 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1770 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1771 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1772 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1773 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1774 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1775 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1776 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1777 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1778 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1779 im_cur.lfFont.lfFaceName);
1780 /* test some system metrics */
1781 eq( GetSystemMetrics( SM_CXICONSPACING ),
1782 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1783 eq( GetSystemMetrics( SM_CYICONSPACING ),
1784 im_new.iVertSpacing, "iVertSpacing", "%d" );
1785 /* check some registry values */
1786 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1787 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1788 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1789 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1790 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1791 if( regval != im_cur.iTitleWrap)
1792 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1793 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1794 /* test some values from other SPI_GETxxx calls */
1795 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1796 ok( rc && spacing == im_cur.iHorzSpacing,
1797 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1798 spacing, im_cur.iHorzSpacing);
1799 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1800 ok( rc && spacing == im_cur.iVertSpacing,
1801 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1802 spacing, im_cur.iVertSpacing);
1803 rc = SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &wrap, 0 );
1804 ok( rc && wrap == im_cur.iTitleWrap,
1805 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1806 wrap, im_cur.iTitleWrap);
1807 /* restore old values */
1808 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1809 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1811 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1812 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1814 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1815 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1816 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1819 static void test_SPI_SETWORKAREA( void ) /* 47 */
1821 BOOL rc;
1822 RECT old_area;
1823 RECT area;
1824 RECT curr_val;
1826 trace("testing SPI_{GET,SET}WORKAREA\n");
1827 SetLastError(0xdeadbeef);
1828 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1829 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1830 return;
1832 /* Modify the work area only minimally as this causes the icons that
1833 * fall outside it to be moved around thus requiring the user to
1834 * reposition them manually one by one.
1835 * Changing the work area by just one pixel should make this occurrence
1836 * reasonably unlikely.
1838 curr_val.left = old_area.left;
1839 curr_val.top = old_area.top;
1840 curr_val.right = old_area.right-1;
1841 curr_val.bottom = old_area.bottom-1;
1842 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1843 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1844 if (!test_error_msg(rc,"SPI_SETWORKAREA")) return;
1845 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1846 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1847 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1848 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1849 test_change_message( SPI_SETWORKAREA, 0);
1850 eq( area.left, curr_val.left, "left", "%d" );
1851 eq( area.top, curr_val.top, "top", "%d" );
1852 /* size may be rounded */
1853 ok( area.right >= curr_val.right - 16 && area.right < curr_val.right + 16,
1854 "right: got %d instead of %d\n", area.right, curr_val.right );
1855 ok( area.bottom >= curr_val.bottom - 16 && area.bottom < curr_val.bottom + 16,
1856 "bottom: got %d instead of %d\n", area.bottom, curr_val.bottom );
1857 curr_val = area;
1858 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1859 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1860 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1861 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1862 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1863 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1864 test_change_message( SPI_SETWORKAREA, 0 );
1865 eq( area.left, old_area.left, "left", "%d" );
1866 eq( area.top, old_area.top, "top", "%d" );
1867 /* size may be rounded */
1868 ok( area.right >= old_area.right - 16 && area.right < old_area.right + 16,
1869 "right: got %d instead of %d\n", area.right, old_area.right );
1870 ok( area.bottom >= old_area.bottom - 16 && area.bottom < old_area.bottom + 16,
1871 "bottom: got %d instead of %d\n", area.bottom, old_area.bottom );
1874 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1876 BOOL rc;
1877 BOOL old_b;
1878 const UINT vals[]={TRUE,FALSE};
1879 unsigned int i;
1881 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1882 SetLastError(0xdeadbeef);
1883 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1884 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1885 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1886 return;
1888 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1890 UINT v;
1892 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1893 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1894 if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return;
1895 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1896 test_change_message( SPI_SETSHOWSOUNDS, 1 );
1897 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1898 SPI_SETSHOWSOUNDS_VALNAME,
1899 vals[i] ? "1" : "0" );
1901 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1902 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1903 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1904 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1905 "SM_SHOWSOUNDS", "%d" );
1908 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1909 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1912 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1914 BOOL rc;
1915 BOOL old_b;
1916 const UINT vals[]={TRUE,FALSE};
1917 unsigned int i;
1919 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1920 SetLastError(0xdeadbeef);
1921 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1922 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1923 return;
1925 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1927 BOOL v;
1929 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1930 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1931 if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) return;
1932 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1933 test_change_message( SPI_SETKEYBOARDPREF, 1 );
1934 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY,
1935 SPI_SETKEYBOARDPREF_VALNAME, SPI_SETKEYBOARDPREF_VALNAME_LEGACY,
1936 vals[i] ? "1" : "0" );
1938 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1939 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1940 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1943 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1944 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1947 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1949 BOOL rc;
1950 BOOL old_b;
1951 const UINT vals[]={TRUE,FALSE};
1952 unsigned int i;
1954 trace("testing SPI_{GET,SET}SCREENREADER\n");
1955 SetLastError(0xdeadbeef);
1956 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1957 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
1958 return;
1960 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1962 BOOL v;
1964 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
1965 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1966 if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return;
1967 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1968 test_change_message( SPI_SETSCREENREADER, 1 );
1969 test_reg_key_ex2_optional( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY,
1970 SPI_SETSCREENREADER_VALNAME, SPI_SETSCREENREADER_VALNAME_LEGACY,
1971 vals[i] ? "1" : "0" );
1973 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
1974 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1975 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
1978 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
1979 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1982 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
1984 BOOL rc;
1985 BOOL old_b;
1986 DWORD old_type, old_contrast, old_orient;
1987 const UINT vals[]={0xffffffff,0,1,2};
1988 unsigned int i;
1990 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
1991 if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */
1992 SetLastError(0xdeadbeef);
1993 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
1994 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
1995 return;
1996 SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &old_type, 0 );
1997 SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &old_contrast, 0 );
1998 SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &old_orient, 0 );
2000 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2002 UINT v;
2004 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
2005 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2006 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return;
2007 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2008 test_change_message( SPI_SETFONTSMOOTHING, 0 );
2009 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
2010 SPI_SETFONTSMOOTHING_VALNAME,
2011 vals[i] ? "2" : "0" );
2013 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, 0, UlongToPtr(vals[i]),
2014 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2015 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGTYPE")) return;
2016 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2017 test_change_message( SPI_SETFONTSMOOTHINGTYPE, 0 );
2018 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2019 SPI_SETFONTSMOOTHINGTYPE_VALNAME, &vals[i] );
2021 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, 0, UlongToPtr(vals[i]),
2022 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2023 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGCONTRAST")) return;
2024 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2025 test_change_message( SPI_SETFONTSMOOTHINGCONTRAST, 0 );
2026 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2027 SPI_SETFONTSMOOTHINGCONTRAST_VALNAME, &vals[i] );
2029 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, 0, UlongToPtr(vals[i]),
2030 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2031 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGORIENTATION")) return;
2032 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2033 test_change_message( SPI_SETFONTSMOOTHINGORIENTATION, 0 );
2034 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2035 SPI_SETFONTSMOOTHINGORIENTATION_VALNAME, &vals[i] );
2037 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
2038 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2039 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
2041 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &v, 0 );
2042 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2043 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2045 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &v, 0 );
2046 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2047 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2049 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &v, 0 );
2050 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2051 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2054 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
2055 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2056 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, old_type, 0, SPIF_UPDATEINIFILE );
2057 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2058 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, old_contrast, 0, SPIF_UPDATEINIFILE );
2059 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2060 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, old_orient, 0, SPIF_UPDATEINIFILE );
2061 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2064 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
2066 BOOL rc;
2067 BOOL old_b;
2068 const UINT vals[]={TRUE,FALSE};
2069 unsigned int i;
2071 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
2072 SetLastError(0xdeadbeef);
2073 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
2074 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
2075 return;
2077 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2079 UINT v;
2081 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
2082 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2083 if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return;
2084 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2085 test_change_message( SPI_SETLOWPOWERACTIVE, 1 );
2086 test_reg_key_optional( SPI_SETLOWPOWERACTIVE_REGKEY,
2087 SPI_SETLOWPOWERACTIVE_VALNAME,
2088 vals[i] ? "1" : "0" );
2090 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
2091 v = 0xdeadbeef;
2092 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
2093 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2094 ok(v == vals[i] ||
2095 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2096 v == 0, /* win2k3 */
2097 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2100 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2101 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2104 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
2106 BOOL rc;
2107 BOOL old_b;
2108 const UINT vals[]={TRUE,FALSE};
2109 unsigned int i;
2111 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
2112 SetLastError(0xdeadbeef);
2113 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
2114 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
2115 return;
2117 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2119 UINT v;
2121 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
2122 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2123 if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return;
2124 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2125 test_change_message( SPI_SETPOWEROFFACTIVE, 1 );
2126 test_reg_key_optional( SPI_SETPOWEROFFACTIVE_REGKEY,
2127 SPI_SETPOWEROFFACTIVE_VALNAME,
2128 vals[i] ? "1" : "0" );
2130 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2131 v = 0xdeadbeef;
2132 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
2133 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2134 ok(v == vals[i] ||
2135 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2136 v == 0, /* win2k3 */
2137 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2140 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2141 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2144 static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2146 BOOL rc;
2147 BOOL old_b;
2148 const UINT vals[]={TRUE,FALSE};
2149 unsigned int i;
2151 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2152 SetLastError(0xdeadbeef);
2153 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &old_b, 0 );
2154 if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
2155 return;
2157 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2159 UINT v;
2161 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0,
2162 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2163 if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return;
2164 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2165 test_change_message( SPI_SETSNAPTODEFBUTTON, 0 );
2166 test_reg_key_optional( SPI_SETSNAPTODEFBUTTON_REGKEY,
2167 SPI_SETSNAPTODEFBUTTON_VALNAME,
2168 vals[i] ? "1" : "0" );
2170 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &v, 0 );
2171 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2172 eq( v, vals[i], "SPI_GETSNAPTODEFBUTTON", "%d" );
2175 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, old_b, 0, SPIF_UPDATEINIFILE );
2176 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2179 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2181 BOOL rc;
2182 UINT old_width;
2183 const UINT vals[]={0,32767};
2184 unsigned int i;
2186 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2187 SetLastError(0xdeadbeef);
2188 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
2189 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2190 * what MSDN states (Verified on Win98SE)
2192 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2193 return;
2195 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2197 UINT v;
2198 char buf[10];
2200 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
2201 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2202 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return;
2203 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2204 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
2205 sprintf( buf, "%d", vals[i] );
2206 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
2207 SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
2209 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
2210 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2211 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2214 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
2215 SPIF_UPDATEINIFILE );
2216 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2219 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2221 BOOL rc;
2222 UINT old_height;
2223 const UINT vals[]={0,32767};
2224 unsigned int i;
2226 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2227 SetLastError(0xdeadbeef);
2228 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
2229 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2230 * what MSDN states (Verified on Win98SE)
2232 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2233 return;
2235 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2237 UINT v;
2238 char buf[10];
2240 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2241 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2242 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return;
2243 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2244 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2245 sprintf( buf, "%d", vals[i] );
2246 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
2247 SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
2249 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2250 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2251 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2254 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2255 SPIF_UPDATEINIFILE );
2256 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2259 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2261 BOOL rc;
2262 UINT old_time;
2264 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2265 * defaulted to a value of 10 automatically.
2267 const UINT vals[]={10,32767};
2268 unsigned int i;
2270 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2271 SetLastError(0xdeadbeef);
2272 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2273 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2274 * what MSDN states (Verified on Win98SE)
2276 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2277 return;
2279 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2281 UINT v;
2282 char buf[10];
2284 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2285 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2286 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return;
2287 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2288 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2289 sprintf( buf, "%d", vals[i] );
2290 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
2291 SPI_SETMOUSEHOVERTIME_VALNAME, buf );
2293 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2294 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2295 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2298 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2299 SPIF_UPDATEINIFILE );
2300 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2303 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2305 BOOL rc;
2306 UINT old_lines;
2307 const UINT vals[]={0,32767};
2308 unsigned int i;
2310 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2311 SetLastError(0xdeadbeef);
2312 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2314 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2315 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2316 return;
2318 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2320 UINT v;
2321 char buf[10];
2323 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
2324 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2325 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return;
2326 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2327 test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
2328 sprintf( buf, "%d", vals[i] );
2329 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
2330 SPI_SETMOUSESCROLLLINES_VALNAME, buf );
2332 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2333 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2334 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2337 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
2338 SPIF_UPDATEINIFILE );
2339 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2342 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2344 BOOL rc;
2345 UINT old_delay;
2346 const UINT vals[]={0,32767};
2347 unsigned int i;
2349 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2350 SetLastError(0xdeadbeef);
2351 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2353 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2354 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2355 return;
2357 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2359 UINT v;
2360 char buf[10];
2362 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2363 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2364 if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return;
2365 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2366 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2367 sprintf( buf, "%d", vals[i] );
2368 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
2369 SPI_SETMENUSHOWDELAY_VALNAME, buf );
2371 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2372 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2373 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2376 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2377 SPIF_UPDATEINIFILE );
2378 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2381 static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2383 BOOL rc;
2384 UINT old_chars;
2385 const UINT vals[]={32767,0};
2386 unsigned int i;
2388 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2389 SetLastError(0xdeadbeef);
2390 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &old_chars, 0 );
2392 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2393 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2394 return;
2396 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2398 UINT v;
2399 char buf[10];
2401 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, vals[i], 0,
2402 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2403 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLCHARS")) return;
2404 test_change_message( SPI_SETWHEELSCROLLCHARS, 0 );
2405 sprintf( buf, "%d", vals[i] );
2406 test_reg_key( SPI_SETMOUSESCROLLCHARS_REGKEY,
2407 SPI_SETMOUSESCROLLCHARS_VALNAME, buf );
2409 SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &v, 0 );
2410 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2411 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2414 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, old_chars, 0,
2415 SPIF_UPDATEINIFILE );
2416 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2419 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2421 BOOL rc;
2422 char oldval[260];
2423 char newval[260];
2425 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2426 SetLastError(0xdeadbeef);
2427 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2428 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2429 * unimplemented on NT4
2431 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2432 return;
2434 strcpy(newval, "");
2435 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
2436 if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return;
2437 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
2438 test_change_message(SPI_SETDESKWALLPAPER, 0);
2440 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
2441 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2443 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
2446 static void test_WM_DISPLAYCHANGE(void)
2448 DEVMODEA mode, startmode;
2449 int start_bpp, last_set_bpp = 0;
2450 int test_bpps[] = {8, 16, 24, 32}, i;
2451 LONG change_ret;
2452 DWORD wait_ret;
2454 if (!pChangeDisplaySettingsExA)
2456 win_skip("ChangeDisplaySettingsExA is not available\n");
2457 return;
2460 displaychange_test_active = TRUE;
2462 memset(&startmode, 0, sizeof(startmode));
2463 startmode.dmSize = sizeof(startmode);
2464 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &startmode);
2465 start_bpp = startmode.dmBitsPerPel;
2467 displaychange_sem = CreateSemaphoreW(NULL, 0, 1, NULL);
2469 for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
2470 last_bpp = -1;
2472 memset(&mode, 0, sizeof(mode));
2473 mode.dmSize = sizeof(mode);
2474 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2475 mode.dmBitsPerPel = test_bpps[i];
2476 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2477 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2479 change_counter = 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
2480 displaychange_ok = TRUE;
2481 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2482 /* Wait quite long for the message, screen setting changes can take some time */
2483 if(change_ret == DISP_CHANGE_SUCCESSFUL) {
2484 wait_ret = WaitForSingleObject(displaychange_sem, 10000);
2485 /* we may not get a notification if nothing changed */
2486 if (wait_ret == WAIT_TIMEOUT && !last_set_bpp && start_bpp == test_bpps[i])
2487 continue;
2488 ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
2490 displaychange_ok = FALSE;
2492 if(change_ret != DISP_CHANGE_SUCCESSFUL) {
2493 skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret);
2494 ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp);
2495 continue;
2498 if(start_bpp != test_bpps[i]) {
2499 todo_wine ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2500 } else {
2501 ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2503 last_set_bpp = test_bpps[i];
2506 if(start_bpp != last_set_bpp && last_set_bpp != 0) {
2507 memset(&mode, 0, sizeof(mode));
2508 mode.dmSize = sizeof(mode);
2509 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2510 mode.dmBitsPerPel = start_bpp;
2511 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2512 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2514 displaychange_ok = TRUE;
2515 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2516 WaitForSingleObject(displaychange_sem, 10000);
2517 displaychange_ok = FALSE;
2518 CloseHandle(displaychange_sem);
2519 displaychange_sem = 0;
2522 displaychange_test_active = FALSE;
2526 * Registry entries for the system parameters.
2527 * Names are created by 'SET' flags names.
2528 * We assume that corresponding 'GET' entries use the same registry keys.
2530 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
2532 test_SPI_SETBEEP(); /* 1 */
2533 test_SPI_SETMOUSE(); /* 4 */
2534 test_SPI_SETBORDER(); /* 6 */
2535 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2536 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2537 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2538 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2539 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2540 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2541 test_SPI_ICONVERTICALSPACING(); /* 24 */
2542 test_SPI_SETICONTITLEWRAP(); /* 26 */
2543 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2544 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2545 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2546 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2547 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2548 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2549 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2550 /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on
2551 * some versions of Windows (Vista, Win2k8, Win7B) in that
2552 * not all metrics are properly restored. Problems are
2553 * SM_CXMAXTRACK, SM_CYMAXTRACK
2554 * Fortunately setting the Non-Client metrics like in
2555 * test_SPI_SETNONCLIENTMETRICS will correct this. That is why
2556 * we do the DISPLAY change now... */
2557 test_WM_DISPLAYCHANGE();
2558 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2559 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2560 test_SPI_SETICONMETRICS(); /* 46 */
2561 test_SPI_SETWORKAREA(); /* 47 */
2562 test_SPI_SETSHOWSOUNDS(); /* 57 */
2563 test_SPI_SETKEYBOARDPREF(); /* 69 */
2564 test_SPI_SETSCREENREADER(); /* 71 */
2565 test_SPI_SETFONTSMOOTHING(); /* 75 */
2566 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2567 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2568 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2569 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2570 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2571 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2572 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2573 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2574 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2575 test_SPI_SETWALLPAPER(); /* 115 */
2578 SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
2579 return 0;
2582 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2583 * icon metrics and minimized metrics.
2586 /* copied from wine's GdiGetCharDimensions, which is not available on most
2587 * windows versions */
2588 static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
2590 SIZE sz;
2591 static const CHAR alphabet[] = {
2592 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2593 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2594 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2596 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2598 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2600 if (height) *height = sz.cy;
2601 return (sz.cx / 26 + 1) / 2;
2604 /* get text metrics and/or "average" char width of the specified logfont
2605 * for the specified dc */
2606 static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2608 HFONT hfont, hfontsav;
2609 TEXTMETRICA tm;
2610 if( !ptm) ptm = &tm;
2611 hfont = CreateFontIndirectA( plf);
2612 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2613 ptm->tmHeight = -1;
2614 if( psz) *psz = 10;
2615 if( hfont) DeleteObject( hfont);
2616 return;
2618 GetTextMetricsA( hdc, ptm);
2619 if( psz)
2620 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2621 *psz = 10;
2622 SelectObject( hdc, hfontsav);
2623 DeleteObject( hfont);
2626 static int gsm_error_ctr;
2628 #define ok_gsm( i, e)\
2630 int exp = (e);\
2631 int act = GetSystemMetrics( (i));\
2632 if( exp != act) gsm_error_ctr++;\
2633 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2635 #define ok_gsm_2( i, e1, e2)\
2637 int exp1 = (e1);\
2638 int exp2 = (e2);\
2639 int act = GetSystemMetrics( (i));\
2640 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2641 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2643 #define ok_gsm_3( i, e1, e2, e3)\
2645 int exp1 = (e1);\
2646 int exp2 = (e2);\
2647 int exp3 = (e3);\
2648 int act = GetSystemMetrics( (i));\
2649 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2650 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2653 static void test_GetSystemMetrics( void)
2655 TEXTMETRICA tmMenuFont;
2656 UINT IconSpacing, IconVerticalSpacing;
2657 BOOL rc;
2659 HDC hdc = CreateICA( "Display", 0, 0, 0);
2660 UINT avcwCaption;
2661 INT CaptionWidthfromreg;
2662 MINIMIZEDMETRICS minim;
2663 NONCLIENTMETRICSA ncm;
2664 SIZE screen;
2666 assert(sizeof(ncm) == 344);
2668 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2669 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2670 ok(rc, "SystemParametersInfoA failed\n");
2672 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) - 1;
2673 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2674 ok(!rc, "SystemParametersInfoA should fail\n");
2676 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) + 1;
2677 SetLastError(0xdeadbeef);
2678 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2679 ok(!rc, "SystemParametersInfoA should fail\n");
2681 ncm.cbSize = sizeof(ncm); /* Vista added padding */
2682 SetLastError(0xdeadbeef);
2683 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2684 ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n");
2686 minim.cbSize = sizeof( minim);
2687 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2688 SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2689 rc = SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2690 if( !rc) {
2691 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
2692 return;
2694 /* CaptionWidth from the registry may have different value of iCaptionWidth
2695 * from the non client metrics (observed on WinXP) */
2696 CaptionWidthfromreg = metricfromreg(
2697 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2698 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2699 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2700 /* FIXME: use icon metric */
2701 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2702 IconVerticalSpacing = 0;
2703 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2704 IconSpacing = 0;
2705 /* reset error counters */
2706 gsm_error_ctr = 0;
2708 /* the tests: */
2710 /* SM_CXSCREEN, cannot test these two */
2711 /* SM_CYSCREEN */
2712 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2713 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2714 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2715 ok_gsm( SM_CXBORDER, 1);
2716 ok_gsm( SM_CYBORDER, 1);
2717 ok_gsm( SM_CXDLGFRAME, 3);
2718 ok_gsm( SM_CYDLGFRAME, 3);
2719 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2720 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2721 /* SM_CXICON */
2722 /* SM_CYICON */
2723 /* SM_CXCURSOR */
2724 /* SM_CYCURSOR */
2725 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2726 ok_gsm( SM_CXFULLSCREEN,
2727 GetSystemMetrics( SM_CXMAXIMIZED) - 2 * GetSystemMetrics( SM_CXFRAME));
2728 ok_gsm( SM_CYFULLSCREEN,
2729 GetSystemMetrics( SM_CYMAXIMIZED) - GetSystemMetrics( SM_CYMIN));
2730 /* SM_CYKANJIWINDOW */
2731 /* SM_MOUSEPRESENT */
2732 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2733 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2734 /* SM_DEBUG */
2735 /* SM_SWAPBUTTON */
2736 /* SM_RESERVED1 */
2737 /* SM_RESERVED2 */
2738 /* SM_RESERVED3 */
2739 /* SM_RESERVED4 */
2740 ok_gsm( SM_CXMIN, 3 * max( CaptionWidthfromreg >= 0 ? CaptionWidthfromreg : ncm.iCaptionWidth, 8) +
2741 GetSystemMetrics( SM_CYSIZE) + 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2742 ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) +
2743 2 * GetSystemMetrics( SM_CYFRAME));
2744 ok_gsm_2( SM_CXSIZE,
2745 ncm.iCaptionWidth, /* classic/standard windows style */
2746 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2748 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2749 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2750 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2751 ok_gsm( SM_CXMINTRACK, GetSystemMetrics( SM_CXMIN));
2752 ok_gsm( SM_CYMINTRACK, GetSystemMetrics( SM_CYMIN));
2753 /* SM_CXDOUBLECLK */
2754 /* SM_CYDOUBLECLK */
2755 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2756 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2757 /* SM_MENUDROPALIGNMENT */
2758 /* SM_PENWINDOWS */
2759 /* SM_DBCSENABLED */
2760 /* SM_CMOUSEBUTTONS */
2761 /* SM_SECURE */
2762 ok_gsm( SM_CXEDGE, 2);
2763 ok_gsm( SM_CYEDGE, 2);
2764 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2765 ok_gsm( SM_CXMINSPACING, GetSystemMetrics( SM_CXMINIMIZED) + (short)minim.iHorzGap );
2766 ok_gsm( SM_CYMINSPACING, GetSystemMetrics( SM_CYMINIMIZED) + (short)minim.iVertGap );
2767 /* SM_CXSMICON */
2768 /* SM_CYSMICON */
2769 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2770 ok_gsm_3( SM_CXSMSIZE,
2771 ncm.iSmCaptionWidth, /* classic/standard windows style */
2772 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2773 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2774 does not change it */
2776 ok_gsm( SM_CYSMSIZE, GetSystemMetrics( SM_CYSMCAPTION) - 1);
2777 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2778 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2779 /* SM_ARRANGE */
2780 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2781 ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
2782 screen.cx = GetSystemMetrics( SM_CXVIRTUALSCREEN );
2783 screen.cy = GetSystemMetrics( SM_CYVIRTUALSCREEN );
2784 if (!screen.cx || !screen.cy) /* not supported on NT4 */
2786 screen.cx = GetSystemMetrics( SM_CXSCREEN );
2787 screen.cy = GetSystemMetrics( SM_CYSCREEN );
2789 ok_gsm_3( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME),
2790 screen.cx - 4 + 2 * GetSystemMetrics(SM_CXFRAME), /* Vista */
2791 screen.cx + 2 * GetSystemMetrics(SM_CXFRAME)); /* Win8 */
2792 ok_gsm_3( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME),
2793 screen.cy - 4 + 2 * GetSystemMetrics(SM_CYFRAME), /* Vista */
2794 screen.cy + 2 * GetSystemMetrics(SM_CYFRAME)); /* Win8 */
2795 /* the next two cannot really be tested as they depend on (application)
2796 * toolbars */
2797 /* SM_CXMAXIMIZED */
2798 /* SM_CYMAXIMIZED */
2799 /* SM_NETWORK */
2800 /* */
2801 /* */
2802 /* */
2803 /* SM_CLEANBOOT */
2804 /* SM_CXDRAG */
2805 /* SM_CYDRAG */
2806 /* SM_SHOWSOUNDS */
2807 ok_gsm( SM_CXMENUCHECK,
2808 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2809 ok_gsm( SM_CYMENUCHECK,
2810 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2811 /* SM_SLOWMACHINE */
2812 /* SM_MIDEASTENABLED */
2813 /* SM_MOUSEWHEELPRESENT */
2814 /* SM_XVIRTUALSCREEN */
2815 /* SM_YVIRTUALSCREEN */
2816 /* SM_CXVIRTUALSCREEN */
2817 /* SM_CYVIRTUALSCREEN */
2818 /* SM_CMONITORS */
2819 /* SM_SAMEDISPLAYFORMAT */
2820 /* SM_IMMENABLED */
2821 /* SM_CXFOCUSBORDER */
2822 /* SM_CYFOCUSBORDER */
2823 /* SM_TABLETPC */
2824 /* SM_MEDIACENTER */
2825 /* SM_CMETRICS */
2826 /* end of tests */
2827 if( gsm_error_ctr ) { /* if any errors where found */
2828 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2829 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2830 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2831 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2832 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d screen %d,%d\n",
2833 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidthfromreg, screen.cx, screen.cy);
2835 ReleaseDC( 0, hdc);
2838 static void test_EnumDisplaySettings(void)
2840 DEVMODEA devmode;
2841 DWORD val;
2842 HDC hdc;
2843 DWORD num;
2845 memset(&devmode, 0, sizeof(devmode));
2846 /* Win95 doesn't handle ENUM_CURRENT_SETTINGS correctly */
2847 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode);
2849 hdc = GetDC(0);
2850 val = GetDeviceCaps(hdc, BITSPIXEL);
2851 ok(devmode.dmBitsPerPel == val ||
2852 broken(devmode.dmDeviceName[0] == 0), /* Win95 */
2853 "GetDeviceCaps(BITSPIXEL) returned %d, EnumDisplaySettings returned %d\n",
2854 val, devmode.dmBitsPerPel);
2856 val = GetDeviceCaps(hdc, NUMCOLORS);
2857 if(devmode.dmBitsPerPel <= 8) {
2858 ok(val == 256, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2859 } else {
2860 ok(val == -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2863 ReleaseDC(0, hdc);
2865 num = 1;
2866 while (1) {
2867 SetLastError (0xdeadbeef);
2868 if (!EnumDisplaySettingsA(NULL, num, &devmode)) {
2869 DWORD le = GetLastError();
2870 ok(le == ERROR_NO_MORE_FILES ||
2871 le == ERROR_MOD_NOT_FOUND /* Win8 */ ||
2872 le == 0xdeadbeef, /* XP, 2003 */
2873 "Expected ERROR_NO_MORE_FILES, ERROR_MOD_NOT_FOUND or 0xdeadbeef, got %d for %d\n", le, num);
2874 break;
2876 num++;
2880 static void test_GetSysColorBrush(void)
2882 HBRUSH hbr;
2884 SetLastError(0xdeadbeef);
2885 hbr = GetSysColorBrush(-1);
2886 ok(hbr == NULL, "Expected NULL brush\n");
2887 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2888 /* greater than max index */
2889 hbr = GetSysColorBrush(COLOR_MENUBAR);
2890 if (hbr)
2892 SetLastError(0xdeadbeef);
2893 hbr = GetSysColorBrush(COLOR_MENUBAR + 1);
2894 ok(hbr == NULL, "Expected NULL brush\n");
2895 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2897 else
2898 win_skip("COLOR_MENUBAR unsupported\n");
2901 START_TEST(sysparams)
2903 int argc;
2904 char** argv;
2905 WNDCLASSA wc;
2906 MSG msg;
2907 HANDLE hThread;
2908 DWORD dwThreadId;
2909 HANDLE hInstance, hdll;
2911 hdll = GetModuleHandleA("user32.dll");
2912 pChangeDisplaySettingsExA=(void*)GetProcAddress(hdll, "ChangeDisplaySettingsExA");
2914 hInstance = GetModuleHandleA( NULL );
2915 hdc = GetDC(0);
2916 dpi = GetDeviceCaps( hdc, LOGPIXELSY);
2917 iswin9x = GetVersion() & 0x80000000;
2919 /* This test requires interactivity, if we don't have it, give up */
2920 if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
2921 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
2923 argc = winetest_get_mainargs(&argv);
2924 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
2925 trace("strict=%d\n",strict);
2927 trace("testing GetSystemMetrics with your current desktop settings\n");
2928 test_GetSystemMetrics( );
2929 trace("testing EnumDisplaySettings vs GetDeviceCaps\n");
2930 test_EnumDisplaySettings( );
2931 test_GetSysColorBrush( );
2933 change_counter = 0;
2934 change_last_param = 0;
2936 wc.lpszClassName = "SysParamsTestClass";
2937 wc.lpfnWndProc = SysParamsTestWndProc;
2938 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
2939 wc.hInstance = hInstance;
2940 wc.hIcon = LoadIconA( 0, (LPCSTR)IDI_APPLICATION );
2941 wc.hCursor = LoadCursorA( 0, (LPCSTR)IDC_ARROW );
2942 wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
2943 wc.lpszMenuName = 0;
2944 wc.cbClsExtra = 0;
2945 wc.cbWndExtra = 0;
2946 RegisterClassA( &wc );
2948 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
2949 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
2951 hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
2952 assert( hThread );
2953 CloseHandle( hThread );
2955 while( GetMessageA( &msg, 0, 0, 0 )) {
2956 TranslateMessage( &msg );
2957 DispatchMessageA( &msg );
2959 ReleaseDC( 0, hdc);