RESENT: sysparams: read/save minimized metrics from/to registry
Rein Klazes
wijn at wanadoo.nl
Sun Dec 11 06:57:07 CST 2005
Hi,
Resent: not included with the new release, no comments.
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-11-24 20:49:41.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',' ',
@@ -776,7 +781,7 @@ static inline BOOL get_bool_param( unsig
}
/* set a uint parameter that is mirrored in two different registry locations */
-static BOOL set_uint_param_mirrored( unsigned int idx, LPCWSTR regkey, LPCWSTR regkey_mirror,
+static BOOL set_uint_param_mirrored( int idx, LPCWSTR regkey, LPCWSTR regkey_mirror,
LPCWSTR value, UINT *value_ptr, UINT new_val, UINT fWinIni )
{
WCHAR buf[10];
@@ -785,19 +790,19 @@ static BOOL set_uint_param_mirrored( uns
if (!SYSPARAMS_Save( regkey, value, buf, fWinIni )) return FALSE;
if (regkey_mirror) SYSPARAMS_Save( regkey_mirror, value, buf, fWinIni );
*value_ptr = new_val;
- spi_loaded[idx] = TRUE;
+ if( idx >= 0) spi_loaded[idx] = TRUE;
return TRUE;
}
/* set a uint parameter in the registry */
-static inline BOOL set_uint_param( unsigned int idx, LPCWSTR regkey, LPCWSTR value,
+static inline BOOL set_uint_param( int idx, LPCWSTR regkey, LPCWSTR value,
UINT *value_ptr, UINT new_val, UINT fWinIni )
{
return set_uint_param_mirrored( idx, regkey, NULL, value, value_ptr, new_val, fWinIni );
}
/* set a boolean parameter that is mirrored in two different registry locations */
-static inline BOOL set_bool_param_mirrored( unsigned int idx, LPCWSTR regkey, LPCWSTR regkey_mirror,
+static inline BOOL set_bool_param_mirrored( int idx, LPCWSTR regkey, LPCWSTR regkey_mirror,
LPCWSTR value, BOOL *value_ptr, BOOL new_val, UINT fWinIni )
{
return set_uint_param_mirrored( idx, regkey, regkey_mirror, value,
@@ -805,7 +810,7 @@ static inline BOOL set_bool_param_mirror
}
/* set a boolean parameter in the registry */
-static inline BOOL set_bool_param( unsigned int idx, LPCWSTR regkey, LPCWSTR value,
+static inline BOOL set_bool_param( int idx, LPCWSTR regkey, LPCWSTR value,
BOOL *value_ptr, BOOL new_val, UINT fWinIni )
{
return set_uint_param( idx, regkey, value, (UINT *)value_ptr, new_val, fWinIni );
@@ -945,6 +950,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)
{
@@ -1479,9 +1504,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 +1515,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_uint_param( -1, METRICS_REGKEY, METRICS_MINWIDTH_VALNAME,
+ &minimized_metrics.iWidth, max( lpMm->iWidth, 0), fWinIni);
+ if( ret) ret = set_uint_param( -1, METRICS_REGKEY,
+ METRICS_MINHORZGAP_VALNAME, &minimized_metrics.iHorzGap,
+ max( lpMm->iHorzGap, 0), fWinIni);
+ if( ret) ret = set_uint_param( -1, METRICS_REGKEY,
+ METRICS_MINVERTGAP_VALNAME, &minimized_metrics.iVertGap,
+ max( lpMm->iVertGap, 0), fWinIni);
+ if( ret) ret = set_uint_param( -1, 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;
}
@@ -2467,8 +2504,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 +2527,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-11-24 20:53:03.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