use gtk_menu_attach_to_widget() and gtk_menu_detach() instead of

2006-01-04  Michael Natterer  <mitch@imendio.com>

	* gtk/gtkmenutoolbutton.c
	(gtk_menu_tool_button_set_menu)
	(gtk_menu_tool_button_destroy): use gtk_menu_attach_to_widget()
	and gtk_menu_detach() instead of reffing/unreffing the menu
	manually. Also fixes brokenness on screen change (bug #85715).
This commit is contained in:
Michael Natterer 2006-01-04 11:25:19 +00:00 committed by Michael Natterer
parent 04eceaf621
commit 51517c1a72
3 changed files with 32 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2006-01-04 Michael Natterer <mitch@imendio.com>
* gtk/gtkmenutoolbutton.c
(gtk_menu_tool_button_set_menu)
(gtk_menu_tool_button_destroy): use gtk_menu_attach_to_widget()
and gtk_menu_detach() instead of reffing/unreffing the menu
manually. Also fixes brokenness on screen change (bug #85715).
2006-01-04 Matthias Clasen <mclasen@redhat.com> 2006-01-04 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkaccelmap.c: * gtk/gtkaccelmap.c:

View File

@ -1,3 +1,11 @@
2006-01-04 Michael Natterer <mitch@imendio.com>
* gtk/gtkmenutoolbutton.c
(gtk_menu_tool_button_set_menu)
(gtk_menu_tool_button_destroy): use gtk_menu_attach_to_widget()
and gtk_menu_detach() instead of reffing/unreffing the menu
manually. Also fixes brokenness on screen change (bug #85715).
2006-01-04 Matthias Clasen <mclasen@redhat.com> 2006-01-04 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkaccelmap.c: * gtk/gtkaccelmap.c:

View File

@ -450,8 +450,7 @@ gtk_menu_tool_button_destroy (GtkObject *object)
g_signal_handlers_disconnect_by_func (button->priv->menu, g_signal_handlers_disconnect_by_func (button->priv->menu,
menu_deactivate_cb, menu_deactivate_cb,
button); button);
g_object_unref (button->priv->menu); gtk_menu_detach (button->priv->menu);
button->priv->menu = NULL;
g_signal_handlers_disconnect_by_func (button->priv->arrow_button, g_signal_handlers_disconnect_by_func (button->priv->arrow_button,
arrow_button_toggled_cb, arrow_button_toggled_cb,
@ -535,6 +534,17 @@ menu_deactivate_cb (GtkMenuShell *menu_shell,
return TRUE; return TRUE;
} }
static void
menu_detacher (GtkWidget *widget,
GtkMenu *menu)
{
GtkMenuToolButtonPrivate *priv = GTK_MENU_TOOL_BUTTON (widget)->priv;
g_return_if_fail (priv->menu == menu);
priv->menu = NULL;
}
/** /**
* gtk_menu_tool_button_set_menu: * gtk_menu_tool_button_set_menu:
* @button: a #GtkMenuToolButton * @button: a #GtkMenuToolButton
@ -566,18 +576,19 @@ gtk_menu_tool_button_set_menu (GtkMenuToolButton *button,
g_signal_handlers_disconnect_by_func (priv->menu, g_signal_handlers_disconnect_by_func (priv->menu,
menu_deactivate_cb, menu_deactivate_cb,
button); button);
g_object_unref (priv->menu); gtk_menu_detach (priv->menu);
} }
priv->menu = GTK_MENU (menu); priv->menu = GTK_MENU (menu);
if (priv->menu) if (priv->menu)
{ {
g_object_ref_sink (priv->menu); gtk_menu_attach_to_widget (priv->menu, GTK_WIDGET (button),
menu_detacher);
gtk_widget_set_sensitive (priv->arrow_button, TRUE); gtk_widget_set_sensitive (priv->arrow_button, TRUE);
g_signal_connect (button->priv->menu, "deactivate", g_signal_connect (priv->menu, "deactivate",
G_CALLBACK (menu_deactivate_cb), button); G_CALLBACK (menu_deactivate_cb), button);
} }
else else