[PATCH] Menu entries with text=NULL

gerard patel gerard.patel at asi.fr
Mon Mar 19 03:01:36 CST 2001


Following the bug report by lawson whitney, here is a bug fix.
The problem is that the pseudo menu bar for the system menu is never
displayed, so until my previous patch in MENU_InitTracking, 
MENU_CalcItemSize was never called.
Since it is now, it's necessary to test if the menu item belong to this
pseudo menu bar.

Also fixes some cases in SetMenuItemInfo_common where text could
be set to NULL with the MF_TEXT flag 'set'.

ChangeLog:

	* controls/menu.c
                   Fix system menu crash by ensuring that item->text is not null when MF_TEXT set
-------------- next part --------------
? controls/menu.c.new
Index: controls/menu.c
===================================================================
RCS file: /home/wine/wine/controls/menu.c,v
retrieving revision 1.109
diff -u -r1.109 menu.c
--- controls/menu.c	2001/03/14 17:24:59	1.109
+++ controls/menu.c	2001/03/19 08:53:11
@@ -865,8 +865,8 @@
     }
     
 
-    /* If we get here, then it must be a text item */
-    if (IS_STRING_ITEM( lpitem->fType ))
+    /* it must be a text item - unless it's the system menu */
+    if (!(lpitem->fType & MF_SYSMENU) && IS_STRING_ITEM( lpitem->fType ))
     {   SIZE size;
 
 	GetTextExtentPoint32W(hdc, lpitem->text,  strlenW(lpitem->text), &size);
@@ -1852,6 +1852,7 @@
     LPWSTR prevText = IS_STRING_ITEM(item->fType) ? item->text : NULL;
 
     debug_print_menuitem("MENU_SetItemData from: ", item, "");
+    TRACE("flags=%x str=%p\n", flags, str);
 
     if (IS_STRING_ITEM(flags))
     {
@@ -4511,6 +4512,8 @@
 {
     if (!menu) return FALSE;
 
+    debug_print_menuitem("MENU_SetItemInfo_common from: ", menu, "");
+
     if (lpmii->fMask & MIIM_TYPE ) {
 	/* Get rid of old string.  */
 	if ( IS_STRING_ITEM(menu->fType) && menu->text) {
@@ -4524,11 +4527,15 @@
 
 	menu->text = lpmii->dwTypeData;
 
-	if (IS_STRING_ITEM(menu->fType) && menu->text) {
-	    if (unicode)
-		menu->text = HEAP_strdupW(GetProcessHeap(), 0,  lpmii->dwTypeData);
-	    else
-		menu->text = HEAP_strdupAtoW(GetProcessHeap(), 0, (LPSTR)lpmii->dwTypeData);
+       if (IS_STRING_ITEM(menu->fType)) {
+            if (menu->text) {
+                if (unicode)
+                   menu->text = HEAP_strdupW(GetProcessHeap(), 0,  lpmii->dwTypeData);
+                else
+                   menu->text = HEAP_strdupAtoW(GetProcessHeap(), 0, (LPSTR)lpmii->dwTypeData);
+                }
+            else
+                menu->fType |= MF_SEPARATOR;
 	}
     }
 
@@ -4540,16 +4547,22 @@
 	}
 	menu->fType &= ~MENU_ITEM_TYPE(menu->fType);
 	menu->fType |= MENU_ITEM_TYPE(lpmii->fType);
+        if ( IS_STRING_ITEM(menu->fType) && !menu->text )
+            menu->fType |= MF_SEPARATOR;
     }
 
     if (lpmii->fMask & MIIM_STRING ) {
 	/* free the string when used */
 	if ( IS_STRING_ITEM(menu->fType) && menu->text) {
 	    HeapFree(GetProcessHeap(), 0, menu->text);
-	    if (unicode)
-		menu->text = HEAP_strdupW(GetProcessHeap(), 0,  lpmii->dwTypeData);
-	    else
-		menu->text = HEAP_strdupAtoW(GetProcessHeap(), 0, (LPSTR) lpmii->dwTypeData);
+            if (lpmii->dwTypeData) {
+	        if (unicode)
+		    menu->text = HEAP_strdupW(GetProcessHeap(), 0,  lpmii->dwTypeData);
+	        else
+		    menu->text = HEAP_strdupAtoW(GetProcessHeap(), 0, (LPSTR) lpmii->dwTypeData);
+            }
+            else
+                menu->fType |= MF_SEPARATOR;
 	}
     }
 
@@ -4589,7 +4602,7 @@
     if (lpmii->fMask & MIIM_DATA)
 	menu->dwItemData = lpmii->dwItemData;
 
-    debug_print_menuitem("SetMenuItemInfo_common: ", menu, "");
+    debug_print_menuitem("SetMenuItemInfo_common to : ", menu, "");
     return TRUE;
 }
 
-------------- next part --------------



More information about the wine-patches mailing list