changeset 185:f55677513954

Updated the menu code.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 19 Dec 2002 04:16:32 +0000
parents 4ec906d40ce2
children 4c4e94a63748
files dw.h gtk/dw.c os2/dw.c win/dw.c
diffstat 4 files changed, 86 insertions(+), 148 deletions(-) [+]
line wrap: on
line diff
--- a/dw.h	Thu Dec 19 02:18:12 2002 +0000
+++ b/dw.h	Thu Dec 19 04:16:32 2002 +0000
@@ -149,11 +149,10 @@
 	HWND handle;
 } *HPIXMAP;
 
-typedef struct _hmenui {
-	HWND menu;
-} *HMENUI;
+typedef HWND HMENUI;
+typedef HMODULE HMOD;
 
-typedef HMODULE HMOD;
+#define DW_NOMENU NULLHANDLE
 
 extern HAB dwhab;
 extern HMQ dwhmq;
@@ -328,8 +327,9 @@
 typedef struct _hmenui {
 	HMENU menu;
 	HWND hwnd;
-} *HMENUI;
+} HMENUI;
 
+static HMENUI DW_NOMENU = { 0, 0 };
 #endif
 
 typedef struct _item {
@@ -515,9 +515,9 @@
     HWND handle;
 } *HPIXMAP;
 
-typedef struct _hmenui {
-	GtkWidget *menu;
-} *HMENUI;
+typedef GtkWidget *HMENUI;
+
+#define DW_NOMENU NULL
 
 typedef struct _resource_struct {
 	long resource_max, *resource_id;
--- a/gtk/dw.c	Thu Dec 19 02:18:12 2002 +0000
+++ b/gtk/dw.c	Thu Dec 19 04:16:32 2002 +0000
@@ -1705,18 +1705,15 @@
 HMENUI dw_menu_new(unsigned long id)
 {
 	int _locked_by_me = FALSE;
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
 	GtkAccelGroup *accel_group;
-
-	if(!tmp)
-		return NULL;
-
-	DW_MUTEX_LOCK;
-	tmp->menu = gtk_menu_new();
-	gtk_widget_show(tmp->menu);
+	HMENUI tmp;
+
+	DW_MUTEX_LOCK;
+	tmp = gtk_menu_new();
+	gtk_widget_show(tmp);
 	accel_group = gtk_accel_group_new();
-	gtk_object_set_data(GTK_OBJECT(tmp->menu), "id", (gpointer)id);
-	gtk_object_set_data(GTK_OBJECT(tmp->menu), "accel", (gpointer)accel_group);
+	gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id);
+	gtk_object_set_data(GTK_OBJECT(tmp), "accel", (gpointer)accel_group);
 	DW_MUTEX_UNLOCK;
 	return tmp;
 }
@@ -1730,21 +1727,18 @@
 {
 	GtkWidget *box;
 	int _locked_by_me = FALSE;
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
 	GtkAccelGroup *accel_group;
-
-	if(!tmp)
-		return NULL;
-
-	DW_MUTEX_LOCK;
-	tmp->menu = gtk_menu_bar_new();
+	HMENUI tmp;
+
+	DW_MUTEX_LOCK;
+	tmp = gtk_menu_bar_new();
 	box = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(location));
-	gtk_widget_show(tmp->menu);
+	gtk_widget_show(tmp);
 	accel_group = gtk_accel_group_new();
-	gtk_object_set_data(GTK_OBJECT(tmp->menu), "accel", (gpointer)accel_group);
+	gtk_object_set_data(GTK_OBJECT(tmp), "accel", (gpointer)accel_group);
 
 	if(box)
-		gtk_box_pack_end(GTK_BOX(box), tmp->menu, FALSE, FALSE, 0);
+		gtk_box_pack_end(GTK_BOX(box), tmp, FALSE, FALSE, 0);
 
 	DW_MUTEX_UNLOCK;
 	return tmp;
@@ -1762,8 +1756,7 @@
 		int _locked_by_me = FALSE;
 
 		DW_MUTEX_LOCK;
-		gtk_widget_destroy((*menu)->menu);
-		free(*menu);
+		gtk_widget_destroy(*menu);
 		*menu = NULL;
 		DW_MUTEX_UNLOCK;
 	}
@@ -1811,7 +1804,7 @@
 	guint tmp_key;
 	GtkAccelGroup *accel_group;
 
-	if(!menu || !menu->menu)
+	if(!menu)
 	{
 		free(tempbuf);
 		return NULL;
@@ -1820,8 +1813,8 @@
 	DW_MUTEX_LOCK;
 	accel = _removetilde(tempbuf, title);
 
-	accel_group = (GtkAccelGroup *)gtk_object_get_data(GTK_OBJECT(menu->menu), "accel");
-	submenucount = (int)gtk_object_get_data(GTK_OBJECT(menu->menu), "submenucount");
+	accel_group = (GtkAccelGroup *)gtk_object_get_data(GTK_OBJECT(menu), "accel");
+	submenucount = (int)gtk_object_get_data(GTK_OBJECT(menu), "submenucount");
 
 	if(strlen(tempbuf) == 0)
 		tmphandle=gtk_menu_item_new();
@@ -1842,7 +1835,7 @@
 				tmphandle=gtk_check_menu_item_new_with_label(tempbuf);
 			gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(tmphandle), TRUE);
 			sprintf(numbuf, "%lu", id);
-			gtk_object_set_data(GTK_OBJECT(menu->menu), numbuf, (gpointer)tmphandle);
+			gtk_object_set_data(GTK_OBJECT(menu), numbuf, (gpointer)tmphandle);
 		}
 		else
 		{
@@ -1867,15 +1860,15 @@
 
 		sprintf(tempbuf, "submenu%d", submenucount);
 		submenucount++;
-		gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), submenu->menu);
-		gtk_object_set_data(GTK_OBJECT(menu->menu), tempbuf, (gpointer)submenu->menu);
-		gtk_object_set_data(GTK_OBJECT(menu->menu), "submenucount", (gpointer)submenucount);
-	}
-
-	if(GTK_IS_MENU_BAR(menu->menu))
-		gtk_menu_bar_append(GTK_MENU_BAR(menu->menu), tmphandle);
+		gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), submenu);
+		gtk_object_set_data(GTK_OBJECT(menu), tempbuf, (gpointer)submenu);
+		gtk_object_set_data(GTK_OBJECT(menu), "submenucount", (gpointer)submenucount);
+	}
+
+	if(GTK_IS_MENU_BAR(menu))
+		gtk_menu_bar_append(GTK_MENU_BAR(menu), tmphandle);
 	else
-		gtk_menu_append(GTK_MENU(menu->menu), tmphandle);
+		gtk_menu_append(GTK_MENU(menu), tmphandle);
 
 	gtk_object_set_data(GTK_OBJECT(tmphandle), "id", (gpointer)id);
 	free(tempbuf);
@@ -1920,12 +1913,12 @@
 	GtkWidget *tmphandle;
 	int _locked_by_me = FALSE;
 
-	if(!menu || !menu->menu)
+	if(!menu)
 		return;
 
 	DW_MUTEX_LOCK;
 	sprintf(numbuf, "%lu", id);
-	tmphandle = _find_submenu_id(menu->menu, numbuf);
+	tmphandle = _find_submenu_id(menu, numbuf);
 
 	if(tmphandle)
 	{
@@ -1955,8 +1948,7 @@
 	popup = parent;
 
 	DW_MUTEX_LOCK;
-	gtk_menu_popup(GTK_MENU((*menu)->menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
-	free(*menu);
+	gtk_menu_popup(GTK_MENU(*menu), NULL, NULL, NULL, NULL, 1, GDK_CURRENT_TIME);
 	*menu = NULL;
 	DW_MUTEX_UNLOCK;
 }
--- a/os2/dw.c	Thu Dec 19 02:18:12 2002 +0000
+++ b/os2/dw.c	Thu Dec 19 04:16:32 2002 +0000
@@ -3682,21 +3682,16 @@
  */
 HMENUI API dw_menu_new(ULONG id)
 {
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
-
-	if(!tmp)
-		return NULL;
-
-	tmp->menu = WinCreateWindow(HWND_OBJECT,
-								WC_MENU,
-								NULL,
-								WS_VISIBLE,
-								0,0,2000,1000,
-								NULLHANDLE,
-								HWND_TOP,
-								id,
-								NULL,
-								NULL);
+	HMENUI tmp = WinCreateWindow(HWND_OBJECT,
+								 WC_MENU,
+								 NULL,
+								 WS_VISIBLE,
+								 0,0,2000,1000,
+								 NULLHANDLE,
+								 HWND_TOP,
+								 id,
+								 NULL,
+								 NULL);
 	return tmp;
 }
 
@@ -3707,21 +3702,16 @@
  */
 HMENUI API dw_menubar_new(HWND location)
 {
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
-
-	if(!tmp)
-		return NULL;
-
-	tmp->menu = WinCreateWindow(location,
-								WC_MENU,
-								NULL,
-								WS_VISIBLE | MS_ACTIONBAR,
-								0,0,2000,1000,
-								location,
-								HWND_TOP,
-								FID_MENU,
-								NULL,
-								NULL);
+	HMENUI tmp = WinCreateWindow(location,
+								 WC_MENU,
+								 NULL,
+								 WS_VISIBLE | MS_ACTIONBAR,
+								 0,0,2000,1000,
+								 location,
+								 HWND_TOP,
+								 FID_MENU,
+								 NULL,
+								 NULL);
 	return tmp;
 }
 
@@ -3732,12 +3722,8 @@
  */
 void API dw_menu_destroy(HMENUI *menu)
 {
-	if(menu && *menu)
-	{
-		WinDestroyWindow((*menu)->menu);
-		free(*menu);
-		*menu = NULL;
-	}
+	if(menu)
+		WinDestroyWindow(*menu);
 }
 
 /*
@@ -3754,13 +3740,10 @@
 HWND API dw_menu_append_item(HMENUI menux, char *title, ULONG id, ULONG flags, int end, int check, HMENUI submenu)
 {
 	MENUITEM miSubMenu;
-	HWND menu;
 
 	if(!menux)
 		return NULLHANDLE;
 
-	menu = menux->menu;
-
 	if(end)
 		miSubMenu.iPosition=MIT_END;
 	else
@@ -3772,15 +3755,13 @@
 		miSubMenu.afStyle=MIS_TEXT | flags;
 	miSubMenu.afAttribute=0;
 	miSubMenu.id=id;
-	miSubMenu.hwndSubMenu = submenu ? submenu->menu : 0;
+	miSubMenu.hwndSubMenu = submenu;
 	miSubMenu.hItem=NULLHANDLE;
 
-	WinSendMsg(menu,
+	WinSendMsg(menux,
 			   MM_INSERTITEM,
 			   MPFROMP(&miSubMenu),
 			   MPFROMP(title));
-	if(submenu)
-		free(submenu);
 	return (HWND)id;
 }
 
@@ -3793,18 +3774,11 @@
  */
 void API dw_menu_item_set_check(HMENUI menux, unsigned long id, int check)
 {
-	HWND menu;
-
-	if(!menux)
-		return;
-
-	menu = menux->menu;
-
 	if(check)
-		WinSendMsg(menu, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
+		WinSendMsg(menux, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
 				   MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
 	else
-		WinSendMsg(menu, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
+		WinSendMsg(menux, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
 				   MPFROM2SHORT(MIA_CHECKED, 0));
 }
 
@@ -3818,12 +3792,10 @@
  */
 void API dw_menu_popup(HMENUI *menu, HWND parent, int x, int y)
 {
-	if(menu && *menu)
+	if(menu)
 	{
 		popup = parent;
-		WinPopupMenu(HWND_DESKTOP, parent, (*menu)->menu, x, dw_screen_height() - y, 0, PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_VCONSTRAIN | PU_HCONSTRAIN);
-		free(*menu);
-		*menu = NULL;
+		WinPopupMenu(HWND_DESKTOP, parent, *menu, x, dw_screen_height() - y, 0, PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_VCONSTRAIN | PU_HCONSTRAIN);
 	}
 }
 
--- a/win/dw.c	Thu Dec 19 02:18:12 2002 +0000
+++ b/win/dw.c	Thu Dec 19 04:16:32 2002 +0000
@@ -3571,13 +3571,10 @@
  */
 HMENUI API dw_menu_new(ULONG id)
 {
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
-
-	if(!tmp)
-		return NULL;
-
-	tmp->menu = CreatePopupMenu();
-	tmp->hwnd = NULL;
+	HMENUI tmp;
+
+	tmp.menu = CreatePopupMenu();
+	tmp.hwnd = NULL;
 	return tmp;
 }
 
@@ -3588,15 +3585,12 @@
  */
 HMENUI API dw_menubar_new(HWND location)
 {
-	HMENUI tmp = malloc(sizeof(struct _hmenui));
-
-	if(!tmp)
-		return NULL;
-
-	tmp->menu = CreateMenu();
-	tmp->hwnd = location;
-
-	SetMenu(location, tmp->menu);
+	HMENUI tmp;
+
+	tmp.menu = CreateMenu();
+	tmp.hwnd = location;
+
+	SetMenu(location, tmp.menu);
 	return tmp;
 }
 
@@ -3607,12 +3601,8 @@
  */
 void API dw_menu_destroy(HMENUI *menu)
 {
-	if(menu && *menu)
-	{
-		DestroyMenu((*menu)->menu);
-		free(*menu);
-		*menu = NULL;
-	}
+	if(menu)
+		DestroyMenu(menu->menu);
 }
 
 /*
@@ -3629,12 +3619,6 @@
 HWND API dw_menu_append_item(HMENUI menux, char *title, ULONG id, ULONG flags, int end, int check, HMENUI submenu)
 {
 	MENUITEMINFO mii;
-	HMENU menu;
-
-	if(!menux)
-		return NULL;
-
-	menu = menux->menu;
 
 	mii.cbSize = sizeof(MENUITEMINFO);
 	mii.fMask = MIIM_ID | MIIM_SUBMENU | MIIM_TYPE;
@@ -3658,15 +3642,13 @@
 		mii.fType = MFT_SEPARATOR;
 
 	mii.wID = id;
-	mii.hSubMenu = submenu ? submenu->menu : 0;
+	mii.hSubMenu = submenu.menu;
 	mii.dwTypeData = title;
 	mii.cch = strlen(title);
 
-	InsertMenuItem(menu, 65535, TRUE, &mii);
-	if(menux->hwnd)
-		DrawMenuBar(menux->hwnd);
-	if(submenu)
-		free(submenu);
+	InsertMenuItem(menux.menu, 65535, TRUE, &mii);
+	if(menux.hwnd)
+		DrawMenuBar(menux.hwnd);
 	return (HWND)id;
 }
 
@@ -3680,12 +3662,6 @@
 void API dw_menu_item_set_check(HMENUI menux, unsigned long id, int check)
 {
 	MENUITEMINFO mii;
-	HMENU menu;
-
-	if(!menux)
-		return;
-
-	menu = menux->menu;
 
 	mii.cbSize = sizeof(MENUITEMINFO);
 	mii.fMask = MIIM_STATE;
@@ -3693,7 +3669,7 @@
 		mii.fState = MFS_CHECKED;
 	else
 		mii.fState = MFS_UNCHECKED;
-	SetMenuItemInfo(menu, id, FALSE, &mii);
+	SetMenuItemInfo(menux.menu, id, FALSE, &mii);
 }
 
 /*
@@ -3706,13 +3682,11 @@
  */
 void API dw_menu_popup(HMENUI *menu, HWND parent, int x, int y)
 {
-	if(menu && *menu)
+	if(menu)
 	{
 		popup = parent;
-		TrackPopupMenu((*menu)->menu, 0, x, y, 0, parent, NULL);
-		DestroyMenu((*menu)->menu);
-		free(*menu);
-		*menu = NULL;
+		TrackPopupMenu(menu->menu, 0, x, y, 0, parent, NULL);
+		DestroyMenu(menu->menu);
 	}
 }