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 */
29 #include "wine/test.h"
37 #ifndef SPI_GETDESKWALLPAPER
38 # define SPI_GETDESKWALLPAPER 0x0073
41 static LONG (WINAPI
*pChangeDisplaySettingsExA
)(LPCSTR
, LPDEVMODEA
, HWND
, DWORD
, LPVOID
);
42 static BOOL (WINAPI
*pIsProcessDPIAware
)(void);
43 static BOOL (WINAPI
*pSetProcessDPIAware
)(void);
44 static BOOL (WINAPI
*pSetProcessDpiAwarenessContext
)(DPI_AWARENESS_CONTEXT
);
45 static BOOL (WINAPI
*pGetProcessDpiAwarenessInternal
)(HANDLE
,DPI_AWARENESS
*);
46 static BOOL (WINAPI
*pSetProcessDpiAwarenessInternal
)(DPI_AWARENESS
);
47 static UINT (WINAPI
*pGetDpiForSystem
)(void);
48 static DPI_AWARENESS_CONTEXT (WINAPI
*pGetThreadDpiAwarenessContext
)(void);
49 static DPI_AWARENESS_CONTEXT (WINAPI
*pSetThreadDpiAwarenessContext
)(DPI_AWARENESS_CONTEXT
);
50 static DPI_AWARENESS_CONTEXT (WINAPI
*pGetWindowDpiAwarenessContext
)(HWND
);
51 static DPI_AWARENESS (WINAPI
*pGetAwarenessFromDpiAwarenessContext
)(DPI_AWARENESS_CONTEXT
);
52 static BOOL (WINAPI
*pIsValidDpiAwarenessContext
)(DPI_AWARENESS_CONTEXT
);
55 static int dpi
, real_dpi
;
59 #define eq(received, expected, label, type) \
60 ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
63 #define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
64 #define SPI_SETBEEP_VALNAME "Beep"
65 #define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
66 #define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
67 #define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
68 #define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
69 #define SPI_SETBORDER_REGKEY "Control Panel\\Desktop\\WindowMetrics"
70 #define SPI_SETBORDER_REGKEY2 "Control Panel\\Desktop"
71 #define SPI_SETBORDER_VALNAME "BorderWidth"
72 #define SPI_METRIC_REGKEY "Control Panel\\Desktop\\WindowMetrics"
73 #define SPI_SCROLLWIDTH_VALNAME "ScrollWidth"
74 #define SPI_SCROLLHEIGHT_VALNAME "ScrollHeight"
75 #define SPI_CAPTIONWIDTH_VALNAME "CaptionWidth"
76 #define SPI_CAPTIONHEIGHT_VALNAME "CaptionHeight"
77 #define SPI_CAPTIONFONT_VALNAME "CaptionFont"
78 #define SPI_SMCAPTIONWIDTH_VALNAME "SmCaptionWidth"
79 #define SPI_SMCAPTIONHEIGHT_VALNAME "SmCaptionHeight"
80 #define SPI_SMCAPTIONFONT_VALNAME "SmCaptionFont"
81 #define SPI_MENUWIDTH_VALNAME "MenuWidth"
82 #define SPI_MENUHEIGHT_VALNAME "MenuHeight"
83 #define SPI_MENUFONT_VALNAME "MenuFont"
84 #define SPI_STATUSFONT_VALNAME "StatusFont"
85 #define SPI_MESSAGEFONT_VALNAME "MessageFont"
87 #define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
88 #define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
89 #define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
90 #define SPI_ICONHORIZONTALSPACING_REGKEY2 "Control Panel\\Desktop"
91 #define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
92 #define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
93 #define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
94 #define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
95 #define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
96 #define SPI_MINWIDTH_VALNAME "MinWidth"
97 #define SPI_MINHORZGAP_VALNAME "MinHorzGap"
98 #define SPI_MINVERTGAP_VALNAME "MinVertGap"
99 #define SPI_MINARRANGE_VALNAME "MinArrange"
100 #define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
101 #define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
102 #define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
103 #define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
104 #define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
105 #define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
106 #define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
107 #define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
108 #define SPI_SETICONTITLEWRAP_REGKEY1 "Control Panel\\Desktop\\WindowMetrics"
109 #define SPI_SETICONTITLEWRAP_REGKEY2 "Control Panel\\Desktop"
110 #define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
111 #define SPI_SETMENUDROPALIGNMENT_REGKEY1 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
112 #define SPI_SETMENUDROPALIGNMENT_REGKEY2 "Control Panel\\Desktop"
113 #define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
114 #define SPI_SETDOUBLECLKWIDTH_REGKEY1 "Control Panel\\Mouse"
115 #define SPI_SETDOUBLECLKWIDTH_REGKEY2 "Control Panel\\Desktop"
116 #define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
117 #define SPI_SETDOUBLECLKHEIGHT_REGKEY1 "Control Panel\\Mouse"
118 #define SPI_SETDOUBLECLKHEIGHT_REGKEY2 "Control Panel\\Desktop"
119 #define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
120 #define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
121 #define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
122 #define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
123 #define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
124 #define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
125 #define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
126 #define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
127 #define SPI_SETSHOWSOUNDS_VALNAME "On"
128 #define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Accessibility\\Keyboard Preference"
129 #define SPI_SETKEYBOARDPREF_VALNAME "On"
130 #define SPI_SETKEYBOARDPREF_REGKEY_LEGACY "Control Panel\\Accessibility"
131 #define SPI_SETKEYBOARDPREF_VALNAME_LEGACY "Keyboard Preference"
132 #define SPI_SETSCREENREADER_REGKEY "Control Panel\\Accessibility\\Blind Access"
133 #define SPI_SETSCREENREADER_VALNAME "On"
134 #define SPI_SETSCREENREADER_REGKEY_LEGACY "Control Panel\\Accessibility"
135 #define SPI_SETSCREENREADER_VALNAME_LEGACY "Blind Access"
136 #define SPI_SETFONTSMOOTHING_REGKEY "Control Panel\\Desktop"
137 #define SPI_SETFONTSMOOTHING_VALNAME "FontSmoothing"
138 #define SPI_SETFONTSMOOTHINGTYPE_VALNAME "FontSmoothingType"
139 #define SPI_SETFONTSMOOTHINGCONTRAST_VALNAME "FontSmoothingGamma"
140 #define SPI_SETFONTSMOOTHINGORIENTATION_VALNAME "FontSmoothingOrientation"
141 #define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
142 #define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
143 #define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
144 #define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
145 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
146 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
147 #define SPI_SETSNAPTODEFBUTTON_REGKEY "Control Panel\\Mouse"
148 #define SPI_SETSNAPTODEFBUTTON_VALNAME "SnapToDefaultButton"
149 #define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
150 #define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
151 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
152 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
153 #define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
154 #define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
155 #define SPI_SETMOUSESCROLLCHARS_REGKEY "Control Panel\\Desktop"
156 #define SPI_SETMOUSESCROLLCHARS_VALNAME "WheelScrollChars"
157 #define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
158 #define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
159 #define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
160 #define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
161 #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
162 #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
164 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
165 #define WINE_CURRENT_USER_REGKEY "Wine"
167 static HWND ghTestWnd
;
169 static DWORD WINAPI
SysParamsThreadFunc( LPVOID lpParam
);
170 static LRESULT CALLBACK
SysParamsTestWndProc( HWND hWnd
, UINT msg
, WPARAM wParam
,
172 static int change_counter
;
173 static int change_setworkarea_param
, change_iconverticalspacing_param
;
174 static int change_last_param
;
176 static BOOL displaychange_ok
= FALSE
, displaychange_test_active
= FALSE
;
177 static HANDLE displaychange_sem
= 0;
179 static BOOL
get_reg_dword(HKEY base
, const char *key_name
, const char *value_name
, DWORD
*value
)
182 DWORD type
, data
, size
= sizeof(data
);
185 if (RegOpenKeyA(base
, key_name
, &key
) == ERROR_SUCCESS
)
187 if (RegQueryValueExA(key
, value_name
, NULL
, &type
, (void *)&data
, &size
) == ERROR_SUCCESS
&&
198 static DWORD
get_real_dpi(void)
202 if (pSetThreadDpiAwarenessContext
)
204 DPI_AWARENESS_CONTEXT context
= pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
);
205 dpi
= pGetDpiForSystem();
206 pSetThreadDpiAwarenessContext( context
);
209 if (get_reg_dword(HKEY_CURRENT_USER
, "Control Panel\\Desktop", "LogPixels", &dpi
))
211 if (get_reg_dword(HKEY_CURRENT_CONFIG
, "Software\\Fonts", "LogPixels", &dpi
))
213 return USER_DEFAULT_SCREEN_DPI
;
216 static LRESULT CALLBACK
SysParamsTestWndProc( HWND hWnd
, UINT msg
, WPARAM wParam
,
221 case WM_DISPLAYCHANGE
:
222 ok(displaychange_ok
, "Unexpected WM_DISPLAYCHANGE message\n");
224 displaychange_ok
= FALSE
;
225 ReleaseSemaphore(displaychange_sem
, 1, 0);
228 case WM_SETTINGCHANGE
:
229 if (change_counter
>0) {
230 /* ignore these messages caused by resizing of toolbars */
231 if( wParam
== SPI_SETWORKAREA
){
232 change_setworkarea_param
= 1;
234 } else if( wParam
== SPI_ICONVERTICALSPACING
) {
235 change_iconverticalspacing_param
= 1;
237 } else if( displaychange_test_active
)
239 if( !change_last_param
){
240 change_last_param
= wParam
;
243 ok(0,"too many changes counter=%d last change=%d\n",
244 change_counter
,change_last_param
);
246 change_last_param
= wParam
;
250 change_last_param
= change_setworkarea_param
= change_iconverticalspacing_param
=0;
251 if( wParam
== SPI_SETWORKAREA
)
252 change_setworkarea_param
= 1;
253 else if( wParam
== SPI_ICONVERTICALSPACING
)
254 change_iconverticalspacing_param
= 1;
256 change_last_param
= wParam
;
260 PostQuitMessage( 0 );
265 return( DefWindowProcA( hWnd
, msg
, wParam
, lParam
) );
272 Performs testing for system parameters messages
274 - system parameter id
275 - supposed value of the registry key
277 static void test_change_message( int action
, int optional
)
279 if (change_counter
==0 && optional
==1)
281 ok( 1 == change_counter
,
282 "Missed a message: change_counter=%d\n", change_counter
);
284 ok( action
== change_last_param
||
285 ( change_setworkarea_param
&& action
== SPI_SETWORKAREA
) ||
286 ( change_iconverticalspacing_param
&& action
== SPI_ICONVERTICALSPACING
),
287 "Wrong action got %d expected %d\n", change_last_param
, action
);
288 change_last_param
= 0;
291 static BOOL
test_error_msg ( int rc
, const char *name
)
293 DWORD last_error
= GetLastError();
297 if (last_error
==0xdeadbeef || last_error
==ERROR_INVALID_SPI_VALUE
|| last_error
==ERROR_INVALID_PARAMETER
)
299 skip("%s not supported on this platform\n", name
);
301 else if (last_error
==ERROR_ACCESS_DENIED
)
303 skip("%s does not have privileges to run\n", name
);
307 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name
,last_error
);
308 ok(rc
!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc
,last_error
);
314 ok(rc
!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc
,last_error
);
320 * Tests the HKEY_CURRENT_USER subkey value.
321 * The value should contain string value.
323 static void _test_reg_key( LPCSTR subKey1
, LPCSTR subKey2
, LPCSTR valName1
, LPCSTR valName2
,
324 const void *exp_value
, DWORD exp_type
, BOOL optional
)
326 CHAR value
[MAX_PATH
];
334 valueLen
=sizeof(value
);
335 RegOpenKeyA( HKEY_CURRENT_USER
, subKey1
, &hKey
);
336 rc
=RegQueryValueExA( hKey
, valName1
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
338 if (rc
==ERROR_SUCCESS
)
340 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
344 ok( *(DWORD
*)value
== *(DWORD
*)exp_value
,
345 "Wrong value in registry: %s %s %08x/%08x\n",
346 subKey1
, valName1
, *(DWORD
*)value
, *(DWORD
*)exp_value
);
349 ok( !strcmp( exp_value
, value
),
350 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
351 subKey1
, valName1
, value
, (const char *)exp_value
);
358 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
364 valueLen
=sizeof(value
);
365 RegOpenKeyA( HKEY_CURRENT_USER
, subKey1
, &hKey
);
366 rc
=RegQueryValueExA( hKey
, valName2
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
368 if (rc
==ERROR_SUCCESS
)
370 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
374 ok( *(DWORD
*)value
== *(DWORD
*)exp_value
,
375 "Wrong value in registry: %s %s %08x/%08x\n",
376 subKey1
, valName1
, *(DWORD
*)value
, *(DWORD
*)exp_value
);
379 ok( !strcmp( exp_value
, value
),
380 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
381 subKey1
, valName1
, value
, (const char *)exp_value
);
388 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
392 if (subKey2
&& !strict
)
395 valueLen
=sizeof(value
);
396 RegOpenKeyA( HKEY_CURRENT_USER
, subKey2
, &hKey
);
397 rc
=RegQueryValueExA( hKey
, valName1
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
399 if (rc
==ERROR_SUCCESS
)
401 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
405 ok( *(DWORD
*)value
== *(DWORD
*)exp_value
,
406 "Wrong value in registry: %s %s %08x/%08x\n",
407 subKey1
, valName1
, *(DWORD
*)value
, *(DWORD
*)exp_value
);
410 ok( !strcmp( exp_value
, value
),
411 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
412 subKey1
, valName1
, value
, (const char *)exp_value
);
419 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
425 valueLen
=sizeof(value
);
426 RegOpenKeyA( HKEY_CURRENT_USER
, subKey2
, &hKey
);
427 rc
=RegQueryValueExA( hKey
, valName2
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
429 if (rc
==ERROR_SUCCESS
)
431 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
435 ok( *(DWORD
*)value
== *(DWORD
*)exp_value
,
436 "Wrong value in registry: %s %s %08x/%08x\n",
437 subKey1
, valName1
, *(DWORD
*)value
, *(DWORD
*)exp_value
);
440 ok( !strcmp( exp_value
, value
),
441 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
442 subKey1
, valName1
, value
, (const char *)exp_value
);
449 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
454 ok(found
|| optional
,
455 "Missing registry values: %s or %s in keys: %s or %s\n",
456 valName1
, (valName2
?valName2
:"<n/a>"), subKey1
, (subKey2
?subKey2
:"<n/a>") );
459 #define test_reg_key( subKey, valName, testValue ) \
460 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, FALSE )
461 #define test_reg_key_optional( subKey, valName, testValue ) \
462 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, TRUE )
463 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
464 _test_reg_key( subKey1, subKey2, valName, NULL, testValue, REG_SZ, FALSE )
465 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
466 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, FALSE )
467 #define test_reg_key_ex2_optional( subKey1, subKey2, valName1, valName2, testValue ) \
468 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, TRUE )
469 #define test_reg_key_dword( subKey, valName, testValue ) \
470 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_DWORD, FALSE )
472 /* get a metric from the registry. If the value is negative
473 * it is assumed to be in twips and converted to pixels */
474 static UINT
metricfromreg( const char *keyname
, const char *valname
, int dpi
)
482 RegOpenKeyA( HKEY_CURRENT_USER
, keyname
, &hkey
);
484 ret
=RegQueryValueExA( hkey
, valname
, NULL
, &type
, (LPBYTE
)buf
, &size
);
486 if( ret
!= ERROR_SUCCESS
) return -1;
489 value
= ( -value
* dpi
+ 720) / 1440;
505 BYTE lfClipPrecision
;
507 BYTE lfPitchAndFamily
;
508 CHAR lfFaceName
[LF_FACESIZE
];
509 } LOGFONT16
, *LPLOGFONT16
;
511 /* get logfont from the registry */
512 static int lffromreg( const char *keyname
, const char *valname
, LOGFONTA
*plf
)
516 DWORD ret
, size
, type
;
518 RegOpenKeyA( HKEY_CURRENT_USER
, keyname
, &hkey
);
520 ret
=RegQueryValueExA( hkey
, valname
, NULL
, &type
, (LPBYTE
)&lfw
, &size
);
522 ok( ret
== ERROR_SUCCESS
, "Key \"%s\" value \"%s\" not found\n", keyname
, valname
);
523 if( ret
!= ERROR_SUCCESS
)
525 if( size
<= sizeof( LOGFONT16
)) {
526 LOGFONT16
*plf16
= (LOGFONT16
*) &lfw
;
527 plf
->lfHeight
= plf16
->lfHeight
;
528 plf
->lfWidth
= plf16
->lfWidth
;
529 plf
->lfEscapement
= plf16
->lfEscapement
;
530 plf
->lfOrientation
= plf16
->lfOrientation
;
531 plf
->lfWeight
= plf16
->lfWeight
;
532 plf
->lfItalic
= plf16
->lfItalic
;
533 plf
->lfUnderline
= plf16
->lfUnderline
;
534 plf
->lfStrikeOut
= plf16
->lfStrikeOut
;
535 plf
->lfCharSet
= plf16
->lfCharSet
;
536 plf
->lfOutPrecision
= plf16
->lfOutPrecision
;
537 plf
->lfClipPrecision
= plf16
->lfClipPrecision
;
538 plf
->lfQuality
= plf16
->lfQuality
;
539 plf
->lfPitchAndFamily
= plf16
->lfPitchAndFamily
;
540 memcpy( plf
->lfFaceName
, plf16
->lfFaceName
, LF_FACESIZE
);
541 } else if( size
<= sizeof( LOGFONTA
)) {
542 plf
= (LOGFONTA
*) &lfw
;
544 plf
->lfHeight
= lfw
.lfHeight
;
545 plf
->lfWidth
= lfw
.lfWidth
;
546 plf
->lfEscapement
= lfw
.lfEscapement
;
547 plf
->lfOrientation
= lfw
.lfOrientation
;
548 plf
->lfWeight
= lfw
.lfWeight
;
549 plf
->lfItalic
= lfw
.lfItalic
;
550 plf
->lfUnderline
= lfw
.lfUnderline
;
551 plf
->lfStrikeOut
= lfw
.lfStrikeOut
;
552 plf
->lfCharSet
= lfw
.lfCharSet
;
553 plf
->lfOutPrecision
= lfw
.lfOutPrecision
;
554 plf
->lfClipPrecision
= lfw
.lfClipPrecision
;
555 plf
->lfQuality
= lfw
.lfQuality
;
556 plf
->lfPitchAndFamily
= lfw
.lfPitchAndFamily
;
557 WideCharToMultiByte( CP_ACP
, 0, lfw
.lfFaceName
, -1, plf
->lfFaceName
,
558 LF_FACESIZE
, NULL
, NULL
);
564 static void test_SPI_SETBEEP( void ) /* 2 */
571 trace("testing SPI_{GET,SET}BEEP\n");
572 SetLastError(0xdeadbeef);
573 rc
=SystemParametersInfoA( SPI_GETBEEP
, 0, &old_b
, 0 );
574 if (!test_error_msg(rc
,"SPI_{GET,SET}BEEP"))
578 rc
=SystemParametersInfoA( SPI_SETBEEP
, curr_val
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
579 if (!test_error_msg(rc
,"SPI_SETBEEP")) return;
580 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
581 test_change_message( SPI_SETBEEP
, 0 );
582 test_reg_key( SPI_SETBEEP_REGKEY
,
584 curr_val
? "Yes" : "No" );
585 rc
=SystemParametersInfoA( SPI_GETBEEP
, 0, &b
, 0 );
586 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
587 eq( b
, curr_val
, "SPI_{GET,SET}BEEP", "%d" );
588 rc
=SystemParametersInfoW( SPI_GETBEEP
, 0, &b
, 0 );
589 if (rc
|| GetLastError() != ERROR_CALL_NOT_IMPLEMENTED
)
591 ok(rc
, "SystemParametersInfoW: rc=%d err=%d\n", rc
, GetLastError());
592 eq( b
, curr_val
, "SystemParametersInfoW", "%d" );
595 /* is a message sent for the second change? */
596 rc
=SystemParametersInfoA( SPI_SETBEEP
, curr_val
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
597 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
598 test_change_message( SPI_SETBEEP
, 0 );
601 rc
=SystemParametersInfoW( SPI_SETBEEP
, curr_val
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
602 if (rc
== FALSE
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
603 rc
=SystemParametersInfoA( SPI_SETBEEP
, curr_val
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
604 ok(rc
, "SystemParametersInfo: rc=%d err=%d\n", rc
, GetLastError());
605 test_change_message( SPI_SETBEEP
, 0 );
606 test_reg_key( SPI_SETBEEP_REGKEY
,
608 curr_val
? "Yes" : "No" );
609 rc
=SystemParametersInfoA( SPI_GETBEEP
, 0, &b
, 0 );
610 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
611 eq( b
, curr_val
, "SPI_{GET,SET}BEEP", "%d" );
612 rc
=SystemParametersInfoW( SPI_GETBEEP
, 0, &b
, 0 );
613 if (rc
|| GetLastError() != ERROR_CALL_NOT_IMPLEMENTED
)
615 ok(rc
, "SystemParametersInfoW: rc=%d err=%d\n", rc
, GetLastError());
616 eq( b
, curr_val
, "SystemParametersInfoW", "%d" );
618 ok( MessageBeep( MB_OK
), "Return value of MessageBeep when sound is disabled\n" );
620 rc
=SystemParametersInfoA( SPI_SETBEEP
, old_b
, 0, SPIF_UPDATEINIFILE
);
621 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
624 static const char *setmouse_valuenames
[3] = {
625 SPI_SETMOUSE_VALNAME1
,
626 SPI_SETMOUSE_VALNAME2
,
627 SPI_SETMOUSE_VALNAME3
631 * Runs check for one setting of spi_setmouse.
633 static BOOL
run_spi_setmouse_test( int curr_val
[], POINT
*req_change
, POINT
*proj_change
, int nchange
)
637 static int aw_turn
= 0;
638 static BOOL w_implemented
= TRUE
;
645 if ((aw_turn
% 2!=0) && (w_implemented
))
647 /* call unicode on odd (non even) calls */
648 SetLastError(0xdeadbeef);
649 rc
=SystemParametersInfoW( SPI_SETMOUSE
, 0, curr_val
, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
650 if (rc
== FALSE
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
652 w_implemented
= FALSE
;
653 trace("SystemParametersInfoW not supported on this platform\n");
657 if ((aw_turn
% 2==0) || (!w_implemented
))
659 /* call ascii version on even calls or if unicode is not available */
660 rc
=SystemParametersInfoA( SPI_SETMOUSE
, 0, curr_val
, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
662 if (!test_error_msg(rc
,"SPI_SETMOUSE")) return FALSE
;
664 ok(rc
, "SystemParametersInfo: rc=%d err=%d\n", rc
, GetLastError());
665 test_change_message( SPI_SETMOUSE
, 0 );
666 for (i
= 0; i
< 3; i
++)
668 sprintf( buf
, "%d", curr_val
[i
] );
669 test_reg_key( SPI_SETMOUSE_REGKEY
, setmouse_valuenames
[i
], buf
);
672 rc
=SystemParametersInfoA( SPI_GETMOUSE
, 0, mi
, 0 );
673 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
674 for (i
= 0; i
< 3; i
++)
676 ok(mi
[i
] == curr_val
[i
],
677 "incorrect value for %d: %d != %d\n", i
, mi
[i
], curr_val
[i
]);
682 rc
=SystemParametersInfoW( SPI_GETMOUSE
, 0, mi
, 0 );
683 ok(rc
, "SystemParametersInfoW: rc=%d err=%d\n", rc
, GetLastError());
684 for (i
= 0; i
< 3; i
++)
686 ok(mi
[i
] == curr_val
[i
],
687 "incorrect value for %d: %d != %d\n", i
, mi
[i
], curr_val
[i
]);
693 /* FIXME: this always fails for me - AJ */
694 for (i
= 0; i
< nchange
; i
++)
697 mouse_event( MOUSEEVENTF_ABSOLUTE
| MOUSEEVENTF_MOVE
, 0, 0, 0, 0 );
698 mouse_event( MOUSEEVENTF_MOVE
, req_change
[i
].x
, req_change
[i
].y
, 0, 0 );
700 ok( proj_change
[i
].x
== mv
.x
, "Projected dx and real dx comparison. May fail under high load.\n" );
701 ok( proj_change
[i
].y
== mv
.y
, "Projected dy equals real dy. May fail under high load.\n" );
707 static void test_SPI_SETMOUSE( void ) /* 4 */
712 /* win nt default values - 6, 10, 1 */
713 INT curr_val
[3] = {6, 10, 1};
715 /* requested and projected mouse movements */
716 POINT req_change
[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
717 POINT proj_change1
[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
718 POINT proj_change2
[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
719 POINT proj_change3
[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
720 POINT proj_change4
[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
721 POINT proj_change5
[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
722 POINT proj_change6
[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
723 POINT proj_change7
[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
724 POINT proj_change8
[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
726 int nchange
= sizeof( req_change
) / sizeof( POINT
);
728 trace("testing SPI_{GET,SET}MOUSE\n");
729 SetLastError(0xdeadbeef);
730 rc
=SystemParametersInfoA( SPI_GETMOUSE
, 0, old_mi
, 0 );
731 if (!test_error_msg(rc
,"SPI_{GET,SET}MOUSE"))
734 if (!run_spi_setmouse_test( curr_val
, req_change
, proj_change1
, nchange
)) return;
736 /* acceleration change */
738 run_spi_setmouse_test( curr_val
, req_change
, proj_change2
, nchange
);
740 /* acceleration change */
742 run_spi_setmouse_test( curr_val
, req_change
, proj_change3
, nchange
);
744 /* acceleration change */
746 run_spi_setmouse_test( curr_val
, req_change
, proj_change4
, nchange
);
748 /* threshold change */
751 run_spi_setmouse_test( curr_val
, req_change
, proj_change5
, nchange
);
753 /* threshold change */
757 run_spi_setmouse_test( curr_val
, req_change
, proj_change6
, nchange
);
759 /* threshold change */
761 run_spi_setmouse_test( curr_val
, req_change
, proj_change7
, nchange
);
763 /* threshold change */
765 run_spi_setmouse_test( curr_val
, req_change
, proj_change8
, nchange
);
767 rc
=SystemParametersInfoA( SPI_SETMOUSE
, 0, old_mi
, SPIF_UPDATEINIFILE
);
768 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
771 static BOOL
test_setborder(UINT curr_val
, int usesetborder
, int dpi
)
776 NONCLIENTMETRICSA ncm
;
778 ncm
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
779 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
780 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
782 rc
=SystemParametersInfoA( SPI_SETBORDER
, curr_val
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
783 if (!test_error_msg(rc
,"SPI_SETBORDER")) return FALSE
;
784 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
785 test_change_message( SPI_SETBORDER
, 1 );
786 } else { /* set non client metrics */
787 ncm
.iBorderWidth
= curr_val
;
788 rc
=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS
, 0, &ncm
, SPIF_UPDATEINIFILE
|
790 if (!test_error_msg(rc
,"SPI_SETNONCLIENTMETRICS")) return FALSE
;
791 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
792 test_change_message( SPI_SETNONCLIENTMETRICS
, 1 );
794 if( curr_val
) { /* skip if 0, some windows versions return 0 others 1 */
795 regval
= metricfromreg( SPI_SETBORDER_REGKEY2
, SPI_SETBORDER_VALNAME
, dpi
);
796 if( regval
!= curr_val
)
797 regval
= metricfromreg( SPI_SETBORDER_REGKEY
, SPI_SETBORDER_VALNAME
, dpi
);
798 ok( regval
==curr_val
, "wrong value in registry %d, expected %d\n", regval
, curr_val
);
800 /* minimum border width is 1 */
801 if (curr_val
== 0) curr_val
= 1;
802 /* should be the same as the non client metrics */
803 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
804 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
805 eq( (UINT
)ncm
.iBorderWidth
, curr_val
, "NonClientMetric.iBorderWidth", "%d");
806 /* and from SPI_GETBORDER */
807 rc
=SystemParametersInfoA( SPI_GETBORDER
, 0, &border
, 0 );
808 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
809 eq( border
, curr_val
, "SPI_{GET,SET}BORDER", "%d");
810 /* test some SystemMetrics */
811 frame
= curr_val
+ GetSystemMetrics( SM_CXDLGFRAME
);
812 eq( frame
, GetSystemMetrics( SM_CXFRAME
), "SM_CXFRAME", "%d" );
813 eq( frame
, GetSystemMetrics( SM_CYFRAME
), "SM_CYFRAME", "%d" );
814 eq( frame
, GetSystemMetrics( SM_CXSIZEFRAME
), "SM_CXSIZEFRAME", "%d" );
815 eq( frame
, GetSystemMetrics( SM_CYSIZEFRAME
), "SM_CYSIZEFRAME", "%d" );
819 static void test_SPI_SETBORDER( void ) /* 6 */
823 NONCLIENTMETRICSA ncmsave
;
827 ncmsave
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
828 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, 0, &ncmsave
, 0);
830 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
833 /* CaptionWidth from the registry may have different value of iCaptionWidth
834 * from the non client metrics (observed on WinXP).
835 * Fix this so we can safely restore settings with the nonclientmetrics */
836 CaptionWidth
= metricfromreg(
837 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi
);
838 ncmsave
.iCaptionWidth
= CaptionWidth
;
840 /* These tests hang when XFree86 4.0 for Windows is running (tested on
841 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
844 if (FindWindowA( NULL
, "Cygwin/XFree86" ))
847 trace("testing SPI_{GET,SET}BORDER\n");
849 SetLastError(0xdeadbeef);
850 rc
=SystemParametersInfoA( SPI_GETBORDER
, 0, &old_border
, 0 );
851 if (!test_error_msg(rc
,"SPI_{GET,SET}BORDER"))
853 /* FIXME: include new PaddedBorderWidth parameter */
854 PaddedBorderWidth
= ncmsave
.iBorderWidth
- old_border
;
855 if( PaddedBorderWidth
){
856 win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n",
860 /* This will restore sane values if the test hang previous run. */
861 if ( old_border
== 7 || old_border
== 20 )
864 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
865 * do it twice to make the intended change). So skip parts of the tests on
868 /* win2k3 fails if you set the same border twice, or if size is 0 */
869 if (!test_setborder(2, 1, dpi
)) return;
870 test_setborder(1, 1, dpi
);
871 test_setborder(3, 1, dpi
);
873 if (!test_setborder(1, 0, dpi
)) return;
874 test_setborder(0, 0, dpi
);
875 test_setborder(3, 0, dpi
);
877 rc
=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS
, 0, &ncmsave
,
878 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
879 test_change_message( SPI_SETNONCLIENTMETRICS
, 1 );
880 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
883 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
887 const UINT vals
[]={0,20,31};
890 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
891 SetLastError(0xdeadbeef);
892 rc
=SystemParametersInfoA( SPI_GETKEYBOARDSPEED
, 0, &old_speed
, 0 );
893 if (!test_error_msg(rc
,"SPI_{GET,SET}KEYBOARDSPEED"))
896 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
901 rc
=SystemParametersInfoA( SPI_SETKEYBOARDSPEED
, vals
[i
], 0,
902 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
903 if (!test_error_msg(rc
,"SPI_SETKEYBOARDSPEED")) return;
904 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
905 test_change_message( SPI_SETKEYBOARDSPEED
, 0 );
906 sprintf( buf
, "%d", vals
[i
] );
907 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY
, SPI_SETKEYBOARDSPEED_VALNAME
, buf
);
909 rc
=SystemParametersInfoA( SPI_GETKEYBOARDSPEED
, 0, &v
, 0 );
910 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
911 eq( v
, vals
[i
], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
914 rc
=SystemParametersInfoA( SPI_SETKEYBOARDSPEED
, old_speed
, 0, SPIF_UPDATEINIFILE
);
915 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
918 /* test_SPI_ICONHORIZONTALSPACING helper */
919 static BOOL
dotest_spi_iconhorizontalspacing( INT curr_val
)
922 INT spacing
, regval
, min_val
= MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
);
925 rc
=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, curr_val
, 0,
926 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
927 if (!test_error_msg(rc
,"SPI_ICONHORIZONTALSPACING")) return FALSE
;
928 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
929 test_change_message( SPI_ICONHORIZONTALSPACING
, 0 );
930 curr_val
= max( curr_val
, min_val
);
931 /* The registry keys depend on the Windows version and the values too
932 * let's test (works on win95,ME,NT4,2k,XP)
934 regval
= metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2
, SPI_ICONHORIZONTALSPACING_VALNAME
, dpi
);
935 if( regval
!= curr_val
)
936 regval
= metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY
, SPI_ICONHORIZONTALSPACING_VALNAME
, dpi
);
937 ok( curr_val
== regval
,
938 "wrong value in registry %d, expected %d\n", regval
, curr_val
);
939 /* compare with what SPI_ICONHORIZONTALSPACING returns */
940 rc
=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0, &spacing
, 0 );
941 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
942 eq( spacing
, curr_val
, "ICONHORIZONTALSPACING", "%d");
943 /* and with a system metrics */
944 eq( GetSystemMetrics( SM_CXICONSPACING
), curr_val
, "SM_CXICONSPACING", "%d" );
945 /* and with what SPI_GETICONMETRICS returns */
946 im
.cbSize
= sizeof(ICONMETRICSA
);
947 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im
, FALSE
);
948 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
949 eq( im
.iHorzSpacing
, curr_val
, "SPI_GETICONMETRICS", "%d" );
953 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
958 trace("testing SPI_ICONHORIZONTALSPACING\n");
959 SetLastError(0xdeadbeef);
960 /* default value: 75 */
961 rc
=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0, &old_spacing
, 0 );
962 if (!test_error_msg(rc
,"SPI_ICONHORIZONTALSPACING"))
964 /* do not increase the value as it would upset the user's icon layout */
965 if (!dotest_spi_iconhorizontalspacing( old_spacing
- 1)) return;
966 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
968 rc
=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, old_spacing
, 0, SPIF_UPDATEINIFILE
);
969 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
972 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
976 const UINT vals
[]={0,32767};
979 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
980 SetLastError(0xdeadbeef);
981 rc
=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT
, 0, &old_timeout
, 0 );
982 if (!test_error_msg(rc
,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
985 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
990 rc
=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT
, vals
[i
], 0,
991 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
992 if (!test_error_msg(rc
,"SPI_SETSCREENSAVETIMEOUT")) return;
993 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
994 test_change_message( SPI_SETSCREENSAVETIMEOUT
, 0 );
995 sprintf( buf
, "%d", vals
[i
] );
996 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY
,
997 SPI_SETSCREENSAVETIMEOUT_VALNAME
, buf
);
999 rc
= SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT
, 0, &v
, 0 );
1000 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1001 eq( v
, vals
[i
], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
1004 rc
=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT
, old_timeout
, 0,
1005 SPIF_UPDATEINIFILE
);
1006 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1009 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
1013 const UINT vals
[]={TRUE
,FALSE
};
1016 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
1017 SetLastError(0xdeadbeef);
1018 rc
=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE
, 0, &old_b
, 0 );
1019 if (!test_error_msg(rc
,"SPI_{GET,SET}SCREENSAVEACTIVE"))
1022 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1026 rc
=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE
, vals
[i
], 0,
1027 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1028 if (!test_error_msg(rc
,"SPI_SETSCREENSAVEACTIVE")) return;
1029 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1030 test_change_message( SPI_SETSCREENSAVEACTIVE
, 0 );
1031 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY
,
1032 SPI_SETSCREENSAVEACTIVE_VALNAME
,
1033 vals
[i
] ? "1" : "0" );
1035 rc
=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE
, 0, &v
, 0 );
1036 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1037 ok(v
== vals
[i
] || broken(! v
) /* Win 7 */,
1038 "SPI_{GET,SET}SCREENSAVEACTIVE: got %d instead of %d\n", v
, vals
[i
]);
1041 rc
=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE
, old_b
, 0, SPIF_UPDATEINIFILE
);
1042 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1045 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
1050 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1054 const UINT vals
[]={0,3};
1057 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
1058 SetLastError(0xdeadbeef);
1059 rc
=SystemParametersInfoA( SPI_GETKEYBOARDDELAY
, 0, &old_delay
, 0 );
1060 if (!test_error_msg(rc
,"SPI_{GET,SET}KEYBOARDDELAY"))
1063 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1068 rc
=SystemParametersInfoA( SPI_SETKEYBOARDDELAY
, vals
[i
], 0,
1069 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1070 if (!test_error_msg(rc
,"SPI_SETKEYBOARDDELAY")) return;
1071 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1072 test_change_message( SPI_SETKEYBOARDDELAY
, 0 );
1073 sprintf( buf
, "%d", vals
[i
] );
1074 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY
,
1075 SPI_SETKEYBOARDDELAY_VALNAME
, buf
);
1077 rc
=SystemParametersInfoA( SPI_GETKEYBOARDDELAY
, 0, &delay
, 0 );
1078 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1079 eq( delay
, vals
[i
], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
1082 rc
=SystemParametersInfoA( SPI_SETKEYBOARDDELAY
, old_delay
, 0, SPIF_UPDATEINIFILE
);
1083 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1087 /* test_SPI_ICONVERTICALSPACING helper */
1088 static BOOL
dotest_spi_iconverticalspacing( INT curr_val
)
1091 INT spacing
, regval
, min_val
= MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
);
1094 rc
=SystemParametersInfoA( SPI_ICONVERTICALSPACING
, curr_val
, 0,
1095 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1096 if (!test_error_msg(rc
,"SPI_ICONVERTICALSPACING")) return FALSE
;
1097 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1098 test_change_message( SPI_ICONVERTICALSPACING
, 0 );
1099 curr_val
= max( curr_val
, min_val
);
1100 /* The registry keys depend on the Windows version and the values too
1101 * let's test (works on win95,ME,NT4,2k,XP)
1103 regval
= metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2
, SPI_ICONVERTICALSPACING_VALNAME
, dpi
);
1104 if( regval
!= curr_val
)
1105 regval
= metricfromreg( SPI_ICONVERTICALSPACING_REGKEY
, SPI_ICONVERTICALSPACING_VALNAME
, dpi
);
1106 ok( curr_val
== regval
,
1107 "wrong value in registry %d, expected %d\n", regval
, curr_val
);
1108 /* compare with what SPI_ICONVERTICALSPACING returns */
1109 rc
=SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0, &spacing
, 0 );
1110 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1111 eq( spacing
, curr_val
, "ICONVERTICALSPACING", "%d" );
1112 /* and with a system metrics */
1113 eq( GetSystemMetrics( SM_CYICONSPACING
), curr_val
, "SM_CYICONSPACING", "%d" );
1114 /* and with what SPI_GETICONMETRICS returns */
1115 im
.cbSize
= sizeof(ICONMETRICSA
);
1116 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im
, FALSE
);
1117 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1118 eq( im
.iVertSpacing
, curr_val
, "SPI_GETICONMETRICS", "%d" );
1122 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1127 trace("testing SPI_ICONVERTICALSPACING\n");
1128 SetLastError(0xdeadbeef);
1129 /* default value: 75 */
1130 rc
=SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0, &old_spacing
, 0 );
1131 if (!test_error_msg(rc
,"SPI_ICONVERTICALSPACING"))
1133 /* do not increase the value as it would upset the user's icon layout */
1134 if (!dotest_spi_iconverticalspacing( old_spacing
- 1)) return;
1135 /* same tests with a value less than the minimum 32 */
1136 dotest_spi_iconverticalspacing( 10);
1138 rc
=SystemParametersInfoA( SPI_ICONVERTICALSPACING
, old_spacing
, 0,
1139 SPIF_UPDATEINIFILE
);
1140 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1143 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1147 const UINT vals
[]={TRUE
,FALSE
};
1151 /* These tests hang when XFree86 4.0 for Windows is running (tested on
1152 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
1155 if (FindWindowA( NULL
, "Cygwin/XFree86" ))
1158 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1159 SetLastError(0xdeadbeef);
1160 rc
=SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0, &old_b
, 0 );
1161 if (!test_error_msg(rc
,"SPI_{GET,SET}ICONTITLEWRAP"))
1164 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1169 rc
=SystemParametersInfoA( SPI_SETICONTITLEWRAP
, vals
[i
], 0,
1170 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1171 if (!test_error_msg(rc
,"SPI_SETICONTITLEWRAP")) return;
1172 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1173 test_change_message( SPI_SETICONTITLEWRAP
, 1 );
1174 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2
,
1175 SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1176 if( regval
!= vals
[i
])
1177 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1
,
1178 SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1179 ok( regval
== vals
[i
] || broken(regval
== -1), /* win9x */
1180 "wrong value in registry %d, expected %d\n", regval
, vals
[i
] );
1182 rc
=SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0, &v
, 0 );
1183 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1184 eq( v
, vals
[i
], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1185 /* and test with what SPI_GETICONMETRICS returns */
1186 im
.cbSize
= sizeof(ICONMETRICSA
);
1187 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im
, FALSE
);
1188 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1189 eq( im
.iTitleWrap
, (BOOL
)vals
[i
], "SPI_GETICONMETRICS", "%d" );
1192 rc
=SystemParametersInfoA( SPI_SETICONTITLEWRAP
, old_b
, 0, SPIF_UPDATEINIFILE
);
1193 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1196 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1200 const UINT vals
[]={TRUE
,FALSE
};
1203 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1204 SetLastError(0xdeadbeef);
1205 rc
=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT
, 0, &old_b
, 0 );
1206 if (!test_error_msg(rc
,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1209 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1213 rc
=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT
, vals
[i
], 0,
1214 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1215 if (!test_error_msg(rc
,"SPI_SETMENUDROPALIGNMENT")) return;
1216 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1217 test_change_message( SPI_SETMENUDROPALIGNMENT
, 0 );
1218 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1
,
1219 SPI_SETMENUDROPALIGNMENT_REGKEY2
,
1220 SPI_SETMENUDROPALIGNMENT_VALNAME
,
1221 vals
[i
] ? "1" : "0" );
1223 rc
=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT
, 0, &v
, 0 );
1224 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1225 eq( v
, vals
[i
], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1226 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT
), (int)vals
[i
],
1227 "SM_MENUDROPALIGNMENT", "%d" );
1230 rc
=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT
, old_b
, 0,
1231 SPIF_UPDATEINIFILE
);
1232 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1235 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1239 const UINT vals
[]={0,10000};
1242 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1243 old_width
= GetSystemMetrics( SM_CXDOUBLECLK
);
1245 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1249 SetLastError(0xdeadbeef);
1250 rc
=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH
, vals
[i
], 0,
1251 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1252 if (!test_error_msg(rc
,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1255 test_change_message( SPI_SETDOUBLECLKWIDTH
, 0 );
1256 sprintf( buf
, "%d", vals
[i
] );
1257 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1
,
1258 SPI_SETDOUBLECLKWIDTH_REGKEY2
,
1259 SPI_SETDOUBLECLKWIDTH_VALNAME
, buf
);
1260 eq( GetSystemMetrics( SM_CXDOUBLECLK
), (int)vals
[i
],
1261 "SM_CXDOUBLECLK", "%d" );
1264 rc
=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH
, old_width
, 0,
1265 SPIF_UPDATEINIFILE
);
1266 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1269 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1273 const UINT vals
[]={0,10000};
1276 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1277 old_height
= GetSystemMetrics( SM_CYDOUBLECLK
);
1279 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1283 SetLastError(0xdeadbeef);
1284 rc
=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT
, vals
[i
], 0,
1285 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1286 if (!test_error_msg(rc
,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1289 test_change_message( SPI_SETDOUBLECLKHEIGHT
, 0 );
1290 sprintf( buf
, "%d", vals
[i
] );
1291 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1
,
1292 SPI_SETDOUBLECLKHEIGHT_REGKEY2
,
1293 SPI_SETDOUBLECLKHEIGHT_VALNAME
, buf
);
1294 eq( GetSystemMetrics( SM_CYDOUBLECLK
), (int)vals
[i
],
1295 "SM_CYDOUBLECLK", "%d" );
1298 rc
=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT
, old_height
, 0,
1299 SPIF_UPDATEINIFILE
);
1300 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1303 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1311 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1312 old_time
= GetDoubleClickTime();
1315 SetLastError(0xdeadbeef);
1316 rc
=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME
, curr_val
, 0,
1317 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1318 if (!test_error_msg(rc
,"SPI_{GET,SET}DOUBLECLICKTIME"))
1321 test_change_message( SPI_SETDOUBLECLICKTIME
, 0 );
1322 sprintf( buf
, "%d", curr_val
);
1323 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY
,
1324 SPI_SETDOUBLECLICKTIME_VALNAME
, buf
);
1325 curr_val
= 500; /* used value for 0 */
1326 eq( GetDoubleClickTime(), curr_val
, "GetDoubleClickTime", "%d" );
1329 rc
=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME
, curr_val
, 0,
1330 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1331 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1332 test_change_message( SPI_SETDOUBLECLICKTIME
, 0 );
1333 sprintf( buf
, "%d", curr_val
);
1334 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY
,
1335 SPI_SETDOUBLECLICKTIME_VALNAME
, buf
);
1336 eq( GetDoubleClickTime(), curr_val
, "GetDoubleClickTime", "%d" );
1338 saved_val
= curr_val
;
1341 SetDoubleClickTime( curr_val
);
1342 sprintf( buf
, "%d", saved_val
);
1343 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY
,
1344 SPI_SETDOUBLECLICKTIME_VALNAME
, buf
);
1345 curr_val
= 500; /* used value for 0 */
1346 eq( GetDoubleClickTime(), curr_val
, "GetDoubleClickTime", "%d" );
1349 SetDoubleClickTime( curr_val
);
1350 sprintf( buf
, "%d", saved_val
);
1351 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY
,
1352 SPI_SETDOUBLECLICKTIME_VALNAME
, buf
);
1353 eq( GetDoubleClickTime(), curr_val
, "GetDoubleClickTime", "%d" );
1355 rc
=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME
, old_time
, 0, SPIF_UPDATEINIFILE
);
1356 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1359 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1363 const UINT vals
[]={TRUE
,FALSE
};
1366 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1367 old_b
= GetSystemMetrics( SM_SWAPBUTTON
);
1369 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1371 SetLastError(0xdeadbeef);
1372 rc
=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP
, vals
[i
], 0,
1373 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1374 if (!test_error_msg(rc
,"SPI_SETMOUSEBUTTONSWAP")) return;
1376 test_change_message( SPI_SETMOUSEBUTTONSWAP
, 0 );
1377 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY
,
1378 SPI_SETMOUSEBUTTONSWAP_VALNAME
,
1379 vals
[i
] ? "1" : "0" );
1380 eq( GetSystemMetrics( SM_SWAPBUTTON
), (int)vals
[i
],
1381 "SM_SWAPBUTTON", "%d" );
1382 rc
=SwapMouseButton((BOOL
)vals
[i
^1]);
1383 eq( GetSystemMetrics( SM_SWAPBUTTON
), (int)vals
[i
^1],
1384 "SwapMouseButton", "%d" );
1385 ok( rc
==(BOOL
)vals
[i
], "SwapMouseButton does not return previous state (really %d)\n", rc
);
1388 rc
=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP
, old_b
, 0,
1389 SPIF_UPDATEINIFILE
);
1390 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1393 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1398 trace("testing SPI_GETFASTTASKSWITCH\n");
1399 SetLastError(0xdeadbeef);
1400 rc
=SystemParametersInfoA( SPI_GETFASTTASKSWITCH
, 0, &v
, 0 );
1401 if (!test_error_msg(rc
,"SPI_{GET,SET}FASTTASKSWITCH"))
1404 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1405 * works. That sure simplifies testing!
1409 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1413 const UINT vals
[]={TRUE
,FALSE
};
1416 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1417 SetLastError(0xdeadbeef);
1418 rc
=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS
, 0, &old_b
, 0 );
1420 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1421 if (!test_error_msg(rc
,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1424 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1428 rc
=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS
, vals
[i
], 0,
1429 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1430 if (!test_error_msg(rc
,"SPI_SETDRAGFULLWINDOWS")) return;
1431 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1432 test_change_message( SPI_SETDRAGFULLWINDOWS
, 0 );
1433 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY
,
1434 SPI_SETDRAGFULLWINDOWS_VALNAME
,
1435 vals
[i
] ? "1" : "0" );
1437 rc
=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS
, 0, &v
, 0 );
1438 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1439 eq( v
, vals
[i
], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1442 rc
=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS
, old_b
, 0, SPIF_UPDATEINIFILE
);
1443 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1446 #define test_reg_metric( KEY, VAL, val) \
1448 regval = metricfromreg( KEY, VAL, dpi);\
1449 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1452 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1454 regval = metricfromreg( KEY1, VAL, dpi);\
1455 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1456 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1459 #define test_reg_font( KEY, VAL, LF) \
1461 lffromreg( KEY, VAL, &lfreg);\
1462 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == MulDiv( lfreg.lfHeight, dpi, real_dpi ) : \
1463 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1464 (LF).lfWidth == lfreg.lfWidth &&\
1465 (LF).lfWeight == lfreg.lfWeight &&\
1466 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1467 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1470 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1471 /*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1472 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1473 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1474 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1475 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1476 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1477 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1478 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1479 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1480 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1481 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1482 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1483 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1484 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1486 /* get text metric height value for the specified logfont */
1487 static int get_tmheight( LOGFONTA
*plf
, int flag
)
1490 HFONT hfont
= CreateFontIndirectA( plf
);
1491 hfont
= SelectObject( hdc
, hfont
);
1492 GetTextMetricsA( hdc
, &tm
);
1493 hfont
= SelectObject( hdc
, hfont
);
1494 return tm
.tmHeight
+ (flag
? tm
.tmExternalLeading
: 0);
1497 static void test_GetSystemMetrics( void);
1498 static UINT smcxsmsize
= 999999999;
1500 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1504 NONCLIENTMETRICSA Ncmorig
;
1505 NONCLIENTMETRICSA Ncmnew
;
1506 NONCLIENTMETRICSA Ncmcur
;
1507 NONCLIENTMETRICSA Ncmstart
;
1509 Ncmorig
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
1510 Ncmnew
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
1511 Ncmcur
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
1512 Ncmstart
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
1514 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1516 SetLastError(0xdeadbeef);
1517 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICSA
), &Ncmorig
, FALSE
);
1518 if (!test_error_msg(rc
,"SPI_{GET,SET}NONCLIENTMETRICS"))
1521 smcxsmsize
= Ncmstart
.iSmCaptionWidth
;
1522 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1523 the caption font height is higher than the CaptionHeight field,
1524 the latter is adjusted accordingly. To be able to restore these setting
1525 accurately be restore the raw values. */
1526 Ncmorig
.iCaptionWidth
= metricfromreg( SPI_METRIC_REGKEY
, SPI_CAPTIONWIDTH_VALNAME
, real_dpi
);
1527 Ncmorig
.iCaptionHeight
= metricfromreg( SPI_METRIC_REGKEY
, SPI_CAPTIONHEIGHT_VALNAME
, dpi
);
1528 Ncmorig
.iSmCaptionHeight
= metricfromreg( SPI_METRIC_REGKEY
, SPI_SMCAPTIONHEIGHT_VALNAME
, dpi
);
1529 Ncmorig
.iMenuHeight
= metricfromreg( SPI_METRIC_REGKEY
, SPI_MENUHEIGHT_VALNAME
, dpi
);
1530 /* test registry entries */
1531 TEST_NONCLIENTMETRICS_REG( Ncmorig
)
1532 Ncmorig
.lfCaptionFont
.lfHeight
= MulDiv( Ncmorig
.lfCaptionFont
.lfHeight
, real_dpi
, dpi
);
1534 /* make small changes */
1536 Ncmnew
.iBorderWidth
+= 1;
1537 Ncmnew
.iScrollWidth
+= 1;
1538 Ncmnew
.iScrollHeight
-= 1;
1539 Ncmnew
.iCaptionWidth
-= 2;
1540 Ncmnew
.iCaptionHeight
+= 2;
1541 Ncmnew
.lfCaptionFont
.lfHeight
+=1;
1542 Ncmnew
.lfCaptionFont
.lfWidth
+=2;
1543 Ncmnew
.lfCaptionFont
.lfWeight
+=1;
1544 Ncmnew
.iSmCaptionWidth
+= 1;
1545 Ncmnew
.iSmCaptionHeight
+= 2;
1546 Ncmnew
.lfSmCaptionFont
.lfHeight
+=3;
1547 Ncmnew
.lfSmCaptionFont
.lfWidth
-=1;
1548 Ncmnew
.lfSmCaptionFont
.lfWeight
+=3;
1549 Ncmnew
.iMenuWidth
+= 1;
1550 Ncmnew
.iMenuHeight
+= 2;
1551 Ncmnew
.lfMenuFont
.lfHeight
+=1;
1552 Ncmnew
.lfMenuFont
.lfWidth
+=1;
1553 Ncmnew
.lfMenuFont
.lfWeight
+=2;
1554 Ncmnew
.lfStatusFont
.lfHeight
-=1;
1555 Ncmnew
.lfStatusFont
.lfWidth
-=1;
1556 Ncmnew
.lfStatusFont
.lfWeight
+=3;
1557 Ncmnew
.lfMessageFont
.lfHeight
-=2;
1558 Ncmnew
.lfMessageFont
.lfWidth
-=1;
1559 Ncmnew
.lfMessageFont
.lfWeight
+=4;
1561 rc
=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS
, 0, &Ncmnew
, SPIF_UPDATEINIFILE
|
1563 if (!test_error_msg(rc
,"SPI_SETNONCLIENTMETRICS")) return;
1564 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1565 test_change_message( SPI_SETNONCLIENTMETRICS
, 1 );
1567 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICSA
), &Ncmcur
, FALSE
);
1568 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1569 /* test registry entries */
1570 TEST_NONCLIENTMETRICS_REG( Ncmcur
)
1571 /* test the system metrics with these settings */
1572 test_GetSystemMetrics();
1573 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1574 by a large amount will increase the {menu|caption|smcaption} height*/
1576 Ncmnew
.lfMenuFont
.lfHeight
-= 8;
1577 Ncmnew
.lfCaptionFont
.lfHeight
=-4;
1578 Ncmnew
.lfSmCaptionFont
.lfHeight
-=10;
1579 /* also show that a few values are lo limited */
1580 Ncmnew
.iCaptionWidth
= 0;
1581 Ncmnew
.iCaptionHeight
= 0;
1582 Ncmnew
.iScrollHeight
= 0;
1583 Ncmnew
.iScrollWidth
= 0;
1585 rc
=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS
, 0, &Ncmnew
, SPIF_UPDATEINIFILE
|
1587 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1588 test_change_message( SPI_SETNONCLIENTMETRICS
, 1 );
1589 /* raw values are in registry */
1590 TEST_NONCLIENTMETRICS_REG( Ncmnew
)
1592 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICSA
), &Ncmcur
, FALSE
);
1593 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1594 /* cooked values are returned */
1595 expect
= max( Ncmnew
.iMenuHeight
, 2 + get_tmheight( &Ncmnew
.lfMenuFont
, 1));
1596 ok( Ncmcur
.iMenuHeight
== expect
,
1597 "MenuHeight: %d expected %d\n", Ncmcur
.iMenuHeight
, expect
);
1598 expect
= max( Ncmnew
.iCaptionHeight
, 2 + get_tmheight(&Ncmnew
.lfCaptionFont
, 0));
1599 ok( Ncmcur
.iCaptionHeight
== expect
,
1600 "CaptionHeight: %d expected %d\n", Ncmcur
.iCaptionHeight
, expect
);
1601 expect
= max( Ncmnew
.iSmCaptionHeight
, 2 + get_tmheight( &Ncmnew
.lfSmCaptionFont
, 0));
1602 ok( Ncmcur
.iSmCaptionHeight
== expect
,
1603 "SmCaptionHeight: %d expected %d\n", Ncmcur
.iSmCaptionHeight
, expect
);
1605 /* iCaptionWidth depends on a version, could be 8, 12 (Vista, Win7), 13 */
1606 ok( (Ncmcur
.iCaptionWidth
>= 8 && Ncmcur
.iCaptionWidth
<= 13) ||
1607 Ncmcur
.iCaptionWidth
== Ncmstart
.iCaptionWidth
, /* with windows XP theme, the value never changes */
1608 "CaptionWidth: %d expected from [8, 13] or %d\n", Ncmcur
.iCaptionWidth
, Ncmstart
.iCaptionWidth
);
1609 ok( Ncmcur
.iScrollWidth
== 8,
1610 "ScrollWidth: %d expected 8\n", Ncmcur
.iScrollWidth
);
1611 ok( Ncmcur
.iScrollHeight
== 8,
1612 "ScrollHeight: %d expected 8\n", Ncmcur
.iScrollHeight
);
1613 /* test the system metrics with these settings */
1614 test_GetSystemMetrics();
1616 rc
=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICSA
),
1617 &Ncmorig
, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1618 test_change_message( SPI_SETNONCLIENTMETRICS
, 0 );
1619 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1620 /* test the system metrics with these settings */
1621 test_GetSystemMetrics();
1624 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1628 MINIMIZEDMETRICS lpMm_orig
;
1629 MINIMIZEDMETRICS lpMm_new
;
1630 MINIMIZEDMETRICS lpMm_cur
;
1632 lpMm_orig
.cbSize
= sizeof(MINIMIZEDMETRICS
);
1633 lpMm_new
.cbSize
= sizeof(MINIMIZEDMETRICS
);
1634 lpMm_cur
.cbSize
= sizeof(MINIMIZEDMETRICS
);
1636 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1637 SetLastError(0xdeadbeef);
1638 rc
=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
), &lpMm_orig
, FALSE
);
1639 if (!test_error_msg(rc
,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1641 /* Test registry. Note that it is perfectly valid for some fields to
1644 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINWIDTH_VALNAME
, dpi
);
1645 ok( regval
== -1 || regval
== lpMm_orig
.iWidth
, "wrong value in registry %d, expected %d\n",
1646 regval
, lpMm_orig
.iWidth
);
1647 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINHORZGAP_VALNAME
, dpi
);
1648 ok( regval
== -1 || regval
== lpMm_orig
.iHorzGap
, "wrong value in registry %d, expected %d\n",
1649 regval
, lpMm_orig
.iHorzGap
);
1650 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINVERTGAP_VALNAME
, dpi
);
1651 ok( regval
== -1 || regval
== lpMm_orig
.iVertGap
, "wrong value in registry %d, expected %d\n",
1652 regval
, lpMm_orig
.iVertGap
);
1653 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINARRANGE_VALNAME
, dpi
);
1654 ok( regval
== -1 || regval
== lpMm_orig
.iArrange
, "wrong value in registry %d, expected %d\n",
1655 regval
, lpMm_orig
.iArrange
);
1656 /* set some new values */
1657 lpMm_cur
.iWidth
= 180;
1658 lpMm_cur
.iHorzGap
= 1;
1659 lpMm_cur
.iVertGap
= 1;
1660 lpMm_cur
.iArrange
= 5;
1661 rc
=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
),
1662 &lpMm_cur
, SPIF_UPDATEINIFILE
);
1663 if (!test_error_msg(rc
,"SPI_SETMINIMIZEDMETRICS")) return;
1664 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1665 /* read them back */
1666 rc
=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
), &lpMm_new
, FALSE
);
1667 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1669 eq( lpMm_new
.iWidth
, lpMm_cur
.iWidth
, "iWidth", "%d" );
1670 eq( lpMm_new
.iHorzGap
, lpMm_cur
.iHorzGap
, "iHorzGap", "%d" );
1671 eq( lpMm_new
.iVertGap
, lpMm_cur
.iVertGap
, "iVertGap", "%d" );
1672 eq( lpMm_new
.iArrange
, lpMm_cur
.iArrange
, "iArrange", "%d" );
1674 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINWIDTH_VALNAME
, dpi
);
1675 ok( regval
== lpMm_new
.iWidth
, "wrong value in registry %d, expected %d\n",
1676 regval
, lpMm_new
.iWidth
);
1677 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINHORZGAP_VALNAME
, dpi
);
1678 ok( regval
== lpMm_new
.iHorzGap
, "wrong value in registry %d, expected %d\n",
1679 regval
, lpMm_new
.iHorzGap
);
1680 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINVERTGAP_VALNAME
, dpi
);
1681 ok( regval
== lpMm_new
.iVertGap
, "wrong value in registry %d, expected %d\n",
1682 regval
, lpMm_new
.iVertGap
);
1683 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINARRANGE_VALNAME
, dpi
);
1684 ok( regval
== lpMm_new
.iArrange
, "wrong value in registry %d, expected %d\n",
1685 regval
, lpMm_new
.iArrange
);
1686 /* test some system metrics */
1687 eq( GetSystemMetrics( SM_CXMINIMIZED
) - 6,
1688 lpMm_new
.iWidth
, "iWidth", "%d" );
1689 eq( GetSystemMetrics( SM_CXMINSPACING
) - GetSystemMetrics( SM_CXMINIMIZED
),
1690 lpMm_new
.iHorzGap
, "iHorzGap", "%d" );
1691 eq( GetSystemMetrics( SM_CYMINSPACING
) - GetSystemMetrics( SM_CYMINIMIZED
),
1692 lpMm_new
.iVertGap
, "iVertGap", "%d" );
1693 eq( GetSystemMetrics( SM_ARRANGE
),
1694 lpMm_new
.iArrange
, "iArrange", "%d" );
1695 /* now some really invalid settings */
1696 lpMm_cur
.iWidth
= -1;
1697 lpMm_cur
.iHorzGap
= -1;
1698 lpMm_cur
.iVertGap
= -1;
1699 lpMm_cur
.iArrange
= - 1;
1700 rc
=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
),
1701 &lpMm_cur
, SPIF_UPDATEINIFILE
);
1702 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1704 rc
=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
), &lpMm_new
, FALSE
);
1705 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1706 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1707 eq( lpMm_new
.iWidth
, 0, "iWidth", "%d" );
1708 eq( lpMm_new
.iHorzGap
, 0, "iHorzGap", "%d" );
1709 eq( lpMm_new
.iVertGap
, 0, "iVertGap", "%d" );
1710 eq( lpMm_new
.iArrange
, 0xf & lpMm_cur
.iArrange
, "iArrange", "%d" );
1714 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1715 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINWIDTH_VALNAME
, dpi
);
1716 ok( regval
== lpMm_new
.iWidth
, "wrong value in registry %d, expected %d\n",
1717 regval
, lpMm_new
.iWidth
);
1718 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINHORZGAP_VALNAME
, dpi
);
1719 ok( regval
== lpMm_new
.iHorzGap
, "wrong value in registry %d, expected %d\n",
1720 regval
, lpMm_new
.iHorzGap
);
1721 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINVERTGAP_VALNAME
, dpi
);
1722 ok( regval
== lpMm_new
.iVertGap
, "wrong value in registry %d, expected %d\n",
1723 regval
, lpMm_new
.iVertGap
);
1724 regval
= metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY
, SPI_MINARRANGE_VALNAME
, dpi
);
1725 ok( regval
== lpMm_new
.iArrange
, "wrong value in registry %d, expected %d\n",
1726 regval
, lpMm_new
.iArrange
);
1728 /* test some system metrics */
1729 eq( GetSystemMetrics( SM_CXMINIMIZED
) - 6,
1730 lpMm_new
.iWidth
, "iWidth", "%d" );
1731 eq( GetSystemMetrics( SM_CXMINSPACING
) - GetSystemMetrics( SM_CXMINIMIZED
),
1732 lpMm_new
.iHorzGap
, "iHorzGap", "%d" );
1733 eq( GetSystemMetrics( SM_CYMINSPACING
) - GetSystemMetrics( SM_CYMINIMIZED
),
1734 lpMm_new
.iVertGap
, "iVertGap", "%d" );
1735 eq( GetSystemMetrics( SM_ARRANGE
),
1736 lpMm_new
.iArrange
, "iArrange", "%d" );
1738 rc
=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
),
1739 &lpMm_orig
, SPIF_UPDATEINIFILE
);
1740 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1742 rc
=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS
, sizeof(MINIMIZEDMETRICS
), &lpMm_new
, FALSE
);
1743 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1744 eq( lpMm_new
.iWidth
, lpMm_orig
.iWidth
, "iWidth", "%d" );
1745 eq( lpMm_new
.iHorzGap
, lpMm_orig
.iHorzGap
, "iHorzGap", "%d" );
1746 eq( lpMm_new
.iVertGap
, lpMm_orig
.iVertGap
, "iVertGap", "%d" );
1747 eq( lpMm_new
.iArrange
, lpMm_orig
.iArrange
, "iArrange", "%d" );
1750 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1754 ICONMETRICSA im_orig
;
1755 ICONMETRICSA im_new
;
1756 ICONMETRICSA im_cur
;
1759 im_orig
.cbSize
= sizeof(ICONMETRICSA
);
1760 im_new
.cbSize
= sizeof(ICONMETRICSA
);
1761 im_cur
.cbSize
= sizeof(ICONMETRICSA
);
1763 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1764 SetLastError(0xdeadbeef);
1765 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im_orig
, FALSE
);
1766 if (!test_error_msg(rc
,"SPI_{GET,SET}ICONMETRICS"))
1768 /* check some registry values */
1769 regval
= metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY
, SPI_ICONHORIZONTALSPACING_VALNAME
, dpi
);
1770 ok( regval
==im_orig
.iHorzSpacing
|| broken(regval
== -1), /* nt4 */
1771 "wrong value in registry %d, expected %d\n", regval
, im_orig
.iHorzSpacing
);
1772 regval
= metricfromreg( SPI_ICONVERTICALSPACING_REGKEY
, SPI_ICONVERTICALSPACING_VALNAME
, dpi
);
1773 ok( regval
==im_orig
.iVertSpacing
|| broken(regval
== -1), /* nt4 */
1774 "wrong value in registry %d, expected %d\n", regval
, im_orig
.iVertSpacing
);
1775 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2
, SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1776 if( regval
!= im_orig
.iTitleWrap
)
1777 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1
, SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1778 ok( regval
==im_orig
.iTitleWrap
, "wrong value in registry %d, expected %d\n", regval
, im_orig
.iTitleWrap
);
1780 /* change everything without creating something invalid ( Win9x would ignore
1781 * an invalid font for instance) */
1783 im_cur
.iHorzSpacing
+= 10;
1784 im_cur
.iVertSpacing
+= 6;
1785 im_cur
.iTitleWrap
= !im_cur
.iTitleWrap
;
1786 im_cur
.lfFont
.lfHeight
+= 1;
1787 im_cur
.lfFont
.lfWidth
+= 2;
1788 im_cur
.lfFont
.lfEscapement
= 1;
1789 im_cur
.lfFont
.lfWeight
= im_cur
.lfFont
.lfWeight
> 100 ? 1 : 314;
1790 im_cur
.lfFont
.lfItalic
= !im_cur
.lfFont
.lfItalic
;
1791 im_cur
.lfFont
.lfStrikeOut
= !im_cur
.lfFont
.lfStrikeOut
;
1792 im_cur
.lfFont
.lfUnderline
= !im_cur
.lfFont
.lfUnderline
;
1793 im_cur
.lfFont
.lfCharSet
= im_cur
.lfFont
.lfCharSet
? 0 : 1;
1794 im_cur
.lfFont
.lfOutPrecision
= im_cur
.lfFont
.lfOutPrecision
== OUT_DEFAULT_PRECIS
?
1795 OUT_TT_PRECIS
: OUT_DEFAULT_PRECIS
;
1796 im_cur
.lfFont
.lfClipPrecision
^= CLIP_LH_ANGLES
;
1797 im_cur
.lfFont
.lfPitchAndFamily
= im_cur
.lfFont
.lfPitchAndFamily
? 0 : 1;
1798 im_cur
.lfFont
.lfQuality
= im_cur
.lfFont
.lfQuality
== DEFAULT_QUALITY
?
1799 DRAFT_QUALITY
: DEFAULT_QUALITY
;
1800 if( strcmp( im_cur
.lfFont
.lfFaceName
, "MS Serif"))
1801 strcpy( im_cur
.lfFont
.lfFaceName
, "MS Serif");
1803 strcpy( im_cur
.lfFont
.lfFaceName
, "MS Sans Serif");
1805 rc
=SystemParametersInfoA( SPI_SETICONMETRICS
, sizeof(ICONMETRICSA
), &im_cur
, SPIF_UPDATEINIFILE
);
1806 if (!test_error_msg(rc
,"SPI_SETICONMETRICS")) return;
1807 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1809 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im_new
, FALSE
);
1810 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1811 /* test GET <-> SETICONMETRICS */
1812 eq( im_new
.iHorzSpacing
, im_cur
.iHorzSpacing
, "iHorzSpacing", "%d" );
1813 eq( im_new
.iVertSpacing
, im_cur
.iVertSpacing
, "iVertSpacing", "%d" );
1814 eq( im_new
.iTitleWrap
, im_cur
.iTitleWrap
, "iTitleWrap", "%d" );
1815 eq( im_new
.lfFont
.lfHeight
, im_cur
.lfFont
.lfHeight
, "lfHeight", "%d" );
1816 eq( im_new
.lfFont
.lfWidth
, im_cur
.lfFont
.lfWidth
, "lfWidth", "%d" );
1817 eq( im_new
.lfFont
.lfEscapement
, im_cur
.lfFont
.lfEscapement
, "lfEscapement", "%d" );
1818 eq( im_new
.lfFont
.lfWeight
, im_cur
.lfFont
.lfWeight
, "lfWeight", "%d" );
1819 eq( im_new
.lfFont
.lfItalic
, im_cur
.lfFont
.lfItalic
, "lfItalic", "%d" );
1820 eq( im_new
.lfFont
.lfStrikeOut
, im_cur
.lfFont
.lfStrikeOut
, "lfStrikeOut", "%d" );
1821 eq( im_new
.lfFont
.lfUnderline
, im_cur
.lfFont
.lfUnderline
, "lfUnderline", "%d" );
1822 eq( im_new
.lfFont
.lfCharSet
, im_cur
.lfFont
.lfCharSet
, "lfCharSet", "%d" );
1823 eq( im_new
.lfFont
.lfOutPrecision
, im_cur
.lfFont
.lfOutPrecision
, "lfOutPrecision", "%d" );
1824 eq( im_new
.lfFont
.lfClipPrecision
, im_cur
.lfFont
.lfClipPrecision
, "lfClipPrecision", "%d" );
1825 eq( im_new
.lfFont
.lfPitchAndFamily
, im_cur
.lfFont
.lfPitchAndFamily
, "lfPitchAndFamily", "%d" );
1826 eq( im_new
.lfFont
.lfQuality
, im_cur
.lfFont
.lfQuality
, "lfQuality", "%d" );
1827 ok( !strcmp( im_new
.lfFont
.lfFaceName
, im_cur
.lfFont
.lfFaceName
),
1828 "wrong facename \"%s\", should be \"%s\"\n", im_new
.lfFont
.lfFaceName
,
1829 im_cur
.lfFont
.lfFaceName
);
1830 /* test some system metrics */
1831 eq( GetSystemMetrics( SM_CXICONSPACING
),
1832 im_new
.iHorzSpacing
, "iHorzSpacing", "%d" );
1833 eq( GetSystemMetrics( SM_CYICONSPACING
),
1834 im_new
.iVertSpacing
, "iVertSpacing", "%d" );
1835 /* check some registry values */
1836 regval
= metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY
, SPI_ICONHORIZONTALSPACING_VALNAME
, dpi
);
1837 ok( regval
==im_cur
.iHorzSpacing
, "wrong value in registry %d, expected %d\n", regval
, im_cur
.iHorzSpacing
);
1838 regval
= metricfromreg( SPI_ICONVERTICALSPACING_REGKEY
, SPI_ICONVERTICALSPACING_VALNAME
, dpi
);
1839 ok( regval
==im_cur
.iVertSpacing
, "wrong value in registry %d, expected %d\n", regval
, im_cur
.iVertSpacing
);
1840 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2
, SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1841 if( regval
!= im_cur
.iTitleWrap
)
1842 regval
= metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1
, SPI_SETICONTITLEWRAP_VALNAME
, dpi
);
1843 ok( regval
==im_cur
.iTitleWrap
, "wrong value in registry %d, expected %d\n", regval
, im_cur
.iTitleWrap
);
1844 /* test some values from other SPI_GETxxx calls */
1845 rc
= SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0, &spacing
, 0 );
1846 ok( rc
&& spacing
== im_cur
.iHorzSpacing
,
1847 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1848 spacing
, im_cur
.iHorzSpacing
);
1849 rc
= SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0, &spacing
, 0 );
1850 ok( rc
&& spacing
== im_cur
.iVertSpacing
,
1851 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1852 spacing
, im_cur
.iVertSpacing
);
1853 rc
= SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0, &wrap
, 0 );
1854 ok( rc
&& wrap
== im_cur
.iTitleWrap
,
1855 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1856 wrap
, im_cur
.iTitleWrap
);
1857 /* restore old values */
1858 rc
=SystemParametersInfoA( SPI_SETICONMETRICS
, sizeof(ICONMETRICSA
), &im_orig
,SPIF_UPDATEINIFILE
);
1859 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1861 rc
=SystemParametersInfoA( SPI_GETICONMETRICS
, sizeof(ICONMETRICSA
), &im_new
, FALSE
);
1862 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1864 eq( im_new
.iHorzSpacing
, im_orig
.iHorzSpacing
, "iHorzSpacing", "%d" );
1865 eq( im_new
.iVertSpacing
, im_orig
.iVertSpacing
, "iVertSpacing", "%d" );
1866 eq( im_new
.iTitleWrap
, im_orig
.iTitleWrap
, "iTitleWrap", "%d" );
1869 static void test_SPI_SETWORKAREA( void ) /* 47 */
1876 trace("testing SPI_{GET,SET}WORKAREA\n");
1877 SetLastError(0xdeadbeef);
1878 rc
=SystemParametersInfoA(SPI_GETWORKAREA
, 0, &old_area
, 0);
1879 if (!test_error_msg(rc
,"SPI_{GET,SET}WORKAREA"))
1882 /* Modify the work area only minimally as this causes the icons that
1883 * fall outside it to be moved around thus requiring the user to
1884 * reposition them manually one by one.
1885 * Changing the work area by just one pixel should make this occurrence
1886 * reasonably unlikely.
1888 SetRect(&curr_val
, old_area
.left
, old_area
.top
, old_area
.right
- 1, old_area
.bottom
- 1);
1889 rc
=SystemParametersInfoA( SPI_SETWORKAREA
, 0, &curr_val
,
1890 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1891 if (!test_error_msg(rc
,"SPI_SETWORKAREA")) return;
1892 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1893 rc
=SystemParametersInfoA( SPI_GETWORKAREA
, 0, &area
, 0 );
1894 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1895 if( !EqualRect( &area
, &curr_val
)) /* no message if rect has not changed */
1896 test_change_message( SPI_SETWORKAREA
, 0);
1897 eq( area
.left
, curr_val
.left
, "left", "%d" );
1898 eq( area
.top
, curr_val
.top
, "top", "%d" );
1899 /* size may be rounded */
1900 ok( area
.right
>= curr_val
.right
- 16 && area
.right
< curr_val
.right
+ 16,
1901 "right: got %d instead of %d\n", area
.right
, curr_val
.right
);
1902 ok( area
.bottom
>= curr_val
.bottom
- 16 && area
.bottom
< curr_val
.bottom
+ 16,
1903 "bottom: got %d instead of %d\n", area
.bottom
, curr_val
.bottom
);
1905 rc
=SystemParametersInfoA( SPI_SETWORKAREA
, 0, &old_area
,
1906 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1907 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1908 rc
=SystemParametersInfoA( SPI_GETWORKAREA
, 0, &area
, 0 );
1909 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
1910 if( !EqualRect( &area
, &curr_val
)) /* no message if rect has not changed */
1911 test_change_message( SPI_SETWORKAREA
, 0 );
1912 eq( area
.left
, old_area
.left
, "left", "%d" );
1913 eq( area
.top
, old_area
.top
, "top", "%d" );
1914 /* size may be rounded */
1915 ok( area
.right
>= old_area
.right
- 16 && area
.right
< old_area
.right
+ 16,
1916 "right: got %d instead of %d\n", area
.right
, old_area
.right
);
1917 ok( area
.bottom
>= old_area
.bottom
- 16 && area
.bottom
< old_area
.bottom
+ 16,
1918 "bottom: got %d instead of %d\n", area
.bottom
, old_area
.bottom
);
1921 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1925 const UINT vals
[]={TRUE
,FALSE
};
1928 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1929 SetLastError(0xdeadbeef);
1930 rc
=SystemParametersInfoA( SPI_GETSHOWSOUNDS
, 0, &old_b
, 0 );
1931 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1932 if (!test_error_msg(rc
,"SPI_{GET,SET}SHOWSOUNDS"))
1935 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1939 rc
=SystemParametersInfoA( SPI_SETSHOWSOUNDS
, vals
[i
], 0,
1940 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1941 if (!test_error_msg(rc
,"SPI_SETSHOWSOUNDS")) return;
1942 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1943 test_change_message( SPI_SETSHOWSOUNDS
, 1 );
1944 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY
,
1945 SPI_SETSHOWSOUNDS_VALNAME
,
1946 vals
[i
] ? "1" : "0" );
1948 rc
=SystemParametersInfoA( SPI_GETSHOWSOUNDS
, 0, &v
, 0 );
1949 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1950 eq( v
, vals
[i
], "SPI_GETSHOWSOUNDS", "%d" );
1951 eq( GetSystemMetrics( SM_SHOWSOUNDS
), (int)vals
[i
],
1952 "SM_SHOWSOUNDS", "%d" );
1955 rc
=SystemParametersInfoA( SPI_SETSHOWSOUNDS
, old_b
, 0, SPIF_UPDATEINIFILE
);
1956 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1959 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1963 const UINT vals
[]={TRUE
,FALSE
};
1966 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1967 SetLastError(0xdeadbeef);
1968 rc
=SystemParametersInfoA( SPI_GETKEYBOARDPREF
, 0, &old_b
, 0 );
1969 if (!test_error_msg(rc
,"SPI_{GET,SET}KEYBOARDPREF"))
1972 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
1976 rc
=SystemParametersInfoA( SPI_SETKEYBOARDPREF
, vals
[i
], 0,
1977 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
1978 if (!test_error_msg(rc
,"SPI_SETKEYBOARDPREF")) return;
1979 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1980 test_change_message( SPI_SETKEYBOARDPREF
, 1 );
1981 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY
, SPI_SETKEYBOARDPREF_REGKEY_LEGACY
,
1982 SPI_SETKEYBOARDPREF_VALNAME
, SPI_SETKEYBOARDPREF_VALNAME_LEGACY
,
1983 vals
[i
] ? "1" : "0" );
1985 rc
=SystemParametersInfoA( SPI_GETKEYBOARDPREF
, 0, &v
, 0 );
1986 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
1987 eq( v
, (BOOL
)vals
[i
], "SPI_GETKEYBOARDPREF", "%d" );
1990 rc
=SystemParametersInfoA( SPI_SETKEYBOARDPREF
, old_b
, 0, SPIF_UPDATEINIFILE
);
1991 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
1994 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1998 const UINT vals
[]={TRUE
,FALSE
};
2001 trace("testing SPI_{GET,SET}SCREENREADER\n");
2002 SetLastError(0xdeadbeef);
2003 rc
=SystemParametersInfoA( SPI_GETSCREENREADER
, 0, &old_b
, 0 );
2004 if (!test_error_msg(rc
,"SPI_{GET,SET}SCREENREADER"))
2007 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2011 rc
=SystemParametersInfoA( SPI_SETSCREENREADER
, vals
[i
], 0,
2012 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2013 if (!test_error_msg(rc
,"SPI_SETSCREENREADER")) return;
2014 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2015 test_change_message( SPI_SETSCREENREADER
, 1 );
2016 test_reg_key_ex2_optional( SPI_SETSCREENREADER_REGKEY
, SPI_SETSCREENREADER_REGKEY_LEGACY
,
2017 SPI_SETSCREENREADER_VALNAME
, SPI_SETSCREENREADER_VALNAME_LEGACY
,
2018 vals
[i
] ? "1" : "0" );
2020 rc
=SystemParametersInfoA( SPI_GETSCREENREADER
, 0, &v
, 0 );
2021 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2022 eq( v
, (BOOL
)vals
[i
], "SPI_GETSCREENREADER", "%d" );
2025 rc
=SystemParametersInfoA( SPI_SETSCREENREADER
, old_b
, 0, SPIF_UPDATEINIFILE
);
2026 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2029 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
2033 DWORD old_type
, old_contrast
, old_orient
;
2034 const UINT vals
[]={0xffffffff,0,1,2};
2037 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
2038 if( iswin9x
) return; /* 95/98/ME don't seem to implement this fully */
2039 SetLastError(0xdeadbeef);
2040 rc
=SystemParametersInfoA( SPI_GETFONTSMOOTHING
, 0, &old_b
, 0 );
2041 if (!test_error_msg(rc
,"SPI_{GET,SET}FONTSMOOTHING"))
2043 SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE
, 0, &old_type
, 0 );
2044 SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST
, 0, &old_contrast
, 0 );
2045 SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION
, 0, &old_orient
, 0 );
2047 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2051 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHING
, vals
[i
], 0,
2052 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2053 if (!test_error_msg(rc
,"SPI_SETFONTSMOOTHING")) return;
2054 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2055 test_change_message( SPI_SETFONTSMOOTHING
, 0 );
2056 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY
,
2057 SPI_SETFONTSMOOTHING_VALNAME
,
2058 vals
[i
] ? "2" : "0" );
2060 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE
, 0, UlongToPtr(vals
[i
]),
2061 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2062 if (!test_error_msg(rc
,"SPI_SETFONTSMOOTHINGTYPE")) return;
2063 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2064 test_change_message( SPI_SETFONTSMOOTHINGTYPE
, 0 );
2065 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY
,
2066 SPI_SETFONTSMOOTHINGTYPE_VALNAME
, &vals
[i
] );
2068 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST
, 0, UlongToPtr(vals
[i
]),
2069 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2070 if (!test_error_msg(rc
,"SPI_SETFONTSMOOTHINGCONTRAST")) return;
2071 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2072 test_change_message( SPI_SETFONTSMOOTHINGCONTRAST
, 0 );
2073 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY
,
2074 SPI_SETFONTSMOOTHINGCONTRAST_VALNAME
, &vals
[i
] );
2076 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION
, 0, UlongToPtr(vals
[i
]),
2077 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2078 if (!test_error_msg(rc
,"SPI_SETFONTSMOOTHINGORIENTATION")) return;
2079 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2080 test_change_message( SPI_SETFONTSMOOTHINGORIENTATION
, 0 );
2081 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY
,
2082 SPI_SETFONTSMOOTHINGORIENTATION_VALNAME
, &vals
[i
] );
2084 rc
=SystemParametersInfoA( SPI_GETFONTSMOOTHING
, 0, &v
, 0 );
2085 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2086 eq( v
, vals
[i
] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
2088 rc
=SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE
, 0, &v
, 0 );
2089 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2090 ok( v
== vals
[i
], "wrong value %x/%x\n", v
, vals
[i
] );
2092 rc
=SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST
, 0, &v
, 0 );
2093 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2094 ok( v
== vals
[i
], "wrong value %x/%x\n", v
, vals
[i
] );
2096 rc
=SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION
, 0, &v
, 0 );
2097 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2098 ok( v
== vals
[i
], "wrong value %x/%x\n", v
, vals
[i
] );
2101 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHING
, old_b
, 0, SPIF_UPDATEINIFILE
);
2102 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2103 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE
, old_type
, 0, SPIF_UPDATEINIFILE
);
2104 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2105 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST
, old_contrast
, 0, SPIF_UPDATEINIFILE
);
2106 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2107 rc
=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION
, old_orient
, 0, SPIF_UPDATEINIFILE
);
2108 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2111 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
2115 const UINT vals
[]={TRUE
,FALSE
};
2118 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
2119 SetLastError(0xdeadbeef);
2120 rc
=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE
, 0, &old_b
, 0 );
2121 if (!test_error_msg(rc
,"SPI_{GET,SET}LOWPOWERACTIVE"))
2124 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2128 rc
=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE
, vals
[i
], 0,
2129 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2130 if (!test_error_msg(rc
,"SPI_SETLOWPOWERACTIVE")) return;
2131 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2132 test_change_message( SPI_SETLOWPOWERACTIVE
, 1 );
2133 test_reg_key_optional( SPI_SETLOWPOWERACTIVE_REGKEY
,
2134 SPI_SETLOWPOWERACTIVE_VALNAME
,
2135 vals
[i
] ? "1" : "0" );
2137 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
2139 rc
=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE
, 0, &v
, 0 );
2140 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2142 broken(v
== (0xdead0000 | vals
[i
])) || /* win98 only sets the low word */
2143 v
== 0, /* win2k3 */
2144 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v
, vals
[i
]);
2147 rc
=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE
, old_b
, 0, SPIF_UPDATEINIFILE
);
2148 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2151 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
2155 const UINT vals
[]={TRUE
,FALSE
};
2158 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
2159 SetLastError(0xdeadbeef);
2160 rc
=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE
, 0, &old_b
, 0 );
2161 if (!test_error_msg(rc
,"SPI_{GET,SET}POWEROFFACTIVE"))
2164 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2168 rc
=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE
, vals
[i
], 0,
2169 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2170 if (!test_error_msg(rc
,"SPI_SETPOWEROFFACTIVE")) return;
2171 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2172 test_change_message( SPI_SETPOWEROFFACTIVE
, 1 );
2173 test_reg_key_optional( SPI_SETPOWEROFFACTIVE_REGKEY
,
2174 SPI_SETPOWEROFFACTIVE_VALNAME
,
2175 vals
[i
] ? "1" : "0" );
2177 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2179 rc
=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE
, 0, &v
, 0 );
2180 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2182 broken(v
== (0xdead0000 | vals
[i
])) || /* win98 only sets the low word */
2183 v
== 0, /* win2k3 */
2184 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v
, vals
[i
]);
2187 rc
=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE
, old_b
, 0, SPIF_UPDATEINIFILE
);
2188 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2191 static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2195 const UINT vals
[]={TRUE
,FALSE
};
2198 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2199 SetLastError(0xdeadbeef);
2200 rc
=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON
, 0, &old_b
, 0 );
2201 if (!test_error_msg(rc
,"SPI_GETSNAPTODEFBUTTON"))
2204 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2208 rc
=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON
, vals
[i
], 0,
2209 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2210 if (!test_error_msg(rc
,"SPI_SETSNAPTODEFBUTTON")) return;
2211 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2212 test_change_message( SPI_SETSNAPTODEFBUTTON
, 0 );
2213 test_reg_key_optional( SPI_SETSNAPTODEFBUTTON_REGKEY
,
2214 SPI_SETSNAPTODEFBUTTON_VALNAME
,
2215 vals
[i
] ? "1" : "0" );
2217 rc
=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON
, 0, &v
, 0 );
2218 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2219 eq( v
, vals
[i
], "SPI_GETSNAPTODEFBUTTON", "%d" );
2222 rc
=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON
, old_b
, 0, SPIF_UPDATEINIFILE
);
2223 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2226 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2230 const UINT vals
[]={0,32767};
2233 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2234 SetLastError(0xdeadbeef);
2235 rc
=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH
, 0, &old_width
, 0 );
2236 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2237 * what MSDN states (Verified on Win98SE)
2239 if (!test_error_msg(rc
,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2242 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2247 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH
, vals
[i
], 0,
2248 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2249 if (!test_error_msg(rc
,"SPI_SETMOUSEHOVERWIDTH")) return;
2250 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2251 test_change_message( SPI_SETMOUSEHOVERWIDTH
, 0 );
2252 sprintf( buf
, "%d", vals
[i
] );
2253 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY
,
2254 SPI_SETMOUSEHOVERWIDTH_VALNAME
, buf
);
2256 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH
, 0, &v
, 0 );
2257 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2258 eq( v
, vals
[i
], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2261 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH
, old_width
, 0,
2262 SPIF_UPDATEINIFILE
);
2263 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2266 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2270 const UINT vals
[]={0,32767};
2273 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2274 SetLastError(0xdeadbeef);
2275 rc
=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT
, 0, &old_height
, 0 );
2276 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2277 * what MSDN states (Verified on Win98SE)
2279 if (!test_error_msg(rc
,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2282 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2287 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT
, vals
[i
], 0,
2288 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2289 if (!test_error_msg(rc
,"SPI_SETMOUSEHOVERHEIGHT")) return;
2290 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2291 test_change_message( SPI_SETMOUSEHOVERHEIGHT
, 0 );
2292 sprintf( buf
, "%d", vals
[i
] );
2293 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY
,
2294 SPI_SETMOUSEHOVERHEIGHT_VALNAME
, buf
);
2296 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT
, 0, &v
, 0 );
2297 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2298 eq( v
, vals
[i
], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2301 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT
, old_height
, 0,
2302 SPIF_UPDATEINIFILE
);
2303 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2306 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2311 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2312 * defaulted to a value of 10 automatically.
2314 const UINT vals
[]={10,32767};
2317 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2318 SetLastError(0xdeadbeef);
2319 rc
=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME
, 0, &old_time
, 0 );
2320 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2321 * what MSDN states (Verified on Win98SE)
2323 if (!test_error_msg(rc
,"SPI_{GET,SET}MOUSEHOVERTIME"))
2326 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2331 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME
, vals
[i
], 0,
2332 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2333 if (!test_error_msg(rc
,"SPI_SETMOUSEHOVERTIME")) return;
2334 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2335 test_change_message( SPI_SETMOUSEHOVERTIME
, 0 );
2336 sprintf( buf
, "%d", vals
[i
] );
2337 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY
,
2338 SPI_SETMOUSEHOVERTIME_VALNAME
, buf
);
2340 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME
, 0, &v
, 0 );
2341 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2342 eq( v
, vals
[i
], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2345 rc
=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME
, old_time
, 0,
2346 SPIF_UPDATEINIFILE
);
2347 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2350 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2354 const UINT vals
[]={0,32767};
2357 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2358 SetLastError(0xdeadbeef);
2359 rc
=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES
, 0, &old_lines
, 0 );
2361 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2362 if (!test_error_msg(rc
,"SPI_{GET,SET}WHEELSCROLLLINES"))
2365 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2370 rc
=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES
, vals
[i
], 0,
2371 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2372 if (!test_error_msg(rc
,"SPI_SETWHEELSCROLLLINES")) return;
2373 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2374 test_change_message( SPI_SETWHEELSCROLLLINES
, 0 );
2375 sprintf( buf
, "%d", vals
[i
] );
2376 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY
,
2377 SPI_SETMOUSESCROLLLINES_VALNAME
, buf
);
2379 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES
, 0, &v
, 0 );
2380 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2381 eq( v
, vals
[i
], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2384 rc
=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES
, old_lines
, 0,
2385 SPIF_UPDATEINIFILE
);
2386 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2389 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2393 const UINT vals
[]={0,32767};
2396 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2397 SetLastError(0xdeadbeef);
2398 rc
=SystemParametersInfoA( SPI_GETMENUSHOWDELAY
, 0, &old_delay
, 0 );
2400 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2401 if (!test_error_msg(rc
,"SPI_{GET,SET}MENUSHOWDELAY"))
2404 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2409 rc
=SystemParametersInfoA( SPI_SETMENUSHOWDELAY
, vals
[i
], 0,
2410 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2411 if (!test_error_msg(rc
,"SPI_SETMENUSHOWDELAY")) return;
2412 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2413 test_change_message( SPI_SETMENUSHOWDELAY
, 0 );
2414 sprintf( buf
, "%d", vals
[i
] );
2415 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY
,
2416 SPI_SETMENUSHOWDELAY_VALNAME
, buf
);
2418 SystemParametersInfoA( SPI_GETMENUSHOWDELAY
, 0, &v
, 0 );
2419 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2420 eq( v
, vals
[i
], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2423 rc
=SystemParametersInfoA( SPI_SETMENUSHOWDELAY
, old_delay
, 0,
2424 SPIF_UPDATEINIFILE
);
2425 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2428 static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2432 const UINT vals
[]={32767,0};
2435 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2436 SetLastError(0xdeadbeef);
2437 rc
=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS
, 0, &old_chars
, 0 );
2439 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2440 if (!test_error_msg(rc
,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2443 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
2448 rc
=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS
, vals
[i
], 0,
2449 SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2450 if (!test_error_msg(rc
,"SPI_SETWHEELSCROLLCHARS")) return;
2451 test_change_message( SPI_SETWHEELSCROLLCHARS
, 0 );
2452 sprintf( buf
, "%d", vals
[i
] );
2453 test_reg_key( SPI_SETMOUSESCROLLCHARS_REGKEY
,
2454 SPI_SETMOUSESCROLLCHARS_VALNAME
, buf
);
2456 SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS
, 0, &v
, 0 );
2457 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
2458 eq( v
, vals
[i
], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2461 rc
=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS
, old_chars
, 0,
2462 SPIF_UPDATEINIFILE
);
2463 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2466 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2472 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2473 SetLastError(0xdeadbeef);
2474 rc
=SystemParametersInfoA(SPI_GETDESKWALLPAPER
, 260, oldval
, 0);
2475 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2476 * unimplemented on NT4
2478 if (!test_error_msg(rc
,"SPI_{GET,SET}DESKWALLPAPER"))
2482 rc
=SystemParametersInfoA(SPI_SETDESKWALLPAPER
, 0, newval
, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
);
2483 if (!test_error_msg(rc
,"SPI_SETDESKWALLPAPER")) return;
2484 ok(rc
, "SystemParametersInfoA: rc=%d err=%d\n", rc
, GetLastError());
2485 test_change_message(SPI_SETDESKWALLPAPER
, 0);
2487 rc
=SystemParametersInfoA(SPI_SETDESKWALLPAPER
, 0, oldval
, SPIF_UPDATEINIFILE
);
2488 ok(rc
, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc
, GetLastError());
2490 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY
, SPI_SETDESKWALLPAPER_VALNAME
, oldval
);
2493 static void test_WM_DISPLAYCHANGE(void)
2495 DEVMODEA mode
, startmode
;
2496 int start_bpp
, last_set_bpp
= 0;
2497 int test_bpps
[] = {8, 16, 24, 32}, i
;
2501 if (!pChangeDisplaySettingsExA
)
2503 win_skip("ChangeDisplaySettingsExA is not available\n");
2507 displaychange_test_active
= TRUE
;
2509 memset(&startmode
, 0, sizeof(startmode
));
2510 startmode
.dmSize
= sizeof(startmode
);
2511 EnumDisplaySettingsA(NULL
, ENUM_CURRENT_SETTINGS
, &startmode
);
2512 start_bpp
= startmode
.dmBitsPerPel
;
2514 displaychange_sem
= CreateSemaphoreW(NULL
, 0, 1, NULL
);
2516 for(i
= 0; i
< sizeof(test_bpps
)/sizeof(test_bpps
[0]); i
++) {
2519 memset(&mode
, 0, sizeof(mode
));
2520 mode
.dmSize
= sizeof(mode
);
2521 mode
.dmFields
= DM_BITSPERPEL
| DM_PELSWIDTH
| DM_PELSHEIGHT
;
2522 mode
.dmBitsPerPel
= test_bpps
[i
];
2523 mode
.dmPelsWidth
= GetSystemMetrics(SM_CXSCREEN
);
2524 mode
.dmPelsHeight
= GetSystemMetrics(SM_CYSCREEN
);
2526 change_counter
= 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
2527 displaychange_ok
= TRUE
;
2528 change_ret
= pChangeDisplaySettingsExA(NULL
, &mode
, NULL
, 0, NULL
);
2529 /* Wait quite long for the message, screen setting changes can take some time */
2530 if(change_ret
== DISP_CHANGE_SUCCESSFUL
) {
2531 wait_ret
= WaitForSingleObject(displaychange_sem
, 10000);
2532 /* we may not get a notification if nothing changed */
2533 if (wait_ret
== WAIT_TIMEOUT
&& !last_set_bpp
&& start_bpp
== test_bpps
[i
])
2535 ok(wait_ret
== WAIT_OBJECT_0
, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
2537 displaychange_ok
= FALSE
;
2539 if(change_ret
!= DISP_CHANGE_SUCCESSFUL
) {
2540 skip("Setting depth %d failed(ret = %d)\n", test_bpps
[i
], change_ret
);
2541 ok(last_bpp
== -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp
);
2545 todo_wine_if(start_bpp
!= test_bpps
[i
]) {
2546 ok(last_bpp
== test_bpps
[i
], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps
[i
], last_bpp
);
2548 last_set_bpp
= test_bpps
[i
];
2551 if(start_bpp
!= last_set_bpp
&& last_set_bpp
!= 0) {
2552 memset(&mode
, 0, sizeof(mode
));
2553 mode
.dmSize
= sizeof(mode
);
2554 mode
.dmFields
= DM_BITSPERPEL
| DM_PELSWIDTH
| DM_PELSHEIGHT
;
2555 mode
.dmBitsPerPel
= start_bpp
;
2556 mode
.dmPelsWidth
= GetSystemMetrics(SM_CXSCREEN
);
2557 mode
.dmPelsHeight
= GetSystemMetrics(SM_CYSCREEN
);
2559 displaychange_ok
= TRUE
;
2560 change_ret
= pChangeDisplaySettingsExA(NULL
, &mode
, NULL
, 0, NULL
);
2561 WaitForSingleObject(displaychange_sem
, 10000);
2562 displaychange_ok
= FALSE
;
2563 CloseHandle(displaychange_sem
);
2564 displaychange_sem
= 0;
2567 displaychange_test_active
= FALSE
;
2571 * Registry entries for the system parameters.
2572 * Names are created by 'SET' flags names.
2573 * We assume that corresponding 'GET' entries use the same registry keys.
2575 static DWORD WINAPI
SysParamsThreadFunc( LPVOID lpParam
)
2577 test_SPI_SETBEEP(); /* 1 */
2578 test_SPI_SETMOUSE(); /* 4 */
2579 test_SPI_SETBORDER(); /* 6 */
2580 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2581 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2582 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2583 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2584 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2585 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2586 test_SPI_ICONVERTICALSPACING(); /* 24 */
2587 test_SPI_SETICONTITLEWRAP(); /* 26 */
2588 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2589 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2590 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2591 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2592 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2593 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2594 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2595 /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on
2596 * some versions of Windows (Vista, Win2k8, Win7B) in that
2597 * not all metrics are properly restored. Problems are
2598 * SM_CXMAXTRACK, SM_CYMAXTRACK
2599 * Fortunately setting the Non-Client metrics like in
2600 * test_SPI_SETNONCLIENTMETRICS will correct this. That is why
2601 * we do the DISPLAY change now... */
2602 test_WM_DISPLAYCHANGE();
2603 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2604 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2605 test_SPI_SETICONMETRICS(); /* 46 */
2606 test_SPI_SETWORKAREA(); /* 47 */
2607 test_SPI_SETSHOWSOUNDS(); /* 57 */
2608 test_SPI_SETKEYBOARDPREF(); /* 69 */
2609 test_SPI_SETSCREENREADER(); /* 71 */
2610 test_SPI_SETFONTSMOOTHING(); /* 75 */
2611 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2612 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2613 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2614 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2615 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2616 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2617 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2618 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2619 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2620 test_SPI_SETWALLPAPER(); /* 115 */
2623 SendMessageA( ghTestWnd
, WM_DESTROY
, 0, 0 );
2627 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2628 * icon metrics and minimized metrics.
2631 /* copied from wine's GdiGetCharDimensions, which is not available on most
2632 * windows versions */
2633 static LONG
_GdiGetCharDimensions(HDC hdc
, LPTEXTMETRICA lptm
, LONG
*height
)
2636 static const CHAR alphabet
[] = {
2637 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2638 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2639 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2641 if(lptm
&& !GetTextMetricsA(hdc
, lptm
)) return 0;
2643 if(!GetTextExtentPointA(hdc
, alphabet
, 52, &sz
)) return 0;
2645 if (height
) *height
= sz
.cy
;
2646 return (sz
.cx
/ 26 + 1) / 2;
2649 /* get text metrics and/or "average" char width of the specified logfont
2650 * for the specified dc */
2651 static void get_text_metr_size( HDC hdc
, LOGFONTA
*plf
, TEXTMETRICA
* ptm
, UINT
*psz
)
2653 HFONT hfont
, hfontsav
;
2655 if( !ptm
) ptm
= &tm
;
2656 hfont
= CreateFontIndirectA( plf
);
2657 if( !hfont
|| ( hfontsav
= SelectObject( hdc
, hfont
)) == NULL
) {
2660 if( hfont
) DeleteObject( hfont
);
2663 GetTextMetricsA( hdc
, ptm
);
2665 if( !(*psz
= _GdiGetCharDimensions( hdc
, ptm
, NULL
)))
2667 SelectObject( hdc
, hfontsav
);
2668 DeleteObject( hfont
);
2671 static int gsm_error_ctr
;
2673 #define ok_gsm( i, e)\
2676 int act = GetSystemMetrics( (i));\
2677 if( exp != act) gsm_error_ctr++;\
2678 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2680 #define ok_gsm_2( i, e1, e2)\
2684 int act = GetSystemMetrics( (i));\
2685 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2686 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2688 #define ok_gsm_3( i, e1, e2, e3)\
2693 int act = GetSystemMetrics( (i));\
2694 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2695 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2698 static INT CALLBACK
enum_all_fonts_proc(const LOGFONTA
*elf
, const TEXTMETRICA
*ntm
, DWORD type
, LPARAM lparam
)
2700 return lstrcmpiA(elf
->lfFaceName
, (const char *)lparam
);
2703 static BOOL
is_font_enumerated(const char *name
)
2705 HDC hdc
= CreateCompatibleDC(0);
2708 if (!EnumFontFamiliesA(hdc
, NULL
, enum_all_fonts_proc
, (LPARAM
)name
))
2715 static int get_cursor_size( int size
)
2717 /* only certain sizes are allowed for cursors */
2718 if (size
>= 64) return 64;
2719 if (size
>= 48) return 48;
2723 static void test_GetSystemMetrics( void)
2725 TEXTMETRICA tmMenuFont
;
2726 UINT IconSpacing
, IconVerticalSpacing
;
2729 HDC hdc
= CreateICA( "Display", 0, 0, 0);
2731 INT CaptionWidthfromreg
, smicon
, broken_val
;
2732 MINIMIZEDMETRICS minim
;
2733 NONCLIENTMETRICSA ncm
;
2736 assert(sizeof(ncm
) == 344);
2738 ncm
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
2739 rc
= SystemParametersInfoA(SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
2740 ok(rc
, "SystemParametersInfoA failed\n");
2742 ncm
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
) - 1;
2743 rc
= SystemParametersInfoA(SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
2744 ok(!rc
, "SystemParametersInfoA should fail\n");
2746 ncm
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
) + 1;
2747 SetLastError(0xdeadbeef);
2748 rc
= SystemParametersInfoA(SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
2749 ok(!rc
, "SystemParametersInfoA should fail\n");
2751 ncm
.cbSize
= sizeof(ncm
); /* Vista added padding */
2752 SetLastError(0xdeadbeef);
2753 rc
= SystemParametersInfoA(SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
2754 ok(rc
|| broken(!rc
) /* before Vista */, "SystemParametersInfoA failed\n");
2756 minim
.cbSize
= sizeof( minim
);
2757 ncm
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
2758 SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS
, 0, &minim
, 0);
2759 rc
= SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, 0, &ncm
, 0);
2761 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
2765 ok(is_font_enumerated(ncm
.lfCaptionFont
.lfFaceName
), "font %s should be enumerated\n", ncm
.lfCaptionFont
.lfFaceName
);
2766 ok(is_font_enumerated(ncm
.lfSmCaptionFont
.lfFaceName
), "font %s should be enumerated\n", ncm
.lfSmCaptionFont
.lfFaceName
);
2767 ok(is_font_enumerated(ncm
.lfMenuFont
.lfFaceName
), "font %s should be enumerated\n", ncm
.lfMenuFont
.lfFaceName
);
2768 ok(is_font_enumerated(ncm
.lfStatusFont
.lfFaceName
), "font %s should be enumerated\n", ncm
.lfStatusFont
.lfFaceName
);
2769 ok(is_font_enumerated(ncm
.lfMessageFont
.lfFaceName
), "font %s should be enumerated\n", ncm
.lfMessageFont
.lfFaceName
);
2771 /* CaptionWidth from the registry may have different value of iCaptionWidth
2772 * from the non client metrics (observed on WinXP) */
2773 CaptionWidthfromreg
= metricfromreg(
2774 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi
);
2775 get_text_metr_size( hdc
, &ncm
.lfMenuFont
, &tmMenuFont
, NULL
);
2776 get_text_metr_size( hdc
, &ncm
.lfCaptionFont
, NULL
, &avcwCaption
);
2777 /* FIXME: use icon metric */
2778 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0, &IconVerticalSpacing
, 0))
2779 IconVerticalSpacing
= 0;
2780 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0, &IconSpacing
, 0 ))
2782 /* reset error counters */
2787 /* SM_CXSCREEN, cannot test these two */
2789 ok_gsm( SM_CXVSCROLL
, ncm
.iScrollWidth
);
2790 ok_gsm( SM_CYHSCROLL
, ncm
.iScrollWidth
);
2791 ok_gsm( SM_CYCAPTION
, ncm
.iCaptionHeight
+1);
2792 ok_gsm( SM_CXBORDER
, 1);
2793 ok_gsm( SM_CYBORDER
, 1);
2794 ok_gsm( SM_CXDLGFRAME
, 3);
2795 ok_gsm( SM_CYDLGFRAME
, 3);
2796 ok_gsm( SM_CYVTHUMB
, ncm
.iScrollHeight
);
2797 ok_gsm( SM_CXHTHUMB
, ncm
.iScrollHeight
);
2798 /* These don't depend on the Shell Icon Size registry value */
2799 ok_gsm( SM_CXICON
, MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
) );
2800 ok_gsm( SM_CYICON
, MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
) );
2801 ok_gsm( SM_CXCURSOR
, get_cursor_size( MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
)));
2802 ok_gsm( SM_CYCURSOR
, get_cursor_size( MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
)));
2803 ok_gsm( SM_CYMENU
, ncm
.iMenuHeight
+ 1);
2804 ok_gsm( SM_CXFULLSCREEN
,
2805 GetSystemMetrics( SM_CXMAXIMIZED
) - 2 * GetSystemMetrics( SM_CXFRAME
));
2806 ok_gsm( SM_CYFULLSCREEN
,
2807 GetSystemMetrics( SM_CYMAXIMIZED
) - GetSystemMetrics( SM_CYMIN
));
2808 /* SM_CYKANJIWINDOW */
2809 /* SM_MOUSEPRESENT */
2810 ok_gsm( SM_CYVSCROLL
, ncm
.iScrollHeight
);
2811 ok_gsm( SM_CXHSCROLL
, ncm
.iScrollHeight
);
2818 ok_gsm( SM_CXMIN
, 3 * max( CaptionWidthfromreg
>= 0 ? CaptionWidthfromreg
: ncm
.iCaptionWidth
, 8) +
2819 GetSystemMetrics( SM_CYSIZE
) + 4 + 4 * avcwCaption
+ 2 * GetSystemMetrics( SM_CXFRAME
));
2820 ok_gsm( SM_CYMIN
, GetSystemMetrics( SM_CYCAPTION
) +
2821 2 * GetSystemMetrics( SM_CYFRAME
));
2822 ok_gsm_2( SM_CXSIZE
,
2823 ncm
.iCaptionWidth
, /* classic/standard windows style */
2824 GetSystemMetrics( SM_CYCAPTION
) - 1 /* WinXP style */
2826 ok_gsm( SM_CYSIZE
, ncm
.iCaptionHeight
);
2827 ok_gsm( SM_CXFRAME
, ncm
.iBorderWidth
+ 3);
2828 ok_gsm( SM_CYFRAME
, ncm
.iBorderWidth
+ 3);
2829 ok_gsm( SM_CXMINTRACK
, GetSystemMetrics( SM_CXMIN
));
2830 ok_gsm( SM_CYMINTRACK
, GetSystemMetrics( SM_CYMIN
));
2831 /* SM_CXDOUBLECLK */
2832 /* SM_CYDOUBLECLK */
2833 if( IconSpacing
) ok_gsm( SM_CXICONSPACING
, IconSpacing
);
2834 if( IconVerticalSpacing
) ok_gsm( SM_CYICONSPACING
, IconVerticalSpacing
);
2835 /* SM_MENUDROPALIGNMENT */
2837 /* SM_DBCSENABLED */
2838 /* SM_CMOUSEBUTTONS */
2840 ok_gsm( SM_CXEDGE
, 2);
2841 ok_gsm( SM_CYEDGE
, 2);
2842 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2843 ok_gsm( SM_CXMINSPACING
, GetSystemMetrics( SM_CXMINIMIZED
) + (short)minim
.iHorzGap
);
2844 ok_gsm( SM_CYMINSPACING
, GetSystemMetrics( SM_CYMINIMIZED
) + (short)minim
.iVertGap
);
2846 smicon
= MulDiv( 16, dpi
, USER_DEFAULT_SCREEN_DPI
);
2847 if (!pIsProcessDPIAware
|| pIsProcessDPIAware())
2848 smicon
= max( min( smicon
, CaptionWidthfromreg
- 2), 4 ) & ~1;
2849 todo_wine_if( real_dpi
== dpi
&& smicon
!= (MulDiv( 16, dpi
, USER_DEFAULT_SCREEN_DPI
) & ~1) )
2851 broken_val
= (min( ncm
.iCaptionHeight
, CaptionWidthfromreg
) - 2) & ~1;
2852 broken_val
= min( broken_val
, 20 );
2856 ok_gsm_2( SM_CXSMICON
, smicon
, 6 );
2857 ok_gsm_2( SM_CYSMICON
, smicon
, 6 );
2859 else if (smicon
< broken_val
)
2861 ok_gsm_2( SM_CXSMICON
, smicon
, broken_val
);
2862 ok_gsm_2( SM_CYSMICON
, smicon
, broken_val
);
2866 ok_gsm( SM_CXSMICON
, smicon
);
2867 ok_gsm( SM_CYSMICON
, smicon
);
2871 ok_gsm( SM_CYSMCAPTION
, ncm
.iSmCaptionHeight
+ 1);
2872 ok_gsm_3( SM_CXSMSIZE
,
2873 ncm
.iSmCaptionWidth
, /* classic/standard windows style */
2874 GetSystemMetrics( SM_CYSMCAPTION
) - 1, /* WinXP style */
2875 smcxsmsize
/* winXP seems to cache this value: setnonclientmetric
2876 does not change it */
2878 ok_gsm( SM_CYSMSIZE
, GetSystemMetrics( SM_CYSMCAPTION
) - 1);
2879 ok_gsm( SM_CXMENUSIZE
, ncm
.iMenuWidth
);
2880 ok_gsm( SM_CYMENUSIZE
, ncm
.iMenuHeight
);
2882 ok_gsm( SM_CXMINIMIZED
, minim
.iWidth
+ 6);
2883 ok_gsm( SM_CYMINIMIZED
, GetSystemMetrics( SM_CYCAPTION
) + 5);
2884 screen
.cx
= GetSystemMetrics( SM_CXVIRTUALSCREEN
);
2885 screen
.cy
= GetSystemMetrics( SM_CYVIRTUALSCREEN
);
2886 if (!screen
.cx
|| !screen
.cy
) /* not supported on NT4 */
2888 screen
.cx
= GetSystemMetrics( SM_CXSCREEN
);
2889 screen
.cy
= GetSystemMetrics( SM_CYSCREEN
);
2891 ok_gsm_3( SM_CXMAXTRACK
, screen
.cx
+ 4 + 2 * GetSystemMetrics(SM_CXFRAME
),
2892 screen
.cx
- 4 + 2 * GetSystemMetrics(SM_CXFRAME
), /* Vista */
2893 screen
.cx
+ 2 * GetSystemMetrics(SM_CXFRAME
)); /* Win8 */
2894 ok_gsm_3( SM_CYMAXTRACK
, screen
.cy
+ 4 + 2 * GetSystemMetrics(SM_CYFRAME
),
2895 screen
.cy
- 4 + 2 * GetSystemMetrics(SM_CYFRAME
), /* Vista */
2896 screen
.cy
+ 2 * GetSystemMetrics(SM_CYFRAME
)); /* Win8 */
2897 /* the next two cannot really be tested as they depend on (application)
2899 /* SM_CXMAXIMIZED */
2900 /* SM_CYMAXIMIZED */
2909 ok_gsm( SM_CXMENUCHECK
,
2910 ((tmMenuFont
.tmHeight
+ tmMenuFont
.tmExternalLeading
+1)/2)*2-1);
2911 ok_gsm( SM_CYMENUCHECK
,
2912 ((tmMenuFont
.tmHeight
+ tmMenuFont
.tmExternalLeading
+1)/2)*2-1);
2913 /* SM_SLOWMACHINE */
2914 /* SM_MIDEASTENABLED */
2915 /* SM_MOUSEWHEELPRESENT */
2916 /* SM_XVIRTUALSCREEN */
2917 /* SM_YVIRTUALSCREEN */
2918 /* SM_CXVIRTUALSCREEN */
2919 /* SM_CYVIRTUALSCREEN */
2921 /* SM_SAMEDISPLAYFORMAT */
2923 /* SM_CXFOCUSBORDER */
2924 /* SM_CYFOCUSBORDER */
2926 /* SM_MEDIACENTER */
2929 if( gsm_error_ctr
) { /* if any errors where found */
2930 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2931 ncm
.iBorderWidth
, ncm
.iCaptionWidth
, ncm
.iCaptionHeight
, IconSpacing
, IconVerticalSpacing
);
2932 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2933 ncm
.iMenuHeight
, ncm
.iMenuWidth
, ncm
.iScrollHeight
, ncm
.iScrollWidth
, ncm
.iSmCaptionHeight
, ncm
.iSmCaptionWidth
);
2934 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d screen %d,%d\n",
2935 avcwCaption
, tmMenuFont
.tmHeight
, tmMenuFont
.tmExternalLeading
, CaptionWidthfromreg
, screen
.cx
, screen
.cy
);
2941 static void test_EnumDisplaySettings(void)
2948 memset(&devmode
, 0, sizeof(devmode
));
2949 /* Win95 doesn't handle ENUM_CURRENT_SETTINGS correctly */
2950 EnumDisplaySettingsA(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
2953 val
= GetDeviceCaps(hdc
, BITSPIXEL
);
2954 ok(devmode
.dmBitsPerPel
== val
||
2955 broken(devmode
.dmDeviceName
[0] == 0), /* Win95 */
2956 "GetDeviceCaps(BITSPIXEL) returned %d, EnumDisplaySettings returned %d\n",
2957 val
, devmode
.dmBitsPerPel
);
2959 val
= GetDeviceCaps(hdc
, NUMCOLORS
);
2960 if(devmode
.dmBitsPerPel
<= 8) {
2961 ok(val
== 256, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode
.dmBitsPerPel
, val
);
2963 ok(val
== -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode
.dmBitsPerPel
, val
);
2970 SetLastError (0xdeadbeef);
2971 if (!EnumDisplaySettingsA(NULL
, num
, &devmode
)) {
2972 DWORD le
= GetLastError();
2973 ok(le
== ERROR_NO_MORE_FILES
||
2974 le
== ERROR_MOD_NOT_FOUND
/* Win8 */ ||
2975 le
== 0xdeadbeef, /* XP, 2003 */
2976 "Expected ERROR_NO_MORE_FILES, ERROR_MOD_NOT_FOUND or 0xdeadbeef, got %d for %d\n", le
, num
);
2983 static void test_GetSysColorBrush(void)
2987 SetLastError(0xdeadbeef);
2988 hbr
= GetSysColorBrush(-1);
2989 ok(hbr
== NULL
, "Expected NULL brush\n");
2990 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2991 /* greater than max index */
2992 hbr
= GetSysColorBrush(COLOR_MENUBAR
);
2995 SetLastError(0xdeadbeef);
2996 hbr
= GetSysColorBrush(COLOR_MENUBAR
+ 1);
2997 ok(hbr
== NULL
, "Expected NULL brush\n");
2998 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
3001 win_skip("COLOR_MENUBAR unsupported\n");
3004 static void test_dpi_aware(void)
3008 if (!pIsProcessDPIAware
)
3010 win_skip("IsProcessDPIAware not available\n");
3014 if (pSetProcessDpiAwarenessContext
)
3016 DPI_AWARENESS awareness
;
3017 DPI_AWARENESS_CONTEXT context
;
3020 HDC hdc
= GetDC( 0 );
3022 context
= pGetThreadDpiAwarenessContext();
3024 ok( context
== (DPI_AWARENESS_CONTEXT
)0x10, "wrong context %p\n", context
);
3025 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3027 ok( awareness
== DPI_AWARENESS_UNAWARE
, "wrong awareness %u\n", awareness
);
3029 ok( !pIsProcessDPIAware(), "already aware\n" );
3030 dpi
= pGetDpiForSystem();
3031 todo_wine_if (real_dpi
!= USER_DEFAULT_SCREEN_DPI
)
3032 ok( dpi
== USER_DEFAULT_SCREEN_DPI
, "wrong dpi %u\n", dpi
);
3033 dpi
= GetDeviceCaps( hdc
, LOGPIXELSX
);
3034 todo_wine_if (real_dpi
!= USER_DEFAULT_SCREEN_DPI
)
3035 ok( dpi
== USER_DEFAULT_SCREEN_DPI
, "wrong dpi %u\n", dpi
);
3036 SetLastError( 0xdeadbeef );
3037 ret
= pSetProcessDpiAwarenessContext( NULL
);
3038 ok( !ret
, "got %d\n", ret
);
3039 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "wrong error %u\n", GetLastError() );
3040 SetLastError( 0xdeadbeef );
3041 ret
= pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)-5 );
3042 ok( !ret
, "got %d\n", ret
);
3043 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "wrong error %u\n", GetLastError() );
3044 ret
= pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
);
3045 ok( ret
, "got %d\n", ret
);
3046 ok( pIsProcessDPIAware(), "not aware\n" );
3047 real_dpi
= pGetDpiForSystem();
3048 SetLastError( 0xdeadbeef );
3049 ret
= pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
);
3050 ok( !ret
, "got %d\n", ret
);
3051 ok( GetLastError() == ERROR_ACCESS_DENIED
, "wrong error %u\n", GetLastError() );
3052 SetLastError( 0xdeadbeef );
3053 ret
= pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE
);
3054 ok( !ret
, "got %d\n", ret
);
3055 ok( GetLastError() == ERROR_ACCESS_DENIED
, "wrong error %u\n", GetLastError() );
3057 ret
= pSetProcessDpiAwarenessInternal( DPI_AWARENESS_INVALID
);
3058 ok( !ret
, "got %d\n", ret
);
3059 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "wrong error %u\n", GetLastError() );
3060 ret
= pSetProcessDpiAwarenessInternal( DPI_AWARENESS_UNAWARE
);
3061 ok( !ret
, "got %d\n", ret
);
3062 ok( GetLastError() == ERROR_ACCESS_DENIED
, "wrong error %u\n", GetLastError() );
3063 ret
= pGetProcessDpiAwarenessInternal( 0, &awareness
);
3064 ok( ret
, "got %d\n", ret
);
3065 ok( awareness
== DPI_AWARENESS_SYSTEM_AWARE
, "wrong value %d\n", awareness
);
3066 ret
= pGetProcessDpiAwarenessInternal( GetCurrentProcess(), &awareness
);
3067 ok( ret
, "got %d\n", ret
);
3068 ok( awareness
== DPI_AWARENESS_SYSTEM_AWARE
, "wrong value %d\n", awareness
);
3069 ret
= pGetProcessDpiAwarenessInternal( (HANDLE
)0xdeadbeef, &awareness
);
3070 ok( ret
, "got %d\n", ret
);
3071 ok( awareness
== DPI_AWARENESS_UNAWARE
, "wrong value %d\n", awareness
);
3073 ret
= pIsProcessDPIAware();
3074 ok(ret
, "got %d\n", ret
);
3075 context
= pGetThreadDpiAwarenessContext();
3076 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3077 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3078 ok( awareness
== DPI_AWARENESS_SYSTEM_AWARE
, "wrong awareness %u\n", awareness
);
3079 SetLastError( 0xdeadbeef );
3080 context
= pSetThreadDpiAwarenessContext( 0 );
3081 ok( !context
, "got %p\n", context
);
3082 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "wrong error %u\n", GetLastError() );
3083 SetLastError( 0xdeadbeef );
3084 context
= pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)-5 );
3085 ok( !context
, "got %p\n", context
);
3086 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "wrong error %u\n", GetLastError() );
3087 context
= pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE
);
3088 ok( context
== (DPI_AWARENESS_CONTEXT
)0x80000011, "wrong context %p\n", context
);
3089 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3090 ok( awareness
== DPI_AWARENESS_SYSTEM_AWARE
, "wrong awareness %u\n", awareness
);
3091 dpi
= pGetDpiForSystem();
3092 ok( dpi
== USER_DEFAULT_SCREEN_DPI
, "wrong dpi %u\n", dpi
);
3093 dpi
= GetDeviceCaps( hdc
, LOGPIXELSX
);
3094 ok( dpi
== USER_DEFAULT_SCREEN_DPI
, "wrong dpi %u\n", dpi
);
3095 ok( !pIsProcessDPIAware(), "still aware\n" );
3096 context
= pGetThreadDpiAwarenessContext();
3097 ok( context
== (DPI_AWARENESS_CONTEXT
)0x10, "wrong context %p\n", context
);
3098 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3099 ok( awareness
== DPI_AWARENESS_UNAWARE
, "wrong awareness %u\n", awareness
);
3100 context
= pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
);
3101 ok( context
== (DPI_AWARENESS_CONTEXT
)0x10, "wrong context %p\n", context
);
3102 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3103 ok( awareness
== DPI_AWARENESS_UNAWARE
, "wrong awareness %u\n", awareness
);
3104 dpi
= pGetDpiForSystem();
3105 ok( dpi
== real_dpi
, "wrong dpi %u/%u\n", dpi
, real_dpi
);
3106 dpi
= GetDeviceCaps( hdc
, LOGPIXELSX
);
3107 ok( dpi
== real_dpi
, "wrong dpi %u\n", dpi
);
3108 context
= pGetThreadDpiAwarenessContext();
3109 ok( context
== (DPI_AWARENESS_CONTEXT
)0x12, "wrong context %p\n", context
);
3110 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3111 ok( awareness
== DPI_AWARENESS_PER_MONITOR_AWARE
, "wrong awareness %u\n", awareness
);
3112 context
= pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
);
3113 ok( context
== (DPI_AWARENESS_CONTEXT
)0x12, "wrong context %p\n", context
);
3114 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3115 ok( awareness
== DPI_AWARENESS_PER_MONITOR_AWARE
, "wrong awareness %u\n", awareness
);
3116 dpi
= pGetDpiForSystem();
3117 ok( dpi
== real_dpi
, "wrong dpi %u/%u\n", dpi
, real_dpi
);
3118 dpi
= GetDeviceCaps( hdc
, LOGPIXELSX
);
3119 ok( dpi
== real_dpi
, "wrong dpi %u\n", dpi
);
3120 ok( pIsProcessDPIAware(), "not aware\n" );
3121 context
= pGetThreadDpiAwarenessContext();
3122 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3123 context
= pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)0x80000010 );
3124 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3125 context
= pGetThreadDpiAwarenessContext();
3126 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3127 context
= pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)0x80000011 );
3128 ok( context
== (DPI_AWARENESS_CONTEXT
)0x80000011, "wrong context %p\n", context
);
3129 context
= pGetThreadDpiAwarenessContext();
3130 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3131 context
= pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)0x12 );
3132 ok( context
== (DPI_AWARENESS_CONTEXT
)0x80000011, "wrong context %p\n", context
);
3133 context
= pSetThreadDpiAwarenessContext( context
);
3134 ok( context
== (DPI_AWARENESS_CONTEXT
)0x12, "wrong context %p\n", context
);
3135 context
= pGetThreadDpiAwarenessContext();
3136 ok( context
== (DPI_AWARENESS_CONTEXT
)0x11, "wrong context %p\n", context
);
3137 for (i
= 0; i
< 0x100; i
++)
3139 awareness
= pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)i
);
3145 ok( awareness
== (i
& ~0x10), "%lx: wrong value %u\n", i
, awareness
);
3146 ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)i
), "%lx: not valid\n", i
);
3149 ok( awareness
== DPI_AWARENESS_INVALID
, "%lx: wrong value %u\n", i
, awareness
);
3150 ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)i
), "%lx: valid\n", i
);
3153 awareness
= pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)(i
| 0x80000000) );
3159 ok( awareness
== (i
& ~0x10), "%lx: wrong value %u\n", i
| 0x80000000, awareness
);
3160 ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)(i
| 0x80000000) ),
3161 "%lx: not valid\n", i
| 0x80000000 );
3164 ok( awareness
== DPI_AWARENESS_INVALID
, "%lx: wrong value %u\n", i
| 0x80000000, awareness
);
3165 ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)(i
| 0x80000000) ),
3166 "%lx: valid\n", i
| 0x80000000 );
3169 awareness
= pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)~i
);
3172 case (ULONG_PTR
)DPI_AWARENESS_CONTEXT_UNAWARE
:
3173 case (ULONG_PTR
)DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
:
3174 case (ULONG_PTR
)DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
:
3175 ok( awareness
== i
, "%lx: wrong value %u\n", ~i
, awareness
);
3176 ok( pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)~i
), "%lx: not valid\n", ~i
);
3179 ok( awareness
== DPI_AWARENESS_INVALID
, "%lx: wrong value %u\n", ~i
, awareness
);
3180 ok( !pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT
)~i
), "%lx: valid\n", ~i
);
3184 ReleaseDC( 0, hdc
);
3186 else win_skip( "SetProcessDpiAwarenessContext not supported\n" );
3188 ret
= pSetProcessDPIAware();
3189 ok(ret
, "got %d\n", ret
);
3191 ret
= pIsProcessDPIAware();
3192 ok(ret
, "got %d\n", ret
);
3194 if (pGetDpiForSystem
) real_dpi
= pGetDpiForSystem();
3196 test_GetSystemMetrics();
3199 static void test_window_dpi(void)
3201 DPI_AWARENESS_CONTEXT context
, orig
;
3202 DPI_AWARENESS awareness
;
3205 if (!pGetWindowDpiAwarenessContext
)
3207 win_skip( "GetWindowDpiAwarenessContext not supported\n" );
3210 orig
= pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE
);
3211 hwnd
= CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3212 WS_OVERLAPPEDWINDOW
, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL
);
3213 ok( hwnd
!= 0, "failed to create window\n" );
3214 context
= pGetWindowDpiAwarenessContext( hwnd
);
3215 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3216 ok( awareness
== DPI_AWARENESS_UNAWARE
, "wrong awareness %u\n", awareness
);
3217 DestroyWindow( hwnd
);
3219 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
);
3220 hwnd
= CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3221 WS_OVERLAPPEDWINDOW
, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL
);
3222 ok( hwnd
!= 0, "failed to create window\n" );
3223 context
= pGetWindowDpiAwarenessContext( hwnd
);
3224 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3225 ok( awareness
== DPI_AWARENESS_SYSTEM_AWARE
, "wrong awareness %u\n", awareness
);
3226 DestroyWindow( hwnd
);
3228 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
);
3229 hwnd
= CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3230 WS_OVERLAPPEDWINDOW
, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL
);
3231 ok( hwnd
!= 0, "failed to create window\n" );
3232 context
= pGetWindowDpiAwarenessContext( hwnd
);
3233 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3234 ok( awareness
== DPI_AWARENESS_PER_MONITOR_AWARE
, "wrong awareness %u\n", awareness
);
3235 DestroyWindow( hwnd
);
3237 SetLastError( 0xdeadbeef );
3238 context
= pGetWindowDpiAwarenessContext( (HWND
)0xdeadbeef );
3239 ok( !context
, "got %p\n", context
);
3240 ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE
, "wrong error %u\n", GetLastError() );
3242 SetLastError( 0xdeadbeef );
3243 context
= pGetWindowDpiAwarenessContext( GetDesktopWindow() );
3244 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3245 ok( awareness
== DPI_AWARENESS_PER_MONITOR_AWARE
, "wrong awareness %u\n", awareness
);
3247 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE
);
3248 SetLastError( 0xdeadbeef );
3249 context
= pGetWindowDpiAwarenessContext( GetDesktopWindow() );
3250 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
3251 ok( awareness
== DPI_AWARENESS_PER_MONITOR_AWARE
, "wrong awareness %u\n", awareness
);
3253 pSetThreadDpiAwarenessContext( orig
);
3256 START_TEST(sysparams
)
3264 HANDLE hInstance
, hdll
;
3266 hdll
= GetModuleHandleA("user32.dll");
3267 pChangeDisplaySettingsExA
= (void*)GetProcAddress(hdll
, "ChangeDisplaySettingsExA");
3268 pIsProcessDPIAware
= (void*)GetProcAddress(hdll
, "IsProcessDPIAware");
3269 pSetProcessDPIAware
= (void*)GetProcAddress(hdll
, "SetProcessDPIAware");
3270 pGetDpiForSystem
= (void*)GetProcAddress(hdll
, "GetDpiForSystem");
3271 pSetProcessDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "SetProcessDpiAwarenessContext");
3272 pGetProcessDpiAwarenessInternal
= (void*)GetProcAddress(hdll
, "GetProcessDpiAwarenessInternal");
3273 pSetProcessDpiAwarenessInternal
= (void*)GetProcAddress(hdll
, "SetProcessDpiAwarenessInternal");
3274 pGetThreadDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "GetThreadDpiAwarenessContext");
3275 pSetThreadDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "SetThreadDpiAwarenessContext");
3276 pGetWindowDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "GetWindowDpiAwarenessContext");
3277 pGetAwarenessFromDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "GetAwarenessFromDpiAwarenessContext");
3278 pIsValidDpiAwarenessContext
= (void*)GetProcAddress(hdll
, "IsValidDpiAwarenessContext");
3280 hInstance
= GetModuleHandleA( NULL
);
3282 dpi
= GetDeviceCaps( hdc
, LOGPIXELSY
);
3283 real_dpi
= get_real_dpi();
3284 trace("dpi %d real_dpi %d\n", dpi
, real_dpi
);
3285 iswin9x
= GetVersion() & 0x80000000;
3287 /* This test requires interactivity, if we don't have it, give up */
3288 if (!SystemParametersInfoA( SPI_SETBEEP
, TRUE
, 0, SPIF_UPDATEINIFILE
| SPIF_SENDCHANGE
) &&
3289 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION
) return;
3291 argc
= winetest_get_mainargs(&argv
);
3292 strict
=(argc
>= 3 && strcmp(argv
[2],"strict")==0);
3293 trace("strict=%d\n",strict
);
3295 trace("testing GetSystemMetrics with your current desktop settings\n");
3296 test_GetSystemMetrics( );
3297 trace("testing EnumDisplaySettings vs GetDeviceCaps\n");
3298 test_EnumDisplaySettings( );
3299 test_GetSysColorBrush( );
3302 change_last_param
= 0;
3304 wc
.lpszClassName
= "SysParamsTestClass";
3305 wc
.lpfnWndProc
= SysParamsTestWndProc
;
3306 wc
.style
= CS_OWNDC
| CS_VREDRAW
| CS_HREDRAW
;
3307 wc
.hInstance
= hInstance
;
3308 wc
.hIcon
= LoadIconA( 0, (LPCSTR
)IDI_APPLICATION
);
3309 wc
.hCursor
= LoadCursorA( 0, (LPCSTR
)IDC_ARROW
);
3310 wc
.hbrBackground
= (HBRUSH
)( COLOR_WINDOW
+ 1 );
3311 wc
.lpszMenuName
= 0;
3314 RegisterClassA( &wc
);
3316 ghTestWnd
= CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3317 WS_OVERLAPPEDWINDOW
, 0, 0, 100, 100, 0, 0, hInstance
, NULL
);
3319 hThread
= CreateThread( NULL
, 0, SysParamsThreadFunc
, 0, 0, &dwThreadId
);
3321 CloseHandle( hThread
);
3323 while( GetMessageA( &msg
, 0, 0, 0 )) {
3324 TranslateMessage( &msg
);
3325 DispatchMessageA( &msg
);