sysparams: read/save minimized metrics from/to registry TRY 2
Rein Klazes
wijn at wanadoo.nl
Tue Dec 13 09:13:11 CST 2005
Hi,
Try 2: use helper for signed int parameters.
Changelog:
dlls/user : sysparams.c
dlls/user/tests : sysparams.c
Read and save the minimized metrics from/to the registry with
conformance tests.
Rein.
-------------- next part --------------
--- wine/dlls/user/sysparams.c 2005-11-23 10:07:11.000000000 +0100
+++ mywine/dlls/user/sysparams.c 2005-12-13 14:51:59.000000000 +0100
@@ -76,6 +76,7 @@ enum spi_index
SPI_SETPOWEROFFACTIVE_IDX,
SPI_USERPREFERENCEMASK_IDX,
SPI_NONCLIENTMETRICS_IDX,
+ SPI_MINIMIZEDMETRICS_IDX,
SPI_INDEX_COUNT
};
@@ -228,10 +229,14 @@ static const WCHAR METRICS_SMCAPTIONLOGF
static const WCHAR METRICS_MENULOGFONT_VALNAME[]= {'M','e','n','u','F','o','n','t',0};
static const WCHAR METRICS_MESSAGELOGFONT_VALNAME[]= {'M','e','s','s','a','g','e','F','o','n','t',0};
static const WCHAR METRICS_STATUSLOGFONT_VALNAME[]= {'S','t','a','t','u','s','F','o','n','t',0};
+/* minimized metrics */
+static const WCHAR METRICS_MINWIDTH_VALNAME[] = {'M','i','n','W','i','d','t','h','\0'};
+static const WCHAR METRICS_MINHORZGAP_VALNAME[] = {'M','i','n','H','o','r','z','G','a','p','\0'};
+static const WCHAR METRICS_MINVERTGAP_VALNAME[] = {'M','i','n','V','e','r','t','G','a','p','\0'};
+static const WCHAR METRICS_MINARRANGE_VALNAME[] = {'M','i','n','A','r','r','a','n','g','e','\0'};
static const WCHAR WINE_CURRENT_USER_REGKEY[] = {'S','o','f','t','w','a','r','e','\\',
'W','i','n','e',0};
-
/* volatile registry branch under WINE_CURRENT_USER_REGKEY for temporary values storage */
static const WCHAR WINE_CURRENT_USER_REGKEY_TEMP_PARAMS[] = {'T','e','m','p','o','r','a','r','y',' ',
'S','y','s','t','e','m',' ',
@@ -789,6 +794,18 @@ static BOOL set_uint_param_mirrored( uns
return TRUE;
}
+/* set an int parameter in registry */
+static BOOL set_int_param( LPCWSTR regkey, LPCWSTR value, INT *value_ptr,
+ INT new_val, UINT fWinIni )
+{
+ WCHAR buf[10];
+
+ wsprintfW(buf, CSd, new_val);
+ if (!SYSPARAMS_Save( regkey, value, buf, fWinIni )) return FALSE;
+ *value_ptr = new_val;
+ return TRUE;
+}
+
/* set a uint parameter in the registry */
static inline BOOL set_uint_param( unsigned int idx, LPCWSTR regkey, LPCWSTR value,
UINT *value_ptr, UINT new_val, UINT fWinIni )
@@ -945,6 +962,26 @@ static BOOL reg_get_logfont(LPCWSTR key,
return found;
}
+/* load all the minimized metrics */
+static void load_minimized_metrics(void)
+{
+ HKEY hkey;
+ if (RegOpenKeyExW (HKEY_CURRENT_USER, METRICS_REGKEY,
+ 0, KEY_QUERY_VALUE, &hkey) != ERROR_SUCCESS) hkey = 0;
+
+ minimized_metrics.iWidth = max( get_reg_metric(hkey,
+ METRICS_MINWIDTH_VALNAME, minimized_metrics.iWidth), 0);
+ minimized_metrics.iHorzGap = max( get_reg_metric(hkey,
+ METRICS_MINHORZGAP_VALNAME, minimized_metrics.iHorzGap), 0);
+ minimized_metrics.iVertGap = max( get_reg_metric(hkey,
+ METRICS_MINVERTGAP_VALNAME, minimized_metrics.iVertGap), 0);
+ minimized_metrics.iArrange = 0x0f & get_reg_metric(hkey,
+ METRICS_MINARRANGE_VALNAME, minimized_metrics.iArrange);
+
+ if (hkey) RegCloseKey( hkey );
+ spi_loaded[SPI_MINIMIZEDMETRICS_IDX] = TRUE;
+}
+
/* load all the non-client metrics */
static void load_nonclient_metrics(void)
{
@@ -1126,31 +1163,17 @@ BOOL WINAPI SystemParametersInfoW( UINT
case SPI_SETMOUSE: /* 4 */
{
- WCHAR buf[10];
-
if (!pvParam) return FALSE;
-
+ ret = set_int_param( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME1,
+ &mouse_threshold1, ((INT *)pvParam)[0], fWinIni);
spi_idx = SPI_SETMOUSE_IDX;
- wsprintfW(buf, CSd, ((INT *)pvParam)[0]);
-
- if (SYSPARAMS_Save( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME1,
- buf, fWinIni ))
- {
- mouse_threshold1 = ((INT *)pvParam)[0];
+ if( ret) {
spi_loaded[spi_idx] = TRUE;
-
- wsprintfW(buf, CSd, ((INT *)pvParam)[1]);
- SYSPARAMS_Save( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME2,
- buf, fWinIni );
- mouse_threshold2 = ((INT *)pvParam)[1];
-
- wsprintfW(buf, CSd, ((INT *)pvParam)[2]);
- SYSPARAMS_Save( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME3,
- buf, fWinIni );
- mouse_speed = ((INT *)pvParam)[2];
+ set_int_param( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME2,
+ &mouse_threshold2, ((INT *)pvParam)[1], fWinIni);
+ set_int_param( SPI_SETMOUSE_REGKEY, SPI_SETMOUSE_VALNAME3,
+ &mouse_speed, ((INT *)pvParam)[2], fWinIni);
}
- else
- ret = FALSE;
break;
}
@@ -1479,9 +1502,10 @@ BOOL WINAPI SystemParametersInfoW( UINT
case SPI_GETMINIMIZEDMETRICS:
{
MINIMIZEDMETRICS * lpMm = pvParam;
- if (lpMm && lpMm->cbSize == sizeof(*lpMm))
+ if (lpMm && lpMm->cbSize == sizeof(*lpMm)) {
+ if( spi_loaded[SPI_MINIMIZEDMETRICS_IDX]) load_minimized_metrics();
memcpy( lpMm, &minimized_metrics, sizeof(*lpMm) );
- else
+ } else
ret = FALSE;
break;
}
@@ -1489,9 +1513,20 @@ BOOL WINAPI SystemParametersInfoW( UINT
case SPI_SETMINIMIZEDMETRICS:
{
MINIMIZEDMETRICS * lpMm = pvParam;
- if (lpMm && lpMm->cbSize == sizeof(*lpMm))
- memcpy( &minimized_metrics, lpMm, sizeof(*lpMm) );
- else
+ if (lpMm && lpMm->cbSize == sizeof(*lpMm)) {
+ ret = set_int_param( METRICS_REGKEY, METRICS_MINWIDTH_VALNAME,
+ &minimized_metrics.iWidth, max( lpMm->iWidth, 0), fWinIni);
+ if( ret) ret = set_int_param( METRICS_REGKEY,
+ METRICS_MINHORZGAP_VALNAME, &minimized_metrics.iHorzGap,
+ max( lpMm->iHorzGap, 0), fWinIni);
+ if( ret) ret = set_int_param( METRICS_REGKEY,
+ METRICS_MINVERTGAP_VALNAME, &minimized_metrics.iVertGap,
+ max( lpMm->iVertGap, 0), fWinIni);
+ if( ret) ret = set_int_param( METRICS_REGKEY,
+ METRICS_MINARRANGE_VALNAME, &minimized_metrics.iArrange,
+ 0x0f & lpMm->iArrange, fWinIni);
+ if( ret) ret = spi_loaded[SPI_MINIMIZEDMETRICS_IDX] = TRUE;
+ } else
ret = FALSE;
break;
}
@@ -1521,20 +1556,24 @@ BOOL WINAPI SystemParametersInfoW( UINT
{
LPICONMETRICSW lpIcon = pvParam;
if (lpIcon && lpIcon->cbSize == sizeof(*lpIcon)) {
- ret = set_uint_param( SPI_ICONVERTICALSPACING_IDX,
- SPI_ICONVERTICALSPACING_REGKEY,
+ ret = set_int_param( SPI_ICONVERTICALSPACING_REGKEY,
SPI_ICONVERTICALSPACING_VALNAME,
- (UINT*)&icon_metrics.iVertSpacing,
+ &icon_metrics.iVertSpacing,
lpIcon->iVertSpacing, fWinIni);
- if( ret) ret = set_uint_param( SPI_ICONHORIZONTALSPACING_IDX,
- SPI_ICONHORIZONTALSPACING_REGKEY,
+ if( ret) {
+ spi_loaded[SPI_ICONVERTICALSPACING_IDX] = TRUE;
+ ret = set_int_param( SPI_ICONHORIZONTALSPACING_REGKEY,
SPI_ICONHORIZONTALSPACING_VALNAME,
- (UINT*)&icon_metrics.iHorzSpacing,
+ &icon_metrics.iHorzSpacing,
lpIcon->iHorzSpacing, fWinIni );
- if( ret) ret = set_bool_param_mirrored( SPI_SETICONTITLEWRAP_IDX,
+ }
+ if( ret) {
+ spi_loaded[SPI_ICONHORIZONTALSPACING_IDX] = TRUE;
+ ret = set_bool_param_mirrored( SPI_SETICONTITLEWRAP_IDX,
SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_REGKEY2,
SPI_SETICONTITLEWRAP_VALNAME, &icon_metrics.iTitleWrap,
lpIcon->iTitleWrap, fWinIni );
+ }
if( ret) ret = SYSPARAMS_SaveLogFont( SPI_SETICONTITLELOGFONT_REGKEY,
SPI_SETICONTITLELOGFONT_VALNAME, &lpIcon->lfFont, fWinIni);
if( ret) {
@@ -2467,8 +2506,10 @@ INT WINAPI GetSystemMetrics( INT index )
case SM_CYEDGE:
return GetSystemMetrics(SM_CYBORDER) + 1;
case SM_CXMINSPACING:
+ if( spi_loaded[SPI_MINIMIZEDMETRICS_IDX]) load_minimized_metrics();
return GetSystemMetrics(SM_CXMINIMIZED) + minimized_metrics.iHorzGap;
case SM_CYMINSPACING:
+ if( spi_loaded[SPI_MINIMIZEDMETRICS_IDX]) load_minimized_metrics();
return GetSystemMetrics(SM_CYMINIMIZED) + minimized_metrics.iVertGap;
case SM_CXSMICON:
case SM_CYSMICON:
@@ -2488,8 +2529,10 @@ INT WINAPI GetSystemMetrics( INT index )
if (!spi_loaded[SPI_NONCLIENTMETRICS_IDX]) load_nonclient_metrics();
return nonclient_metrics.iMenuHeight;
case SM_ARRANGE:
+ if( spi_loaded[SPI_MINIMIZEDMETRICS_IDX]) load_minimized_metrics();
return minimized_metrics.iArrange;
case SM_CXMINIMIZED:
+ if( spi_loaded[SPI_MINIMIZEDMETRICS_IDX]) load_minimized_metrics();
return minimized_metrics.iWidth + 6;
case SM_CYMINIMIZED:
if (!spi_loaded[SPI_NONCLIENTMETRICS_IDX]) load_nonclient_metrics();
--- wine/dlls/user/tests/sysparams.c 2005-11-24 16:59:49.000000000 +0100
+++ mywine/dlls/user/tests/sysparams.c 2005-12-13 13:14:26.000000000 +0100
@@ -60,6 +60,11 @@ static int dpi;
#define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
#define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
#define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
+#define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
+#define SPI_MINWIDTH_VALNAME "MinWidth"
+#define SPI_MINHORZGAP_VALNAME "MinHorzGap"
+#define SPI_MINVERTGAP_VALNAME "MinVertGap"
+#define SPI_MINARRANGE_VALNAME "MinArrange"
#define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
#define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
#define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
@@ -910,15 +915,19 @@ static void test_SPI_SETICONTITLEWRAP( v
for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
{
UINT v;
+ UINT regval;
rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
test_change_message( SPI_SETICONTITLEWRAP, 1 );
- test_reg_key_ex( SPI_SETICONTITLEWRAP_REGKEY1,
- SPI_SETICONTITLEWRAP_REGKEY2,
- SPI_SETICONTITLEWRAP_VALNAME,
- vals[i] ? "1" : "0" );
+ regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
+ SPI_SETICONTITLEWRAP_VALNAME, dpi);
+ if( regval != vals[i])
+ regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
+ SPI_SETICONTITLEWRAP_VALNAME, dpi);
+ ok( regval == vals[i],
+ "wrong value in registry %d, expected %d\n", regval, vals[i] );
rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
ok(rc!=0,"%d: rc=%d err=%ld\n",i,rc,GetLastError());
@@ -1186,6 +1195,7 @@ static void test_SPI_SETDRAGFULLWINDOWS(
static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
{
BOOL rc;
+ INT regval;
MINIMIZEDMETRICS lpMm_orig;
MINIMIZEDMETRICS lpMm_new;
MINIMIZEDMETRICS lpMm_cur;
@@ -1199,23 +1209,49 @@ static void test_SPI_SETMINIMIZEDMETRICS
rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
return;
-
+ /* test registry */
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
+ ok( regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_orig.iWidth);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
+ ok( regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_orig.iHorzGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
+ ok( regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_orig.iVertGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
+ ok( regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_orig.iArrange);
+ /* set some new values */
lpMm_cur.iWidth = 180;
lpMm_cur.iHorzGap = 1;
lpMm_cur.iVertGap = 1;
lpMm_cur.iArrange = 5;
-
- rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_cur, FALSE );
+ rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
+ &lpMm_cur, SPIF_UPDATEINIFILE );
ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
-
+ /* read them back */
rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
-
+ /* and compare */
eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
-
+ /* test registry */
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
+ ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iWidth);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
+ ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iHorzGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
+ ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iVertGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
+ ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iArrange);
+ /* test some system metrics */
eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
lpMm_new.iWidth, "iWidth", "%d" );
eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
@@ -1224,13 +1260,53 @@ static void test_SPI_SETMINIMIZEDMETRICS
lpMm_new.iVertGap, "iVertGap", "%d" );
eq( GetSystemMetrics( SM_ARRANGE ),
lpMm_new.iArrange, "iArrange", "%d" );
-
- rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
+ /* now some realy invalid settings */
+ lpMm_cur.iWidth = -1;
+ lpMm_cur.iHorzGap = -1;
+ lpMm_cur.iVertGap = -1;
+ lpMm_cur.iArrange = - 1;
+ rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
+ &lpMm_cur, SPIF_UPDATEINIFILE );
+ ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
+ /* read back */
+ rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
+ ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
+ /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
+ eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
+ eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
+ eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
+ eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
+ /* test registry */
+#if 0 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
+ ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iWidth);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
+ ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iHorzGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
+ ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iVertGap);
+ regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
+ ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
+ regval, lpMm_new.iArrange);
+#endif
+ /* test some system metrics */
+ eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
+ lpMm_new.iWidth, "iWidth", "%d" );
+ eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
+ lpMm_new.iHorzGap, "iHorzGap", "%d" );
+ eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
+ lpMm_new.iVertGap, "iVertGap", "%d" );
+ eq( GetSystemMetrics( SM_ARRANGE ),
+ lpMm_new.iArrange, "iArrange", "%d" );
+ /* restore */
+ rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
+ &lpMm_orig, SPIF_UPDATEINIFILE );
ok(rc!=0,"***warning*** failed to restore the original value: rc=%d err=%ld\n",rc,GetLastError());
-
+ /* check that */
rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,GetLastError());
-
eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
More information about the wine-patches
mailing list