Updating branch refs/heads/master to b8e11daa4411952355c0b555995c58a2cb8507f7 (commit) from 1b80346e44c57e9f1d7b36e2604e595c7907f6ff (commit)
commit b8e11daa4411952355c0b555995c58a2cb8507f7 Author: Gearoid Murphy <gear...@murphy.com> Date: Sun Oct 14 12:26:34 2012 +0100 Finally fixed the context menu crashes for window actions on hover menu items. README | 2 ++ taskbar-widget.c | 45 ++++++++++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/README b/README index 3bc9c56..e439ac1 100644 --- a/README +++ b/README @@ -1,3 +1,5 @@ +Taskbar plugin was created using code from the Window Buttons plugin, written by Nick Schermer + 1) Make sure you've got the development packages # Valid for XUbuntu 12.04 diff --git a/taskbar-widget.c b/taskbar-widget.c index 7f80f7c..3ed3e17 100644 --- a/taskbar-widget.c +++ b/taskbar-widget.c @@ -247,6 +247,7 @@ static void xfce_taskbar_group_button_remove (XfceTaskBarGrou static void xfce_taskbar_group_button_add_window (XfceTaskBarGroup *group, XfceTaskBarWNode *window_child); static gboolean xfce_taskbar_group_button_enter_event (GtkWidget *button, GdkEvent *event, XfceTaskBarGroup *group); static gboolean xfce_taskbar_group_button_leave_event (GtkWidget *button, GdkEvent *event, XfceTaskBarGroup *group); +static void xfce_taskbar_group_button_menu_destroy (GtkWidget *menu_widget, XfceTaskBarGroup *group); static void xfce_taskbar_disable_group_enter_event(XfceTaskBar *taskbar); static void xfce_taskbar_enable_group_enter_event(XfceTaskBar *taskbar); @@ -262,8 +263,8 @@ static void cache_pinned_configuration (XfceTaskBar *taskba //hover menu functions static gboolean trigger_hover_menu_timeout(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr); -static gboolean hover_menu_leave(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr); -static gboolean hover_menu_enter(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr); +static gboolean xfce_taskbar_hover_menu_leave(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr); +static gboolean xfce_taskbar_hover_menu_enter(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr); static gboolean xfce_taskbar_hover_menu_timeout(gpointer menu_ptr); static gboolean xfce_taskbar_group_button_hover_timeout(gpointer group_ptr); static void xfce_taskbar_activate_hover_menu(GtkWidget *widget, XfceTaskBarGroup *group, size_t mouse_button); @@ -1571,6 +1572,12 @@ static gboolean xfce_taskbar_button_enter_notify_event (GtkWidget *button, GdkEv return FALSE; } +static void wnck_action_menu_destroy(GtkWidget *wnck_widget, GtkWidget *menu_widget) +{ + gtk_widget_destroy(wnck_widget); + xfce_taskbar_group_button_menu_destroy(menu_widget, NULL); +} + //This function handles mouse release events on the sub-menu of active windows associated with an application group //Returning FALSE will close the menu that generated the event, return TRUE will persist it static gboolean xfce_taskbar_app_button_release_event (GtkWidget *button, GdkEventButton *event, XfceTaskBarWNode *child) @@ -1609,8 +1616,15 @@ static gboolean xfce_taskbar_app_button_release_event (GtkWidget *button, GdkEve } else// if(event->button == RIGHTMOUSE) { - GtkWidget *menu ; - menu = wnck_action_menu_new (child->window); g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (gtk_widget_destroy), NULL); + GtkWidget *menu = wnck_action_menu_new (child->window); + + GList *attachlist = gtk_menu_get_for_attach_widget(child->group->button); + //This submenu is a component of the hover menu + panel_assert(g_list_length(attachlist) == 1); + GtkWidget *hover_menu = (GtkWidget *)attachlist->data; + //Unfortunately, this is quite elaborate :| + panel_assert(g_signal_handlers_disconnect_by_func (GTK_WINDOW (GTK_MENU(hover_menu)->toplevel), xfce_taskbar_hover_menu_leave, hover_menu) == 1); + g_signal_connect (G_OBJECT (menu), "selection-done", G_CALLBACK (wnck_action_menu_destroy), hover_menu); gtk_menu_attach_to_widget (GTK_MENU (menu), button, NULL); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, xfce_panel_plugin_position_menu, xfce_taskbar_get_panel_plugin (child->taskbar), event->button, event->time); return TRUE ; @@ -2130,6 +2144,7 @@ static void xfce_taskbar_group_button_toggle_pinned (XfceTaskBarGroup *group) } // Create the pinning functions first, then *append* the group actions to the menu +// This awkward way of constructing the pinned menu needs to be refactored static GtkWidget * xfce_taskbar_group_button_menu_group_actions (XfceTaskBarGroup *group) { GSList *li; @@ -2150,10 +2165,12 @@ static GtkWidget * xfce_taskbar_group_button_menu_group_actions (XfceTaskBarGrou //Only offer to pin windows with detectable pids else if(group->wnodes && wnck_window_get_pid(((XfceTaskBarWNode *)group->wnodes->data)->window) != 0) { - xfce_taskbar_group_button_build_pin_menu(group, menu); } + //FIXME: When these submenus activate, they cause a leave-notify event on the hover menu which + //triggers a destroy event after a short timeout, disabling them for the moment. + /* for (li = group->wnodes; li != NULL; li = li->next) { wnode = li->data; @@ -2166,10 +2183,10 @@ static GtkWidget * xfce_taskbar_group_button_menu_group_actions (XfceTaskBarGrou gtk_menu_item_set_submenu (GTK_MENU_ITEM (mi), wnck_action_menu_new (wnode->window)); } } - mi = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); gtk_widget_show (mi); + */ mi = gtk_image_menu_item_new_with_mnemonic (_("Mi_nimize All")); gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi); @@ -2215,14 +2232,11 @@ static GtkWidget * xfce_taskbar_group_button_menu_group_actions (XfceTaskBarGrou static void xfce_taskbar_group_button_menu_destroy(GtkWidget *menu_widget, XfceTaskBarGroup *group) { - panel_return_if_fail (XFCE_IS_taskbar (group->taskbar)); - panel_return_if_fail (GTK_IS_TOGGLE_BUTTON (group->button)); - panel_return_if_fail (GTK_IS_WIDGET (menu_widget)); xfce_taskbar_disable_hover_menu_timeout(menu_widget); gtk_widget_destroy (menu_widget); #ifdef GDK_WINDOWING_X11 // Removes the wireframe associated with the currently selected window - xfce_taskbar_wireframe_hide (group->taskbar); + if(group) xfce_taskbar_wireframe_hide (group->taskbar); #endif } @@ -2279,7 +2293,6 @@ static gboolean xfce_taskbar_group_button_release_event { GtkMenu *menu = attached->data; menu_source = (size_t)(g_object_get_data(G_OBJECT(menu), "menu-source")); - printf("menu_source: %zu\n", menu_source); gtk_widget_destroy (GTK_WIDGET(menu)); } @@ -2382,7 +2395,7 @@ static void xfce_taskbar_disable_hover_menu_timeout(GtkWidget *menu_widget) } //Triggered when mouse focus enters the hover menu -static gboolean hover_menu_enter(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr) +static gboolean xfce_taskbar_hover_menu_enter(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr) { GtkWidget *menu_widget = (GtkWidget *)menu_ptr; xfce_taskbar_disable_hover_menu_timeout(menu_widget); @@ -2390,14 +2403,12 @@ static gboolean hover_menu_enter(GtkWidget *widget, GdkEvent *event, gpointer m } //Triggered when mouse focus leaves the hover menu -static gboolean hover_menu_leave(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr) +static gboolean xfce_taskbar_hover_menu_leave(GtkWidget *widget, GdkEvent *event, gpointer menu_ptr) { GtkWidget *menu_widget = (GtkWidget *)menu_ptr; - //We don't want to kill the hover menu immediately, so we wait a small time size_t timeout_id = (size_t)g_timeout_add(300, xfce_taskbar_hover_menu_timeout, menu_widget); g_object_set_data(G_OBJECT(menu_widget), "timeout_id", (void *)timeout_id); - return FALSE ; } @@ -2406,8 +2417,8 @@ static void xfce_taskbar_activate_hover_menu(GtkWidget *menu_widget, XfceTaskBar gtk_menu_attach_to_widget (GTK_MENU (menu_widget), group->button, NULL); g_object_set_data(G_OBJECT(menu_widget), "menu-source", (void *)mouse_button); g_signal_connect (G_OBJECT (menu_widget), "selection-done", G_CALLBACK (xfce_taskbar_group_button_menu_destroy), group); - g_signal_connect (GTK_WINDOW (GTK_MENU(menu_widget)->toplevel), "enter-notify-event", G_CALLBACK (hover_menu_enter), menu_widget); - g_signal_connect (GTK_WINDOW (GTK_MENU(menu_widget)->toplevel), "leave-notify-event", G_CALLBACK (hover_menu_leave), menu_widget); + g_signal_connect (GTK_WINDOW (GTK_MENU(menu_widget)->toplevel), "enter-notify-event", G_CALLBACK (xfce_taskbar_hover_menu_enter), menu_widget); + g_signal_connect (GTK_WINDOW (GTK_MENU(menu_widget)->toplevel), "leave-notify-event", G_CALLBACK (xfce_taskbar_hover_menu_leave), menu_widget); { gint x, y ; gboolean push_in=TRUE; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits