user32: Add support for iPaddedBorderWidth in NONCLIENTMETRICS structure.

Dmitry Timoshkov dmitry at baikal.ru
Sat Oct 8 03:15:13 CDT 2011


---
 dlls/user32/sysparams.c       |   28 ++++++++++++++++++++++------
 dlls/user32/tests/dialog.c    |    2 +-
 dlls/user32/tests/generated.c |   12 ++++++------
 dlls/user32/tests/sysparams.c |   37 +++++++++++++++++++++++++++++--------
 include/winuser.h             |    2 ++
 5 files changed, 60 insertions(+), 21 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index fe910f2..15838ed 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -369,7 +369,8 @@ static NONCLIENTMETRICSW nonclient_metrics =
     18,    /* iMenuHeight */
     { 0 }, /* lfMenuFont */
     { 0 }, /* lfStatusFont */
-    { 0 }  /* lfMessageFont */
+    { 0 }, /* lfMessageFont */
+    0      /* iPaddedBorderWidth */
 };
 
 /* some additional non client metric info */
@@ -462,6 +463,10 @@ static void SYSPARAMS_NonClientMetrics32WTo32A( const NONCLIENTMETRICSW* lpnm32W
     SYSPARAMS_LogFont32WTo32A( &lpnm32W->lfMenuFont,		&lpnm32A->lfMenuFont );
     SYSPARAMS_LogFont32WTo32A( &lpnm32W->lfStatusFont,		&lpnm32A->lfStatusFont );
     SYSPARAMS_LogFont32WTo32A( &lpnm32W->lfMessageFont,		&lpnm32A->lfMessageFont );
+    if (lpnm32A->cbSize == sizeof(NONCLIENTMETRICSA) && lpnm32W->cbSize == sizeof(NONCLIENTMETRICSW))
+        lpnm32A->iPaddedBorderWidth = lpnm32W->iPaddedBorderWidth;
+    else
+        lpnm32A->iPaddedBorderWidth = 0;
 }
 
 static void SYSPARAMS_NonClientMetrics32ATo32W( const NONCLIENTMETRICSA* lpnm32A, LPNONCLIENTMETRICSW lpnm32W )
@@ -480,6 +485,10 @@ static void SYSPARAMS_NonClientMetrics32ATo32W( const NONCLIENTMETRICSA* lpnm32A
     SYSPARAMS_LogFont32ATo32W( &lpnm32A->lfMenuFont,		&lpnm32W->lfMenuFont );
     SYSPARAMS_LogFont32ATo32W( &lpnm32A->lfStatusFont,		&lpnm32W->lfStatusFont );
     SYSPARAMS_LogFont32ATo32W( &lpnm32A->lfMessageFont,		&lpnm32W->lfMessageFont );
+    if (lpnm32A->cbSize == sizeof(NONCLIENTMETRICSA) && lpnm32W->cbSize == sizeof(NONCLIENTMETRICSW))
+        lpnm32W->iPaddedBorderWidth = lpnm32A->iPaddedBorderWidth;
+    else
+        lpnm32W->iPaddedBorderWidth = 0;
 }
 
 
@@ -1569,7 +1578,8 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
 
         if (!spi_loaded[SPI_NONCLIENTMETRICS_IDX]) load_nonclient_metrics();
 
-        if (lpnm && lpnm->cbSize == sizeof(NONCLIENTMETRICSW))
+        if (lpnm && (lpnm->cbSize == sizeof(NONCLIENTMETRICSW) ||
+                     lpnm->cbSize == FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth)))
             *lpnm = nonclient_metrics;
         else
             ret = FALSE;
@@ -1580,7 +1590,8 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
     {
         LPNONCLIENTMETRICSW lpnm = pvParam;
 
-        if (lpnm && lpnm->cbSize == sizeof(NONCLIENTMETRICSW))
+        if (lpnm && (lpnm->cbSize == sizeof(NONCLIENTMETRICSW) ||
+                     lpnm->cbSize == FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth)))
         {
             NONCLIENTMETRICSW ncm;
             ret = set_uint_param( SPI_SETBORDER_IDX,
@@ -1626,7 +1637,10 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
                     METRICS_REGKEY, METRICS_MESSAGELOGFONT_VALNAME,
                     &lpnm->lfMessageFont, fWinIni);
             if( ret) {
-                ncm = *lpnm;
+                memcpy(&ncm, lpnm, FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth));
+                ncm.cbSize = sizeof(ncm);
+                ncm.iPaddedBorderWidth = (lpnm->cbSize == sizeof(NONCLIENTMETRICSW)) ?
+                                         lpnm->iPaddedBorderWidth : 0;
                 normalize_nonclientmetrics( &ncm);
                 nonclient_metrics = ncm;
                 spi_loaded[SPI_NONCLIENTMETRICS_IDX] = TRUE;
@@ -2526,7 +2540,8 @@ BOOL WINAPI SystemParametersInfoA( UINT uiAction, UINT uiParam,
     {
 	NONCLIENTMETRICSW tmp;
         LPNONCLIENTMETRICSA lpnmA = pvParam;
-	if (lpnmA && lpnmA->cbSize == sizeof(NONCLIENTMETRICSA))
+        if (lpnmA && (lpnmA->cbSize == sizeof(NONCLIENTMETRICSA) ||
+                      lpnmA->cbSize == FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth)))
 	{
 	    tmp.cbSize = sizeof(NONCLIENTMETRICSW);
 	    ret = SystemParametersInfoW( uiAction, uiParam, &tmp, fuWinIni );
@@ -2542,7 +2557,8 @@ BOOL WINAPI SystemParametersInfoA( UINT uiAction, UINT uiParam,
     {
         NONCLIENTMETRICSW tmp;
         LPNONCLIENTMETRICSA lpnmA = pvParam;
-        if (lpnmA && lpnmA->cbSize == sizeof(NONCLIENTMETRICSA))
+        if (lpnmA && (lpnmA->cbSize == sizeof(NONCLIENTMETRICSA) ||
+                      lpnmA->cbSize == FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth)))
         {
             tmp.cbSize = sizeof(NONCLIENTMETRICSW);
             SYSPARAMS_NonClientMetrics32ATo32W( lpnmA, &tmp );
diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c
index 8e4ffb5..f749278 100644
--- a/dlls/user32/tests/dialog.c
+++ b/dlls/user32/tests/dialog.c
@@ -1198,7 +1198,7 @@ static void test_MessageBoxFontTest(void)
     }
     GetObjectW(hFont, sizeof(LOGFONTW), &lfStaticFont);
 
-    ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW);
+    ncMetrics.cbSize = FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth);
     SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &ncMetrics, 0);
     ok( !memcmp(&lfStaticFont, &ncMetrics.lfMessageFont, FIELD_OFFSET(LOGFONTW, lfFaceName)) &&
         !lstrcmpW(lfStaticFont.lfFaceName, ncMetrics.lfMessageFont.lfFaceName),
diff --git a/dlls/user32/tests/generated.c b/dlls/user32/tests/generated.c
index e7c08cf..05b1599 100644
--- a/dlls/user32/tests/generated.c
+++ b/dlls/user32/tests/generated.c
@@ -5060,7 +5060,7 @@ static void test_pack_LPNONCLIENTMETRICSA(void)
     /* LPNONCLIENTMETRICSA */
     TEST_TYPE_SIZE   (LPNONCLIENTMETRICSA, 4)
     TEST_TYPE_ALIGN  (LPNONCLIENTMETRICSA, 4)
-    TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 340)
+    TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 344)
     TEST_TARGET_ALIGN(LPNONCLIENTMETRICSA, 4)
 }
 
@@ -5069,7 +5069,7 @@ static void test_pack_LPNONCLIENTMETRICSW(void)
     /* LPNONCLIENTMETRICSW */
     TEST_TYPE_SIZE   (LPNONCLIENTMETRICSW, 4)
     TEST_TYPE_ALIGN  (LPNONCLIENTMETRICSW, 4)
-    TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 500)
+    TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 504)
     TEST_TARGET_ALIGN(LPNONCLIENTMETRICSW, 4)
 }
 
@@ -5888,7 +5888,7 @@ static void test_pack_NMHDR(void)
 static void test_pack_NONCLIENTMETRICSA(void)
 {
     /* NONCLIENTMETRICSA */
-    TEST_TYPE_SIZE   (NONCLIENTMETRICSA, 340)
+    TEST_TYPE_SIZE   (NONCLIENTMETRICSA, 344)
     TEST_TYPE_ALIGN  (NONCLIENTMETRICSA, 4)
     TEST_FIELD_SIZE  (NONCLIENTMETRICSA, cbSize, 4)
     TEST_FIELD_ALIGN (NONCLIENTMETRICSA, cbSize, 4)
@@ -5940,7 +5940,7 @@ static void test_pack_NONCLIENTMETRICSA(void)
 static void test_pack_NONCLIENTMETRICSW(void)
 {
     /* NONCLIENTMETRICSW */
-    TEST_TYPE_SIZE   (NONCLIENTMETRICSW, 500)
+    TEST_TYPE_SIZE   (NONCLIENTMETRICSW, 504)
     TEST_TYPE_ALIGN  (NONCLIENTMETRICSW, 4)
     TEST_FIELD_SIZE  (NONCLIENTMETRICSW, cbSize, 4)
     TEST_FIELD_ALIGN (NONCLIENTMETRICSW, cbSize, 4)
@@ -6368,7 +6368,7 @@ static void test_pack_PNONCLIENTMETRICSA(void)
     /* PNONCLIENTMETRICSA */
     TEST_TYPE_SIZE   (PNONCLIENTMETRICSA, 4)
     TEST_TYPE_ALIGN  (PNONCLIENTMETRICSA, 4)
-    TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 340)
+    TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 344)
     TEST_TARGET_ALIGN(PNONCLIENTMETRICSA, 4)
 }
 
@@ -6377,7 +6377,7 @@ static void test_pack_PNONCLIENTMETRICSW(void)
     /* PNONCLIENTMETRICSW */
     TEST_TYPE_SIZE   (PNONCLIENTMETRICSW, 4)
     TEST_TYPE_ALIGN  (PNONCLIENTMETRICSW, 4)
-    TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 500)
+    TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 504)
     TEST_TARGET_ALIGN(PNONCLIENTMETRICSW, 4)
 }
 
diff --git a/dlls/user32/tests/sysparams.c b/dlls/user32/tests/sysparams.c
index 25356f6..b641f6b 100644
--- a/dlls/user32/tests/sysparams.c
+++ b/dlls/user32/tests/sysparams.c
@@ -25,6 +25,7 @@
 #undef _WIN32_WINNT
 #define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */
 #define _WIN32_IE 0x0700
+#define WINVER 0x0600 /* For COLOR_MENUBAR, NONCLIENTMETRICS with padding */
 
 #include "wine/test.h"
 #include "windef.h"
@@ -682,7 +683,7 @@ static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
     INT frame;
     NONCLIENTMETRICSA ncm;
 
-    ncm.cbSize = sizeof( ncm);
+    ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth);
     rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
     ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError());
     if( usesetborder) {
@@ -727,11 +728,11 @@ static void test_SPI_SETBORDER( void )                 /*      6 */
 {
     BOOL rc;
     UINT old_border;
-    NONCLIENTMETRICSA ncmsave;
+    NONCLIENTMETRICS ncmsave;
     INT CaptionWidth,
         PaddedBorderWidth;
 
-    ncmsave.cbSize = sizeof( ncmsave);
+    ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth);
     rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
     if( !rc) {
         win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
@@ -1415,10 +1416,10 @@ static void test_SPI_SETNONCLIENTMETRICS( void )               /*     44 */
     NONCLIENTMETRICSA Ncmcur;
     NONCLIENTMETRICSA Ncmstart;
 
-    Ncmorig.cbSize = sizeof(NONCLIENTMETRICSA);
-    Ncmnew.cbSize = sizeof(NONCLIENTMETRICSA);
-    Ncmcur.cbSize = sizeof(NONCLIENTMETRICSA);
-    Ncmstart.cbSize = sizeof(NONCLIENTMETRICSA);
+    Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
+    Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
+    Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
+    Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
 
     trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
     change_counter = 0;
@@ -2574,8 +2575,28 @@ static void test_GetSystemMetrics( void)
     NONCLIENTMETRICS ncm;
     SIZE screen;
 
+    assert(sizeof(ncm) == 344);
+
+    ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth);
+    rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+    ok(rc, "SystemParametersInfoA failed\n");
+
+    ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth) - 1;
+    rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+    ok(!rc, "SystemParametersInfoA should fail\n");
+
+    ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth) + 1;
+    SetLastError(0xdeadbeef);
+    rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+    ok(!rc, "SystemParametersInfoA should fail\n");
+
+    ncm.cbSize = sizeof(ncm); /* Vista added padding */
+    SetLastError(0xdeadbeef);
+    rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
+    ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n");
+
     minim.cbSize = sizeof( minim);
-    ncm.cbSize = sizeof( ncm);
+    ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth);
     SystemParametersInfo( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
     rc = SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
     if( !rc) {
diff --git a/include/winuser.h b/include/winuser.h
index ef6530f..1079407 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -3230,6 +3230,7 @@ typedef struct tagNONCLIENTMETRICSA {
 	LOGFONTA	lfMenuFont;
 	LOGFONTA	lfStatusFont;
 	LOGFONTA	lfMessageFont;
+	INT		iPaddedBorderWidth;
 } NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, *LPNONCLIENTMETRICSA;
 
 typedef struct tagNONCLIENTMETRICSW {
@@ -3248,6 +3249,7 @@ typedef struct tagNONCLIENTMETRICSW {
 	LOGFONTW	lfMenuFont;
 	LOGFONTW	lfStatusFont;
 	LOGFONTW	lfMessageFont;
+	INT		iPaddedBorderWidth;
 } NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, *LPNONCLIENTMETRICSW;
 
 DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS)
-- 
1.7.5.1




More information about the wine-patches mailing list