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
32 #include "wine/winuser16.h"
37 #include "wine/unicode.h"
38 #include "wine/debug.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(system
);
42 /* System parameter indexes */
43 #define SPI_SETBEEP_IDX 0
44 #define SPI_SETMOUSE_IDX 1
45 #define SPI_SETBORDER_IDX 2
46 #define SPI_SETKEYBOARDSPEED_IDX 3
47 #define SPI_ICONHORIZONTALSPACING_IDX 4
48 #define SPI_SETSCREENSAVETIMEOUT_IDX 5
49 #define SPI_SETGRIDGRANULARITY_IDX 6
50 #define SPI_SETKEYBOARDDELAY_IDX 7
51 #define SPI_ICONVERTICALSPACING_IDX 8
52 #define SPI_SETICONTITLEWRAP_IDX 9
53 #define SPI_SETMENUDROPALIGNMENT_IDX 10
54 #define SPI_SETDOUBLECLKWIDTH_IDX 11
55 #define SPI_SETDOUBLECLKHEIGHT_IDX 12
56 #define SPI_SETDOUBLECLICKTIME_IDX 13
57 #define SPI_SETMOUSEBUTTONSWAP_IDX 14
58 #define SPI_SETDRAGFULLWINDOWS_IDX 15
59 #define SPI_SETWORKAREA_IDX 16
60 #define SPI_SETSHOWSOUNDS_IDX 17
61 #define SPI_SETKEYBOARDPREF_IDX 18
62 #define SPI_SETSCREENREADER_IDX 19
63 #define SPI_SETSCREENSAVERRUNNING_IDX 20
64 #define SPI_SETFONTSMOOTHING_IDX 21
65 #define SPI_SETKEYBOARDCUES_IDX 22
66 #define SPI_SETGRADIENTCAPTIONS_IDX 23
67 #define SPI_SETHOTTRACKING_IDX 24
68 #define SPI_SETLISTBOXSMOOTHSCROLLING_IDX 25
70 #define SPI_WINE_IDX SPI_SETSCREENSAVERRUNNING_IDX
73 * Names of the registry subkeys of HKEY_CURRENT_USER key and value names
74 * for the system parameters.
75 * Names of the keys are created by adding string "_REGKEY" to
76 * "SET" action names, value names are created by adding "_REG_NAME"
77 * to the "SET" action name.
79 static const WCHAR SPI_SETBEEP_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','S','o','u','n','d',0};
80 static const WCHAR SPI_SETBEEP_VALNAME
[]= {'B','e','e','p',0};
81 static const WCHAR SPI_SETMOUSE_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','M','o','u','s','e',0};
82 static const WCHAR SPI_SETMOUSE_VALNAME1
[]= {'M','o','u','s','e','T','h','r','e','s','h','o','l','d','1',0};
83 static const WCHAR SPI_SETMOUSE_VALNAME2
[]= {'M','o','u','s','e','T','h','r','e','s','h','o','l','d','2',0};
84 static const WCHAR SPI_SETMOUSE_VALNAME3
[]= {'M','o','u','s','e','S','p','e','e','d',0};
85 static const WCHAR SPI_SETBORDER_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
86 static const WCHAR SPI_SETBORDER_VALNAME
[]= {'B','o','r','d','e','r','W','i','d','t','h',0};
87 static const WCHAR SPI_SETKEYBOARDSPEED_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','K','e','y','b','o','a','r','d',0};
88 static const WCHAR SPI_SETKEYBOARDSPEED_VALNAME
[]= {'K','e','y','b','o','a','r','d','S','p','e','e','d',0};
89 static const WCHAR SPI_ICONHORIZONTALSPACING_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p','\\',
90 'W','i','n','d','o','w','M','e','t','r','i','c','s',0};
91 static const WCHAR SPI_ICONHORIZONTALSPACING_VALNAME
[]= {'I','c','o','n','S','p','a','c','i','n','g',0};
92 static const WCHAR SPI_SETSCREENSAVETIMEOUT_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
93 static const WCHAR SPI_SETSCREENSAVETIMEOUT_VALNAME
[]= {'S','c','r','e','e','n','S','a','v','e','T','i','m','e','O','u','t',0};
94 static const WCHAR SPI_SETSCREENSAVEACTIVE_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
95 static const WCHAR SPI_SETSCREENSAVEACTIVE_VALNAME
[]= {'S','c','r','e','e','n','S','a','v','e','A','c','t','i','v','e',0};
96 static const WCHAR SPI_SETGRIDGRANULARITY_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
97 static const WCHAR SPI_SETGRIDGRANULARITY_VALNAME
[]= {'G','r','i','d','G','r','a','n','u','l','a','r','i','t','y',0};
98 static const WCHAR SPI_SETKEYBOARDDELAY_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','K','e','y','b','o','a','r','d',0};
99 static const WCHAR SPI_SETKEYBOARDDELAY_VALNAME
[]= {'K','e','y','b','o','a','r','d','D','e','l','a','y',0};
100 static const WCHAR SPI_ICONVERTICALSPACING_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p','\\',
101 'W','i','n','d','o','w','M','e','t','r','i','c','s',0};
102 static const WCHAR SPI_ICONVERTICALSPACING_VALNAME
[]= {'I','c','o','n','V','e','r','t','i','c','a','l','S','p','a','c','i','n','g',0};
103 static const WCHAR SPI_SETICONTITLEWRAP_REGKEY1
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p','\\',
104 'W','i','n','d','o','w','M','e','t','r','i','c','s',0};
105 static const WCHAR SPI_SETICONTITLEWRAP_REGKEY2
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
106 static const WCHAR SPI_SETICONTITLEWRAP_VALNAME
[]= {'I','c','o','n','T','i','t','l','e','W','r','a','p',0};
107 static const WCHAR SPI_SETMENUDROPALIGNMENT_REGKEY1
[]= {'S','o','f','t','w','a','r','e','\\',
108 'M','i','c','r','o','s','o','f','t','\\',
109 'W','i','n','d','o','w','s',' ','N','T','\\',
110 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
111 'W','i','n','d','o','w','s',0};
112 static const WCHAR SPI_SETMENUDROPALIGNMENT_REGKEY2
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
113 static const WCHAR SPI_SETMENUDROPALIGNMENT_VALNAME
[]= {'M','e','n','u','D','r','o','p','A','l','i','g','n','m','e','n','t',0};
114 static const WCHAR SPI_SETDOUBLECLKWIDTH_REGKEY1
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','M','o','u','s','e',0};
115 static const WCHAR SPI_SETDOUBLECLKWIDTH_REGKEY2
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
116 static const WCHAR SPI_SETDOUBLECLKWIDTH_VALNAME
[]= {'D','o','u','b','l','e','C','l','i','c','k','W','i','d','t','h',0};
117 static const WCHAR SPI_SETDOUBLECLKHEIGHT_REGKEY1
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','M','o','u','s','e',0};
118 static const WCHAR SPI_SETDOUBLECLKHEIGHT_REGKEY2
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
119 static const WCHAR SPI_SETDOUBLECLKHEIGHT_VALNAME
[]= {'D','o','u','b','l','e','C','l','i','c','k','H','e','i','g','h','t',0};
120 static const WCHAR SPI_SETDOUBLECLICKTIME_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','M','o','u','s','e',0};
121 static const WCHAR SPI_SETDOUBLECLICKTIME_VALNAME
[]= {'D','o','u','b','l','e','C','l','i','c','k','S','p','e','e','d',0};
122 static const WCHAR SPI_SETMOUSEBUTTONSWAP_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','M','o','u','s','e',0};
123 static const WCHAR SPI_SETMOUSEBUTTONSWAP_VALNAME
[]= {'S','w','a','p','M','o','u','s','e','B','u','t','t','o','n','s',0};
124 static const WCHAR SPI_SETDRAGFULLWINDOWS_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
125 static const WCHAR SPI_SETDRAGFULLWINDOWS_VALNAME
[]= {'D','r','a','g','F','u','l','l','W','i','n','d','o','w','s',0};
126 static const WCHAR SPI_SETWORKAREA_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
127 static const WCHAR SPI_SETWORKAREA_VALNAME
[]= {'W','I','N','E','_','W','o','r','k','A','r','e','a',0};
128 static const WCHAR SPI_SETSHOWSOUNDS_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\',
129 'A','c','c','e','s','s','i','b','i','l','i','t','y','\\',
130 'S','h','o','w','S','o','u','n','d','s',0};
131 static const WCHAR SPI_SETSHOWSOUNDS_VALNAME
[]= {'O','n',0};
132 static const WCHAR SPI_SETDESKWALLPAPER_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
133 static const WCHAR SPI_SETDESKWALLPAPER_VALNAME
[]= {'W','a','l','l','p','a','p','e','r',0};
134 static const WCHAR SPI_SETFONTSMOOTHING_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
135 static const WCHAR SPI_SETFONTSMOOTHING_VALNAME
[]= {'F','o','n','t','S','m','o','o','t','h','i','n','g',0};
136 static const WCHAR SPI_USERPREFERENCEMASK_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
137 static const WCHAR SPI_USERPREFERENCEMASK_VALNAME
[]= {'U','s','e','r','P','r','e','f','e','r','e','n','c','e','m','a','s','k',0};
138 static const WCHAR SPI_SETLISTBOXSMOOTHSCROLLING_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
139 static const WCHAR SPI_SETLISTBOXSMOOTHSCROLLING_VALNAME
[]= {'S','m','o','o','t','h','S','c','r','o','l','l',0};
142 /* FIXME - real values */
143 static const WCHAR SPI_SETKEYBOARDPREF_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
144 static const WCHAR SPI_SETKEYBOARDPREF_VALNAME
[]= {'W','I','N','E','_','K','e','y','b','o','a','r','d','P','r','e','f',0};
145 static const WCHAR SPI_SETSCREENREADER_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
146 static const WCHAR SPI_SETSCREENREADER_VALNAME
[]= {'W','I','N','E','_','S','c','r','e','e','n','R','e','a','d','e','r',0};
147 static const WCHAR SPI_SETSCREENSAVERRUNNING_REGKEY
[]= {'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p',0};
148 static const WCHAR SPI_SETSCREENSAVERRUNNING_VALNAME
[]= {'W','I','N','E','_','S','c','r','e','e','n','S','a','v','e','r','R','u','n','n','i','n','g',0};
150 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
151 static const WCHAR WINE_CURRENT_USER_REGKEY
[] = {'W','i','n','e',0};
154 static const WCHAR Yes
[]= {'Y','e','s',0};
155 static const WCHAR No
[]= {'N','o',0};
156 static const WCHAR Desktop
[]= {'D','e','s','k','t','o','p',0};
157 static const WCHAR Pattern
[]= {'P','a','t','t','e','r','n',0};
158 static const WCHAR MenuFont
[]= {'M','e','n','u','F','o','n','t',0};
159 static const WCHAR MenuFontSize
[]= {'M','e','n','u','F','o','n','t','S','i','z','e',0};
160 static const WCHAR System
[]= {'S','y','s','t','e','m',0};
161 static const WCHAR IconTitleSize
[]= {'I','c','o','n','T','i','t','l','e','S','i','z','e',0};
162 static const WCHAR IconTitleFaceName
[]= {'I','c','o','n','T','i','t','l','e','F','a','c','e','N','a','m','e',0};
163 static const WCHAR defPattern
[]= {'1','7','0',' ','8','5',' ','1','7','0',' ','8','5',' ','1','7','0',' ','8','5',
164 ' ','1','7','0',' ','8','5',0};
165 static const WCHAR CSu
[]= {'%','u',0};
166 static const WCHAR CSd
[]= {'%','d',0};
168 /* Indicators whether system parameter value is loaded */
169 static char spi_loaded
[SPI_WINE_IDX
+ 1];
171 static BOOL notify_change
= TRUE
;
173 /* System parameters storage */
174 static BOOL beep_active
= TRUE
;
175 static int mouse_threshold1
= 6;
176 static int mouse_threshold2
= 10;
177 static int mouse_speed
= 1;
178 static int border
= 1;
179 static int keyboard_speed
= 31;
180 static int screensave_timeout
= 300;
181 static int grid_granularity
= 0;
182 static int keyboard_delay
= 1;
183 static BOOL icon_title_wrap
= TRUE
;
184 static int double_click_time
= 500;
185 static BOOL drag_full_windows
= FALSE
;
186 static RECT work_area
;
187 static BOOL keyboard_pref
= TRUE
;
188 static BOOL screen_reader
= FALSE
;
189 static BOOL screensaver_running
= FALSE
;
190 static BOOL font_smoothing
= FALSE
;
191 static BOOL keyboard_cues
= FALSE
;
192 static BOOL gradient_captions
= FALSE
;
193 static BOOL listbox_smoothscrolling
= FALSE
;
194 static BOOL hot_tracking
= FALSE
;
196 /***********************************************************************
197 * GetTimerResolution (USER.14)
199 LONG WINAPI
GetTimerResolution16(void)
204 /***********************************************************************
205 * ControlPanelInfo (USER.273)
207 void WINAPI
ControlPanelInfo16( INT16 nInfoType
, WORD wData
, LPSTR lpBuffer
)
209 FIXME("(%d, %04x, %p): stub.\n", nInfoType
, wData
, lpBuffer
);
212 /* This function is a copy of the one in objects/font.c */
213 static void SYSPARAMS_LogFont32ATo16( const LOGFONTA
* font32
, LPLOGFONT16 font16
)
215 font16
->lfHeight
= font32
->lfHeight
;
216 font16
->lfWidth
= font32
->lfWidth
;
217 font16
->lfEscapement
= font32
->lfEscapement
;
218 font16
->lfOrientation
= font32
->lfOrientation
;
219 font16
->lfWeight
= font32
->lfWeight
;
220 font16
->lfItalic
= font32
->lfItalic
;
221 font16
->lfUnderline
= font32
->lfUnderline
;
222 font16
->lfStrikeOut
= font32
->lfStrikeOut
;
223 font16
->lfCharSet
= font32
->lfCharSet
;
224 font16
->lfOutPrecision
= font32
->lfOutPrecision
;
225 font16
->lfClipPrecision
= font32
->lfClipPrecision
;
226 font16
->lfQuality
= font32
->lfQuality
;
227 font16
->lfPitchAndFamily
= font32
->lfPitchAndFamily
;
228 lstrcpynA( font16
->lfFaceName
, font32
->lfFaceName
, LF_FACESIZE
);
231 static void SYSPARAMS_LogFont32WTo32A( const LOGFONTW
* font32W
, LPLOGFONTA font32A
)
233 font32A
->lfHeight
= font32W
->lfHeight
;
234 font32A
->lfWidth
= font32W
->lfWidth
;
235 font32A
->lfEscapement
= font32W
->lfEscapement
;
236 font32A
->lfOrientation
= font32W
->lfOrientation
;
237 font32A
->lfWeight
= font32W
->lfWeight
;
238 font32A
->lfItalic
= font32W
->lfItalic
;
239 font32A
->lfUnderline
= font32W
->lfUnderline
;
240 font32A
->lfStrikeOut
= font32W
->lfStrikeOut
;
241 font32A
->lfCharSet
= font32W
->lfCharSet
;
242 font32A
->lfOutPrecision
= font32W
->lfOutPrecision
;
243 font32A
->lfClipPrecision
= font32W
->lfClipPrecision
;
244 font32A
->lfQuality
= font32W
->lfQuality
;
245 font32A
->lfPitchAndFamily
= font32W
->lfPitchAndFamily
;
246 WideCharToMultiByte( CP_ACP
, 0, font32W
->lfFaceName
, -1, font32A
->lfFaceName
, LF_FACESIZE
, NULL
, NULL
);
247 font32A
->lfFaceName
[LF_FACESIZE
-1] = 0;
250 static void SYSPARAMS_NonClientMetrics32ATo16( const NONCLIENTMETRICSA
* lpnm32
, LPNONCLIENTMETRICS16 lpnm16
)
252 lpnm16
->iBorderWidth
= lpnm32
->iBorderWidth
;
253 lpnm16
->iScrollWidth
= lpnm32
->iScrollWidth
;
254 lpnm16
->iScrollHeight
= lpnm32
->iScrollHeight
;
255 lpnm16
->iCaptionWidth
= lpnm32
->iCaptionWidth
;
256 lpnm16
->iCaptionHeight
= lpnm32
->iCaptionHeight
;
257 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfCaptionFont
, &lpnm16
->lfCaptionFont
);
258 lpnm16
->iSmCaptionWidth
= lpnm32
->iSmCaptionWidth
;
259 lpnm16
->iSmCaptionHeight
= lpnm32
->iSmCaptionHeight
;
260 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfSmCaptionFont
, &lpnm16
->lfSmCaptionFont
);
261 lpnm16
->iMenuWidth
= lpnm32
->iMenuWidth
;
262 lpnm16
->iMenuHeight
= lpnm32
->iMenuHeight
;
263 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfMenuFont
, &lpnm16
->lfMenuFont
);
264 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfStatusFont
, &lpnm16
->lfStatusFont
);
265 SYSPARAMS_LogFont32ATo16( &lpnm32
->lfMessageFont
, &lpnm16
->lfMessageFont
);
268 static void SYSPARAMS_NonClientMetrics32WTo32A( const NONCLIENTMETRICSW
* lpnm32W
, LPNONCLIENTMETRICSA lpnm32A
)
270 lpnm32A
->iBorderWidth
= lpnm32W
->iBorderWidth
;
271 lpnm32A
->iScrollWidth
= lpnm32W
->iScrollWidth
;
272 lpnm32A
->iScrollHeight
= lpnm32W
->iScrollHeight
;
273 lpnm32A
->iCaptionWidth
= lpnm32W
->iCaptionWidth
;
274 lpnm32A
->iCaptionHeight
= lpnm32W
->iCaptionHeight
;
275 SYSPARAMS_LogFont32WTo32A( &lpnm32W
->lfCaptionFont
, &lpnm32A
->lfCaptionFont
);
276 lpnm32A
->iSmCaptionWidth
= lpnm32W
->iSmCaptionWidth
;
277 lpnm32A
->iSmCaptionHeight
= lpnm32W
->iSmCaptionHeight
;
278 SYSPARAMS_LogFont32WTo32A( &lpnm32W
->lfSmCaptionFont
, &lpnm32A
->lfSmCaptionFont
);
279 lpnm32A
->iMenuWidth
= lpnm32W
->iMenuWidth
;
280 lpnm32A
->iMenuHeight
= lpnm32W
->iMenuHeight
;
281 SYSPARAMS_LogFont32WTo32A( &lpnm32W
->lfMenuFont
, &lpnm32A
->lfMenuFont
);
282 SYSPARAMS_LogFont32WTo32A( &lpnm32W
->lfStatusFont
, &lpnm32A
->lfStatusFont
);
283 SYSPARAMS_LogFont32WTo32A( &lpnm32W
->lfMessageFont
, &lpnm32A
->lfMessageFont
);
286 /***********************************************************************
289 * Sets the system parameter which should be always loaded to
290 * current value stored in registry.
291 * Invalidates lazy loaded parameter, so it will be loaded the next time
295 * uiAction - system parameter to reload value for.
296 * Note, only "SET" values can be used for this parameter.
297 * If uiAction is 0 all system parameters are reset.
299 void SYSPARAMS_Reset( UINT uiAction
)
301 #define WINE_RELOAD_SPI(x) \
303 spi_loaded[x##_IDX] = FALSE; \
304 SystemParametersInfoA( x, 0, dummy_buf, 0 );\
308 #define WINE_IGNORE_SPI(x) \
313 #define WINE_INVALIDATE_SPI(x) \
315 spi_loaded[x##_IDX] = FALSE; \
318 BOOL not_all_processed
= TRUE
;
321 /* Execution falls through all the branches for uiAction == 0 */
325 memset( spi_loaded
, 0, sizeof(spi_loaded
) );
327 WINE_RELOAD_SPI(SPI_SETBORDER
);
328 WINE_RELOAD_SPI(SPI_ICONHORIZONTALSPACING
);
329 WINE_RELOAD_SPI(SPI_ICONVERTICALSPACING
);
330 WINE_IGNORE_SPI(SPI_SETSCREENSAVEACTIVE
);
331 WINE_RELOAD_SPI(SPI_SETDOUBLECLKWIDTH
);
332 WINE_RELOAD_SPI(SPI_SETDOUBLECLKHEIGHT
);
333 WINE_RELOAD_SPI(SPI_SETMOUSEBUTTONSWAP
);
334 WINE_RELOAD_SPI(SPI_SETSHOWSOUNDS
);
335 WINE_RELOAD_SPI(SPI_SETMENUDROPALIGNMENT
);
340 /* lazy loaded parameters */
343 WINE_INVALIDATE_SPI(SPI_SETBEEP
);
344 WINE_INVALIDATE_SPI(SPI_SETMOUSE
);
345 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDSPEED
);
346 WINE_INVALIDATE_SPI(SPI_SETSCREENSAVETIMEOUT
);
347 WINE_INVALIDATE_SPI(SPI_SETGRIDGRANULARITY
);
348 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDDELAY
);
349 WINE_INVALIDATE_SPI(SPI_SETICONTITLEWRAP
);
350 WINE_INVALIDATE_SPI(SPI_SETDOUBLECLICKTIME
);
351 WINE_INVALIDATE_SPI(SPI_SETDRAGFULLWINDOWS
);
352 WINE_INVALIDATE_SPI(SPI_SETWORKAREA
);
353 WINE_INVALIDATE_SPI(SPI_SETKEYBOARDPREF
);
354 WINE_INVALIDATE_SPI(SPI_SETSCREENREADER
);
355 WINE_INVALIDATE_SPI(SPI_SETSCREENSAVERRUNNING
);
357 FIXME( "Unknown action reset: %u\n", uiAction
);
362 not_all_processed
= FALSE
;
366 if (!uiAction
&& not_all_processed
)
367 ERR( "Incorrect implementation of SYSPARAMS_Reset. "
368 "Not all params are reloaded.\n" );
369 #undef WINE_INVALIDATE_SPI
370 #undef WINE_IGNORE_SPI
371 #undef WINE_RELOAD_SPI
374 /***********************************************************************
375 * get_volatile_regkey
377 * Return a handle to the volatile registry key used to store
378 * non-permanently modified parameters.
380 static HKEY
get_volatile_regkey(void)
382 static HKEY volatile_key
;
386 if (RegCreateKeyExW( HKEY_CURRENT_USER
, WINE_CURRENT_USER_REGKEY
,
387 0, 0, REG_OPTION_VOLATILE
, KEY_ALL_ACCESS
, 0,
388 &volatile_key
, 0 ) != ERROR_SUCCESS
)
389 ERR("Can't create wine configuration registry branch\n");
394 /***********************************************************************
395 * SYSPARAMS_NotifyChange
397 * Sends notification about system parameter update.
399 void SYSPARAMS_NotifyChange( UINT uiAction
, UINT fWinIni
)
401 static const WCHAR emptyW
[1];
405 if (fWinIni
& SPIF_UPDATEINIFILE
)
407 if (fWinIni
& (SPIF_SENDWININICHANGE
| SPIF_SENDCHANGE
))
408 SendMessageTimeoutW(HWND_BROADCAST
, WM_SETTINGCHANGE
,
409 uiAction
, (LPARAM
) emptyW
,
410 SMTO_ABORTIFHUNG
, 2000, NULL
);
414 /* FIXME notify other wine processes with internal message */
420 /***********************************************************************
421 * Loads system parameter from user profile.
423 static BOOL
SYSPARAMS_Load( LPCWSTR lpRegKey
, LPCWSTR lpValName
, LPWSTR lpBuf
, DWORD count
)
429 if ((RegOpenKeyW( get_volatile_regkey(), lpRegKey
, &hKey
) == ERROR_SUCCESS
) ||
430 (RegOpenKeyW( HKEY_CURRENT_USER
, lpRegKey
, &hKey
) == ERROR_SUCCESS
))
432 ret
= !RegQueryValueExW( hKey
, lpValName
, NULL
, &type
, (LPBYTE
)lpBuf
, &count
);
438 /***********************************************************************
439 * Saves system parameter to user profile.
441 static BOOL
SYSPARAMS_Save( LPCWSTR lpRegKey
, LPCWSTR lpValName
, LPCWSTR lpValue
,
449 if (fWinIni
& SPIF_UPDATEINIFILE
)
451 hBaseKey
= HKEY_CURRENT_USER
;
456 hBaseKey
= get_volatile_regkey();
457 dwOptions
= REG_OPTION_VOLATILE
;
460 if (RegCreateKeyExW( hBaseKey
, lpRegKey
,
461 0, 0, dwOptions
, KEY_ALL_ACCESS
,
462 0, &hKey
, 0 ) == ERROR_SUCCESS
)
464 if (RegSetValueExW( hKey
, lpValName
, 0, REG_SZ
,
465 (const BYTE
*)lpValue
,
466 (strlenW(lpValue
) + 1)*sizeof(WCHAR
)) == ERROR_SUCCESS
)
469 if (hBaseKey
== HKEY_CURRENT_USER
)
470 RegDeleteKeyW( get_volatile_regkey(), lpRegKey
);
478 /***********************************************************************
479 * SYSPARAMS_GetDoubleClickSize
481 * There is no SPI_GETDOUBLECLK* so we export this function instead.
483 void SYSPARAMS_GetDoubleClickSize( INT
*width
, INT
*height
)
487 if (!spi_loaded
[SPI_SETDOUBLECLKWIDTH_IDX
])
489 if (SYSPARAMS_Load( SPI_SETDOUBLECLKWIDTH_REGKEY1
,
490 SPI_SETDOUBLECLKWIDTH_VALNAME
, buf
, sizeof(buf
) ))
492 SYSMETRICS_Set( SM_CXDOUBLECLK
, atoiW( buf
) );
494 spi_loaded
[SPI_SETDOUBLECLKWIDTH_IDX
] = TRUE
;
496 if (!spi_loaded
[SPI_SETDOUBLECLKHEIGHT_IDX
])
498 if (SYSPARAMS_Load( SPI_SETDOUBLECLKHEIGHT_REGKEY1
,
499 SPI_SETDOUBLECLKHEIGHT_VALNAME
, buf
, sizeof(buf
) ))
501 SYSMETRICS_Set( SM_CYDOUBLECLK
, atoiW( buf
) );
503 spi_loaded
[SPI_SETDOUBLECLKHEIGHT_IDX
] = TRUE
;
505 *width
= GetSystemMetrics( SM_CXDOUBLECLK
);
506 *height
= GetSystemMetrics( SM_CYDOUBLECLK
);
510 /***********************************************************************
511 * SYSPARAMS_GetMouseButtonSwap
513 * There is no SPI_GETMOUSEBUTTONSWAP so we export this function instead.
515 INT
SYSPARAMS_GetMouseButtonSwap( void )
517 int spi_idx
= SPI_SETMOUSEBUTTONSWAP_IDX
;
519 if (!spi_loaded
[spi_idx
])
523 if (SYSPARAMS_Load( SPI_SETMOUSEBUTTONSWAP_REGKEY
,
524 SPI_SETMOUSEBUTTONSWAP_VALNAME
, buf
, sizeof(buf
) ))
526 SYSMETRICS_Set( SM_SWAPBUTTON
, atoiW( buf
) );
528 spi_loaded
[spi_idx
] = TRUE
;
531 return GetSystemMetrics( SM_SWAPBUTTON
);
534 /***********************************************************************
536 * SYSPARAMS_GetGUIFont
538 * fills LOGFONT with 'default GUI font'.
541 static void SYSPARAMS_GetGUIFont( LOGFONTW
* plf
)
545 memset( plf
, 0, sizeof(LOGFONTW
) );
546 hf
= (HFONT
)GetStockObject( DEFAULT_GUI_FONT
);
547 if ( GetObjectW( hf
, sizeof(LOGFONTW
), plf
) != sizeof(LOGFONTW
) )
550 * GetObjectW() would be succeeded always
551 * since this is a stock object
553 ERR("GetObjectW() failed\n");
557 /* copied from GetSystemMetrics()'s RegistryTwips2Pixels() */
558 inline static int SYSPARAMS_Twips2Pixels(int x
)
565 /***********************************************************************
566 * SystemParametersInfoW (USER32.@)
568 * Each system parameter has flag which shows whether the parameter
569 * is loaded or not. Parameters, stored directly in SysParametersInfo are
570 * loaded from registry only when they are requested and the flag is
571 * "false", after the loading the flag is set to "true". On interprocess
572 * notification of the parameter change the corresponding parameter flag is
573 * set to "false". The parameter value will be reloaded when it is requested
575 * Parameters, backed by or depend on GetSystemMetrics are processed
576 * differently. These parameters are always loaded. They are reloaded right
577 * away on interprocess change notification. We can't do lazy loading because
578 * we don't want to complicate GetSystemMetrics.
579 * Parameters, backed by X settings are read from corresponding setting.
580 * On the parameter change request the setting is changed. Interprocess change
581 * notifications are ignored.
582 * When parameter value is updated the changed value is stored in permanent
583 * registry branch if saving is requested. Otherwise it is stored
584 * in temporary branch
586 * Some SPI values can also be stored as Twips values in the registry,
587 * don't forget the conversion!
589 BOOL WINAPI
SystemParametersInfoW( UINT uiAction
, UINT uiParam
,
590 PVOID pvParam
, UINT fWinIni
)
592 #define WINE_SPI_FIXME(x) \
594 FIXME( "Unimplemented action: %u (%s)\n", x, #x ); \
595 SetLastError( ERROR_INVALID_SPI_VALUE ); \
598 #define WINE_SPI_WARN(x) \
600 WARN( "Ignored action: %u (%s)\n", x, #x ); \
604 unsigned spi_idx
= 0;
606 TRACE("(%u, %u, %p, %u)\n", uiAction
, uiParam
, pvParam
, fWinIni
);
610 case SPI_GETBEEP
: /* 1 */
611 if (!pvParam
) return FALSE
;
613 spi_idx
= SPI_SETBEEP_IDX
;
614 if (!spi_loaded
[spi_idx
])
618 if (SYSPARAMS_Load( SPI_SETBEEP_REGKEY
, SPI_SETBEEP_VALNAME
, buf
, sizeof(buf
) ))
619 beep_active
= !lstrcmpiW( Yes
, buf
);
620 spi_loaded
[spi_idx
] = TRUE
;
623 *(BOOL
*)pvParam
= beep_active
;
626 case SPI_SETBEEP
: /* 2 */
627 spi_idx
= SPI_SETBEEP_IDX
;
628 if (SYSPARAMS_Save( SPI_SETBEEP_REGKEY
, SPI_SETBEEP_VALNAME
,
629 (uiParam
? Yes
: No
), fWinIni
))
631 beep_active
= uiParam
;
632 spi_loaded
[spi_idx
] = TRUE
;
638 case SPI_GETMOUSE
: /* 3 */
639 if (!pvParam
) return FALSE
;
641 spi_idx
= SPI_SETMOUSE_IDX
;
642 if (!spi_loaded
[spi_idx
])
646 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME1
,
648 mouse_threshold1
= atoiW( buf
);
649 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME2
,
651 mouse_threshold2
= atoiW( buf
);
652 if (SYSPARAMS_Load( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME3
,
654 mouse_speed
= atoiW( buf
);
655 spi_loaded
[spi_idx
] = TRUE
;
657 ((INT
*)pvParam
)[0] = mouse_threshold1
;
658 ((INT
*)pvParam
)[1] = mouse_threshold2
;
659 ((INT
*)pvParam
)[2] = mouse_speed
;
662 case SPI_SETMOUSE
: /* 4 */
666 if (!pvParam
) return FALSE
;
668 spi_idx
= SPI_SETMOUSE_IDX
;
669 wsprintfW(buf
, CSd
, ((INT
*)pvParam
)[0]);
671 if (SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME1
,
674 mouse_threshold1
= ((INT
*)pvParam
)[0];
675 spi_loaded
[spi_idx
] = TRUE
;
677 wsprintfW(buf
, CSd
, ((INT
*)pvParam
)[1]);
678 SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME2
,
680 mouse_threshold2
= ((INT
*)pvParam
)[1];
682 wsprintfW(buf
, CSd
, ((INT
*)pvParam
)[2]);
683 SYSPARAMS_Save( SPI_SETMOUSE_REGKEY
, SPI_SETMOUSE_VALNAME3
,
685 mouse_speed
= ((INT
*)pvParam
)[2];
692 case SPI_GETBORDER
: /* 5 */
693 if (!pvParam
) return FALSE
;
695 spi_idx
= SPI_SETBORDER_IDX
;
696 if (!spi_loaded
[spi_idx
])
700 if (SYSPARAMS_Load( SPI_SETBORDER_REGKEY
, SPI_SETBORDER_VALNAME
, buf
, sizeof(buf
) ))
701 border
= SYSPARAMS_Twips2Pixels( atoiW(buf
) );
703 spi_loaded
[spi_idx
] = TRUE
;
704 if (TWEAK_WineLook
> WIN31_LOOK
)
706 SYSMETRICS_Set( SM_CXFRAME
, border
+ GetSystemMetrics( SM_CXDLGFRAME
) );
707 SYSMETRICS_Set( SM_CYFRAME
, border
+ GetSystemMetrics( SM_CXDLGFRAME
) );
710 *(INT
*)pvParam
= border
;
713 case SPI_SETBORDER
: /* 6 */
717 spi_idx
= SPI_SETBORDER_IDX
;
718 wsprintfW(buf
, CSu
, uiParam
);
720 if (SYSPARAMS_Save( SPI_SETBORDER_REGKEY
, SPI_SETBORDER_VALNAME
,
726 spi_loaded
[spi_idx
] = TRUE
;
727 if (TWEAK_WineLook
> WIN31_LOOK
)
729 SYSMETRICS_Set( SM_CXFRAME
, uiParam
+ GetSystemMetrics( SM_CXDLGFRAME
) );
730 SYSMETRICS_Set( SM_CYFRAME
, uiParam
+ GetSystemMetrics( SM_CXDLGFRAME
) );
739 case SPI_GETKEYBOARDSPEED
: /* 10 */
740 if (!pvParam
) return FALSE
;
742 spi_idx
= SPI_SETKEYBOARDSPEED_IDX
;
743 if (!spi_loaded
[spi_idx
])
747 if (SYSPARAMS_Load( SPI_SETKEYBOARDSPEED_REGKEY
,
748 SPI_SETKEYBOARDSPEED_VALNAME
,
750 keyboard_speed
= atoiW( buf
);
751 spi_loaded
[spi_idx
] = TRUE
;
753 *(INT
*)pvParam
= keyboard_speed
;
756 case SPI_SETKEYBOARDSPEED
: /* 11 */
760 spi_idx
= SPI_SETKEYBOARDSPEED_IDX
;
763 wsprintfW(buf
, CSu
, uiParam
);
765 if (SYSPARAMS_Save( SPI_SETKEYBOARDSPEED_REGKEY
,
766 SPI_SETKEYBOARDSPEED_VALNAME
,
769 keyboard_speed
= uiParam
;
770 spi_loaded
[spi_idx
] = TRUE
;
777 /* not implemented in Windows */
778 WINE_SPI_WARN(SPI_LANGDRIVER
); /* 12 */
780 case SPI_ICONHORIZONTALSPACING
: /* 13 */
781 spi_idx
= SPI_ICONHORIZONTALSPACING_IDX
;
784 if (!spi_loaded
[spi_idx
])
789 if (SYSPARAMS_Load( SPI_ICONHORIZONTALSPACING_REGKEY
,
790 SPI_ICONHORIZONTALSPACING_VALNAME
, buf
, sizeof(buf
) ))
792 val
= SYSPARAMS_Twips2Pixels( atoiW(buf
) );
793 SYSMETRICS_Set( SM_CXICONSPACING
, val
);
795 spi_loaded
[spi_idx
] = TRUE
;
798 *(INT
*)pvParam
= GetSystemMetrics( SM_CXICONSPACING
);
804 if (uiParam
< 32) uiParam
= 32;
806 wsprintfW(buf
, CSu
, uiParam
);
807 if (SYSPARAMS_Save( SPI_ICONHORIZONTALSPACING_REGKEY
,
808 SPI_ICONHORIZONTALSPACING_VALNAME
,
811 SYSMETRICS_Set( SM_CXICONSPACING
, uiParam
);
812 spi_loaded
[spi_idx
] = TRUE
;
819 case SPI_GETSCREENSAVETIMEOUT
: /* 14 */
820 if (!pvParam
) return FALSE
;
822 spi_idx
= SPI_SETSCREENSAVETIMEOUT_IDX
;
823 if (!spi_loaded
[spi_idx
])
827 if (SYSPARAMS_Load( SPI_SETSCREENSAVETIMEOUT_REGKEY
,
828 SPI_SETSCREENSAVETIMEOUT_VALNAME
,
830 screensave_timeout
= atoiW( buf
);
832 spi_loaded
[spi_idx
] = TRUE
;
834 *(INT
*)pvParam
= screensave_timeout
;
837 case SPI_SETSCREENSAVETIMEOUT
: /* 15 */
841 spi_idx
= SPI_SETSCREENSAVETIMEOUT_IDX
;
842 wsprintfW(buf
, CSu
, uiParam
);
844 if (SYSPARAMS_Save( SPI_SETSCREENSAVETIMEOUT_REGKEY
,
845 SPI_SETSCREENSAVETIMEOUT_VALNAME
,
848 screensave_timeout
= uiParam
;
849 spi_loaded
[spi_idx
] = TRUE
;
856 case SPI_GETSCREENSAVEACTIVE
: /* 16 */
857 if (!pvParam
) return FALSE
;
858 *(BOOL
*)pvParam
= USER_Driver
.pGetScreenSaveActive();
861 case SPI_SETSCREENSAVEACTIVE
: /* 17 */
865 wsprintfW(buf
, CSu
, uiParam
);
866 USER_Driver
.pSetScreenSaveActive( uiParam
);
867 /* saved value does not affect Wine */
868 SYSPARAMS_Save( SPI_SETSCREENSAVEACTIVE_REGKEY
,
869 SPI_SETSCREENSAVEACTIVE_VALNAME
,
874 case SPI_GETGRIDGRANULARITY
: /* 18 */
875 if (!pvParam
) return FALSE
;
877 spi_idx
= SPI_SETGRIDGRANULARITY_IDX
;
878 if (!spi_loaded
[spi_idx
])
882 if (SYSPARAMS_Load( SPI_SETGRIDGRANULARITY_REGKEY
,
883 SPI_SETGRIDGRANULARITY_VALNAME
,
885 grid_granularity
= atoiW( buf
);
887 spi_loaded
[spi_idx
] = TRUE
;
889 *(INT
*)pvParam
= grid_granularity
;
892 case SPI_SETGRIDGRANULARITY
: /* 19 */
896 spi_idx
= SPI_SETGRIDGRANULARITY_IDX
;
897 wsprintfW(buf
, CSu
, uiParam
);
899 if (SYSPARAMS_Save( SPI_SETGRIDGRANULARITY_REGKEY
,
900 SPI_SETGRIDGRANULARITY_VALNAME
,
903 grid_granularity
= uiParam
;
904 spi_loaded
[spi_idx
] = TRUE
;
911 case SPI_SETDESKWALLPAPER
: /* 20 */
912 if (!pvParam
|| !SetDeskWallPaper( (LPSTR
)pvParam
)) return FALSE
;
913 SYSPARAMS_Save(SPI_SETDESKWALLPAPER_REGKEY
, SPI_SETDESKWALLPAPER_VALNAME
, pvParam
, fWinIni
);
916 case SPI_SETDESKPATTERN
: /* 21 */
917 /* FIXME: the ability to specify a pattern in pvParam
918 doesn't seem to be documented for Win32 */
919 if ((INT16
)uiParam
== -1)
922 GetProfileStringW( Desktop
, Pattern
,
924 buf
, sizeof(buf
)/sizeof(WCHAR
) );
925 ret
= DESKTOP_SetPattern( buf
);
927 ret
= DESKTOP_SetPattern( (LPWSTR
)pvParam
);
930 case SPI_GETKEYBOARDDELAY
: /* 22 */
931 if (!pvParam
) return FALSE
;
933 spi_idx
= SPI_SETKEYBOARDDELAY_IDX
;
934 if (!spi_loaded
[spi_idx
])
938 if (SYSPARAMS_Load( SPI_SETKEYBOARDDELAY_REGKEY
,
939 SPI_SETKEYBOARDDELAY_VALNAME
,
942 int i
= atoiW( buf
);
943 if ( (i
>= 0) && (i
<= 3)) keyboard_delay
= i
;
946 spi_loaded
[spi_idx
] = TRUE
;
948 *(INT
*)pvParam
= keyboard_delay
;
951 case SPI_SETKEYBOARDDELAY
: /* 23 */
955 spi_idx
= SPI_SETKEYBOARDDELAY_IDX
;
956 wsprintfW(buf
, CSu
, uiParam
);
958 if (SYSPARAMS_Save( SPI_SETKEYBOARDDELAY_REGKEY
,
959 SPI_SETKEYBOARDDELAY_VALNAME
,
963 keyboard_delay
= uiParam
;
964 spi_loaded
[spi_idx
] = TRUE
;
971 case SPI_ICONVERTICALSPACING
: /* 24 */
972 spi_idx
= SPI_ICONVERTICALSPACING_IDX
;
975 if (!spi_loaded
[spi_idx
])
980 if (SYSPARAMS_Load( SPI_ICONVERTICALSPACING_REGKEY
,
981 SPI_ICONVERTICALSPACING_VALNAME
, buf
, sizeof(buf
) ))
983 val
= SYSPARAMS_Twips2Pixels( atoiW(buf
) );
984 SYSMETRICS_Set( SM_CYICONSPACING
, val
);
986 spi_loaded
[spi_idx
] = TRUE
;
989 *(INT
*)pvParam
= GetSystemMetrics( SM_CYICONSPACING
);
995 if (uiParam
< 32) uiParam
= 32;
997 wsprintfW(buf
, CSu
, uiParam
);
998 if (SYSPARAMS_Save( SPI_ICONVERTICALSPACING_REGKEY
,
999 SPI_ICONVERTICALSPACING_VALNAME
,
1002 SYSMETRICS_Set( SM_CYICONSPACING
, uiParam
);
1003 spi_loaded
[spi_idx
] = TRUE
;
1011 case SPI_GETICONTITLEWRAP
: /* 25 */
1012 if (!pvParam
) return FALSE
;
1014 spi_idx
= SPI_SETICONTITLEWRAP_IDX
;
1015 if (!spi_loaded
[spi_idx
])
1019 if (SYSPARAMS_Load( SPI_SETICONTITLEWRAP_REGKEY1
,
1020 SPI_SETICONTITLEWRAP_VALNAME
, buf
, sizeof(buf
) ))
1021 icon_title_wrap
= atoiW(buf
);
1022 spi_loaded
[spi_idx
] = TRUE
;
1025 *(BOOL
*)pvParam
= icon_title_wrap
;
1028 case SPI_SETICONTITLEWRAP
: /* 26 */
1032 spi_idx
= SPI_SETICONTITLEWRAP_IDX
;
1033 wsprintfW(buf
, CSu
, uiParam
);
1034 if (SYSPARAMS_Save( SPI_SETICONTITLEWRAP_REGKEY1
,
1035 SPI_SETICONTITLEWRAP_VALNAME
,
1038 SYSPARAMS_Save( SPI_SETICONTITLEWRAP_REGKEY2
,
1039 SPI_SETICONTITLEWRAP_VALNAME
,
1041 icon_title_wrap
= uiParam
;
1042 spi_loaded
[spi_idx
] = TRUE
;
1049 case SPI_GETMENUDROPALIGNMENT
: /* 27 */
1050 if (!pvParam
) return FALSE
;
1052 spi_idx
= SPI_SETMENUDROPALIGNMENT_IDX
;
1054 if (!spi_loaded
[spi_idx
])
1058 if (SYSPARAMS_Load( SPI_SETMENUDROPALIGNMENT_REGKEY1
,
1059 SPI_SETMENUDROPALIGNMENT_VALNAME
, buf
, sizeof(buf
) ))
1061 SYSMETRICS_Set( SM_MENUDROPALIGNMENT
, atoiW( buf
) );
1063 spi_loaded
[spi_idx
] = TRUE
;
1066 *(BOOL
*)pvParam
= GetSystemMetrics( SM_MENUDROPALIGNMENT
);
1069 case SPI_SETMENUDROPALIGNMENT
: /* 28 */
1072 spi_idx
= SPI_SETMENUDROPALIGNMENT_IDX
;
1074 wsprintfW(buf
, CSu
, uiParam
);
1075 if (SYSPARAMS_Save( SPI_SETMENUDROPALIGNMENT_REGKEY1
,
1076 SPI_SETMENUDROPALIGNMENT_VALNAME
,
1079 SYSPARAMS_Save( SPI_SETMENUDROPALIGNMENT_REGKEY2
,
1080 SPI_SETMENUDROPALIGNMENT_VALNAME
,
1082 SYSMETRICS_Set( SM_MENUDROPALIGNMENT
, uiParam
);
1083 spi_loaded
[spi_idx
] = TRUE
;
1090 case SPI_SETDOUBLECLKWIDTH
: /* 29 */
1093 spi_idx
= SPI_SETDOUBLECLKWIDTH_IDX
;
1095 wsprintfW(buf
, CSu
, uiParam
);
1096 if (SYSPARAMS_Save( SPI_SETDOUBLECLKWIDTH_REGKEY1
,
1097 SPI_SETDOUBLECLKWIDTH_VALNAME
,
1100 SYSPARAMS_Save( SPI_SETDOUBLECLKWIDTH_REGKEY2
,
1101 SPI_SETDOUBLECLKWIDTH_VALNAME
,
1103 SYSMETRICS_Set( SM_CXDOUBLECLK
, uiParam
);
1104 spi_loaded
[spi_idx
] = TRUE
;
1111 case SPI_SETDOUBLECLKHEIGHT
: /* 30 */
1114 spi_idx
= SPI_SETDOUBLECLKHEIGHT_IDX
;
1116 wsprintfW(buf
, CSu
, uiParam
);
1117 if (SYSPARAMS_Save( SPI_SETDOUBLECLKHEIGHT_REGKEY1
,
1118 SPI_SETDOUBLECLKHEIGHT_VALNAME
,
1121 SYSPARAMS_Save( SPI_SETDOUBLECLKHEIGHT_REGKEY2
,
1122 SPI_SETDOUBLECLKHEIGHT_VALNAME
,
1124 SYSMETRICS_Set( SM_CYDOUBLECLK
, uiParam
);
1125 spi_loaded
[spi_idx
] = TRUE
;
1132 case SPI_GETICONTITLELOGFONT
: /* 31 */
1134 LPLOGFONTW lpLogFont
= (LPLOGFONTW
)pvParam
;
1137 if (!pvParam
) return FALSE
;
1140 * The 'default GDI fonts' seems to be returned.
1141 * If a returned font is not a correct font in your environment,
1142 * please try to fix objects/gdiobj.c at first.
1144 SYSPARAMS_GetGUIFont( &lfDefault
);
1146 GetProfileStringW( Desktop
, IconTitleFaceName
,
1147 lfDefault
.lfFaceName
,
1148 lpLogFont
->lfFaceName
, LF_FACESIZE
);
1149 lpLogFont
->lfHeight
= -GetProfileIntW( Desktop
, IconTitleSize
, 11 );
1150 lpLogFont
->lfWidth
= 0;
1151 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
1152 lpLogFont
->lfWeight
= FW_NORMAL
;
1153 lpLogFont
->lfItalic
= FALSE
;
1154 lpLogFont
->lfStrikeOut
= FALSE
;
1155 lpLogFont
->lfUnderline
= FALSE
;
1156 lpLogFont
->lfCharSet
= lfDefault
.lfCharSet
; /* at least 'charset' should not be hard-coded */
1157 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
1158 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
1159 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
;
1160 lpLogFont
->lfQuality
= DEFAULT_QUALITY
;
1164 case SPI_SETDOUBLECLICKTIME
: /* 32 */
1168 spi_idx
= SPI_SETDOUBLECLICKTIME_IDX
;
1169 wsprintfW(buf
, CSu
, uiParam
);
1171 if (SYSPARAMS_Save( SPI_SETDOUBLECLICKTIME_REGKEY
,
1172 SPI_SETDOUBLECLICKTIME_VALNAME
,
1177 double_click_time
= uiParam
;
1178 spi_loaded
[spi_idx
] = TRUE
;
1185 case SPI_SETMOUSEBUTTONSWAP
: /* 33 */
1188 spi_idx
= SPI_SETMOUSEBUTTONSWAP_IDX
;
1190 wsprintfW(buf
, CSu
, uiParam
);
1191 if (SYSPARAMS_Save( SPI_SETMOUSEBUTTONSWAP_REGKEY
,
1192 SPI_SETMOUSEBUTTONSWAP_VALNAME
,
1195 SYSMETRICS_Set( SM_SWAPBUTTON
, uiParam
);
1196 spi_loaded
[spi_idx
] = TRUE
;
1203 WINE_SPI_FIXME(SPI_SETICONTITLELOGFONT
); /* 34 */
1205 case SPI_GETFASTTASKSWITCH
: /* 35 */
1206 if (!pvParam
) return FALSE
;
1207 *(BOOL
*)pvParam
= 1;
1210 case SPI_SETFASTTASKSWITCH
: /* 36 */
1211 /* the action is disabled */
1215 case SPI_SETDRAGFULLWINDOWS
: /* 37 WINVER >= 0x0400 */
1219 spi_idx
= SPI_SETDRAGFULLWINDOWS_IDX
;
1220 wsprintfW(buf
, CSu
, uiParam
);
1221 if (SYSPARAMS_Save( SPI_SETDRAGFULLWINDOWS_REGKEY
,
1222 SPI_SETDRAGFULLWINDOWS_VALNAME
,
1225 drag_full_windows
= uiParam
;
1226 spi_loaded
[spi_idx
] = TRUE
;
1233 case SPI_GETDRAGFULLWINDOWS
: /* 38 WINVER >= 0x0400 */
1234 if (!pvParam
) return FALSE
;
1236 spi_idx
= SPI_SETDRAGFULLWINDOWS_IDX
;
1237 if (!spi_loaded
[spi_idx
])
1241 if (SYSPARAMS_Load( SPI_SETDRAGFULLWINDOWS_REGKEY
,
1242 SPI_SETDRAGFULLWINDOWS_VALNAME
, buf
, sizeof(buf
) ))
1243 drag_full_windows
= atoiW(buf
);
1244 spi_loaded
[spi_idx
] = TRUE
;
1247 *(BOOL
*)pvParam
= drag_full_windows
;
1250 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
1252 LPNONCLIENTMETRICSW lpnm
= (LPNONCLIENTMETRICSW
)pvParam
;
1254 if (!pvParam
) return FALSE
;
1256 if (lpnm
->cbSize
== sizeof(NONCLIENTMETRICSW
))
1258 /* clear the struct, so we have 'sane' members */
1260 (char *)pvParam
+ sizeof(lpnm
->cbSize
),
1262 lpnm
->cbSize
- sizeof(lpnm
->cbSize
)
1265 /* initialize geometry entries */
1266 lpnm
->iBorderWidth
= 1;
1267 lpnm
->iScrollWidth
= GetSystemMetrics(SM_CXVSCROLL
);
1268 lpnm
->iScrollHeight
= GetSystemMetrics(SM_CYHSCROLL
);
1270 /* size of the normal caption buttons */
1271 lpnm
->iCaptionWidth
= GetSystemMetrics(SM_CXSIZE
);
1272 lpnm
->iCaptionHeight
= GetSystemMetrics(SM_CYSIZE
);
1274 /* caption font metrics */
1275 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfCaptionFont
), 0 );
1276 lpnm
->lfCaptionFont
.lfWeight
= FW_BOLD
;
1278 /* size of the small caption buttons */
1279 lpnm
->iSmCaptionWidth
= GetSystemMetrics(SM_CXSMSIZE
);
1280 lpnm
->iSmCaptionHeight
= GetSystemMetrics(SM_CYSMSIZE
);
1282 /* small caption font metrics */
1283 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfSmCaptionFont
), 0 );
1285 /* menus, FIXME: names of wine.conf entries are bogus */
1287 /* size of the menu (MDI) buttons */
1288 lpnm
->iMenuWidth
= GetSystemMetrics(SM_CXMENUSIZE
);
1289 lpnm
->iMenuHeight
= GetSystemMetrics(SM_CYMENUSIZE
);
1291 /* menu font metrics */
1292 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfMenuFont
), 0 );
1293 GetProfileStringW( Desktop
, MenuFont
,
1294 (TWEAK_WineLook
> WIN31_LOOK
) ? lpnm
->lfCaptionFont
.lfFaceName
: System
,
1295 lpnm
->lfMenuFont
.lfFaceName
, LF_FACESIZE
);
1296 lpnm
->lfMenuFont
.lfHeight
= -GetProfileIntW( Desktop
, MenuFontSize
, 11 );
1297 lpnm
->lfMenuFont
.lfWeight
= (TWEAK_WineLook
> WIN31_LOOK
) ? FW_NORMAL
: FW_BOLD
;
1299 /* status bar font metrics */
1300 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0,
1301 (LPVOID
)&(lpnm
->lfStatusFont
), 0 );
1302 /* message font metrics */
1303 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0,
1304 (LPVOID
)&(lpnm
->lfMessageFont
), 0 );
1308 WARN("size mismatch !! (is %d; should be %d)\n", lpnm
->cbSize
, sizeof(NONCLIENTMETRICSW
));
1309 /* FIXME: SetLastError? */
1314 WINE_SPI_FIXME(SPI_SETNONCLIENTMETRICS
); /* 42 WINVER >= 0x400 */
1316 case SPI_GETMINIMIZEDMETRICS
: /* 43 WINVER >= 0x400 */
1318 MINIMIZEDMETRICS
* lpMm
= pvParam
;
1319 if (lpMm
&& lpMm
->cbSize
== sizeof(*lpMm
))
1321 /* these taken from Win2k SP3 */
1331 WINE_SPI_FIXME(SPI_SETMINIMIZEDMETRICS
); /* 44 WINVER >= 0x400 */
1333 case SPI_GETICONMETRICS
: /* 45 WINVER >= 0x400 */
1335 LPICONMETRICSW lpIcon
= pvParam
;
1336 if(lpIcon
&& lpIcon
->cbSize
== sizeof(*lpIcon
))
1338 SystemParametersInfoW( SPI_ICONHORIZONTALSPACING
, 0,
1339 &lpIcon
->iHorzSpacing
, FALSE
);
1340 SystemParametersInfoW( SPI_ICONVERTICALSPACING
, 0,
1341 &lpIcon
->iVertSpacing
, FALSE
);
1342 SystemParametersInfoW( SPI_GETICONTITLEWRAP
, 0,
1343 &lpIcon
->iTitleWrap
, FALSE
);
1344 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0,
1345 &lpIcon
->lfFont
, FALSE
);
1353 WINE_SPI_FIXME(SPI_SETICONMETRICS
); /* 46 WINVER >= 0x400 */
1355 case SPI_SETWORKAREA
: /* 47 WINVER >= 0x400 */
1357 static const WCHAR CSld
[]={'%','l','d',' ','%','l','d',' ','%','l','d',' ','%','l','d',0};
1359 RECT
*pr
= (RECT
*) pvParam
;
1361 if (!pvParam
) return FALSE
;
1363 spi_idx
= SPI_SETWORKAREA_IDX
;
1364 wsprintfW(buf
, CSld
, pr
->left
, pr
->top
,
1365 pr
->right
, pr
->bottom
);
1367 if (SYSPARAMS_Save( SPI_SETWORKAREA_REGKEY
,
1368 SPI_SETWORKAREA_VALNAME
,
1371 CopyRect( &work_area
, (RECT
*)pvParam
);
1372 spi_loaded
[spi_idx
] = TRUE
;
1379 case SPI_GETWORKAREA
: /* 48 WINVER >= 0x400 */
1380 if (!pvParam
) return FALSE
;
1382 spi_idx
= SPI_SETWORKAREA_IDX
;
1383 if (!spi_loaded
[spi_idx
])
1387 SetRect( &work_area
, 0, 0,
1388 GetSystemMetrics( SM_CXSCREEN
),
1389 GetSystemMetrics( SM_CYSCREEN
) );
1391 if (SYSPARAMS_Load( SPI_SETWORKAREA_REGKEY
,
1392 SPI_SETWORKAREA_VALNAME
,
1396 WideCharToMultiByte( CP_ACP
, 0, buf
, -1,
1397 tmpbuf
, sizeof(tmpbuf
), NULL
, NULL
);
1398 sscanf( tmpbuf
, "%ld %ld %ld %ld",
1399 &work_area
.left
, &work_area
.top
,
1400 &work_area
.right
, &work_area
.bottom
);
1402 spi_loaded
[spi_idx
] = TRUE
;
1404 CopyRect( (RECT
*)pvParam
, &work_area
);
1408 WINE_SPI_FIXME(SPI_SETPENWINDOWS
); /* 49 WINVER >= 0x400 */
1410 case SPI_GETFILTERKEYS
: /* 50 */
1412 LPFILTERKEYS lpFilterKeys
= (LPFILTERKEYS
)pvParam
;
1413 WARN("SPI_GETFILTERKEYS not fully implemented\n");
1414 if (lpFilterKeys
&& lpFilterKeys
->cbSize
== sizeof(FILTERKEYS
))
1416 /* Indicate that no FilterKeys feature available */
1417 lpFilterKeys
->dwFlags
= 0;
1418 lpFilterKeys
->iWaitMSec
= 0;
1419 lpFilterKeys
->iDelayMSec
= 0;
1420 lpFilterKeys
->iRepeatMSec
= 0;
1421 lpFilterKeys
->iBounceMSec
= 0;
1429 WINE_SPI_FIXME(SPI_SETFILTERKEYS
); /* 51 */
1431 case SPI_GETTOGGLEKEYS
: /* 52 */
1433 LPTOGGLEKEYS lpToggleKeys
= (LPTOGGLEKEYS
)pvParam
;
1434 WARN("SPI_GETTOGGLEKEYS not fully implemented\n");
1435 if (lpToggleKeys
&& lpToggleKeys
->cbSize
== sizeof(TOGGLEKEYS
))
1437 /* Indicate that no ToggleKeys feature available */
1438 lpToggleKeys
->dwFlags
= 0;
1446 WINE_SPI_FIXME(SPI_SETTOGGLEKEYS
); /* 53 */
1448 case SPI_GETMOUSEKEYS
: /* 54 */
1450 LPMOUSEKEYS lpMouseKeys
= (LPMOUSEKEYS
)pvParam
;
1451 WARN("SPI_GETMOUSEKEYS not fully implemented\n");
1452 if (lpMouseKeys
&& lpMouseKeys
->cbSize
== sizeof(MOUSEKEYS
))
1454 /* Indicate that no MouseKeys feature available */
1455 lpMouseKeys
->dwFlags
= 0;
1456 lpMouseKeys
->iMaxSpeed
= 360;
1457 lpMouseKeys
->iTimeToMaxSpeed
= 1000;
1458 lpMouseKeys
->iCtrlSpeed
= 0;
1459 lpMouseKeys
->dwReserved1
= 0;
1460 lpMouseKeys
->dwReserved2
= 0;
1468 WINE_SPI_FIXME(SPI_SETMOUSEKEYS
); /* 55 */
1470 case SPI_GETSHOWSOUNDS
: /* 56 */
1471 if (!pvParam
) return FALSE
;
1473 spi_idx
= SPI_SETSHOWSOUNDS_IDX
;
1475 if (!spi_loaded
[spi_idx
])
1479 if (SYSPARAMS_Load( SPI_SETSHOWSOUNDS_REGKEY
,
1480 SPI_SETSHOWSOUNDS_VALNAME
, buf
, sizeof(buf
) ))
1482 SYSMETRICS_Set( SM_SHOWSOUNDS
, atoiW( buf
) );
1484 spi_loaded
[spi_idx
] = TRUE
;
1487 *(INT
*)pvParam
= GetSystemMetrics( SM_SHOWSOUNDS
);
1490 case SPI_SETSHOWSOUNDS
: /* 57 */
1493 spi_idx
= SPI_SETSHOWSOUNDS_IDX
;
1495 wsprintfW(buf
, CSu
, uiParam
);
1496 if (SYSPARAMS_Save( SPI_SETSHOWSOUNDS_REGKEY
,
1497 SPI_SETSHOWSOUNDS_VALNAME
,
1500 SYSMETRICS_Set( SM_SHOWSOUNDS
, uiParam
);
1501 spi_loaded
[spi_idx
] = TRUE
;
1508 case SPI_GETSTICKYKEYS
: /* 58 */
1510 LPSTICKYKEYS lpStickyKeys
= (LPSTICKYKEYS
)pvParam
;
1511 WARN("SPI_GETSTICKYKEYS not fully implemented\n");
1512 if (lpStickyKeys
&& lpStickyKeys
->cbSize
== sizeof(STICKYKEYS
))
1514 /* Indicate that no StickyKeys feature available */
1515 lpStickyKeys
->dwFlags
= 0;
1523 WINE_SPI_FIXME(SPI_SETSTICKYKEYS
); /* 59 */
1525 case SPI_GETACCESSTIMEOUT
: /* 60 */
1527 LPACCESSTIMEOUT lpAccessTimeout
= (LPACCESSTIMEOUT
)pvParam
;
1528 WARN("SPI_GETACCESSTIMEOUT not fully implemented\n");
1529 if (lpAccessTimeout
&& lpAccessTimeout
->cbSize
== sizeof(ACCESSTIMEOUT
))
1531 /* Indicate that no accessibility features timeout is available */
1532 lpAccessTimeout
->dwFlags
= 0;
1533 lpAccessTimeout
->iTimeOutMSec
= 0;
1541 WINE_SPI_FIXME(SPI_SETACCESSTIMEOUT
); /* 61 */
1543 case SPI_GETSERIALKEYS
: /* 62 WINVER >= 0x400 */
1545 LPSERIALKEYSW lpSerialKeysW
= (LPSERIALKEYSW
)pvParam
;
1546 WARN("SPI_GETSERIALKEYS not fully implemented\n");
1547 if (lpSerialKeysW
&& lpSerialKeysW
->cbSize
== sizeof(SERIALKEYSW
))
1549 /* Indicate that no SerialKeys feature available */
1550 lpSerialKeysW
->dwFlags
= 0;
1551 lpSerialKeysW
->lpszActivePort
= NULL
;
1552 lpSerialKeysW
->lpszPort
= NULL
;
1553 lpSerialKeysW
->iBaudRate
= 0;
1554 lpSerialKeysW
->iPortState
= 0;
1562 WINE_SPI_FIXME(SPI_SETSERIALKEYS
); /* 63 WINVER >= 0x400 */
1564 case SPI_GETSOUNDSENTRY
: /* 64 */
1566 LPSOUNDSENTRYW lpSoundSentryW
= (LPSOUNDSENTRYW
)pvParam
;
1567 WARN("SPI_GETSOUNDSENTRY not fully implemented\n");
1568 if (lpSoundSentryW
&& lpSoundSentryW
->cbSize
== sizeof(SOUNDSENTRYW
))
1570 /* Indicate that no SoundSentry feature available */
1571 lpSoundSentryW
->dwFlags
= 0;
1572 lpSoundSentryW
->iFSTextEffect
= 0;
1573 lpSoundSentryW
->iFSTextEffectMSec
= 0;
1574 lpSoundSentryW
->iFSTextEffectColorBits
= 0;
1575 lpSoundSentryW
->iFSGrafEffect
= 0;
1576 lpSoundSentryW
->iFSGrafEffectMSec
= 0;
1577 lpSoundSentryW
->iFSGrafEffectColor
= 0;
1578 lpSoundSentryW
->iWindowsEffect
= 0;
1579 lpSoundSentryW
->iWindowsEffectMSec
= 0;
1580 lpSoundSentryW
->lpszWindowsEffectDLL
= 0;
1581 lpSoundSentryW
->iWindowsEffectOrdinal
= 0;
1589 WINE_SPI_FIXME(SPI_SETSOUNDSENTRY
); /* 65 */
1591 case SPI_GETHIGHCONTRAST
: /* 66 WINVER >= 0x400 */
1593 LPHIGHCONTRASTW lpHighContrastW
= (LPHIGHCONTRASTW
)pvParam
;
1594 WARN("SPI_GETHIGHCONTRAST not fully implemented\n");
1595 if (lpHighContrastW
&& lpHighContrastW
->cbSize
== sizeof(HIGHCONTRASTW
))
1597 /* Indicate that no high contrast feature available */
1598 lpHighContrastW
->dwFlags
= 0;
1599 lpHighContrastW
->lpszDefaultScheme
= NULL
;
1607 WINE_SPI_FIXME(SPI_SETHIGHCONTRAST
); /* 67 WINVER >= 0x400 */
1609 case SPI_GETKEYBOARDPREF
: /* 68 WINVER >= 0x400 */
1610 if (!pvParam
) return FALSE
;
1612 spi_idx
= SPI_SETKEYBOARDPREF_IDX
;
1613 if (!spi_loaded
[spi_idx
])
1617 if (SYSPARAMS_Load( SPI_SETKEYBOARDPREF_REGKEY
,
1618 SPI_SETKEYBOARDPREF_VALNAME
, buf
, sizeof(buf
) ))
1619 keyboard_pref
= atoiW(buf
);
1620 spi_loaded
[spi_idx
] = TRUE
;
1623 *(BOOL
*)pvParam
= keyboard_pref
;
1626 case SPI_SETKEYBOARDPREF
: /* 69 WINVER >= 0x400 */
1630 spi_idx
= SPI_SETKEYBOARDPREF_IDX
;
1631 wsprintfW(buf
, CSu
, uiParam
);
1632 if (SYSPARAMS_Save( SPI_SETKEYBOARDPREF_REGKEY
,
1633 SPI_SETKEYBOARDPREF_VALNAME
,
1636 keyboard_pref
= uiParam
;
1637 spi_loaded
[spi_idx
] = TRUE
;
1644 case SPI_GETSCREENREADER
: /* 70 WINVER >= 0x400 */
1645 if (!pvParam
) return FALSE
;
1647 spi_idx
= SPI_SETSCREENREADER_IDX
;
1648 if (!spi_loaded
[spi_idx
])
1652 if (SYSPARAMS_Load( SPI_SETSCREENREADER_REGKEY
,
1653 SPI_SETSCREENREADER_VALNAME
, buf
, sizeof(buf
) ))
1654 screen_reader
= atoiW(buf
);
1655 spi_loaded
[spi_idx
] = TRUE
;
1658 *(BOOL
*)pvParam
= screen_reader
;
1661 case SPI_SETSCREENREADER
: /* 71 WINVER >= 0x400 */
1665 spi_idx
= SPI_SETSCREENREADER_IDX
;
1666 wsprintfW(buf
, CSu
, uiParam
);
1667 if (SYSPARAMS_Save( SPI_SETSCREENREADER_REGKEY
,
1668 SPI_SETSCREENREADER_VALNAME
,
1671 screen_reader
= uiParam
;
1672 spi_loaded
[spi_idx
] = TRUE
;
1679 case SPI_GETANIMATION
: /* 72 WINVER >= 0x400 */
1681 LPANIMATIONINFO lpAnimInfo
= (LPANIMATIONINFO
)pvParam
;
1683 /* Tell it "disabled" */
1684 if (lpAnimInfo
&& lpAnimInfo
->cbSize
== sizeof(ANIMATIONINFO
))
1685 lpAnimInfo
->iMinAnimate
= 0; /* Minimise and restore animation is disabled (nonzero == enabled) */
1690 WINE_SPI_WARN(SPI_SETANIMATION
); /* 73 WINVER >= 0x400 */
1692 case SPI_GETFONTSMOOTHING
: /* 74 WINVER >= 0x400 */
1693 if (!pvParam
) return FALSE
;
1695 spi_idx
= SPI_SETFONTSMOOTHING_IDX
;
1696 if (!spi_loaded
[spi_idx
])
1700 if (SYSPARAMS_Load( SPI_SETFONTSMOOTHING_REGKEY
,
1701 SPI_SETFONTSMOOTHING_VALNAME
, buf
, sizeof(buf
) ))
1703 spi_loaded
[spi_idx
] = TRUE
;
1704 if (buf
[0] == 0x01 || buf
[0] == 0x02) /* 0x01 for 95/98/NT, 0x02 for 98/ME/2k/XP */
1706 font_smoothing
= TRUE
;
1711 *(BOOL
*)pvParam
= font_smoothing
;
1715 WINE_SPI_FIXME(SPI_SETFONTSMOOTHING
); /* 75 WINVER >= 0x400 */
1717 WINE_SPI_FIXME(SPI_SETDRAGWIDTH
); /* 76 WINVER >= 0x400 */
1718 WINE_SPI_FIXME(SPI_SETDRAGHEIGHT
); /* 77 WINVER >= 0x400 */
1720 WINE_SPI_FIXME(SPI_SETHANDHELD
); /* 78 WINVER >= 0x400 */
1722 WINE_SPI_FIXME(SPI_GETLOWPOWERTIMEOUT
); /* 79 WINVER >= 0x400 */
1723 WINE_SPI_FIXME(SPI_GETPOWEROFFTIMEOUT
); /* 80 WINVER >= 0x400 */
1724 WINE_SPI_FIXME(SPI_SETLOWPOWERTIMEOUT
); /* 81 WINVER >= 0x400 */
1725 WINE_SPI_FIXME(SPI_SETPOWEROFFTIMEOUT
); /* 82 WINVER >= 0x400 */
1726 WINE_SPI_FIXME(SPI_GETLOWPOWERACTIVE
); /* 83 WINVER >= 0x400 */
1727 WINE_SPI_FIXME(SPI_GETPOWEROFFACTIVE
); /* 84 WINVER >= 0x400 */
1728 WINE_SPI_FIXME(SPI_SETLOWPOWERACTIVE
); /* 85 WINVER >= 0x400 */
1729 WINE_SPI_FIXME(SPI_SETPOWEROFFACTIVE
); /* 86 WINVER >= 0x400 */
1731 WINE_SPI_FIXME(SPI_SETCURSORS
); /* 87 WINVER >= 0x400 */
1732 WINE_SPI_FIXME(SPI_SETICONS
); /* 88 WINVER >= 0x400 */
1734 case SPI_GETDEFAULTINPUTLANG
: /* 89 WINVER >= 0x400 */
1735 ret
= GetKeyboardLayout(0) ? TRUE
: FALSE
;
1738 WINE_SPI_FIXME(SPI_SETDEFAULTINPUTLANG
); /* 90 WINVER >= 0x400 */
1740 WINE_SPI_FIXME(SPI_SETLANGTOGGLE
); /* 91 WINVER >= 0x400 */
1742 case SPI_GETWINDOWSEXTENSION
: /* 92 WINVER >= 0x400 */
1743 WARN("pretend no support for Win9x Plus! for now.\n");
1744 ret
= FALSE
; /* yes, this is the result value */
1747 WINE_SPI_FIXME(SPI_SETMOUSETRAILS
); /* 93 WINVER >= 0x400 */
1748 WINE_SPI_FIXME(SPI_GETMOUSETRAILS
); /* 94 WINVER >= 0x400 */
1750 case SPI_SETSCREENSAVERRUNNING
: /* 97 WINVER >= 0x400 */
1752 /* SPI_SCREENSAVERRUNNING is an alias for SPI_SETSCREENSAVERRUNNING */
1755 spi_idx
= SPI_SETSCREENSAVERRUNNING_IDX
;
1756 wsprintfW(buf
, CSu
, uiParam
);
1758 /* save only temporarily */
1759 if (SYSPARAMS_Save( SPI_SETSCREENSAVERRUNNING_REGKEY
,
1760 SPI_SETSCREENSAVERRUNNING_VALNAME
,
1763 screensaver_running
= uiParam
;
1764 spi_loaded
[spi_idx
] = TRUE
;
1771 case SPI_GETMOUSEHOVERWIDTH
: /* 98 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1772 if (!pvParam
) return FALSE
;
1773 *(UINT
*)pvParam
= 4;
1776 WINE_SPI_FIXME(SPI_SETMOUSEHOVERWIDTH
); /* 99 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1778 case SPI_GETMOUSEHOVERHEIGHT
: /* 100 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1779 if (!pvParam
) return FALSE
;
1780 *(UINT
*)pvParam
= 4;
1783 WINE_SPI_FIXME(SPI_SETMOUSEHOVERHEIGHT
); /* 101 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1785 case SPI_GETMOUSEHOVERTIME
: /* 102 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1786 if (!pvParam
) return FALSE
;
1787 *(UINT
*)pvParam
= 400; /* default for menu dropdowns */
1790 WINE_SPI_FIXME(SPI_SETMOUSEHOVERTIME
); /* 103 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1792 case SPI_GETWHEELSCROLLLINES
: /* 104 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1793 if (!pvParam
) return FALSE
;
1794 *(UINT
*)pvParam
= 3; /* default for num scroll lines */
1797 WINE_SPI_FIXME(SPI_SETWHEELSCROLLLINES
); /* 105 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1799 case SPI_GETMENUSHOWDELAY
: /* 106 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1800 if (!pvParam
) return FALSE
;
1801 *(UINT
*)pvParam
= 400; /* Tested against Windows NT 4.0 and Windows 2000 */
1804 WINE_SPI_FIXME(SPI_GETSHOWIMEUI
); /* 110 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1805 WINE_SPI_FIXME(SPI_SETSHOWIMEUI
); /* 111 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
1807 case SPI_GETSCREENSAVERRUNNING
: /* 114 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1808 if (!pvParam
) return FALSE
;
1810 spi_idx
= SPI_SETSCREENSAVERRUNNING_IDX
;
1811 if (!spi_loaded
[spi_idx
])
1815 if (SYSPARAMS_Load( SPI_SETSCREENSAVERRUNNING_REGKEY
,
1816 SPI_SETSCREENSAVERRUNNING_VALNAME
, buf
, sizeof(buf
) ))
1817 screensaver_running
= atoiW( buf
);
1818 spi_loaded
[spi_idx
] = TRUE
;
1821 *(BOOL
*)pvParam
= screensaver_running
;
1824 case SPI_GETDESKWALLPAPER
: /* 115 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1826 WCHAR buf
[MAX_PATH
];
1828 if (!pvParam
) return FALSE
;
1830 if (uiParam
> MAX_PATH
)
1835 if (SYSPARAMS_Load(SPI_SETDESKWALLPAPER_REGKEY
, SPI_SETDESKWALLPAPER_VALNAME
, buf
, sizeof(buf
)))
1837 lstrcpynW((WCHAR
*)pvParam
, buf
, uiParam
);
1841 /* Return an empty string */
1842 memset((WCHAR
*)pvParam
, 0, uiParam
);
1848 WINE_SPI_FIXME(SPI_GETACTIVEWINDOWTRACKING
);/* 0x1000 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1849 WINE_SPI_FIXME(SPI_SETACTIVEWINDOWTRACKING
);/* 0x1001 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1850 WINE_SPI_FIXME(SPI_GETMENUANIMATION
); /* 0x1002 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1851 WINE_SPI_FIXME(SPI_SETMENUANIMATION
); /* 0x1003 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1852 WINE_SPI_FIXME(SPI_GETCOMBOBOXANIMATION
); /* 0x1004 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1853 WINE_SPI_FIXME(SPI_SETCOMBOBOXANIMATION
); /* 0x1005 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1855 case SPI_GETLISTBOXSMOOTHSCROLLING
: /* 0x1006 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1856 if (!pvParam
) return FALSE
;
1858 spi_idx
= SPI_SETLISTBOXSMOOTHSCROLLING_IDX
;
1859 if (!spi_loaded
[spi_idx
])
1863 if (SYSPARAMS_Load( SPI_SETLISTBOXSMOOTHSCROLLING_REGKEY
,
1864 SPI_SETLISTBOXSMOOTHSCROLLING_VALNAME
, buf
, sizeof(buf
) ))
1866 if ((buf
[0]&0x01) == 0x01)
1868 listbox_smoothscrolling
= TRUE
;
1871 spi_loaded
[spi_idx
] = TRUE
;
1874 *(BOOL
*)pvParam
= listbox_smoothscrolling
;
1878 WINE_SPI_FIXME(SPI_SETLISTBOXSMOOTHSCROLLING
);/* 0x1007 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1880 case SPI_GETGRADIENTCAPTIONS
: /* 0x1008 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1881 if (!pvParam
) return FALSE
;
1883 spi_idx
= SPI_SETGRADIENTCAPTIONS_IDX
;
1884 if (!spi_loaded
[spi_idx
])
1888 if (SYSPARAMS_Load( SPI_USERPREFERENCEMASK_REGKEY
,
1889 SPI_USERPREFERENCEMASK_VALNAME
, buf
, sizeof(buf
) ))
1891 if ((buf
[0]&0x10) == 0x10)
1893 gradient_captions
= TRUE
;
1896 spi_loaded
[spi_idx
] = TRUE
;
1899 *(BOOL
*)pvParam
= gradient_captions
;
1903 WINE_SPI_FIXME(SPI_SETGRADIENTCAPTIONS
); /* 0x1009 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1905 case SPI_GETKEYBOARDCUES
: /* 0x100A _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1906 if (!pvParam
) return FALSE
;
1908 spi_idx
= SPI_SETKEYBOARDCUES_IDX
;
1909 if (!spi_loaded
[spi_idx
])
1913 if (SYSPARAMS_Load( SPI_USERPREFERENCEMASK_REGKEY
,
1914 SPI_USERPREFERENCEMASK_VALNAME
, buf
, sizeof(buf
) ))
1916 if ((buf
[0]&0x20) == 0x20)
1918 keyboard_cues
= TRUE
;
1921 spi_loaded
[spi_idx
] = TRUE
;
1924 *(BOOL
*)pvParam
= keyboard_cues
;
1928 WINE_SPI_FIXME(SPI_SETKEYBOARDCUES
); /* 0x100B _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1929 WINE_SPI_FIXME(SPI_GETACTIVEWNDTRKZORDER
); /* 0x100C _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1930 WINE_SPI_FIXME(SPI_SETACTIVEWNDTRKZORDER
); /* 0x100D _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1931 case SPI_GETHOTTRACKING
: /* 0x100E _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1932 if (!pvParam
) return FALSE
;
1934 spi_idx
= SPI_SETHOTTRACKING_IDX
;
1935 if (!spi_loaded
[spi_idx
])
1939 if (SYSPARAMS_Load( SPI_USERPREFERENCEMASK_REGKEY
,
1940 SPI_USERPREFERENCEMASK_VALNAME
, buf
, sizeof(buf
) ))
1942 if ((buf
[0]&0x80) == 0x80)
1944 hot_tracking
= TRUE
;
1947 spi_loaded
[spi_idx
] = TRUE
;
1950 *(BOOL
*)pvParam
= hot_tracking
;
1954 WINE_SPI_FIXME(SPI_SETHOTTRACKING
); /* 0x100F _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1955 WINE_SPI_FIXME(SPI_GETSELECTIONFADE
); /* 0x1014 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1956 WINE_SPI_FIXME(SPI_SETSELECTIONFADE
); /* 0x1015 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1957 WINE_SPI_FIXME(SPI_GETDROPSHADOW
); /* 0x1024 _WIN32_WINNT >= 0x510 */
1958 WINE_SPI_FIXME(SPI_SETDROPSHADOW
); /* 0x1025 _WIN32_WINNT >= 0x510 */
1959 WINE_SPI_FIXME(SPI_GETFOREGROUNDLOCKTIMEOUT
);/* 0x2000 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1960 WINE_SPI_FIXME(SPI_SETFOREGROUNDLOCKTIMEOUT
);/* 0x2001 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1961 WINE_SPI_FIXME(SPI_GETACTIVEWNDTRKTIMEOUT
); /* 0x2002 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1962 WINE_SPI_FIXME(SPI_SETACTIVEWNDTRKTIMEOUT
); /* 0x2003 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1963 WINE_SPI_FIXME(SPI_GETFOREGROUNDFLASHCOUNT
);/* 0x2004 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1964 WINE_SPI_FIXME(SPI_SETFOREGROUNDFLASHCOUNT
);/* 0x2005 _WIN32_WINNT >= 0x500 || _WIN32_WINDOW > 0x400 */
1967 FIXME( "Unknown action: %u\n", uiAction
);
1968 SetLastError( ERROR_INVALID_SPI_VALUE
);
1974 SYSPARAMS_NotifyChange( uiAction
, fWinIni
);
1977 #undef WINE_SPI_FIXME
1978 #undef WINE_SPI_WARN
1982 /***********************************************************************
1983 * SystemParametersInfo (USER.483)
1985 BOOL16 WINAPI
SystemParametersInfo16( UINT16 uAction
, UINT16 uParam
,
1986 LPVOID lpvParam
, UINT16 fuWinIni
)
1990 TRACE("(%u, %u, %p, %u)\n", uAction
, uParam
, lpvParam
, fuWinIni
);
1994 case SPI_GETBEEP
: /* 1 */
1995 case SPI_GETSCREENSAVEACTIVE
: /* 16 */
1996 case SPI_GETICONTITLEWRAP
: /* 25 */
1997 case SPI_GETMENUDROPALIGNMENT
: /* 27 */
1998 case SPI_GETFASTTASKSWITCH
: /* 35 */
1999 case SPI_GETDRAGFULLWINDOWS
: /* 38 WINVER >= 0x0400 */
2002 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2003 if (ret
&& lpvParam
)
2004 *(BOOL16
*)lpvParam
= tmp
;
2008 case SPI_GETBORDER
: /* 5 */
2009 case SPI_ICONHORIZONTALSPACING
: /* 13 */
2010 case SPI_GETSCREENSAVETIMEOUT
: /* 14 */
2011 case SPI_GETGRIDGRANULARITY
: /* 18 */
2012 case SPI_GETKEYBOARDDELAY
: /* 22 */
2013 case SPI_ICONVERTICALSPACING
: /* 24 */
2016 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2017 if (ret
&& lpvParam
)
2018 *(INT16
*)lpvParam
= tmp
;
2022 case SPI_GETKEYBOARDSPEED
: /* 10 */
2025 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2026 if (ret
&& lpvParam
)
2027 *(WORD
*)lpvParam
= tmp
;
2031 case SPI_GETICONTITLELOGFONT
: /* 31 */
2034 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2035 if (ret
&& lpvParam
)
2036 SYSPARAMS_LogFont32ATo16( &tmp
, (LPLOGFONT16
)lpvParam
);
2040 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
2042 NONCLIENTMETRICSA tmp
;
2043 LPNONCLIENTMETRICS16 lpnm16
= (LPNONCLIENTMETRICS16
)lpvParam
;
2044 if (lpnm16
&& lpnm16
->cbSize
== sizeof(NONCLIENTMETRICS16
))
2046 tmp
.cbSize
= sizeof(NONCLIENTMETRICSA
);
2047 ret
= SystemParametersInfoA( uAction
, uParam
, &tmp
, fuWinIni
);
2049 SYSPARAMS_NonClientMetrics32ATo16( &tmp
, lpnm16
);
2051 else /* winfile 95 sets cbSize to 340 */
2052 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
, fuWinIni
);
2056 case SPI_GETWORKAREA
: /* 48 WINVER >= 0x400 */
2059 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2060 if (ret
&& lpvParam
)
2061 CONV_RECT32TO16( &tmp
, (RECT16
*)lpvParam
);
2065 case SPI_GETMOUSEHOVERWIDTH
: /* 98 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
2066 case SPI_GETMOUSEHOVERHEIGHT
: /* 100 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
2067 case SPI_GETMOUSEHOVERTIME
: /* 102 _WIN32_WINNT >= 0x400 || _WIN32_WINDOW > 0x400 */
2070 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
? &tmp
: NULL
, fuWinIni
);
2071 if (ret
&& lpvParam
)
2072 *(UINT16
*)lpvParam
= tmp
;
2077 ret
= SystemParametersInfoA( uAction
, uParam
, lpvParam
, fuWinIni
);
2083 /***********************************************************************
2084 * SystemParametersInfoA (USER32.@)
2086 BOOL WINAPI
SystemParametersInfoA( UINT uiAction
, UINT uiParam
,
2087 PVOID pvParam
, UINT fuWinIni
)
2091 TRACE("(%u, %u, %p, %u)\n", uiAction
, uiParam
, pvParam
, fuWinIni
);
2095 case SPI_SETDESKWALLPAPER
: /* 20 */
2096 case SPI_SETDESKPATTERN
: /* 21 */
2100 if (!MultiByteToWideChar( CP_ACP
, 0, (LPSTR
)pvParam
, -1,
2101 buffer
, sizeof(buffer
)/sizeof(WCHAR
) ))
2102 buffer
[sizeof(buffer
)/sizeof(WCHAR
)-1] = 0;
2103 ret
= SystemParametersInfoW( uiAction
, uiParam
, pvParam
? buffer
: NULL
, fuWinIni
);
2107 case SPI_GETICONTITLELOGFONT
: /* 31 */
2110 ret
= SystemParametersInfoW( uiAction
, uiParam
, pvParam
? &tmp
: NULL
, fuWinIni
);
2112 SYSPARAMS_LogFont32WTo32A( &tmp
, (LPLOGFONTA
)pvParam
);
2116 case SPI_GETNONCLIENTMETRICS
: /* 41 WINVER >= 0x400 */
2118 NONCLIENTMETRICSW tmp
;
2119 LPNONCLIENTMETRICSA lpnmA
= (LPNONCLIENTMETRICSA
)pvParam
;
2120 if (lpnmA
&& lpnmA
->cbSize
== sizeof(NONCLIENTMETRICSA
))
2122 tmp
.cbSize
= sizeof(NONCLIENTMETRICSW
);
2123 ret
= SystemParametersInfoW( uiAction
, uiParam
, &tmp
, fuWinIni
);
2125 SYSPARAMS_NonClientMetrics32WTo32A( &tmp
, lpnmA
);
2132 case SPI_GETICONMETRICS
: /* 45 WINVER >= 0x400 */
2135 LPICONMETRICSA lpimA
= (LPICONMETRICSA
)pvParam
;
2136 if (lpimA
&& lpimA
->cbSize
== sizeof(ICONMETRICSA
))
2138 tmp
.cbSize
= sizeof(ICONMETRICSW
);
2139 ret
= SystemParametersInfoW( uiAction
, uiParam
, &tmp
, fuWinIni
);
2142 lpimA
->iHorzSpacing
= tmp
.iHorzSpacing
;
2143 lpimA
->iVertSpacing
= tmp
.iVertSpacing
;
2144 lpimA
->iTitleWrap
= tmp
.iTitleWrap
;
2145 SYSPARAMS_LogFont32WTo32A( &tmp
.lfFont
, &lpimA
->lfFont
);
2153 case SPI_GETHIGHCONTRAST
: /* 66 WINVER >= 0x400 */
2156 LPHIGHCONTRASTA lphcA
= (LPHIGHCONTRASTA
)pvParam
;
2157 if (lphcA
&& lphcA
->cbSize
== sizeof(HIGHCONTRASTA
))
2159 tmp
.cbSize
= sizeof(HIGHCONTRASTW
);
2160 ret
= SystemParametersInfoW( uiAction
, uiParam
, &tmp
, fuWinIni
);
2163 lphcA
->dwFlags
= tmp
.dwFlags
;
2164 lphcA
->lpszDefaultScheme
= NULL
; /* FIXME? */
2173 ret
= SystemParametersInfoW( uiAction
, uiParam
, pvParam
, fuWinIni
);
2180 /**********************************************************************
2181 * SetDoubleClickTime (USER32.@)
2183 BOOL WINAPI
SetDoubleClickTime( UINT interval
)
2185 return SystemParametersInfoW(SPI_SETDOUBLECLICKTIME
, interval
, 0, 0);
2189 /**********************************************************************
2190 * GetDoubleClickTime (USER32.@)
2192 UINT WINAPI
GetDoubleClickTime(void)
2196 if (!spi_loaded
[SPI_SETDOUBLECLICKTIME_IDX
])
2198 if (SYSPARAMS_Load( SPI_SETDOUBLECLICKTIME_REGKEY
,
2199 SPI_SETDOUBLECLICKTIME_VALNAME
,
2202 double_click_time
= atoiW( buf
);
2203 if (!double_click_time
) double_click_time
= 500;
2205 spi_loaded
[SPI_SETDOUBLECLICKTIME_IDX
] = TRUE
;
2207 return double_click_time
;