summaryrefslogtreecommitdiff
path: root/gtk/gtkmenuitem.c
diff options
context:
space:
mode:
authorTim Janik <timj@gimp.org>1998-02-03 15:14:35 +0000
committerTim Janik <timj@src.gnome.org>1998-02-03 15:14:35 +0000
commit584231106242a6dd92f7744c0d9f5617574078c0 (patch)
tree8e642b1b83de4e6afb55db352127ad436c939696 /gtk/gtkmenuitem.c
parentb45cd0430c79f9426036ced2809427e0920dd855 (diff)
downloadgdk-pixbuf-584231106242a6dd92f7744c0d9f5617574078c0.tar.gz
don't add the same menu to different menuitems/ optionmenus.
Tue Feb 3 15:09:55 1998 Tim Janik <timj@gimp.org> * gtk/testgtk.c: don't add the same menu to different menuitems/ optionmenus. * gtk/gtkmenuitem.h: * gtk/gtkmenuitem.c: new function gtk_menu_item_remove_submenu ro be consistent with optionmenu. use gtk_menu_attach_to_widget/ gtk_menu_detach for setting/removing the submenu. invoke gtk_widget_destroy(submenu) in destructor to be consistent with other destructors. * gtk/gtkoptionmenu.h: * gtk/gtkoptionmenu.c: attach/detach to menu widget via gtk_menu_attach_to_widget/gtk_menu_detach. invoke gtk_widget_destroy(menu) in destructor to be consistent with other destructors.
Diffstat (limited to 'gtk/gtkmenuitem.c')
-rw-r--r--gtk/gtkmenuitem.c47
1 files changed, 33 insertions, 14 deletions
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c
index 8ead19f50..b710afd8a 100644
--- a/gtk/gtkmenuitem.c
+++ b/gtk/gtkmenuitem.c
@@ -196,40 +196,59 @@ gtk_menu_item_destroy (GtkObject *object)
menu_item = GTK_MENU_ITEM (object);
if (menu_item->submenu)
- {
- gtk_widget_destroy (menu_item->submenu);
- gtk_widget_unref (menu_item->submenu);
- menu_item->submenu = NULL;
- }
+ gtk_widget_destroy (menu_item->submenu);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
+static void
+gtk_menu_item_detacher (GtkWidget *widget,
+ GtkMenu *menu)
+{
+ GtkMenuItem *menu_item;
+
+ g_return_if_fail (widget != NULL);
+ g_return_if_fail (GTK_IS_MENU_ITEM (widget));
+
+ menu_item = GTK_MENU_ITEM (widget);
+ g_return_if_fail (menu_item->submenu == (GtkWidget*) menu);
+
+ menu_item->submenu = NULL;
+}
+
void
gtk_menu_item_set_submenu (GtkMenuItem *menu_item,
GtkWidget *submenu)
{
g_return_if_fail (menu_item != NULL);
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
-
+
if (menu_item->submenu != submenu)
{
- if (menu_item->submenu)
- {
- g_return_if_fail (!GTK_WIDGET_VISIBLE (menu_item->submenu));
- gtk_widget_unref (menu_item->submenu);
- }
+ gtk_menu_item_remove_submenu (menu_item);
+
menu_item->submenu = submenu;
- if (menu_item->submenu)
- gtk_widget_ref (menu_item->submenu);
-
+ gtk_menu_attach_to_widget (GTK_MENU (submenu),
+ GTK_WIDGET (menu_item),
+ gtk_menu_item_detacher);
+
if (GTK_WIDGET (menu_item)->parent)
gtk_widget_queue_resize (GTK_WIDGET (menu_item));
}
}
void
+gtk_menu_item_remove_submenu (GtkMenuItem *menu_item)
+{
+ g_return_if_fail (menu_item != NULL);
+ g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
+
+ if (menu_item->submenu)
+ gtk_menu_detach (GTK_MENU (menu_item->submenu));
+}
+
+void
gtk_menu_item_set_placement (GtkMenuItem *menu_item,
GtkSubmenuPlacement placement)
{