[PATCH 1/5] user32: Rationalize the popup menu margin calculation.

Huw Davies huw at codeweavers.com
Tue Mar 28 06:52:18 CDT 2017


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/user32/menu.c | 60 ++++++++++++++++++++++++------------------------------
 1 file changed, 27 insertions(+), 33 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 93b39b4809..7836c76ee3 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -133,9 +133,8 @@ typedef struct
   /* Space between 2 columns */
 #define MENU_COL_SPACE 4
 
-  /*  top and bottom margins for popup menus */
-#define MENU_TOP_MARGIN 3
-#define MENU_BOTTOM_MARGIN 2
+  /* Margins for popup menus */
+#define MENU_MARGIN 3
 
 /* maximum allowed depth of any branch in the menu tree.
  * This value is slightly larger than in windows (25) to
@@ -1175,7 +1174,7 @@ static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop )
     SelectObject( hdc, get_menu_font(FALSE));
 
     start = 0;
-    maxX = 2 + 1;
+    maxX = MENU_MARGIN;
 
     lppop->textOffset = 0;
 
@@ -1185,7 +1184,7 @@ static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop )
 	orgX = maxX;
         if( lpitem->fType & (MF_MENUBREAK | MF_MENUBARBREAK))
             orgX += MENU_COL_SPACE; 
-	orgY = MENU_TOP_MARGIN;
+	orgY = MENU_MARGIN;
 
 	maxTab = maxTabWidth = 0;
 	  /* Parse items until column break or end of menu */
@@ -1226,12 +1225,12 @@ static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop )
     if( !textandbmp) lppop->textOffset = 0;
 
     /* space for 3d border */
-    lppop->Height += MENU_BOTTOM_MARGIN;
-    lppop->Width += 2;
+    lppop->Height += MENU_MARGIN;
+    lppop->Width += MENU_MARGIN;
 
     /* Adjust popup height if it exceeds maximum */
     maxHeight = MENU_GetMaxPopupHeight(lppop);
-    lppop->nTotalHeight = lppop->Height - MENU_TOP_MARGIN;
+    lppop->nTotalHeight = lppop->Height - MENU_MARGIN;
     if (lppop->Height >= maxHeight)
     {
         lppop->Height = maxHeight;
@@ -1856,7 +1855,6 @@ static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id, UINT flags,
                               INT x, INT y, INT xanchor, INT yanchor )
 {
     POPUPMENU *menu;
-    INT width, height;
     POINT pt;
     HMONITOR monitor;
     MONITORINFO info;
@@ -1876,9 +1874,6 @@ static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id, UINT flags,
 
     /* adjust popup menu pos so that it fits within the desktop */
 
-    width = menu->Width + GetSystemMetrics(SM_CXBORDER);
-    height = menu->Height + GetSystemMetrics(SM_CYBORDER);
-
     /* FIXME: should use item rect */
     pt.x = x;
     pt.y = y;
@@ -1889,29 +1884,29 @@ static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id, UINT flags,
     if (flags & TPM_LAYOUTRTL)
         flags ^= TPM_RIGHTALIGN;
 
-    if( flags & TPM_RIGHTALIGN ) x -= width;
-    if( flags & TPM_CENTERALIGN ) x -= width / 2;
+    if( flags & TPM_RIGHTALIGN ) x -= menu->Width;
+    if( flags & TPM_CENTERALIGN ) x -= menu->Width / 2;
 
-    if( flags & TPM_BOTTOMALIGN ) y -= height;
-    if( flags & TPM_VCENTERALIGN ) y -= height / 2;
+    if( flags & TPM_BOTTOMALIGN ) y -= menu->Height;
+    if( flags & TPM_VCENTERALIGN ) y -= menu->Height / 2;
 
-    if( x + width > info.rcWork.right)
+    if( x + menu->Width > info.rcWork.right)
     {
-        if( xanchor && x >= width - xanchor )
-            x -= width - xanchor;
+        if( xanchor && x >= menu->Width - xanchor )
+            x -= menu->Width - xanchor;
 
-        if( x + width > info.rcWork.right)
-            x = info.rcWork.right - width;
+        if( x + menu->Width > info.rcWork.right)
+            x = info.rcWork.right - menu->Width;
     }
     if( x < info.rcWork.left ) x = info.rcWork.left;
 
-    if( y + height > info.rcWork.bottom)
+    if( y + menu->Height > info.rcWork.bottom)
     {
-        if( yanchor && y >= height + yanchor )
-            y -= height + yanchor;
+        if( yanchor && y >= menu->Height + yanchor )
+            y -= menu->Height + yanchor;
 
-        if( y + height > info.rcWork.bottom)
-            y = info.rcWork.bottom - height;
+        if( y + menu->Height > info.rcWork.bottom)
+            y = info.rcWork.bottom - menu->Height;
     }
     if( y < info.rcWork.top ) y = info.rcWork.top;
 
@@ -1921,7 +1916,7 @@ static BOOL MENU_ShowPopup( HWND hwndOwner, HMENU hmenu, UINT id, UINT flags,
     }
     /* Display the window */
 
-    SetWindowPos( menu->hWnd, HWND_TOPMOST, x, y, width, height,
+    SetWindowPos( menu->hWnd, HWND_TOPMOST, x, y, menu->Width, menu->Height,
                   SWP_SHOWWINDOW | SWP_NOACTIVATE );
     UpdateWindow( menu->hWnd );
     return TRUE;
@@ -1949,7 +1944,7 @@ MENU_EnsureMenuItemVisible(LPPOPUPMENU lppop, UINT wIndex, HDC hdc)
         arrow_bitmap_height = bmp.bmHeight;
 
         rc.top += arrow_bitmap_height;
-        rc.bottom -= arrow_bitmap_height + MENU_BOTTOM_MARGIN;
+        rc.bottom -= arrow_bitmap_height + MENU_MARGIN;
        
         nMaxHeight -= GetSystemMetrics(SM_CYBORDER) + 2 * arrow_bitmap_height;
         if (item->rect.bottom > lppop->nScrollPos + nMaxHeight)
@@ -1959,9 +1954,9 @@ MENU_EnsureMenuItemVisible(LPPOPUPMENU lppop, UINT wIndex, HDC hdc)
             ScrollWindow(lppop->hWnd, 0, nOldPos - lppop->nScrollPos, &rc, &rc);
             MENU_DrawScrollArrows(lppop, hdc);
         }
-        else if (item->rect.top - MENU_TOP_MARGIN < lppop->nScrollPos)
+        else if (item->rect.top - MENU_MARGIN < lppop->nScrollPos)
         {
-            lppop->nScrollPos = item->rect.top - MENU_TOP_MARGIN;
+            lppop->nScrollPos = item->rect.top - MENU_MARGIN;
             ScrollWindow(lppop->hWnd, 0, nOldPos - lppop->nScrollPos, &rc, &rc);
             MENU_DrawScrollArrows(lppop, hdc);
         }
@@ -2379,10 +2374,9 @@ static HMENU MENU_ShowSubPopup( HWND hwndOwner, HMENU hmenu,
                 rect.left += GetSystemMetrics(SM_CXBORDER);
 	    else
                 rect.left += rc.right - GetSystemMetrics(SM_CXBORDER);
-	    rect.top += rc.top - MENU_TOP_MARGIN;
+	    rect.top += rc.top - MENU_MARGIN;
 	    rect.right = rc.left - rc.right + GetSystemMetrics(SM_CXBORDER);
-	    rect.bottom = rc.top - rc.bottom - MENU_TOP_MARGIN
-	                  - MENU_BOTTOM_MARGIN - GetSystemMetrics(SM_CYBORDER);
+	    rect.bottom = rc.top - rc.bottom - 2 * MENU_MARGIN;
 	}
 	else
 	{
-- 
2.12.0




More information about the wine-patches mailing list