Better way of handling non-existent SystemParametersInfoW.
[wine] / dlls / user / tests / sysparams.c
1 /* Unit test suite for functions SystemParametersInfo and GetSystemMetrics.
2  *
3  * Copyright 2002 Andriy Palamarchuk
4  *
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.
9  *
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.
14  *
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <assert.h>
21 #include <stdlib.h>
22 #include <stdarg.h>
23 #include <stdio.h>
24
25 #define _WIN32_WINNT 0x0500 /* For SPI_GETMOUSEHOVERWIDTH and more */
26
27 #include "wine/test.h"
28 #include "windef.h"
29 #include "winbase.h"
30 #include "wingdi.h"
31 #include "winreg.h"
32 #include "winuser.h"
33
34 #ifndef SPI_GETDESKWALLPAPER
35 # define SPI_GETDESKWALLPAPER 0x0073
36 #endif
37
38 static int strict;
39
40 #define eq(received, expected, label, type) \
41         ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
42
43
44 #define SPI_SETBEEP_REGKEY           "Control Panel\\Sound"
45 #define SPI_SETBEEP_VALNAME          "Beep"
46 #define SPI_SETMOUSE_REGKEY             "Control Panel\\Mouse"
47 #define SPI_SETMOUSE_VALNAME1           "MouseThreshold1"
48 #define SPI_SETMOUSE_VALNAME2           "MouseThreshold2"
49 #define SPI_SETMOUSE_VALNAME3           "MouseSpeed"
50 #define SPI_SETBORDER_REGKEY         "Control Panel\\Desktop\\WindowMetrics"
51 #define SPI_SETBORDER_VALNAME        "BorderWidth"
52 #define SPI_SETKEYBOARDSPEED_REGKEY             "Control Panel\\Keyboard"
53 #define SPI_SETKEYBOARDSPEED_VALNAME            "KeyboardSpeed"
54 #define SPI_SETSCREENSAVETIMEOUT_REGKEY         "Control Panel\\Desktop"
55 #define SPI_SETSCREENSAVETIMEOUT_VALNAME        "ScreenSaveTimeOut"
56 #define SPI_SETSCREENSAVEACTIVE_REGKEY          "Control Panel\\Desktop"
57 #define SPI_SETSCREENSAVEACTIVE_VALNAME         "ScreenSaveActive"
58 #define SPI_SETGRIDGRANULARITY_REGKEY           "Control Panel\\Desktop"
59 #define SPI_SETGRIDGRANULARITY_VALNAME          "GridGranularity"
60 #define SPI_SETKEYBOARDDELAY_REGKEY             "Control Panel\\Keyboard"
61 #define SPI_SETKEYBOARDDELAY_VALNAME            "KeyboardDelay"
62 #define SPI_SETICONTITLEWRAP_REGKEY1            "Control Panel\\Desktop\\WindowMetrics"
63 #define SPI_SETICONTITLEWRAP_REGKEY2            "Control Panel\\Desktop"
64 #define SPI_SETICONTITLEWRAP_VALNAME            "IconTitleWrap"
65 #define SPI_SETMENUDROPALIGNMENT_REGKEY1        "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
66 #define SPI_SETMENUDROPALIGNMENT_REGKEY2        "Control Panel\\Desktop"
67 #define SPI_SETMENUDROPALIGNMENT_VALNAME        "MenuDropAlignment"
68 #define SPI_SETDOUBLECLKWIDTH_REGKEY1           "Control Panel\\Mouse"
69 #define SPI_SETDOUBLECLKWIDTH_REGKEY2           "Control Panel\\Desktop"
70 #define SPI_SETDOUBLECLKWIDTH_VALNAME           "DoubleClickWidth"
71 #define SPI_SETDOUBLECLKHEIGHT_REGKEY1          "Control Panel\\Mouse"
72 #define SPI_SETDOUBLECLKHEIGHT_REGKEY2          "Control Panel\\Desktop"
73 #define SPI_SETDOUBLECLKHEIGHT_VALNAME          "DoubleClickHeight"
74 #define SPI_SETDOUBLECLICKTIME_REGKEY           "Control Panel\\Mouse"
75 #define SPI_SETDOUBLECLICKTIME_VALNAME          "DoubleClickSpeed"
76 #define SPI_SETMOUSEBUTTONSWAP_REGKEY           "Control Panel\\Mouse"
77 #define SPI_SETMOUSEBUTTONSWAP_VALNAME          "SwapMouseButtons"
78 #define SPI_SETWORKAREA_REGKEY                  "Control Panel\\Desktop"
79 #define SPI_SETWORKAREA_VALNAME                 "WINE_WorkArea"
80 #define SPI_SETSHOWSOUNDS_REGKEY        "Control Panel\\Accessibility\\ShowSounds"
81 #define SPI_SETSHOWSOUNDS_VALNAME       "On"
82 #define SPI_SETKEYBOARDPREF_REGKEY      "Control Panel\\Accessibility\\Keyboard Preference"
83 #define SPI_SETKEYBOARDPREF_VALNAME     "On"
84 #define SPI_SETSCREENREADER_REGKEY      "Control Panel\\Accessibility\\Blind Access"
85 #define SPI_SETSCREENREADER_VALNAME     "On"
86 #define SPI_SETLOWPOWERACTIVE_REGKEY            "Control Panel\\Desktop"
87 #define SPI_SETLOWPOWERACTIVE_VALNAME           "LowPowerActive"
88 #define SPI_SETPOWEROFFACTIVE_REGKEY            "Control Panel\\Desktop"
89 #define SPI_SETPOWEROFFACTIVE_VALNAME           "PowerOffActive"
90 #define SPI_SETDRAGFULLWINDOWS_REGKEY           "Control Panel\\Desktop"
91 #define SPI_SETDRAGFULLWINDOWS_VALNAME          "DragFullWindows"
92 #define SPI_SETMOUSEHOVERWIDTH_REGKEY           "Control Panel\\Mouse"
93 #define SPI_SETMOUSEHOVERWIDTH_VALNAME          "MouseHoverWidth"
94 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY          "Control Panel\\Mouse"
95 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME         "MouseHoverHeight"
96 #define SPI_SETMOUSEHOVERTIME_REGKEY            "Control Panel\\Mouse"
97 #define SPI_SETMOUSEHOVERTIME_VALNAME           "MouseHoverTime"
98 #define SPI_SETMOUSESCROLLLINES_REGKEY          "Control Panel\\Desktop"
99 #define SPI_SETMOUSESCROLLLINES_VALNAME         "WheelScrollLines"
100 #define SPI_SETMENUSHOWDELAY_REGKEY             "Control Panel\\Desktop"
101 #define SPI_SETMENUSHOWDELAY_VALNAME            "MenuShowDelay"
102 #define SPI_SETDESKWALLPAPER_REGKEY             "Control Panel\\Desktop"
103 #define SPI_SETDESKWALLPAPER_VALNAME            "Wallpaper"
104
105 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
106 #define WINE_CURRENT_USER_REGKEY     "Wine"
107
108 static HWND ghTestWnd;
109
110 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
111 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
112                                               LPARAM lParam );
113 static int change_counter;
114 static int change_last_param;
115
116 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
117                                               LPARAM lParam )
118 {
119     switch (msg) {
120
121     case WM_SETTINGCHANGE:
122         if (change_counter>0) {
123             ok(0,"too many changes counter=%d last change=%d\n",
124                change_counter,change_last_param);
125         }
126         change_counter++;
127         change_last_param = wParam;
128         break;
129
130     case WM_DESTROY:
131         PostQuitMessage( 0 );
132         break;
133
134     default:
135         return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
136     }
137
138     return 0;
139 }
140
141 /*
142 Performs testing for system parameters messages
143 params:
144  - system parameter id
145  - supposed value of the registry key
146 */
147 static void test_change_message( int action, int optional )
148 {
149     if (change_counter==0 && optional==1)
150         return;
151     ok( 1 == change_counter,
152         "Missed a message: change_counter=%d\n", change_counter );
153     change_counter = 0;
154     ok( action == change_last_param,
155         "Wrong action got %d expected %d\n", change_last_param, action );
156     change_last_param = 0;
157 }
158
159 /*
160  * Tests the HKEY_CURRENT_USER subkey value.
161  * The value should contain string value.
162  *
163  * Params:
164  * lpsSubKey - subkey name
165  * lpsRegName - registry entry name
166  * lpsTestValue - value to test
167  */
168 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName, LPCSTR testValue )
169 {
170     CHAR  value[MAX_PATH];
171     DWORD valueLen;
172     DWORD type;
173     HKEY hKey;
174     LONG rc;
175     int found=0;
176
177     *value='\0';
178     valueLen=sizeof(value);
179     RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
180     rc=RegQueryValueExA( hKey, valName, NULL, &type, value, &valueLen );
181     RegCloseKey( hKey );
182     if (rc==ERROR_SUCCESS)
183     {
184         ok( !strcmp( testValue, value ),
185             "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
186             subKey1, valName, testValue, value );
187         found++;
188     }
189     else if (strict)
190     {
191         ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
192            subKey1, valName);
193     }
194     if (subKey2 && !strict)
195     {
196         *value='\0';
197         valueLen=sizeof(value);
198         RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
199         rc=RegQueryValueExA( hKey, valName, NULL, &type, value, &valueLen );
200         RegCloseKey( hKey );
201         if (rc==ERROR_SUCCESS)
202         {
203             ok( !strcmp( testValue, value ),
204                 "Wrong value in registry: subKey=%s, valName=%s, testValue=%s, value=%s\n",
205                 subKey2, valName, testValue, value );
206             found++;
207         }
208     }
209     ok(found,"Missing registry entry: %s in %s or %s\n",
210        valName, subKey1, (subKey2?subKey2:"<n/a>") );
211 }
212
213 #define test_reg_key( subKey, valName, testValue ) \
214     _test_reg_key( subKey, NULL, valName, testValue )
215 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
216     _test_reg_key( subKey1, subKey2, valName, testValue )
217
218 static void test_SPI_SETBEEP( void )                   /*      2 */
219 {
220     BOOL rc;
221     BOOL old_b;
222     BOOL b;
223     BOOL curr_val;
224
225     trace("testing SPI_{GET,SET}BEEP\n");
226     rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
227     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
228
229     curr_val = TRUE;
230     rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
231     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
232     test_change_message( SPI_SETBEEP, 0 );
233     test_reg_key( SPI_SETBEEP_REGKEY,
234                   SPI_SETBEEP_VALNAME,
235                   curr_val ? "Yes" : "No" );
236     rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
237     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
238     eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
239     rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
240     if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
241     {
242         ok(rc!=0,"SystemParametersInfoW: rc=%d err=%ld\n",rc,GetLastError());
243         eq( b, curr_val, "SystemParametersInfoW", "%d" );
244     }
245
246     /* is a message sent for the second change? */
247     rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
248     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
249     test_change_message( SPI_SETBEEP, 0 );
250
251     curr_val = FALSE;
252     rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
253     if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
254         rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
255     ok(rc!=0,"SystemParametersInfo: rc=%d err=%ld\n",rc,GetLastError());
256     test_change_message( SPI_SETBEEP, 0 );
257     test_reg_key( SPI_SETBEEP_REGKEY,
258                   SPI_SETBEEP_VALNAME,
259                   curr_val ? "Yes" : "No" );
260     rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
261     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
262     eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
263     rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
264     if (rc!=0 || GetLastError()!=ERROR_CALL_NOT_IMPLEMENTED)
265     {
266         ok(rc!=0,"SystemParametersInfoW: rc=%d err=%ld\n",rc,GetLastError());
267         eq( b, curr_val, "SystemParametersInfoW", "%d" );
268     }
269     ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
270
271     rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
272     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
273 }
274
275 static const char *setmouse_valuenames[3] = {
276     SPI_SETMOUSE_VALNAME1,
277     SPI_SETMOUSE_VALNAME2,
278     SPI_SETMOUSE_VALNAME3
279 };
280
281 /*
282  * Runs check for one setting of spi_setmouse.
283  */
284 static void run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change,
285                                    int nchange )
286 {
287     BOOL rc;
288     INT mi[3];
289     static int aw_turn = 0;
290     static BOOL w_implemented = 1;
291
292     char buf[20];
293     int i;
294
295     aw_turn++;
296     rc=0;
297     if ((aw_turn % 2!=0) && (w_implemented))
298     {
299         /* call unicode on odd (non even) calls */ 
300         SetLastError(0xdeadbeef);
301         rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
302         if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)
303         {
304             w_implemented = 0;
305             trace("SystemParametersInfoW not supported on this platform\n");
306         }
307     }
308
309     if ((aw_turn % 2==0) || (!w_implemented))
310     {
311         /* call ascii version on even calls or if unicode is not available */
312         rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
313     }
314
315     ok(rc!=0,"SystemParametersInfo: rc=%d err=%ld\n",rc,GetLastError());
316     test_change_message( SPI_SETMOUSE, 0 );
317     for (i = 0; i < 3; i++)
318     {
319         sprintf( buf, "%d", curr_val[i] );
320         test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
321     }
322
323     rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
324     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
325     for (i = 0; i < 3; i++)
326     {
327         ok(mi[i] == curr_val[i],
328            "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
329     }
330
331     if (w_implemented)
332     { 
333         rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
334         ok(rc!=0,"SystemParametersInfoW: rc=%d err=%ld\n",rc,GetLastError());
335         for (i = 0; i < 3; i++)
336         {
337             ok(mi[i] == curr_val[i],
338                "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
339         }
340     }
341
342 #if 0  /* FIXME: this always fails for me  - AJ */
343     for (i = 0; i < nchange; i++)
344     {
345         POINT mv;
346         mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
347         mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
348         GetCursorPos( &mv );
349         ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
350         ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
351     }
352 #endif
353 }
354
355 static void test_SPI_SETMOUSE( void )                  /*      4 */
356 {
357     BOOL rc;
358     INT old_mi[3];
359
360     /* win nt default values - 6, 10, 1 */
361     INT curr_val[3] = {6, 10, 1};
362
363     /* requested and projected mouse movements */
364     POINT req_change[] =   { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
365     POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
366     POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
367     POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
368     POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
369     POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
370     POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
371     POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
372     POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
373
374     int nchange = sizeof( req_change ) / sizeof( POINT );
375
376     trace("testing SPI_{GET,SET}MOUSE\n");
377     rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
378     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
379
380     run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange );
381
382     /* acceleration change */
383     curr_val[2] = 2;
384     run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
385
386     /* acceleration change */
387     curr_val[2] = 3;
388     run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
389
390     /* acceleration change */
391     curr_val[2] = 0;
392     run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
393
394     /* threshold change */
395     curr_val[2] = 1;
396     curr_val[0] = 7;
397     run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
398
399     /* threshold change */
400     curr_val[2] = 2;
401     curr_val[0] = 6;
402     curr_val[1] = 6;
403     run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
404
405     /* threshold change */
406     curr_val[1] = 7;
407     run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
408
409     /* threshold change */
410     curr_val[1] = 5;
411     run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
412
413     rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
414     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
415 }
416
417 #if 0
418 static void test_setborder(UINT curr_val)
419 {
420     BOOL rc;
421     UINT border;
422     INT frame;
423     char buf[10];
424
425     rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
426     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
427     test_change_message( SPI_SETBORDER, 1 );
428     sprintf( buf, "%d", curr_val );
429     test_reg_key( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, buf );
430
431     if (curr_val == 0)
432         curr_val = 1;
433     rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
434     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
435     eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
436
437     frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
438     eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
439     eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
440     eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
441     eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
442 }
443
444 static void test_SPI_SETBORDER( void )                 /*      6 */
445 {
446     BOOL rc;
447     UINT old_border;
448
449     /* These tests hang when XFree86 4.0 for Windows is running (tested on
450      *  WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
451      * running.
452      */
453     if (FindWindowA( NULL, "Cygwin/XFree86" ))
454         return;
455
456     trace("testing SPI_{GET,SET}BORDER\n");
457     rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
458     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
459
460     test_setborder(1);
461     test_setborder(0);
462     test_setborder(7);
463     test_setborder(20);
464
465     /* This will restore sane values if the test hang previous run. */
466     if ( old_border == 7 || old_border == 20 )
467         old_border = -15;
468
469     rc=SystemParametersInfoA( SPI_SETBORDER, old_border, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
470     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
471 }
472 #endif
473
474 static void test_SPI_SETKEYBOARDSPEED( void )          /*     10 */
475 {
476     BOOL rc;
477     UINT old_speed;
478     const UINT vals[]={0,20,31};
479     unsigned int i;
480
481     trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
482     rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
483     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
484
485     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
486     {
487         UINT v;
488         char buf[10];
489
490         rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
491                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
492         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
493         test_change_message( SPI_SETKEYBOARDSPEED, 0 );
494         sprintf( buf, "%d", vals[i] );
495         test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
496
497         rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
498         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
499         eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
500     }
501
502     rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
503     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
504 }
505
506 static void test_SPI_ICONHORIZONTALSPACING( void )     /*     13 */
507 {
508     BOOL rc;
509     INT old_spacing;
510     INT spacing;
511     INT curr_val;
512
513     trace("testing SPI_ICONHORIZONTALSPACING\n");
514     /* default value: 75 */
515     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
516     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
517
518     /* do not increase the value as it would upset the user's icon layout */
519     curr_val = (old_spacing > 32 ? old_spacing-1 : 32);
520     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
521                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
522     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
523     test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
524     /* The registry keys depend on the Windows version and the values too
525      * => don't test them
526      */
527
528     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
529     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
530     eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
531     eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
532
533     curr_val = 10;
534     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
535                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
536     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
537     curr_val = 32;      /*min value*/
538     test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
539
540     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
541     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
542     eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d" );
543     eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
544
545     rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
546     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
547 }
548
549 static void test_SPI_SETSCREENSAVETIMEOUT( void )      /*     14 */
550 {
551     BOOL rc;
552     UINT old_timeout;
553     const UINT vals[]={0,32767};
554     unsigned int i;
555
556     trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
557     rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
558     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
559
560     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
561     {
562         UINT v;
563         char buf[10];
564
565         rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
566                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
567         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
568         test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
569         sprintf( buf, "%d", vals[i] );
570         test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
571                       SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
572
573         SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
574         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
575         eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
576     }
577
578     rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
579                               SPIF_UPDATEINIFILE );
580     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
581 }
582
583 static void test_SPI_SETSCREENSAVEACTIVE( void )       /*     17 */
584 {
585     BOOL rc;
586     BOOL old_b;
587     const UINT vals[]={TRUE,FALSE};
588     unsigned int i;
589
590     trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
591     rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
592     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
593
594     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
595     {
596         UINT v;
597
598         rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
599                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
600         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
601         test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
602         test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
603                       SPI_SETSCREENSAVEACTIVE_VALNAME,
604                       vals[i] ? "1" : "0" );
605
606         rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
607         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
608         eq( v, vals[i], "SPI_{GET,SET}SCREENSAVEACTIVE", "%d" );
609     }
610
611     rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
612     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
613 }
614
615 static void test_SPI_SETGRIDGRANULARITY( void )        /*     19 */
616 {
617     /* ??? */;
618 }
619
620 static void test_SPI_SETKEYBOARDDELAY( void )          /*     23 */
621 {
622     BOOL rc;
623     UINT old_delay;
624     const UINT vals[]={0,3};
625     unsigned int i;
626
627     trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
628     rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
629     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
630
631     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
632     {
633         UINT delay;
634         char buf[10];
635
636         rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
637                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
638         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
639         test_change_message( SPI_SETKEYBOARDDELAY, 0 );
640         sprintf( buf, "%d", vals[i] );
641         test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
642                       SPI_SETKEYBOARDDELAY_VALNAME, buf );
643
644         rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
645         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
646         eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
647     }
648
649     rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
650     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
651 }
652
653 static void test_SPI_ICONVERTICALSPACING( void )       /*     24 */
654 {
655     BOOL rc;
656     INT old_spacing;
657     INT spacing;
658     INT curr_val;
659
660     trace("testing SPI_ICONVERTICALSPACING\n");
661     /* default value: 75 */
662     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
663     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
664
665     /* do not increase the value as it would upset the user's icon layout */
666     curr_val = old_spacing-1;
667     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
668                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
669     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
670     test_change_message( SPI_ICONVERTICALSPACING, 0 );
671     /* The registry keys depend on the Windows version and the values too
672      * => don't test them
673      */
674
675     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
676     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
677     eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
678     eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
679
680     curr_val = 10;
681     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
682                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
683     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
684     curr_val = 32;      /*min value*/
685     test_change_message( SPI_ICONVERTICALSPACING, 0 );
686
687     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
688     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
689     eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
690     eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
691
692     rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
693                               SPIF_UPDATEINIFILE );
694     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
695 }
696
697 static void test_SPI_SETICONTITLEWRAP( void )          /*     26 */
698 {
699     BOOL rc;
700     BOOL old_b;
701     const UINT vals[]={TRUE,FALSE};
702     unsigned int i;
703
704     /* These tests hang when XFree86 4.0 for Windows is running (tested on
705      * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
706      * running.
707      */
708     if (FindWindowA( NULL, "Cygwin/XFree86" ))
709         return;
710
711     trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
712     rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
713
714     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_CALL_NOT_IMPLEMENTED))
715     {
716         /* SPI_{GET,SET}ICONTITLEWRAP is not implemented on a standard Win98 SE */
717         trace("SPI_{GET,SET}ICONTITLEWRAP not supported on this platform\n");
718         return;
719     }
720     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
721
722     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
723     {
724         UINT v;
725
726         rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
727                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
728         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
729         test_change_message( SPI_SETICONTITLEWRAP, 1 );
730         test_reg_key_ex( SPI_SETICONTITLEWRAP_REGKEY1,
731                          SPI_SETICONTITLEWRAP_REGKEY2,
732                          SPI_SETICONTITLEWRAP_VALNAME,
733                          vals[i] ? "1" : "0" );
734
735         rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
736         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
737         eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
738     }
739
740     rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
741     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
742 }
743
744 static void test_SPI_SETMENUDROPALIGNMENT( void )      /*     28 */
745 {
746     BOOL rc;
747     BOOL old_b;
748     const UINT vals[]={TRUE,FALSE};
749     unsigned int i;
750
751     trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
752     rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
753     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
754
755     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
756     {
757         UINT v;
758
759         rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
760                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
761         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
762         test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
763         test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
764                          SPI_SETMENUDROPALIGNMENT_REGKEY2,
765                          SPI_SETMENUDROPALIGNMENT_VALNAME,
766                          vals[i] ? "1" : "0" );
767
768         rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
769         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
770         eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
771         eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
772             "SM_MENUDROPALIGNMENT", "%d" );
773     }
774
775     rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
776                               SPIF_UPDATEINIFILE );
777     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
778 }
779
780 static void test_SPI_SETDOUBLECLKWIDTH( void )         /*     29 */
781 {
782     BOOL rc;
783     INT old_width;
784     const UINT vals[]={0,10000};
785     unsigned int i;
786
787     trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
788     old_width = GetSystemMetrics( SM_CXDOUBLECLK );
789
790     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
791     {
792         char buf[10];
793
794         rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
795                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
796         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
797         test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
798         sprintf( buf, "%d", vals[i] );
799         test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
800                          SPI_SETDOUBLECLKWIDTH_REGKEY2,
801                          SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
802         eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
803             "SM_CXDOUBLECLK", "%d" );
804     }
805
806     rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
807                               SPIF_UPDATEINIFILE );
808     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
809 }
810
811 static void test_SPI_SETDOUBLECLKHEIGHT( void )        /*     30 */
812 {
813     BOOL rc;
814     INT old_height;
815     const UINT vals[]={0,10000};
816     unsigned int i;
817
818     trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
819     old_height = GetSystemMetrics( SM_CYDOUBLECLK );
820
821     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
822     {
823         char buf[10];
824
825         rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
826                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
827         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
828         test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
829         sprintf( buf, "%d", vals[i] );
830         test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
831                          SPI_SETDOUBLECLKHEIGHT_REGKEY2,
832                          SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
833         eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
834             "SM_CYDOUBLECLK", "%d" );
835     }
836
837     rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
838                               SPIF_UPDATEINIFILE );
839     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
840 }
841
842 static void test_SPI_SETDOUBLECLICKTIME( void )        /*     32 */
843 {
844     BOOL rc;
845     UINT curr_val;
846     UINT saved_val;
847     UINT old_time;
848     char buf[10];
849
850     trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
851     old_time = GetDoubleClickTime();
852
853     curr_val = 0;
854     rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
855                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
856     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
857     test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
858     sprintf( buf, "%d", curr_val );
859     test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
860                   SPI_SETDOUBLECLICKTIME_VALNAME, buf );
861     curr_val = 500; /* used value for 0 */
862     eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
863
864     curr_val = 1000;
865     rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
866                              SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
867     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
868     test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
869     sprintf( buf, "%d", curr_val );
870     test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
871                   SPI_SETDOUBLECLICKTIME_VALNAME, buf );
872     eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
873
874     saved_val = curr_val;
875
876     curr_val = 0;
877     SetDoubleClickTime( curr_val );
878     sprintf( buf, "%d", saved_val );
879     test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
880                   SPI_SETDOUBLECLICKTIME_VALNAME, buf );
881     curr_val = 500; /* used value for 0 */
882     eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
883
884     curr_val = 1000;
885     SetDoubleClickTime( curr_val );
886     sprintf( buf, "%d", saved_val );
887     test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
888                   SPI_SETDOUBLECLICKTIME_VALNAME, buf );
889     eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
890
891     rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
892     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
893 }
894
895 static void test_SPI_SETMOUSEBUTTONSWAP( void )        /*     33 */
896 {
897     BOOL rc;
898     BOOL old_b;
899     const UINT vals[]={TRUE,FALSE};
900     unsigned int i;
901
902     trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
903     old_b = GetSystemMetrics( SM_SWAPBUTTON );
904
905     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
906     {
907         rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
908                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
909         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
910         test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
911         test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
912                       SPI_SETMOUSEBUTTONSWAP_VALNAME,
913                       vals[i] ? "1" : "0" );
914         eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
915             "SM_SWAPBUTTON", "%d" );
916     }
917
918     rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
919                               SPIF_UPDATEINIFILE );
920     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
921 }
922
923 static void test_SPI_SETFASTTASKSWITCH( void )         /*     36 */
924 {
925     BOOL rc;
926     BOOL v;
927
928     trace("testing SPI_GETFASTTASKSWITCH\n");
929     rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
930     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
931     /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
932      * works. That sure simplifies testing!
933      */
934 }
935
936 static void test_SPI_SETDRAGFULLWINDOWS( void )        /*     37 */
937 {
938     BOOL rc;
939     BOOL old_b;
940     const UINT vals[]={TRUE,FALSE};
941     unsigned int i;
942
943     trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
944     rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
945     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_CALL_NOT_IMPLEMENTED))
946     {
947         /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
948         trace("SPI_{GET,SET}DRAGFULLWINDOWS not supported on this platform\n");
949         return;
950     }
951     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
952
953     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
954     {
955         UINT v;
956
957         rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
958                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
959         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
960         test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
961         test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
962                       SPI_SETDRAGFULLWINDOWS_VALNAME,
963                       vals[i] ? "1" : "0" );
964
965         rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
966         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
967         eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
968     }
969
970     rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
971     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
972 }
973
974 static void test_SPI_SETMINIMIZEDMETRICS( void )               /*     44 */
975 {
976     BOOL rc;
977     MINIMIZEDMETRICS lpMm_orig;
978     MINIMIZEDMETRICS lpMm_new;
979     MINIMIZEDMETRICS lpMm_cur;
980
981     lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
982     lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
983     lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
984
985     trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
986     rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
987     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
988
989     lpMm_cur.iWidth = 180;
990     lpMm_cur.iHorzGap = 1;
991     lpMm_cur.iVertGap = 1;
992     lpMm_cur.iArrange = 5;
993     
994     rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_cur, FALSE );
995     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
996
997     rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
998     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
999
1000     eq( lpMm_new.iWidth,   lpMm_cur.iWidth,   "iWidth",   "%d" );
1001     eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1002     eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1003     eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1004
1005     eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1006         lpMm_new.iWidth,   "iWidth",   "%d" );
1007     eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1008         lpMm_new.iHorzGap, "iHorzGap", "%d" );
1009     eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1010         lpMm_new.iVertGap, "iVertGap", "%d" );
1011     eq( GetSystemMetrics( SM_ARRANGE ),
1012         lpMm_new.iArrange, "iArrange", "%d" );
1013
1014     rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1015     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1016     
1017     rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1018     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1019     
1020     eq( lpMm_new.iWidth,   lpMm_orig.iWidth,   "iWidth",   "%d" );
1021     eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1022     eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1023     eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1024 }
1025
1026 static void test_SPI_SETICONMETRICS( void )               /*     46 */
1027 {
1028     BOOL rc;
1029     ICONMETRICSA im_orig;
1030     ICONMETRICSA im_new;
1031     ICONMETRICSA im_cur;
1032         
1033     im_orig.cbSize = sizeof(ICONMETRICSA);
1034     im_new.cbSize = sizeof(ICONMETRICSA);
1035     im_cur.cbSize = sizeof(ICONMETRICSA);
1036
1037     trace("testing SPI_{GET,SET}ICONMETRICS\n");
1038     rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1039     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1040
1041     im_cur.iHorzSpacing = 65;
1042     im_cur.iVertSpacing = 65;
1043     im_cur.iTitleWrap = 0;
1044     im_cur.lfFont.lfHeight = 1;
1045     im_cur.lfFont.lfWidth = 1;
1046     im_cur.lfFont.lfEscapement = 1;
1047     im_cur.lfFont.lfWeight = 1;
1048     im_cur.lfFont.lfItalic = 1;
1049     im_cur.lfFont.lfStrikeOut = 1;
1050     im_cur.lfFont.lfUnderline = 1;
1051     im_cur.lfFont.lfCharSet = 1;
1052     im_cur.lfFont.lfOutPrecision = 1;
1053     im_cur.lfFont.lfClipPrecision = 1;
1054     im_cur.lfFont.lfPitchAndFamily = 1;
1055     im_cur.lfFont.lfQuality = 1;
1056
1057     rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, FALSE );
1058     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1059
1060     rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1061     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1062
1063     eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1064     eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1065     eq( im_new.iTitleWrap,   im_cur.iTitleWrap,   "iTitleWrap",   "%d" );
1066
1067     eq( im_new.lfFont.lfHeight,         im_cur.lfFont.lfHeight,         "lfHeight",         "%ld" );
1068     eq( im_new.lfFont.lfWidth,          im_cur.lfFont.lfWidth,          "lfWidth",          "%ld" );
1069     eq( im_new.lfFont.lfEscapement,     im_cur.lfFont.lfEscapement,     "lfEscapement",     "%ld" );
1070     eq( im_new.lfFont.lfWeight,         im_cur.lfFont.lfWeight,         "lfWeight",         "%ld" );
1071     eq( im_new.lfFont.lfItalic,         im_cur.lfFont.lfItalic,         "lfItalic",         "%d" );
1072     eq( im_new.lfFont.lfStrikeOut,      im_cur.lfFont.lfStrikeOut,      "lfStrikeOut",      "%d" );
1073     eq( im_new.lfFont.lfUnderline,      im_cur.lfFont.lfUnderline,      "lfUnderline",      "%d" );
1074     eq( im_new.lfFont.lfCharSet,        im_cur.lfFont.lfCharSet,        "lfCharSet",        "%d" );
1075     eq( im_new.lfFont.lfOutPrecision,   im_cur.lfFont.lfOutPrecision,   "lfOutPrecision",   "%d" );
1076     eq( im_new.lfFont.lfClipPrecision,  im_cur.lfFont.lfClipPrecision,  "lfClipPrecision",  "%d" );
1077     eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1078     eq( im_new.lfFont.lfQuality,        im_cur.lfFont.lfQuality,        "lfQuality",        "%d" );
1079
1080     eq( GetSystemMetrics( SM_CXICONSPACING ),
1081         im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1082     eq( GetSystemMetrics( SM_CYICONSPACING ),
1083         im_new.iVertSpacing, "iVertSpacing", "%d" );
1084
1085     rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1086     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1087     
1088     rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1089     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1090     
1091     eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1092     eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1093     eq( im_new.iTitleWrap,   im_orig.iTitleWrap,   "iTitleWrap",   "%d" );
1094 }
1095
1096 static void test_SPI_SETWORKAREA( void )               /*     47 */
1097 {
1098     BOOL rc;
1099     RECT old_area;
1100     RECT area;
1101     RECT curr_val;
1102
1103     trace("testing SPI_{GET,SET}WORKAREA\n");
1104     rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1105     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1106
1107     /* Modify the work area only minimally as this causes the icons that
1108      * fall outside it to be moved around thus requiring the user to
1109      * reposition them manually one by one.
1110      * Changing the work area by just one pixel should make this occurrence
1111      * reasonably unlikely.
1112      */
1113     curr_val.left = old_area.left;
1114     curr_val.top = old_area.top;
1115     curr_val.right = old_area.right-1;
1116     curr_val.bottom = old_area.bottom-1;
1117     rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1118                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1119     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1120     test_change_message( SPI_SETWORKAREA, 0 );
1121     rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1122     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1123     eq( area.left,   curr_val.left,   "left",   "%ld" );
1124     eq( area.top,    curr_val.top,    "top",    "%ld" );
1125     eq( area.right,  curr_val.right,  "right",  "%ld" );
1126     eq( area.bottom, curr_val.bottom, "bottom", "%ld" );
1127
1128     rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1129                               SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1130     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1131     test_change_message( SPI_SETWORKAREA, 0 );
1132     rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1133     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1134     eq( area.left,   old_area.left,   "left",   "%ld" );
1135     eq( area.top,    old_area.top,    "top",    "%ld" );
1136     eq( area.right,  old_area.right,  "right",  "%ld" );
1137     eq( area.bottom, old_area.bottom, "bottom", "%ld" );
1138 }
1139
1140 static void test_SPI_SETSHOWSOUNDS( void )             /*     57 */
1141 {
1142     BOOL rc;
1143     BOOL old_b;
1144     const UINT vals[]={TRUE,FALSE};
1145     unsigned int i;
1146
1147     trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1148     SetLastError(0);
1149     rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1150     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1151     {
1152         /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1153         trace("SPI_{GET,SET}SHOWSOUNDS not supported on this platform\n");
1154         return;
1155     }
1156     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1157
1158     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1159     {
1160         UINT v;
1161
1162         rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1163                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1164         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1165         test_change_message( SPI_SETSHOWSOUNDS, 0 );
1166         test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1167                       SPI_SETSHOWSOUNDS_VALNAME,
1168                       vals[i] ? "1" : "0" );
1169
1170         rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1171         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1172         eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1173         eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1174             "SM_SHOWSOUNDS", "%d" );
1175     }
1176
1177     rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1178     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1179 }
1180
1181 static void test_SPI_SETKEYBOARDPREF( void )           /*     69 */
1182 {
1183     BOOL rc;
1184     BOOL old_b;
1185     const UINT vals[]={TRUE,FALSE};
1186     unsigned int i;
1187
1188     trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1189     SetLastError(0);
1190     rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1191     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1192     {
1193         trace("SPI_{GET,SET}KEYBOARDPREF not supported on this platform\n");
1194         return;
1195     }
1196     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1197
1198     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1199     {
1200         BOOL v;
1201
1202         rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1203                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1204         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1205         test_change_message( SPI_SETKEYBOARDPREF, 0 );
1206         test_reg_key( SPI_SETKEYBOARDPREF_REGKEY,
1207                       SPI_SETKEYBOARDPREF_VALNAME,
1208                       vals[i] ? "1" : "0" );
1209
1210         rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1211         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1212         eq( v, vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1213     }
1214
1215     rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1216     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1217 }
1218
1219 static void test_SPI_SETSCREENREADER( void )           /*     71 */
1220 {
1221     BOOL rc;
1222     BOOL old_b;
1223     const UINT vals[]={TRUE,FALSE};
1224     unsigned int i;
1225
1226     trace("testing SPI_{GET,SET}SCREENREADER\n");
1227     SetLastError(0);
1228     rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1229     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1230     {
1231         trace("SPI_{GET,SET}SCREENREADER not supported on this platform\n");
1232         return;
1233     }
1234     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1235
1236     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1237     {
1238         BOOL v;
1239
1240         rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
1241                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1242         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1243         test_change_message( SPI_SETSCREENREADER, 0 );
1244         test_reg_key( SPI_SETSCREENREADER_REGKEY,
1245                       SPI_SETSCREENREADER_VALNAME,
1246                       vals[i] ? "1" : "0" );
1247
1248         rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
1249         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1250         eq( v, vals[i], "SPI_GETSCREENREADER", "%d" );
1251     }
1252
1253     rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
1254     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1255 }
1256
1257 static void test_SPI_SETLOWPOWERACTIVE( void )         /*     85 */
1258 {
1259     BOOL rc;
1260     BOOL old_b;
1261     const UINT vals[]={TRUE,FALSE};
1262     unsigned int i;
1263
1264     trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
1265     SetLastError(0);
1266     rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
1267     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1268     {
1269         trace("SPI_{GET,SET}LOWPOWERACTIVE not supported on this platform\n");
1270         return;
1271     }
1272     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1273
1274     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1275     {
1276         UINT v;
1277
1278         rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
1279                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1280         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1281         test_change_message( SPI_SETLOWPOWERACTIVE, 0 );
1282         test_reg_key( SPI_SETLOWPOWERACTIVE_REGKEY,
1283                       SPI_SETLOWPOWERACTIVE_VALNAME,
1284                       vals[i] ? "1" : "0" );
1285
1286         rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
1287         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1288         eq( v, vals[i], "SPI_GETLOWPOWERACTIVE", "%d" );
1289     }
1290
1291     rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1292     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1293 }
1294
1295 static void test_SPI_SETPOWEROFFACTIVE( void )         /*     86 */
1296 {
1297     BOOL rc;
1298     BOOL old_b;
1299     const UINT vals[]={TRUE,FALSE};
1300     unsigned int i;
1301
1302     trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
1303     SetLastError(0);
1304     rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
1305     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1306     {
1307         trace("SPI_{GET,SET}POWEROFFACTIVE not supported on this platform\n");
1308         return;
1309     }
1310     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1311
1312     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1313     {
1314         UINT v;
1315
1316         rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
1317                                   SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1318         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1319         test_change_message( SPI_SETPOWEROFFACTIVE, 0 );
1320         test_reg_key( SPI_SETPOWEROFFACTIVE_REGKEY,
1321                       SPI_SETPOWEROFFACTIVE_VALNAME,
1322                       vals[i] ? "1" : "0" );
1323
1324         rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
1325         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1326         eq( v, vals[i], "SPI_GETPOWEROFFACTIVE", "%d" );
1327     }
1328
1329     rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1330     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1331 }
1332
1333 static void test_SPI_SETMOUSEHOVERWIDTH( void )      /*     99 */
1334 {
1335     BOOL rc;
1336     UINT old_width;
1337     const UINT vals[]={0,32767};
1338     unsigned int i;
1339
1340     trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
1341     rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
1342     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1343     {
1344         /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
1345          * what MSDN states (Verified on Win98SE)
1346          */
1347         trace("SPI_{GET,SET}MOUSEHOVERWIDTH not supported on this platform\n");
1348         return;
1349     }
1350     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1351     
1352     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1353     {
1354         UINT v;
1355         char buf[10];
1356
1357         rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
1358                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1359         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1360         test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
1361         sprintf( buf, "%d", vals[i] );
1362         test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
1363                       SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
1364
1365         SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
1366         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1367         eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
1368     }
1369
1370     rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
1371                               SPIF_UPDATEINIFILE );
1372     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1373 }
1374
1375 static void test_SPI_SETMOUSEHOVERHEIGHT( void )      /*     101 */
1376 {
1377     BOOL rc;
1378     UINT old_height;
1379     const UINT vals[]={0,32767};
1380     unsigned int i;
1381
1382     trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
1383     rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
1384     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1385     {
1386         /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
1387          * what MSDN states (Verified on Win98SE)
1388          */
1389         trace("SPI_{GET,SET}MOUSEHOVERHEIGHT not supported on this platform\n");
1390         return;
1391     }
1392     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1393     
1394     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1395     {
1396         UINT v;
1397         char buf[10];
1398
1399         rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
1400                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1401         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1402         test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
1403         sprintf( buf, "%d", vals[i] );
1404         test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
1405                       SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
1406
1407         SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
1408         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1409         eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
1410     }
1411
1412     rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
1413                               SPIF_UPDATEINIFILE );
1414     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1415 }
1416
1417 static void test_SPI_SETMOUSEHOVERTIME( void )      /*     103 */
1418 {
1419     BOOL rc;
1420     UINT old_time;
1421
1422     /* Windows XP accepts 10 as the minimum hover time. Any value below will be
1423      * defaulted to a value of 10 automatically.
1424      */
1425     const UINT vals[]={10,32767};
1426     unsigned int i;
1427
1428     trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
1429     rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
1430     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1431     {
1432         /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
1433          * what MSDN states (Verified on Win98SE)
1434          */
1435         trace("SPI_{GET,SET}MOUSEHOVERTIME not supported on this platform\n");
1436         return;
1437     }
1438     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1439     
1440     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1441     {
1442         UINT v;
1443         char buf[10];
1444
1445         rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
1446                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1447         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1448         test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
1449         sprintf( buf, "%d", vals[i] );
1450         test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
1451                       SPI_SETMOUSEHOVERTIME_VALNAME, buf );
1452
1453         SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
1454         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1455         eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
1456     }
1457
1458     rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
1459                               SPIF_UPDATEINIFILE );
1460     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1461 }
1462
1463 static void test_SPI_SETWHEELSCROLLLINES( void )      /*     105 */
1464 {
1465     BOOL rc;
1466     UINT old_lines;
1467     const UINT vals[]={0,32767};
1468     unsigned int i;
1469
1470     trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
1471     rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
1472     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1473     {
1474         /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
1475         trace("SPI_{GET,SET}WHEELSCROLLLINES not supported on this platform\n");
1476         return;
1477     }
1478     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1479
1480     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1481     {
1482         UINT v;
1483         char buf[10];
1484
1485         rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
1486                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1487         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1488         test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
1489         sprintf( buf, "%d", vals[i] );
1490         test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
1491                       SPI_SETMOUSESCROLLLINES_VALNAME, buf );
1492
1493         SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
1494         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1495         eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
1496     }
1497
1498     rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
1499                               SPIF_UPDATEINIFILE );
1500     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1501 }
1502
1503 static void test_SPI_SETMENUSHOWDELAY( void )      /*     107 */
1504 {
1505     BOOL rc;
1506     UINT old_delay;
1507     const UINT vals[]={0,32767};
1508     unsigned int i;
1509
1510     trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
1511     rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
1512     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1513     {
1514         /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
1515         trace("SPI_{GET,SET}MENUSHOWDELAY not supported on this platform\n");
1516         return;
1517     }
1518     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1519
1520     for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1521     {
1522         UINT v;
1523         char buf[10];
1524
1525         rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
1526                                SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1527         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1528         test_change_message( SPI_SETMENUSHOWDELAY, 0 );
1529         sprintf( buf, "%d", vals[i] );
1530         test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
1531                       SPI_SETMENUSHOWDELAY_VALNAME, buf );
1532
1533         SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
1534         ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
1535         eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
1536     }
1537
1538     rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
1539                               SPIF_UPDATEINIFILE );
1540     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1541 }
1542
1543 static void test_SPI_SETWALLPAPER( void )              /*   115 */
1544 {
1545     BOOL rc;
1546     char oldval[260];
1547     char newval[260];
1548
1549     trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
1550     SetLastError(0);
1551     rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
1552     if (rc==0 && (GetLastError()==0 || GetLastError()==ERROR_INVALID_SPI_VALUE))
1553     {
1554         /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
1555          * unimplemented on NT4
1556          */
1557         trace("SPI_{GET,SET}DESKWALLPAPER not supported on this platform\n");
1558         return;
1559     }
1560     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1561
1562     strcpy(newval, "");
1563     rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1564     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
1565     test_change_message(SPI_SETDESKWALLPAPER, 0);
1566
1567     rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
1568     ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
1569
1570     test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
1571 }
1572
1573 /*
1574  * Registry entries for the system parameters.
1575  * Names are created by 'SET' flags names.
1576  * We assume that corresponding 'GET' entries use the same registry keys.
1577  */
1578 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
1579 {
1580     test_SPI_SETBEEP();                         /*      1 */
1581     test_SPI_SETMOUSE();                        /*      4 */
1582     /* Messes up systems settings on Win9x */
1583     /*test_SPI_SETBORDER();*/                   /*      6 */
1584     test_SPI_SETKEYBOARDSPEED();                /*     10 */
1585     test_SPI_ICONHORIZONTALSPACING();           /*     13 */
1586     test_SPI_SETSCREENSAVETIMEOUT();            /*     14 */
1587     test_SPI_SETSCREENSAVEACTIVE();             /*     17 */
1588     test_SPI_SETGRIDGRANULARITY();              /*     19 */
1589     test_SPI_SETKEYBOARDDELAY();                /*     23 */
1590     test_SPI_ICONVERTICALSPACING();             /*     24 */
1591     test_SPI_SETICONTITLEWRAP();                /*     26 */
1592     test_SPI_SETMENUDROPALIGNMENT();            /*     28 */
1593     test_SPI_SETDOUBLECLKWIDTH();               /*     29 */
1594     test_SPI_SETDOUBLECLKHEIGHT();              /*     30 */
1595     test_SPI_SETDOUBLECLICKTIME();              /*     32 */
1596     test_SPI_SETMOUSEBUTTONSWAP();              /*     33 */
1597     test_SPI_SETFASTTASKSWITCH();               /*     36 */
1598     test_SPI_SETDRAGFULLWINDOWS();              /*     37 */
1599     test_SPI_SETMINIMIZEDMETRICS();             /*     44 */
1600     test_SPI_SETICONMETRICS();                  /*     46 */
1601     test_SPI_SETWORKAREA();                     /*     47 */
1602     test_SPI_SETSHOWSOUNDS();                   /*     57 */
1603     test_SPI_SETKEYBOARDPREF();                 /*     69 */
1604     test_SPI_SETSCREENREADER();                 /*     71 */
1605     test_SPI_SETLOWPOWERACTIVE();               /*     85 */
1606     test_SPI_SETPOWEROFFACTIVE();               /*     86 */
1607     test_SPI_SETMOUSEHOVERWIDTH();              /*     99 */
1608     test_SPI_SETMOUSEHOVERHEIGHT();             /*    101 */
1609     test_SPI_SETMOUSEHOVERTIME();               /*    103 */
1610     test_SPI_SETWHEELSCROLLLINES();             /*    105 */
1611     test_SPI_SETMENUSHOWDELAY();                /*    107 */
1612     test_SPI_SETWALLPAPER();                    /*    115 */
1613     SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
1614     return 0;
1615 }
1616
1617 START_TEST(sysparams)
1618 {
1619     int argc;
1620     char** argv;
1621     WNDCLASSA wc;
1622     MSG msg;
1623     HANDLE hThread;
1624     DWORD dwThreadId;
1625     HANDLE hInstance = GetModuleHandleA( NULL );
1626
1627     /* This test requires interactivity, if we don't have it, give up */
1628     if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
1629         GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
1630
1631     argc = winetest_get_mainargs(&argv);
1632     strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
1633     trace("strict=%d\n",strict);
1634
1635     change_counter = 0;
1636     change_last_param = 0;
1637
1638     wc.lpszClassName = "SysParamsTestClass";
1639     wc.lpfnWndProc = SysParamsTestWndProc;
1640     wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
1641     wc.hInstance = hInstance;
1642     wc.hIcon = LoadIconA( 0, (LPSTR)IDI_APPLICATION );
1643     wc.hCursor = LoadCursorA( 0, (LPSTR)IDC_ARROW );
1644     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1 );
1645     wc.lpszMenuName = 0;
1646     wc.cbClsExtra = 0;
1647     wc.cbWndExtra = 0;
1648     RegisterClassA( &wc );
1649
1650     ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
1651                                WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
1652
1653     hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
1654     assert( hThread );
1655     CloseHandle( hThread );
1656
1657     while( GetMessageA( &msg, 0, 0, 0 )) {
1658         TranslateMessage( &msg );
1659         DispatchMessageA( &msg );
1660     }
1661 }