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