diff options
author | Tim Janik <timj@gimp.org> | 1998-02-03 15:14:35 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-02-03 15:14:35 +0000 |
commit | 584231106242a6dd92f7744c0d9f5617574078c0 (patch) | |
tree | 8e642b1b83de4e6afb55db352127ad436c939696 /gtk/gtkmenuitem.c | |
parent | b45cd0430c79f9426036ced2809427e0920dd855 (diff) | |
download | gtk+-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.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c index 8ead19f502..b710afd8a9 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) { |