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