Fix WM_MDIREFRESHMENU for the case when separator is at the position 0

Dmitry Timoshkov dmitry at baikal.ru
Mon Sep 20 07:18:28 CDT 2004


Hello,

this patch fixes a case when WM_MDIREFRESHMENU is called and
a Window menu has separator at the position 0. That leads to
adding MDI children to the Window menu without removing any
previously existing one.

Please apply this patch after MDI children creation/activation/destruction
fixes.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Fix WM_MDIREFRESHMENU for the case when separator is at the position 0.

--- cvs/hq/wine/windows/mdi.c	2004-09-20 18:40:38.000000000 +0900
+++ wine/windows/mdi.c	2004-09-20 21:01:08.000000000 +0900
@@ -296,10 +296,13 @@ static LRESULT MDISetMenu( HWND hwnd, HM
 
     if (!(ci = get_client_info( hwnd ))) return 0;
 
-    if (hmenuFrame == ci->hFrameMenu) return (LRESULT)hmenuFrame;
+    if (hmenuFrame)
+    {
+        if (hmenuFrame == ci->hFrameMenu) return (LRESULT)hmenuFrame;
 
-    if( IsZoomed(ci->hwndActiveChild) && hmenuFrame && hmenuFrame!= ci->hFrameMenu )
-        MDI_RestoreFrameMenu( hwndFrame, ci->hwndActiveChild );
+        if( IsZoomed(ci->hwndActiveChild) && hmenuFrame != ci->hFrameMenu )
+            MDI_RestoreFrameMenu( hwndFrame, ci->hwndActiveChild );
+    }
 
     if( hmenuWindow && hmenuWindow != ci->hWindowMenu )
     {
@@ -358,7 +361,7 @@ static LRESULT MDISetMenu( HWND hwnd, HM
  */
 static LRESULT MDI_RefreshMenu(MDICLIENTINFO *ci)
 {
-    UINT i, count, visible, separator_pos, id;
+    UINT i, count, visible, id;
     WCHAR buf[MDI_MAXTITLELENGTH];
 
     TRACE("children %u, window menu %p\n", ci->nActiveChildren, ci->hWindowMenu);
@@ -376,8 +379,6 @@ static LRESULT MDI_RefreshMenu(MDICLIENT
      * there is a menu item with MDI magic ID removes all existing
      * menu items after it, and then adds visible MDI children.
      */
-    id = (UINT)-1;
-    separator_pos = 0;
     count = GetMenuItemCount(ci->hWindowMenu);
     for (i = 0; i < count; i++)
     {
@@ -390,24 +391,25 @@ static LRESULT MDI_RefreshMenu(MDICLIENT
         {
             if (mii.fType & MF_SEPARATOR)
             {
-                separator_pos = i;
-
                 /* Windows checks only ID of the menu item */
                 memset(&mii, 0, sizeof(mii));
                 mii.cbSize = sizeof(mii);
                 mii.fMask  = MIIM_ID;
                 if (GetMenuItemInfoW(ci->hWindowMenu, i + 1, TRUE, &mii))
-                    id = mii.wID;
+                {
+                    if (mii.wID == ci->idFirstChild)
+                    {
+                        TRACE("removing %u items including separator\n", count - i);
+                        while (RemoveMenu(ci->hWindowMenu, i, MF_BYPOSITION))
+                            /* nothing */;
+
+                        break;
+                    }
+                }
             }
         }
     }
 
-    if (separator_pos && id == ci->idFirstChild)
-    {
-        for (i = separator_pos; i < count; i++)
-            RemoveMenu(ci->hWindowMenu, separator_pos, MF_BYPOSITION);
-    }
-
     visible = 0;
     for (i = 0; i < ci->nActiveChildren; i++)
     {
@@ -1022,7 +1024,8 @@ static LRESULT MDIClientWndProc_common( 
 
 	if (!hBmpClose) hBmpClose = CreateMDIMenuBitmap();
 
-        TRACE("Client created - hwnd = %p, idFirst = %u\n", hwnd, ci->idFirstChild );
+        TRACE("Client created: hwnd %p, Window menu %p, idFirst = %u\n",
+              hwnd, ci->hWindowMenu, ci->idFirstChild );
         return 0;
       }
 






More information about the wine-patches mailing list