2 * System parameters functions
4 * Copyright 1994 Alexandre Julliard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include "wine/winuser16.h"
36 #include "wine/debug.h"
37 #include "sysmetrics.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(system
);
41 /* System parameter indexes */
42 #define SPI_SETBEEP_IDX 0
43 #define SPI_SETMOUSE_IDX 1
44 #define SPI_SETBORDER_IDX 2
45 #define SPI_SETKEYBOARDSPEED_IDX 3
46 #define SPI_ICONHORIZONTALSPACING_IDX 4
47 #define SPI_SETSCREENSAVETIMEOUT_IDX 5
48 #define SPI_SETGRIDGRANULARITY_IDX 6
49 #define SPI_SETKEYBOARDDELAY_IDX 7
50 #define SPI_ICONVERTICALSPACING_IDX 8
51 #define SPI_SETICONTITLEWRAP_IDX 9
52 #define SPI_SETMENUDROPALIGNMENT_IDX 10
53 #define SPI_SETDOUBLECLKWIDTH_IDX 11
54 #define SPI_SETDOUBLECLKHEIGHT_IDX 12
55 #define SPI_SETDOUBLECLICKTIME_IDX 13
56 #define SPI_SETMOUSEBUTTONSWAP_IDX 14
57 #define SPI_SETDRAGFULLWINDOWS_IDX 15
58 #define SPI_SETWORKAREA_IDX 16
59 #define SPI_SETSHOWSOUNDS_IDX 17
60 #define SPI_SETKEYBOARDPREF_IDX 18
61 #define SPI_SETSCREENREADER_IDX 19
62 #define SPI_SETSCREENSAVERRUNNING_IDX 20
63 #define SPI_WINE_IDX SPI_SETSCREENSAVERRUNNING_IDX
66 * Names of the registry subkeys of HKEY_CURRENT_USER key and value names
67 * for the system parameters.
68 * Names of the keys are created by adding string "_REGKEY" to
69 * "SET" action names, value names are created by adding "_REG_NAME"
70 * to the "SET" action name.
72 #define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
73 #define SPI_SETBEEP_VALNAME "Beep"
74 #define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
75 #define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
76 #define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
77 #define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
78 #define SPI_SETBORDER_REGKEY "Control Panel\\Desktop"
79 #define SPI_SETBORDER_VALNAME "BorderWidth"
80 #define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
81 #define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
82 #define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop"
83 #define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
84 #define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
85 #define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
86 #define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
87 #define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
88 #define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
89 #define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
90 #define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
91 #define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
92 #define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop"
93 #define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
94 #define SPI_SETICONTITLEWRAP_REGKEY "Control Panel\\Desktop"
95 #define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
96 #define SPI_SETMENUDROPALIGNMENT_REGKEY "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
97 #define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
98 #define SPI_SETDOUBLECLKWIDTH_REGKEY "Control Panel\\Mouse"
99 #define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
100 #define SPI_SETDOUBLECLKHEIGHT_REGKEY "Control Panel\\Mouse"
101 #define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
102 #define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
103 #define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
104 #define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
105 #define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
106 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
107 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
108 #define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
109 #define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
110 #define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
111 #define SPI_SETSHOWSOUNDS_VALNAME "On"
112 /* FIXME - real values */
113 #define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Desktop"
114 #define SPI_SETKEYBOARDPREF_VALNAME "WINE_KeyboardPref"
115 #define SPI_SETSCREENREADER_REGKEY "Control Panel\\Desktop"
116 #define SPI_SETSCREENREADER_VALNAME "WINE_ScreenReader"
117 #define SPI_SETSCREENSAVERRUNNING_REGKEY "Control Panel\\Desktop"
118 #define SPI_SETSCREENSAVERRUNNING_VALNAME "WINE_ScreenSaverRunning"
120 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
121 #define WINE_CURRENT_USER_REGKEY "Wine"
123 /* Indicators whether system parameter value is loaded */
124 static char spi_loaded
[SPI_WINE_IDX
+ 1];
126 static BOOL notify_change
= TRUE
;
128 /* System parameters storage */
129 static BOOL beep_active
= TRUE
;
130 static int mouse_threshold1
= 6;
131 static int mouse_threshold2
= 10;
132 static int mouse_speed
= 1;
133 static int border
= 1;
134 static int keyboard_speed
= 31;
135 static int screensave_timeout
= 300;
136 static int grid_granularity
= 0;
137 static int keyboard_delay
= 1;
138 static BOOL icon_title_wrap
= TRUE
;
139 static int double_click_time
= 500;
140 static BOOL drag_full_windows
= FALSE
;
141 static RECT work_area
;
142 static BOOL keyboard_pref
= TRUE
;
143 static BOOL screen_reader
= FALSE
;
144 static BOOL screensaver_running
= FALSE
;
146 /***********************************************************************
147 * GetTimerResolution (USER.14)
149 LONG WINAPI
GetTimerResolution16(void)
154 /***********************************************************************
155 * ControlPanelInfo (USER.273)
157 void WINAPI
ControlPanelInfo16( INT16 nInfoType
, WORD wData
, LPSTR lpBuffer
)
159 FIXME("(%d, %04x, %p): stub.\n", nInfoType
, wData
, lpBuffer
);
162 /* This function is a copy of the one in objects/font.c */
163 static void SYSPARAMS_LogFont32ATo16( const LOGFONTA
* font32
, LPLOGFONT16 font16
)
165 font16
->lfHeight
= font32
->lfHeight
;
166 font16
->lfWidth
= font32
->lfWidth
;
167 font16
->lfEscapement
= font32
->lfEscapement
;
168 font16
->lfOrientation
= font32
->lfOrientation
;
169 font16
->lfWeight
= font32
->lfWeight
;
170 font16
->lfItalic
= font32
->lfItalic
;
171 font16
->lfUnderline
= font32
->lfUnderline
;
172 font16
->lfStrikeOut
= font32
->lfStrikeOut
;
173 font16
->lfCharSet
= font32
->lfCharSet
;
174 font16
->lfOutPrecision
= font32
->lfOutPrecision
;
175 font16
->lfClipPrecision
= font32
->lfClipPrecision
;
176 font16
->lfQuality
= font32
->lfQuality
;
177 font16
->lfPitchAndFamily
= font32
->lfPitchAndFamily
;
178 lstrcpynA( font16
->lfFaceName
, font32
->lfFaceName
, LF_FACESIZE
);
181 static void SYSPARAMS_LogFont32ATo32W( const LOGFONTA
* font32A
, LPLOGFONTW font32W
)
183 font32W
->lfHeight
= font32A
->lfHeight
;
184 font32W
->lfWidth
= font32A
->lfWidth
;
185 font32W
->lfEscapement
= font32A
->lfEscapement
;
186 font32W
->lfOrientation
= font32A
->lfOrientation
;
187 font32W
->lfWeight
= font32A
->lfWeight
;
188 font32W
->lfItalic
= font32A
->lfItalic
;
189 font32W
->lfUnderline
= font32A
->lfUnderline
;
190 font32W
->lfStrikeOut
= font32A
->lfStrikeOut
;
191 font32W
->lfCharSet
= font32A
->lfCharSet
;
192 font32W
->lfOutPrecision
= font32A
->lfOutPrecision
;
193 font32W
->lfClipPrecision
= font32A
->lfClipPrecision
;
194 font32W
->lfQuality
= font32A
->lfQuality
;
195 font32W
->lfPitchAndFamily
= font32A
->lfPitchAndFamily
;
196 MultiByteToWideChar( CP_ACP
, 0, font32A
->lfFaceName
, -1, font32W
->lfFaceName
, LF_FACESIZE
);
197 font32W
->lfFaceName
[LF_FACESIZE
-1] = 0;
200 static void SYSPARAMS_NonClientMetrics32ATo16( const NONCLIENTMETRICSA
* lpnm32
, LPNONCLIENTMETRICS16 lpnm16
)
202 lpnm16
->iBorderWidth
= lpnm32
->iBorderWidth
;
203 lpnm16
->iScrollWidth
= lpnm32
->iScrollWidth
;
204 lpnm16
->iScrollHeight
= lpnm32
->iScrollHeight
;
205 lpnm16
->iCaptionWidth
= lpnm32
->iCaptionWidth
;
206 lpnm16
->iCaptionHeight
= lpnm32
->iCaptionHeight
;
207 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfCaptionFont
, &lpnm16
->lfCaptionFont
);
208 lpnm16
->iSmCaptionWidth
= lpnm32
->iSmCaptionWidth
;
209 lpnm16
->iSmCaptionHeight
= lpnm32
->iSmCaptionHeight
;
210 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfSmCaptionFont
, &lpnm16
->lfSmCaptionFont
);
211 lpnm16
->iMenuWidth
= lpnm32
->iMenuWidth
;
212 lpnm16
->iMenuHeight
= lpnm32
->iMenuHeight
;
213 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfMenuFont
, &lpnm16
->lfMenuFont
);
214 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfStatusFont
, &lpnm16
->lfStatusFont
);
215 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfMessageFont
, &lpnm16
->lfMessageFont
);
218 static void SYSPARAMS_NonClientMetrics32ATo32W( const NONCLIENTMETRICSA
* lpnm32A
, LPNONCLIENTMETRICSW lpnm32W
)
220 lpnm32W
->iBorderWidth
= lpnm32A
->iBorderWidth
;
221 lpnm32W
->iScrollWidth
= lpnm32A
->iScrollWidth
;
222 lpnm32W
->iScrollHeight
= lpnm32A
->iScrollHeight
;
223 lpnm32W
->iCaptionWidth
= lpnm32A
->iCaptionWidth
;
224 lpnm32W
->iCaptionHeight
= lpnm32A
->iCaptionHeight
;
225 SYSPARAMS_LogFont32ATo32W( &lpnm32A
->lfCaptionFont
, &lpnm32W
->lfCaptionFont
);
226 lpnm32W
->iSmCaptionWidth
= lpnm32A
->iSmCaptionWidth
;
227 lpnm32W
->iSmCaptionHeight
= lpnm32A
->iSmCaptionHeight
;
228 SYSPARAMS_LogFont32ATo32W( &lpnm32A
->lfSmCaptionFont
, &lpnm32W
->lfSmCaptionFont
);
229 lpnm32W
->iMenuWidth
= lpnm32A
->iMenuWidth
;
230 lpnm32W
->iMenuHeight
= lpnm32A
->iMenuHeight
;
231 SYSPARAMS_LogFont32ATo32W( &lpnm32A
->lfMenuFont
, &lpnm32W
->lfMenuFont
);
232 SYSPARAMS_LogFont32ATo32W( &lpnm32A
->lfStatusFont
, &lpnm32W
->lfStatusFont
);
233 SYSPARAMS_LogFont32ATo32W( &lpnm32A
->lfMessageFont
, &lpnm32W
->lfMessageFont
);
236 /***********************************************************************
239 * Sets the system parameter which should be always loaded to
240 * current value stored in registry.
241 * Invalidates lazy loaded parameter, so it will be loaded the next time
245 * uiAction - system parameter to reload value for.
246 * Note, only "SET" values can be used for this parameter.
247 * If uiAction is 0 all system parameters are reset.
249 void SYSPARAMS_Reset( UINT uiAction
)
251 #define WINE_RELOAD_SPI(x) \
253 spi_loaded[x##_IDX] = FALSE; \
254 SystemParametersInfoA( x, 0, dummy_buf, 0 );\
258 #define WINE_IGNORE_SPI(x) \
263 #define WINE_INVALIDATE_SPI(x) \
265 spi_loaded[x##_IDX] = FALSE; \
268 BOOL not_all_processed
= TRUE
;
271 /* Execution falls through all the branches for uiAction == 0 */
275 memset( spi_loaded
, 0, sizeof(spi_loaded
) );
277 WINE_RELOAD_SPI(SPI_SETBORDER
);
278 WINE_RELOAD_SPI(SPI_ICONHORIZONTALSPACING
);
279 WINE_RELOAD_SPI(SPI_ICONVERTICALSPACING
);
280 WINE_IGNORE_SPI(SPI_SETSCREENSAVEACTIVE
);
281 WINE_RELOAD_SPI(SPI_SETDOUBLECLKWIDTH
);
282 WINE_RELOAD_SPI(SPI_SETDOUBLECLKHEIGHT
);
283 WINE_RELOAD_SPI(SPI_SETMOUSEBUTTONSWAP
);
284 WINE_RELOAD_SPI(SPI_SETSHOWSOUNDS
);
285 WINE_RELOAD_SPI(SPI_SETMENUDROPALIGNMENT
);
290 /* lazy loaded parameters */
293 WINE_INVALIDATE_SPI(SPI_SETBEEP
);
294 WINE_INVALIDATE_SPI(SPI_SETMOUSE
);
295 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDSPEED
);
296 WINE_INVALIDATE_SPI(SPI_SETSCREENSAVETIMEOUT
);
297 WINE_INVALIDATE_SPI(SPI_SETGRIDGRANULARITY
);
298 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDDELAY
);
299 WINE_INVALIDATE_SPI(SPI_SETICONTITLEWRAP
);
300 WINE_INVALIDATE_SPI(SPI_SETDOUBLECLICKTIME
);
301 WINE_INVALIDATE_SPI(SPI_SETDRAGFULLWINDOWS
);
302 WINE_INVALIDATE_SPI(SPI_SETWORKAREA
);
303 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDPREF
);
304 WINE_INVALIDATE_SPI(SPI_SETSCREENREADER
);
305 WINE_INVALIDATE_SPI(SPI_SETSCREENSAVERRUNNING
);
307 FIXME( "Unknown action reset: %u\n", uiAction
);
312 not_all_processed
= FALSE
;
316 if (!uiAction
&& not_all_processed
)
317 ERR( "Incorrect implementation of SYSPARAMS_Reset. "
318 "Not all params are reloaded.\n" );
319 #undef WINE_INVALIDATE_SPI
320 #undef WINE_IGNORE_SPI
321 #undef WINE_RELOAD_SPI
324 /***********************************************************************
325 * get_volatile_regkey
327 * Return a handle to the volatile registry key used to store
328 * non-permanently modified parameters.
330 static HKEY
get_volatile_regkey(void)
332 static HKEY volatile_key
;
336 if (RegCreateKeyExA( HKEY_CURRENT_USER
, WINE_CURRENT_USER_REGKEY
,
337 0, 0, REG_OPTION_VOLATILE
, KEY_ALL_ACCESS
, 0,
338 &volatile_key
, 0 ) != ERROR_SUCCESS
)
339 ERR("Can't create wine configuration registry branch");
344 /***********************************************************************
345 * SYSPARAMS_NotifyChange
347 * Sends notification about system parameter update.
349 void SYSPARAMS_NotifyChange( UINT uiAction
, UINT fWinIni
)
353 if (fWinIni
& SPIF_UPDATEINIFILE
)
355 if (fWinIni
& (SPIF_SENDWININICHANGE
| SPIF_SENDCHANGE
))
356 SendMessageA(HWND_BROADCAST
, WM_SETTINGCHANGE
,
357 uiAction
, (LPARAM
) "");
361 /* FIXME notify other wine processes with internal message */
367 /***********************************************************************
368 * Loads system parameter from user profile.
370 BOOL
SYSPARAMS_Load( LPSTR lpRegKey
, LPSTR lpValName
, LPSTR lpBuf
)
377 if ((RegOpenKeyA( get_volatile_regkey(), lpRegKey
,
378 &hKey
) == ERROR_SUCCESS
) ||
379 (RegOpenKeyA( HKEY_CURRENT_USER
, lpRegKey
,
380 &hKey
) == ERROR_SUCCESS
))
382 ret
= !RegQueryValueExA( hKey
, lpValName
, NULL
, &type
, lpBuf
, &count
);
388 /***********************************************************************
389 * Saves system parameter to user profile.
391 BOOL
SYSPARAMS_Save( LPSTR lpRegKey
, LPSTR lpValName
, LPSTR lpValue
,
399 if (fWinIni
& SPIF_UPDATEINIFILE
)
401 hBaseKey
= HKEY_CURRENT_USER
;
406 hBaseKey
= get_volatile_regkey();
407 dwOptions
= REG_OPTION_VOLATILE
;
410 if (RegCreateKeyExA( hBaseKey
, lpRegKey
,
411 0, 0, dwOptions
, KEY_ALL_ACCESS
,
412 0, &hKey
, 0 ) == ERROR_SUCCESS
)
414 if (RegSetValueExA( hKey
, lpValName
, 0, REG_SZ
,
415 lpValue
, strlen(lpValue
) + 1 ) == ERROR_SUCCESS
)
418 if (hBaseKey
== HKEY_CURRENT_USER
)
419 RegDeleteKeyA( get_volatile_regkey(), lpRegKey
);
427 /***********************************************************************
428 * SYSPARAMS_GetDoubleClickSize
430 * There is no SPI_GETDOUBLECLK* so we export this function instead.
432 void SYSPARAMS_GetDoubleClickSize( INT
*width
, INT
*height
)
436 if (!spi_loaded
[SPI_SETDOUBLECLKWIDTH_IDX
])
440 if (SYSPARAMS_Load( SPI_SETDOUBLECLKWIDTH_REGKEY
,
441 SPI_SETDOUBLECLKWIDTH_VALNAME
, buf
))
443 SYSMETRICS_Set( SM_CXDOUBLECLK
, atoi( buf
) );
445 spi_loaded
[SPI_SETDOUBLECLKWIDTH_IDX
] = TRUE
;
447 if (!spi_loaded
[SPI_SETDOUBLECLKHEIGHT_IDX
])
449 if (SYSPARAMS_Load( SPI_SETDOUBLECLKHEIGHT_REGKEY
,
450 SPI_SETDOUBLECLKHEIGHT_VALNAME
, buf
))
452 SYSMETRICS_Set( SM_CYDOUBLECLK
, atoi( buf
) );
454 spi_loaded
[SPI_SETDOUBLECLKHEIGHT_IDX
] = TRUE
;
456 *width
= GetSystemMetrics( SM_CXDOUBLECLK
);
457 *height
= GetSystemMetrics( SM_CYDOUBLECLK
);
461 /***********************************************************************
462 * SYSPARAMS_GetMouseButtonSwap
464 * There is no SPI_GETMOUSEBUTTONSWAP so we export this function instead.
466 INT
SYSPARAMS_GetMouseButtonSwap( void )
468 int spi_idx
= SPI_SETMOUSEBUTTONSWAP_IDX
;
470 if (!spi_loaded
[spi_idx
])
474 if (SYSPARAMS_Load( SPI_SETMOUSEBUTTONSWAP_REGKEY
,
475 SPI_SETMOUSEBUTTONSWAP_VALNAME
, buf
))
477 SYSMETRICS_Set( SM_SWAPBUTTON
, atoi( buf
) );
479 spi_loaded
[spi_idx
] = TRUE
;
482 return GetSystemMetrics( SM_SWAPBUTTON
);
485 /***********************************************************************
486 * SystemParametersInfoA (USER32.@)
488 * Each system parameter has flag which shows whether the parameter
489 * is loaded or not. Parameters, stored directly in SysParametersInfo are
490 * loaded from registry only when they are requested and the flag is
491 * "false", after the loading the flag is set to "true". On interprocess
492 * notification of the parameter change the corresponding parameter flag is
493 * set to "false". The parameter value will be reloaded when it is requested
495 * Parameters, backed by or depend on GetSystemMetrics are processed
496 * differently. These parameters are always loaded. They are reloaded right
497 * away on interprocess change notification. We can't do lazy loading because
498 * we don't want to complicate GetSystemMetrics.
499 * Parameters, backed by X settings are read from corresponding setting.
500 * On the parameter change request the setting is changed. Interprocess change
501 * notifications are ignored.
502 * When parameter value is updated the changed value is stored in permanent
503 * registry branch if saving is requested. Otherwise it is stored
504 * in temporary branch
507 BOOL WINAPI
SystemParametersInfoA( UINT uiAction
, UINT uiParam
,
508 PVOID pvParam
, UINT fWinIni
)
510 #define WINE_SPI_FIXME(x) \
512 FIXME( "Unimplemented action: %u (%s)\n", x, #x ); \
513 SetLastError( ERROR_INVALID_SPI_VALUE ); \
516 #define WINE_SPI_WARN(x) \
518 WARN( "Ignored action: %u (%s)\n", x, #x ); \
522 unsigned spi_idx
= 0;
524 TRACE("(%u, %u, %p, %u)\n", uiAction
, uiParam
, pvParam
, fWinIni
);
528 case SPI_GETBEEP
: /* 1 */
529 spi_idx
= SPI_SETBEEP_IDX
;
530 if (!spi_loaded
[spi_idx
])
534 if (SYSPARAMS_Load( SPI_SETBEEP_REGKEY
, SPI_SETBEEP_VALNAME
, buf
))
535 beep_active
= !strcasecmp( "Yes", buf
);
536 spi_loaded
[spi_idx
] = TRUE
;
539 *(BOOL
*)pvParam
= beep_active
;
542 case SPI_SETBEEP
: /* 2 */
543 spi_idx
= SPI_SETBEEP_IDX
;
544 if (SYSPARAMS_Save( SPI_SETBEEP_REGKEY
, SPI_SETBEEP_VALNAME
,
545 (uiParam
? "Yes" : "No"), fWinIni
))
547 beep_active
= uiParam
;
548 spi_loaded
[spi_idx
] = TRUE
;
554 case SPI_GETMOUSE
: /* 3 */
555 spi_idx
= SPI_SETMOUSE_IDX
;
556 if (!spi_loaded
[spi_idx
])
560 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME1
,
562 mouse_threshold1
= atoi( buf
);
563 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME2
,
565 mouse_threshold2
= atoi( buf
);
566 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME3
,
568 mouse_speed
= atoi( buf
);
569 spi_loaded
[spi_idx
] = TRUE
;
571 ((INT
*)pvParam
)[0] = mouse_threshold1
;
572 ((INT
*)pvParam
)[1] = mouse_threshold2
;
573 ((INT
*)pvParam
)[2] = mouse_speed
;
576 case SPI_SETMOUSE
: /* 4 */
580 spi_idx
= SPI_SETMOUSE_IDX
;
581 sprintf(buf
, "%d", ((INT
*)pvParam
)[0]);
583 if (SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME1
,
586 mouse_threshold1
= ((INT
*)pvParam
)[0];
587 spi_loaded
[spi_idx
] = TRUE
;
589 sprintf(buf
, "%d", ((INT
*)pvParam
)[1]);
590 SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME2
,
592 mouse_threshold2
= ((INT
*)pvParam
)[1];
594 sprintf(buf
, "%d", ((INT
*)pvParam
)[2]);
595 SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME3
,
597 mouse_speed
= ((INT
*)pvParam
)[2];
604 case SPI_GETBORDER
: /* 5 */
605 spi_idx
= SPI_SETBORDER_IDX
;
606 if (!spi_loaded
[spi_idx
])
610 if (SYSPARAMS_Load( SPI_SETBORDER_REGKEY
, SPI_SETBORDER_VALNAME
,
614 if (i
> 0) border
= i
;
616 spi_loaded
[spi_idx
] = TRUE
;
617 if (TWEAK_WineLook
> WIN31_LOOK
)
619 SYSMETRICS_Set( SM_CXFRAME
, border
+ GetSystemMetrics( SM_CXDLGFRAME
) );
620 SYSMETRICS_Set( SM_CYFRAME
, border
+ GetSystemMetrics( SM_CXDLGFRAME
) );
623 *(INT
*)pvParam
= border
;
626 case SPI_SETBORDER
: /* 6 */
630 spi_idx
= SPI_SETBORDER_IDX
;
631 sprintf(buf
, "%u", uiParam
);
633 if (SYSPARAMS_Save( SPI_SETBORDER_REGKEY
, SPI_SETBORDER_VALNAME
,
639 spi_loaded
[spi_idx
] = TRUE
;
640 if (TWEAK_WineLook
> WIN31_LOOK
)
642 SYSMETRICS_Set( SM_CXFRAME
, uiParam
+ GetSystemMetrics( SM_CXDLGFRAME
) );
643 SYSMETRICS_Set( SM_CYFRAME
, uiParam
+ GetSystemMetrics( SM_CXDLGFRAME
) );
652 case SPI_GETKEYBOARDSPEED
: /* 10 */
653 spi_idx
= SPI_SETKEYBOARDSPEED_IDX
;
654 if (!spi_loaded
[spi_idx
])
658 if (SYSPARAMS_Load( SPI_SETKEYBOARDSPEED_REGKEY
,
659 SPI_SETKEYBOARDSPEED_VALNAME
,
661 keyboard_speed
= atoi( buf
);
662 spi_loaded
[spi_idx
] = TRUE
;
664 *(INT
*)pvParam
= keyboard_speed
;
667 case SPI_SETKEYBOARDSPEED
: /* 11 */
671 spi_idx
= SPI_SETKEYBOARDSPEED_IDX
;
674 sprintf(buf
, "%u", uiParam
);
676 if (SYSPARAMS_Save( SPI_SETKEYBOARDSPEED_REGKEY
,
677 SPI_SETKEYBOARDSPEED_VALNAME
,
680 keyboard_speed
= uiParam
;
681 spi_loaded
[spi_idx
] = TRUE
;
688 /* not implemented in Windows */
689 WINE_SPI_WARN(SPI_LANGDRIVER
); /* 12 */
691 case SPI_ICONHORIZONTALSPACING
: /* 13 */
692 spi_idx
= SPI_ICONHORIZONTALSPACING_IDX
;
695 if (!spi_loaded
[spi_idx
])
699 if (SYSPARAMS_Load( SPI_ICONHORIZONTALSPACING_REGKEY
,
700 SPI_ICONHORIZONTALSPACING_VALNAME
, buf
))
702 SYSMETRICS_Set( SM_CXICONSPACING
, atoi( buf
) );
704 spi_loaded
[spi_idx
] = TRUE
;
707 *(INT
*)pvParam
= GetSystemMetrics( SM_CXICONSPACING
);
713 if (uiParam
< 32) uiParam
= 32;
715 sprintf(buf
, "%u", uiParam
);
716 if (SYSPARAMS_Save( SPI_ICONHORIZONTALSPACING_REGKEY
,
717 SPI_ICONHORIZONTALSPACING_VALNAME
,
720 SYSMETRICS_Set( SM_CXICONSPACING
, uiParam
);
721 spi_loaded
[spi_idx
] = TRUE
;
728 case SPI_GETSCREENSAVETIMEOUT
: /* 14 */
729 spi_idx
= SPI_SETSCREENSAVETIMEOUT_IDX
;
730 if (!spi_loaded
[spi_idx
])
734 if (SYSPARAMS_Load( SPI_SETSCREENSAVETIMEOUT_REGKEY
,
735 SPI_SETSCREENSAVETIMEOUT_VALNAME
,
737 screensave_timeout
= atoi( buf
);
739 spi_loaded
[spi_idx
] = TRUE
;
741 *(INT
*)pvParam
= screensave_timeout
;
744 case SPI_SETSCREENSAVETIMEOUT
: /* 15 */
748 spi_idx
= SPI_SETSCREENSAVETIMEOUT_IDX
;
749 sprintf(buf
, "%u", uiParam
);
751 if (SYSPARAMS_Save( SPI_SETSCREENSAVETIMEOUT_REGKEY
,
752 SPI_SETSCREENSAVETIMEOUT_VALNAME
,
755 screensave_timeout
= uiParam
;
756 spi_loaded
[spi_idx
] = TRUE
;
763 case SPI_GETSCREENSAVEACTIVE
: /* 16 */
764 *(BOOL
*)pvParam
= USER_Driver
.pGetScreenSaveActive();
767 case SPI_SETSCREENSAVEACTIVE
: /* 17 */
771 sprintf(buf
, "%u", uiParam
);
772 USER_Driver
.pSetScreenSaveActive( uiParam
);
773 /* saved value does not affect Wine */
774 SYSPARAMS_Save( SPI_SETSCREENSAVEACTIVE_REGKEY
,
775 SPI_SETSCREENSAVEACTIVE_VALNAME
,
780 case SPI_GETGRIDGRANULARITY
: /* 18 */
781 spi_idx
= SPI_SETGRIDGRANULARITY_IDX
;
782 if (!spi_loaded
[spi_idx
])
786 if (SYSPARAMS_Load( SPI_SETGRIDGRANULARITY_REGKEY
,
787 SPI_SETGRIDGRANULARITY_VALNAME
,
789 grid_granularity
= atoi( buf
);
791 spi_loaded
[spi_idx
] = TRUE
;
793 *(INT
*)pvParam
= grid_granularity
;
796 case SPI_SETGRIDGRANULARITY
: /* 19 */
800 spi_idx
= SPI_SETGRIDGRANULARITY_IDX
;
801 sprintf(buf
, "%u", uiParam
);
803 if (SYSPARAMS_Save( SPI_SETGRIDGRANULARITY_REGKEY
,
804 SPI_SETGRIDGRANULARITY_VALNAME
,
807 grid_granularity
= uiParam
;
808 spi_loaded
[spi_idx
] = TRUE
;
815 case SPI_SETDESKWALLPAPER
: /* 20 */
816 ret
= SetDeskWallPaper( (LPSTR
)pvParam
);
818 case SPI_SETDESKPATTERN
: /* 21 */
819 /* FIXME: the ability to specify a pattern in pvParam
820 doesn't seem to be documented for Win32 */
821 if ((INT16
)uiParam
== -1)
824 GetProfileStringA( "Desktop", "Pattern",
825 "170 85 170 85 170 85 170 85",
826 buffer
, sizeof(buffer
) );
827 ret
= DESKTOP_SetPattern( (LPSTR
)buffer
);
829 ret
= DESKTOP_SetPattern( (LPSTR
)pvParam
);
832 case SPI_GETKEYBOARDDELAY
: /* 22 */
833 spi_idx
= SPI_SETKEYBOARDDELAY_IDX
;
834 if (!spi_loaded
[spi_idx
])
838 if (SYSPARAMS_Load( SPI_SETKEYBOARDDELAY_REGKEY
,
839 SPI_SETKEYBOARDDELAY_VALNAME
,
843 if ( (i
>= 0) && (i
<= 3)) keyboard_delay
= i
;
846 spi_loaded
[spi_idx
] = TRUE
;
848 *(INT
*)pvParam
= keyboard_delay
;
851 case SPI_SETKEYBOARDDELAY
: /* 23 */
855 spi_idx
= SPI_SETKEYBOARDDELAY_IDX
;
856 sprintf(buf
, "%u", uiParam
);
858 if (SYSPARAMS_Save( SPI_SETKEYBOARDDELAY_REGKEY
,
859 SPI_SETKEYBOARDDELAY_VALNAME
,
863 keyboard_delay
= uiParam
;
864 spi_loaded
[spi_idx
] = TRUE
;
871 case SPI_ICONVERTICALSPACING
: /* 24 */
872 spi_idx
= SPI_ICONVERTICALSPACING_IDX
;
875 if (!spi_loaded
[spi_idx
])
879 if (SYSPARAMS_Load( SPI_ICONVERTICALSPACING_REGKEY
,
880 SPI_ICONVERTICALSPACING_VALNAME
, buf
))
882 SYSMETRICS_Set( SM_CYICONSPACING
, atoi( buf
) );
884 spi_loaded
[spi_idx
] = TRUE
;
887 *(INT
*)pvParam
= GetSystemMetrics( SM_CYICONSPACING
);
893 if (uiParam
< 32) uiParam
= 32;
895 sprintf(buf
, "%u", uiParam
);
896 if (SYSPARAMS_Save( SPI_ICONVERTICALSPACING_REGKEY
,
897 SPI_ICONVERTICALSPACING_VALNAME
,
900 SYSMETRICS_Set( SM_CYICONSPACING
, uiParam
);
901 spi_loaded
[spi_idx
] = TRUE
;
909 case SPI_GETICONTITLEWRAP
: /* 25 */
910 spi_idx
= SPI_SETICONTITLEWRAP_IDX
;
911 if (!spi_loaded
[spi_idx
])
915 if (SYSPARAMS_Load( SPI_SETICONTITLEWRAP_REGKEY
,
916 SPI_SETICONTITLEWRAP_VALNAME
, buf
))
917 icon_title_wrap
= atoi(buf
);
918 spi_loaded
[spi_idx
] = TRUE
;
921 *(BOOL
*)pvParam
= icon_title_wrap
;
924 case SPI_SETICONTITLEWRAP
: /* 26 */
928 spi_idx
= SPI_SETICONTITLEWRAP_IDX
;
929 sprintf(buf
, "%u", uiParam
);
930 if (SYSPARAMS_Save( SPI_SETICONTITLEWRAP_REGKEY
,
931 SPI_SETICONTITLEWRAP_VALNAME
,
934 icon_title_wrap
= uiParam
;
935 spi_loaded
[spi_idx
] = TRUE
;
942 case SPI_GETMENUDROPALIGNMENT
: /* 27 */
943 spi_idx
= SPI_SETMENUDROPALIGNMENT_IDX
;
945 if (!spi_loaded
[spi_idx
])
949 if (SYSPARAMS_Load( SPI_SETMENUDROPALIGNMENT_REGKEY
,
950 SPI_SETMENUDROPALIGNMENT_VALNAME
, buf
))
952 SYSMETRICS_Set( SM_MENUDROPALIGNMENT
, atoi( buf
) );
954 spi_loaded
[spi_idx
] = TRUE
;
958 *(BOOL
*)pvParam
= GetSystemMetrics( SM_MENUDROPALIGNMENT
);
961 case SPI_SETMENUDROPALIGNMENT
: /* 28 */
964 spi_idx
= SPI_SETMENUDROPALIGNMENT_IDX
;
966 sprintf(buf
, "%u", uiParam
);
967 if (SYSPARAMS_Save( SPI_SETMENUDROPALIGNMENT_REGKEY
,
968 SPI_SETMENUDROPALIGNMENT_VALNAME
,
971 SYSMETRICS_Set( SM_MENUDROPALIGNMENT
, uiParam
);
972 spi_loaded
[spi_idx
] = TRUE
;
979 case SPI_SETDOUBLECLKWIDTH
: /* 29 */
982 spi_idx
= SPI_SETDOUBLECLKWIDTH_IDX
;
984 sprintf(buf
, "%u", uiParam
);
985 if (SYSPARAMS_Save( SPI_SETDOUBLECLKWIDTH_REGKEY
,
986 SPI_SETDOUBLECLKWIDTH_VALNAME
,
989 SYSMETRICS_Set( SM_CXDOUBLECLK
, uiParam
);
990 spi_loaded
[spi_idx
] = TRUE
;
997 case SPI_SETDOUBLECLKHEIGHT
: /* 30 */
1000 spi_idx
= SPI_SETDOUBLECLKHEIGHT_IDX
;
1002 sprintf(buf
, "%u", uiParam
);
1003 if (SYSPARAMS_Save( SPI_SETDOUBLECLKHEIGHT_REGKEY
,
1004 SPI_SETDOUBLECLKHEIGHT_VALNAME
,
1007 SYSMETRICS_Set( SM_CYDOUBLECLK
, uiParam
);
1008 spi_loaded
[spi_idx
] = TRUE
;
1015 case SPI_GETICONTITLELOGFONT
: /* 31 */
1017 LPLOGFONTA lpLogFont
= (LPLOGFONTA
)pvParam
;
1019 /* from now on we always have an alias for MS Sans Serif */
1021 GetProfileStringA( "Desktop", "IconTitleFaceName", "MS Sans Serif",
1022 lpLogFont
->lfFaceName
, LF_FACESIZE
);
1023 lpLogFont
->lfHeight
= -GetProfileIntA( "Desktop", "IconTitleSize", 13 );
1024 lpLogFont
->lfWidth
= 0;
1025 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
1026 lpLogFont
->lfWeight
= FW_NORMAL
;
1027 lpLogFont
->lfItalic
= FALSE
;
1028 lpLogFont
->lfStrikeOut
= FALSE
;
1029 lpLogFont
->lfUnderline
= FALSE
;
1030 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
1031 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
1032 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
1033 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
1037 case SPI_SETDOUBLECLICKTIME
: /* 32 */
1041 spi_idx
= SPI_SETDOUBLECLICKTIME_IDX
;
1042 sprintf(buf
, "%u", uiParam
);
1044 if (SYSPARAMS_Save( SPI_SETDOUBLECLICKTIME_REGKEY
,
1045 SPI_SETDOUBLECLICKTIME_VALNAME
,
1050 double_click_time
= uiParam
;
1051 spi_loaded
[spi_idx
] = TRUE
;
1058 case SPI_SETMOUSEBUTTONSWAP
: /* 33 */
1061 spi_idx
= SPI_SETMOUSEBUTTONSWAP_IDX
;
1063 sprintf(buf
, "%u", uiParam
);
1064 if (SYSPARAMS_Save( SPI_SETMOUSEBUTTONSWAP_REGKEY
,
1065 SPI_SETMOUSEBUTTONSWAP_VALNAME
,
1068 SYSMETRICS_Set( SM_SWAPBUTTON
, uiParam
);
1069 spi_loaded
[spi_idx
] = TRUE
;
1076 WINE_SPI_FIXME(SPI_SETICONTITLELOGFONT
); /* 34 */
1078 case SPI_GETFASTTASKSWITCH
: /* 35 */
1079 *(BOOL
*)pvParam
= 1;
1082 case SPI_SETFASTTASKSWITCH
: /* 36 */
1083 /* the action is disabled */
1087 case SPI_SETDRAGFULLWINDOWS
: /* 37 WINVER >= 0x0400 */
1091 spi_idx
= SPI_SETDRAGFULLWINDOWS_IDX
;
1092 sprintf(buf
, "%u", uiParam
);
1093 if (SYSPARAMS_Save( SPI_SETDRAGFULLWINDOWS_REGKEY
,
1094 SPI_SETDRAGFULLWINDOWS_VALNAME
,
1097 drag_full_windows
= uiParam
;
1098 spi_loaded
[spi_idx
] = TRUE
;
1105 case SPI_GETDRAGFULLWINDOWS
: /* 38 WINVER >= 0x0400 */
1106 spi_idx
= SPI_SETDRAGFULLWINDOWS_IDX
;
1107 if (!spi_loaded
[spi_idx
])
1111 if (SYSPARAMS_Load( SPI_SETDRAGFULLWINDOWS_REGKEY
,
1112 SPI_SETDRAGFULLWINDOWS_VALNAME
, buf
))
1113 drag_full_windows
= atoi(buf
);
1114 spi_loaded
[spi_idx
] = TRUE
;
1117 *(BOOL
*)pvParam
= drag_full_windows
;
1120 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
1122 LPNONCLIENTMETRICSA lpnm
= (LPNONCLIENTMETRICSA
)pvParam
;
1124 if (lpnm
->cbSize
== sizeof(NONCLIENTMETRICSA
))
1126 LPLOGFONTA lpLogFont
= &(lpnm
->lfMenuFont
);
1128 /* clear the struct, so we have 'sane' members */
1130 (char *)pvParam
+ sizeof(lpnm
->cbSize
),
1132 lpnm
->cbSize
- sizeof(lpnm
->cbSize
)
1135 /* initialize geometry entries */
1136 lpnm
->iBorderWidth
= -1; /* FIXME */
1137 lpnm
->iScrollWidth
= GetSystemMetrics(SM_CXVSCROLL
);
1138 lpnm
->iScrollHeight
= GetSystemMetrics(SM_CYHSCROLL
);
1140 lpnm
->iCaptionWidth
= GetSystemMetrics(SM_CXSIZE
);
1141 lpnm
->iCaptionHeight
= lpnm
->iCaptionWidth
;
1142 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfCaptionFont
), 0 );
1143 lpnm
->lfCaptionFont
.lfWeight
= FW_BOLD
;
1146 lpnm
->iSmCaptionWidth
= GetSystemMetrics(SM_CXSMSIZE
);
1147 lpnm
->iSmCaptionHeight
= lpnm
->iSmCaptionWidth
;
1148 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfSmCaptionFont
), 0 );
1150 /* menus, FIXME: names of wine.conf entries are bogus */
1152 lpnm
->iMenuWidth
= GetProfileIntA( "Desktop", "MenuWidth", 13 ); /* size of the menu buttons*/
1153 lpnm
->iMenuHeight
= GetProfileIntA( "Desktop", "MenuHeight",
1154 (TWEAK_WineLook
> WIN31_LOOK
) ? 13 : 27 );
1156 GetProfileStringA( "Desktop", "MenuFont",
1157 (TWEAK_WineLook
> WIN31_LOOK
) ? "MS Sans Serif": "System",
1158 lpLogFont
->lfFaceName
, LF_FACESIZE
);
1160 lpLogFont
->lfHeight
= -GetProfileIntA( "Desktop", "MenuFontSize", 13 );
1161 lpLogFont
->lfWidth
= 0;
1162 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
1163 lpLogFont
->lfWeight
= (TWEAK_WineLook
> WIN31_LOOK
) ? FW_NORMAL
: FW_BOLD
;
1164 lpLogFont
->lfItalic
= FALSE
;
1165 lpLogFont
->lfStrikeOut
= FALSE
;
1166 lpLogFont
->lfUnderline
= FALSE
;
1167 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
1168 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
1169 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
1170 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
1172 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0,
1173 (LPVOID
)&(lpnm
->lfStatusFont
), 0 );
1174 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0,
1175 (LPVOID
)&(lpnm
->lfMessageFont
), 0 );
1179 WARN("size mismatch !! (is %d; should be %d)\n", lpnm
->cbSize
, sizeof(NONCLIENTMETRICSA
));
1180 /* FIXME: SetLastError? */
1185 WINE_SPI_FIXME(SPI_SETNONCLIENTMETRICS
); /* 42 WINVER >= 0x400 */
1187 WINE_SPI_FIXME(SPI_GETMINIMIZEDMETRICS
); /* 43 WINVER >= 0x400 */
1188 WINE_SPI_FIXME(SPI_SETMINIMIZEDMETRICS
); /* 44 WINVER >= 0x400 */
1190 case SPI_GETICONMETRICS
: /* 45 WINVER >= 0x400 */
1192 LPICONMETRICSA lpIcon
= pvParam
;
1193 if(lpIcon
&& lpIcon
->cbSize
== sizeof(*lpIcon
))
1195 SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0,
1196 &lpIcon
->iHorzSpacing
, FALSE
);
1197 SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0,
1198 &lpIcon
->iVertSpacing
, FALSE
);
1199 SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0,
1200 &lpIcon
->iTitleWrap
, FALSE
);
1201 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0,
1202 &lpIcon
->lfFont
, FALSE
);
1210 WINE_SPI_FIXME(SPI_SETICONMETRICS
); /* 46 WINVER >= 0x400 */
1212 case SPI_SETWORKAREA
: /* 47 WINVER >= 0x400 */
1215 RECT
*pr
= (RECT
*) pvParam
;
1217 spi_idx
= SPI_SETWORKAREA_IDX
;
1218 sprintf(buf
, "%d %d %d %d",
1220 pr
->right
, pr
->bottom
);
1222 if (SYSPARAMS_Save( SPI_SETWORKAREA_REGKEY
,
1223 SPI_SETWORKAREA_VALNAME
,
1226 CopyRect( &work_area
, (RECT
*)pvParam
);
1227 spi_loaded
[spi_idx
] = TRUE
;
1234 case SPI_GETWORKAREA
: /* 48 WINVER >= 0x400 */
1235 spi_idx
= SPI_SETWORKAREA_IDX
;
1236 if (!spi_loaded
[spi_idx
])
1240 SetRect( &work_area
, 0, 0,
1241 GetSystemMetrics( SM_CXSCREEN
),
1242 GetSystemMetrics( SM_CYSCREEN
) );
1244 if (SYSPARAMS_Load( SPI_SETWORKAREA_REGKEY
,
1245 SPI_SETWORKAREA_VALNAME
,
1248 sscanf( buf
, "%d %d %d %d",
1249 &work_area
.left
, &work_area
.top
,
1250 &work_area
.right
, &work_area
.bottom
);
1252 spi_loaded
[spi_idx
] = TRUE
;
1254 CopyRect( (RECT
*)pvParam
, &work_area
);
1258 WINE_SPI_FIXME(SPI_SETPENWINDOWS
); /* 49 WINVER >= 0x400 */
1260 case SPI_GETFILTERKEYS
: /* 50 */
1262 LPFILTERKEYS lpFilterKeys
= (LPFILTERKEYS
)pvParam
;
1263 WARN("SPI_GETFILTERKEYS not fully implemented\n");
1264 if (lpFilterKeys
->cbSize
== sizeof(FILTERKEYS
))
1266 /* Indicate that no FilterKeys feature available */
1267 lpFilterKeys
->dwFlags
= 0;
1268 lpFilterKeys
->iWaitMSec
= 0;
1269 lpFilterKeys
->iDelayMSec
= 0;
1270 lpFilterKeys
->iRepeatMSec
= 0;
1271 lpFilterKeys
->iBounceMSec
= 0;
1279 WINE_SPI_FIXME(SPI_SETFILTERKEYS
); /* 51 */
1281 case SPI_GETTOGGLEKEYS
: /* 52 */
1283 LPTOGGLEKEYS lpToggleKeys
= (LPTOGGLEKEYS
)pvParam
;
1284 WARN("SPI_GETTOGGLEKEYS not fully implemented\n");
1285 if (lpToggleKeys
->cbSize
== sizeof(TOGGLEKEYS
))
1287 /* Indicate that no ToggleKeys feature available */
1288 lpToggleKeys
->dwFlags
= 0;
1296 WINE_SPI_FIXME(SPI_SETTOGGLEKEYS
); /* 53 */
1298 case SPI_GETMOUSEKEYS
: /* 54 */
1300 LPMOUSEKEYS lpMouseKeys
= (LPMOUSEKEYS
)pvParam
;
1301 WARN("SPI_GETMOUSEKEYS not fully implemented\n");
1302 if (lpMouseKeys
->cbSize
== sizeof(MOUSEKEYS
))
1304 /* Indicate that no MouseKeys feature available */
1305 lpMouseKeys
->dwFlags
= 0;
1306 lpMouseKeys
->iMaxSpeed
= 360;
1307 lpMouseKeys
->iTimeToMaxSpeed
= 1000;
1308 lpMouseKeys
->iCtrlSpeed
= 0;
1309 lpMouseKeys
->dwReserved1
= 0;
1310 lpMouseKeys
->dwReserved2
= 0;
1318 WINE_SPI_FIXME(SPI_SETMOUSEKEYS
); /* 55 */
1320 case SPI_GETSHOWSOUNDS
: /* 56 */
1321 spi_idx
= SPI_SETSHOWSOUNDS_IDX
;
1323 if (!spi_loaded
[spi_idx
])
1327 if (SYSPARAMS_Load( SPI_SETSHOWSOUNDS_REGKEY
,
1328 SPI_SETSHOWSOUNDS_VALNAME
, buf
))
1330 SYSMETRICS_Set( SM_SHOWSOUNDS
, atoi( buf
) );
1332 spi_loaded
[spi_idx
] = TRUE
;
1336 *(INT
*)pvParam
= GetSystemMetrics( SM_SHOWSOUNDS
);
1339 case SPI_SETSHOWSOUNDS
: /* 57 */
1342 spi_idx
= SPI_SETSHOWSOUNDS_IDX
;
1344 sprintf(buf
, "%u", uiParam
);
1345 if (SYSPARAMS_Save( SPI_SETSHOWSOUNDS_REGKEY
,
1346 SPI_SETSHOWSOUNDS_VALNAME
,
1349 SYSMETRICS_Set( SM_SHOWSOUNDS
, uiParam
);
1350 spi_loaded
[spi_idx
] = TRUE
;
1357 case SPI_GETSTICKYKEYS
: /* 58 */
1359 LPSTICKYKEYS lpStickyKeys
= (LPSTICKYKEYS
)pvParam
;
1360 WARN("SPI_GETSTICKYKEYS not fully implemented\n");
1361 if (lpStickyKeys
->cbSize
== sizeof(STICKYKEYS
))
1363 /* Indicate that no StickyKeys feature available */
1364 lpStickyKeys
->dwFlags
= 0;
1372 WINE_SPI_FIXME(SPI_SETSTICKYKEYS
); /* 59 */
1374 case SPI_GETACCESSTIMEOUT
: /* 60 */
1376 LPACCESSTIMEOUT lpAccessTimeout
= (LPACCESSTIMEOUT
)pvParam
;
1377 WARN("SPI_GETACCESSTIMEOUT not fully implemented\n");
1378 if (lpAccessTimeout
->cbSize
== sizeof(ACCESSTIMEOUT
))
1380 /* Indicate that no accessibility features timeout is available */
1381 lpAccessTimeout
->dwFlags
= 0;
1382 lpAccessTimeout
->iTimeOutMSec
= 0;
1390 WINE_SPI_FIXME(SPI_SETACCESSTIMEOUT
); /* 61 */
1392 case SPI_GETSERIALKEYS
: /* 62 WINVER >= 0x400 */
1394 LPSERIALKEYSA lpSerialKeysA
= (LPSERIALKEYSA
)pvParam
;
1395 WARN("SPI_GETSERIALKEYS not fully implemented\n");
1396 if (lpSerialKeysA
->cbSize
== sizeof(SERIALKEYSA
))
1398 /* Indicate that no SerialKeys feature available */
1399 lpSerialKeysA
->dwFlags
= 0;
1400 lpSerialKeysA
->lpszActivePort
= NULL
;
1401 lpSerialKeysA
->lpszPort
= NULL
;
1402 lpSerialKeysA
->iBaudRate
= 0;
1403 lpSerialKeysA
->iPortState
= 0;
1411 WINE_SPI_FIXME(SPI_SETSERIALKEYS
); /* 63 WINVER >= 0x400 */
1413 case SPI_GETSOUNDSENTRY
: /* 64 */
1415 LPSOUNDSENTRYA lpSoundSentryA
= (LPSOUNDSENTRYA
)pvParam
;
1416 WARN("SPI_GETSOUNDSENTRY not fully implemented\n");
1417 if (lpSoundSentryA
->cbSize
== sizeof(SOUNDSENTRYA
))
1419 /* Indicate that no SoundSentry feature available */
1420 lpSoundSentryA
->dwFlags
= 0;
1421 lpSoundSentryA
->iFSTextEffect
= 0;
1422 lpSoundSentryA
->iFSTextEffectMSec
= 0;
1423 lpSoundSentryA
->iFSTextEffectColorBits
= 0;
1424 lpSoundSentryA
->iFSGrafEffect
= 0;
1425 lpSoundSentryA
->iFSGrafEffectMSec
= 0;
1426 lpSoundSentryA
->iFSGrafEffectColor
= 0;
1427 lpSoundSentryA
->iWindowsEffect
= 0;
1428 lpSoundSentryA
->iWindowsEffectMSec
= 0;
1429 lpSoundSentryA
->lpszWindowsEffectDLL
= 0;
1430 lpSoundSentryA
->iWindowsEffectOrdinal
= 0;
1438 WINE_SPI_FIXME(SPI_SETSOUNDSENTRY
); /* 65 */
1440 case SPI_GETHIGHCONTRAST
: /* 66 WINVER >= 0x400 */
1442 LPHIGHCONTRASTA lpHighContrastA
= (LPHIGHCONTRASTA
)pvParam
;
1443 WARN("SPI_GETHIGHCONTRAST not fully implemented\n");
1444 if (lpHighContrastA
->cbSize
== sizeof(HIGHCONTRASTA
))
1446 /* Indicate that no high contrast feature available */
1447 lpHighContrastA
->dwFlags
= 0;
1448 lpHighContrastA
->lpszDefaultScheme
= NULL
;
1456 WINE_SPI_FIXME(SPI_SETHIGHCONTRAST
); /* 67 WINVER >= 0x400 */
1458 case SPI_GETKEYBOARDPREF
: /* 68 WINVER >= 0x400 */
1459 spi_idx
= SPI_SETKEYBOARDPREF_IDX
;
1460 if (!spi_loaded
[spi_idx
])
1464 if (SYSPARAMS_Load( SPI_SETKEYBOARDPREF_REGKEY
,
1465 SPI_SETKEYBOARDPREF_VALNAME
, buf
))
1466 keyboard_pref
= atoi(buf
);
1467 spi_loaded
[spi_idx
] = TRUE
;
1470 *(BOOL
*)pvParam
= keyboard_pref
;
1473 case SPI_SETKEYBOARDPREF
: /* 69 WINVER >= 0x400 */
1477 spi_idx
= SPI_SETKEYBOARDPREF_IDX
;
1478 sprintf(buf
, "%u", uiParam
);
1479 if (SYSPARAMS_Save( SPI_SETKEYBOARDPREF_REGKEY
,
1480 SPI_SETKEYBOARDPREF_VALNAME
,
1483 keyboard_pref
= uiParam
;
1484 spi_loaded
[spi_idx
] = TRUE
;
1491 case SPI_GETSCREENREADER
: /* 70 WINVER >= 0x400 */
1492 spi_idx
= SPI_SETSCREENREADER_IDX
;
1493 if (!spi_loaded
[spi_idx
])
1497 if (SYSPARAMS_Load( SPI_SETSCREENREADER_REGKEY
,
1498 SPI_SETSCREENREADER_VALNAME
, buf
))
1499 screen_reader
= atoi(buf
);
1500 spi_loaded
[spi_idx
] = TRUE
;
1503 *(BOOL
*)pvParam
= screen_reader
;
1506 case SPI_SETSCREENREADER
: /* 71 WINVER >= 0x400 */
1510 spi_idx
= SPI_SETSCREENREADER_IDX
;
1511 sprintf(buf
, "%u", uiParam
);
1512 if (SYSPARAMS_Save( SPI_SETSCREENREADER_REGKEY
,
1513 SPI_SETSCREENREADER_VALNAME
,
1516 screen_reader
= uiParam
;
1517 spi_loaded
[spi_idx
] = TRUE
;
1524 case SPI_GETANIMATION
: /* 72 WINVER >= 0x400 */
1526 LPANIMATIONINFO lpAnimInfo
= (LPANIMATIONINFO
)pvParam
;
1528 /* Tell it "disabled" */
1529 if (lpAnimInfo
->cbSize
== sizeof(ANIMATIONINFO
))
1530 lpAnimInfo
->iMinAnimate
= 0; /* Minimise and restore animation is disabled (nonzero == enabled) */
1535 WINE_SPI_WARN(SPI_SETANIMATION
); /* 73 WINVER >= 0x400 */
1537 WINE_SPI_FIXME(SPI_GETFONTSMOOTHING
); /* 74 WINVER >= 0x400 */
1538 WINE_SPI_FIXME(SPI_SETFONTSMOOTHING
); /* 75 WINVER >= 0x400 */
1540 WINE_SPI_FIXME(SPI_SETDRAGWIDTH
); /* 76 WINVER >= 0x400 */
1541 WINE_SPI_FIXME(SPI_SETDRAGHEIGHT
); /* 77 WINVER >= 0x400 */
1543 WINE_SPI_FIXME(SPI_SETHANDHELD
); /* 78 WINVER >= 0x400 */
1545 WINE_SPI_FIXME(SPI_GETLOWPOWERTIMEOUT
); /* 79 WINVER >= 0x400 */
1546 WINE_SPI_FIXME(SPI_GETPOWEROFFTIMEOUT
); /* 80 WINVER >= 0x400 */
1547 WINE_SPI_FIXME(SPI_SETLOWPOWERTIMEOUT
); /* 81 WINVER >= 0x400 */
1548 WINE_SPI_FIXME(SPI_SETPOWEROFFTIMEOUT
); /* 82 WINVER >= 0x400 */
1549 WINE_SPI_FIXME(SPI_GETLOWPOWERACTIVE
); /* 83 WINVER >= 0x400 */
1550 WINE_SPI_FIXME(SPI_GETPOWEROFFACTIVE
); /* 84 WINVER >= 0x400 */
1551 WINE_SPI_FIXME(SPI_SETLOWPOWERACTIVE
); /* 85 WINVER >= 0x400 */
1552 WINE_SPI_FIXME(SPI_SETPOWEROFFACTIVE
); /* 86 WINVER >= 0x400 */
1554 WINE_SPI_FIXME(SPI_SETCURSORS
); /* 87 WINVER >= 0x400 */
1555 WINE_SPI_FIXME(SPI_SETICONS
); /* 88 WINVER >= 0x400 */
1557 WINE_SPI_FIXME(SPI_GETDEFAULTINPUTLANG
); /* 89 WINVER >= 0x400 */
1558 WINE_SPI_FIXME(SPI_SETDEFAULTINPUTLANG
); /* 90 WINVER >= 0x400 */
1560 WINE_SPI_FIXME(SPI_SETLANGTOGGLE
); /* 91 WINVER >= 0x400 */
1562 case SPI_GETWINDOWSEXTENSION
: /* 92 WINVER >= 0x400 */
1563 WARN("pretend no support for Win9x Plus! for now.\n");
1564 ret
= FALSE
; /* yes, this is the result value */
1567 WINE_SPI_FIXME(SPI_SETMOUSETRAILS
); /* 93 WINVER >= 0x400 */
1568 WINE_SPI_FIXME(SPI_GETMOUSETRAILS
); /* 94 WINVER >= 0x400 */
1570 case SPI_SETSCREENSAVERRUNNING
: /* 97 WINVER >= 0x400 */
1572 /* SPI_SCREENSAVERRUNNING is an alias for SPI_SETSCREENSAVERRUNNING */
1575 spi_idx
= SPI_SETSCREENSAVERRUNNING_IDX
;
1576 sprintf(buf
, "%u", uiParam
);
1578 /* save only temporarily */
1579 if (SYSPARAMS_Save( SPI_SETSCREENSAVERRUNNING_REGKEY
,
1580 SPI_SETSCREENSAVERRUNNING_VALNAME
,
1583 screensaver_running
= uiParam
;
1584 spi_loaded
[spi_idx
] = TRUE
;
1591 case SPI_GETMOUSEHOVERWIDTH
: /* 98 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1592 *(UINT
*)pvParam
= 4;
1594 WINE_SPI_FIXME(SPI_SETMOUSEHOVERWIDTH
); /* 99 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1596 case SPI_GETMOUSEHOVERHEIGHT
: /* 100 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1597 *(UINT
*)pvParam
= 4;
1599 WINE_SPI_FIXME(SPI_SETMOUSEHOVERHEIGHT
); /* 101 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1601 case SPI_GETMOUSEHOVERTIME
: /* 102 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1602 *(UINT
*)pvParam
= 400; /* default for menu dropdowns */
1604 WINE_SPI_FIXME(SPI_SETMOUSEHOVERTIME
); /* 103 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1606 case SPI_GETWHEELSCROLLLINES
: /* 104 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1607 *(UINT
*)pvParam
= 3; /* default for num scroll lines */
1610 WINE_SPI_FIXME(SPI_SETWHEELSCROLLLINES
); /* 105 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1612 case SPI_GETMENUSHOWDELAY
: /* 106 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1613 *(UINT
*)pvParam
= 400; /* Tested against Windows NT 4.0 and Windows 2000 */
1616 WINE_SPI_FIXME(SPI_GETSHOWIMEUI
); /* 110 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1617 WINE_SPI_FIXME(SPI_SETSHOWIMEUI
); /* 111 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1619 case SPI_GETSCREENSAVERRUNNING
: /* 114 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1620 spi_idx
= SPI_SETSCREENSAVERRUNNING_IDX
;
1621 if (!spi_loaded
[spi_idx
])
1625 if (SYSPARAMS_Load( SPI_SETSCREENSAVERRUNNING_REGKEY
,
1626 SPI_SETSCREENSAVERRUNNING_VALNAME
, buf
))
1627 screensaver_running
= atoi( buf
);
1628 spi_loaded
[spi_idx
] = TRUE
;
1631 *(BOOL
*)pvParam
= screensaver_running
;
1635 FIXME( "Unknown action: %u\n", uiAction
);
1636 SetLastError( ERROR_INVALID_SPI_VALUE
);
1642 SYSPARAMS_NotifyChange( uiAction
, fWinIni
);
1645 #undef WINE_SPI_FIXME
1646 #undef WINE_SPI_WARN
1650 /***********************************************************************
1651 * SystemParametersInfo (USER.483)
1653 BOOL16 WINAPI
SystemParametersInfo16( UINT16 uAction
, UINT16 uParam
,
1654 LPVOID lpvParam
, UINT16 fuWinIni
)
1658 TRACE("(%u, %u, %p, %u)\n", uAction
, uParam
, lpvParam
, fuWinIni
);
1662 case SPI_GETBEEP
: /* 1 */
1663 case SPI_GETSCREENSAVEACTIVE
: /* 16 */
1664 case SPI_GETICONTITLEWRAP
: /* 25 */
1665 case SPI_GETMENUDROPALIGNMENT
: /* 27 */
1666 case SPI_GETFASTTASKSWITCH
: /* 35 */
1667 case SPI_GETDRAGFULLWINDOWS
: /* 38 WINVER >= 0x0400 */
1670 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1671 if (ret
&& lpvParam
)
1672 *(BOOL16
*)lpvParam
= tmp
;
1676 case SPI_GETBORDER
: /* 5 */
1677 case SPI_ICONHORIZONTALSPACING
: /* 13 */
1678 case SPI_GETSCREENSAVETIMEOUT
: /* 14 */
1679 case SPI_GETGRIDGRANULARITY
: /* 18 */
1680 case SPI_GETKEYBOARDDELAY
: /* 22 */
1681 case SPI_ICONVERTICALSPACING
: /* 24 */
1684 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1685 if (ret
&& lpvParam
)
1686 *(INT16
*)lpvParam
= tmp
;
1690 case SPI_GETKEYBOARDSPEED
: /* 10 */
1693 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1694 if (ret
&& lpvParam
)
1695 *(WORD
*)lpvParam
= tmp
;
1699 case SPI_GETICONTITLELOGFONT
: /* 31 */
1702 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1703 if (ret
&& lpvParam
)
1704 SYSPARAMS_LogFont32ATo16( &tmp
, (LPLOGFONT16
)lpvParam
);
1708 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
1710 NONCLIENTMETRICSA tmp
;
1711 LPNONCLIENTMETRICS16 lpnm16
= (LPNONCLIENTMETRICS16
)lpvParam
;
1712 if (lpnm16
&& lpnm16
->cbSize
== sizeof(NONCLIENTMETRICS16
))
1714 tmp
.cbSize
= sizeof(NONCLIENTMETRICSA
);
1715 ret
= SystemParametersInfoA( uAction
, uParam
, &tmp
, fuWinIni
);
1717 SYSPARAMS_NonClientMetrics32ATo16( &tmp
, lpnm16
);
1719 else /* winfile 95 sets cbSize to 340 */
1720 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
, fuWinIni
);
1724 case SPI_GETWORKAREA
: /* 48 WINVER >= 0x400 */
1727 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1728 if (ret
&& lpvParam
)
1729 CONV_RECT32TO16( &tmp
, (RECT16
*)lpvParam
);
1733 case SPI_GETMOUSEHOVERWIDTH
: /* 98 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1734 case SPI_GETMOUSEHOVERHEIGHT
: /* 100 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1735 case SPI_GETMOUSEHOVERTIME
: /* 102 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1738 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
1739 if (ret
&& lpvParam
)
1740 *(UINT16
*)lpvParam
= tmp
;
1745 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
, fuWinIni
);
1751 /***********************************************************************
1752 * SystemParametersInfoW (USER32.@)
1754 BOOL WINAPI
SystemParametersInfoW( UINT uiAction
, UINT uiParam
,
1755 PVOID pvParam
, UINT fuWinIni
)
1759 TRACE("(%u, %u, %p, %u)\n", uiAction
, uiParam
, pvParam
, fuWinIni
);
1763 case SPI_SETDESKWALLPAPER
: /* 20 */
1764 case SPI_SETDESKPATTERN
: /* 21 */
1768 if (!WideCharToMultiByte( CP_ACP
, 0, (LPWSTR
)pvParam
, -1,
1769 buffer
, sizeof(buffer
), NULL
, NULL
))
1770 buffer
[sizeof(buffer
)-1] = 0;
1771 ret
= SystemParametersInfoA( uiAction
, uiParam
, pvParam
? buffer
: NULL
, fuWinIni
);
1775 case SPI_GETICONTITLELOGFONT
: /* 31 */
1778 ret
= SystemParametersInfoA( uiAction
, uiParam
, pvParam
? &tmp
: NULL
, fuWinIni
);
1780 SYSPARAMS_LogFont32ATo32W( &tmp
, (LPLOGFONTW
)pvParam
);
1784 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
1786 NONCLIENTMETRICSA tmp
;
1787 LPNONCLIENTMETRICSW lpnmW
= (LPNONCLIENTMETRICSW
)pvParam
;
1788 if (lpnmW
&& lpnmW
->cbSize
== sizeof(NONCLIENTMETRICSW
))
1790 tmp
.cbSize
= sizeof(NONCLIENTMETRICSA
);
1791 ret
= SystemParametersInfoA( uiAction
, uiParam
, &tmp
, fuWinIni
);
1793 SYSPARAMS_NonClientMetrics32ATo32W( &tmp
, lpnmW
);
1800 case SPI_GETICONMETRICS
: /* 45 WINVER >= 0x400 */
1803 LPICONMETRICSW lpimW
= (LPICONMETRICSW
)pvParam
;
1804 if (lpimW
&& lpimW
->cbSize
== sizeof(ICONMETRICSW
))
1806 tmp
.cbSize
= sizeof(ICONMETRICSA
);
1807 ret
= SystemParametersInfoA( uiAction
, uiParam
, &tmp
, fuWinIni
);
1810 lpimW
->iHorzSpacing
= tmp
.iHorzSpacing
;
1811 lpimW
->iVertSpacing
= tmp
.iVertSpacing
;
1812 lpimW
->iTitleWrap
= tmp
.iTitleWrap
;
1813 SYSPARAMS_LogFont32ATo32W( &tmp
.lfFont
, &lpimW
->lfFont
);
1821 case SPI_GETHIGHCONTRAST
: /* 66 WINVER >= 0x400 */
1824 LPHIGHCONTRASTW lphcW
= (LPHIGHCONTRASTW
)pvParam
;
1825 if (lphcW
&& lphcW
->cbSize
== sizeof(HIGHCONTRASTW
))
1827 tmp
.cbSize
= sizeof(HIGHCONTRASTA
);
1828 ret
= SystemParametersInfoA( uiAction
, uiParam
, &tmp
, fuWinIni
);
1831 lphcW
->dwFlags
= tmp
.dwFlags
;
1832 lphcW
->lpszDefaultScheme
= NULL
; /* FIXME? */
1841 ret
= SystemParametersInfoA( uiAction
, uiParam
, pvParam
, fuWinIni
);
1848 /**********************************************************************
1849 * SetDoubleClickTime (USER32.@)
1851 BOOL WINAPI
SetDoubleClickTime( UINT interval
)
1853 return SystemParametersInfoA(SPI_SETDOUBLECLICKTIME
, interval
, 0, 0);
1857 /**********************************************************************
1858 * GetDoubleClickTime (USER32.@)
1860 UINT WINAPI
GetDoubleClickTime(void)
1864 if (!spi_loaded
[SPI_SETDOUBLECLICKTIME_IDX
])
1866 if (SYSPARAMS_Load( SPI_SETDOUBLECLICKTIME_REGKEY
,
1867 SPI_SETDOUBLECLICKTIME_VALNAME
,
1870 double_click_time
= atoi( buf
);
1871 if (!double_click_time
) double_click_time
= 500;
1873 spi_loaded
[SPI_SETDOUBLECLICKTIME_IDX
] = TRUE
;
1875 return double_click_time
;