Updating branch refs/heads/master to 3d44306b86b5942887e4c1650d3cc21e102bf944 (commit) from b8e11daa4411952355c0b555995c58a2cb8507f7 (commit)
commit 3d44306b86b5942887e4c1650d3cc21e102bf944 Author: Gearoid Murphy <gear...@murphy.com> Date: Sun Oct 14 12:55:18 2012 +0100 Usability tweak. taskbar-widget.c | 41 ++++++++++++++++++++++++----------------- 1 files changed, 24 insertions(+), 17 deletions(-) diff --git a/taskbar-widget.c b/taskbar-widget.c index 3ed3e17..2cecb52 100644 --- a/taskbar-widget.c +++ b/taskbar-widget.c @@ -73,6 +73,7 @@ enum enum {LEFTMOUSE=1, MIDMOUSE=2, RIGHTMOUSE=3} ; +enum { HOVER_DISPLAY_COOLOFF=200, GROUP_ICON_HOVER_TIMEOUT=250 } ; struct _XfceTaskBarClass { @@ -193,6 +194,7 @@ struct _XfceTaskBarGroup gboolean pinned ; gchar *command ; guint hover_timeout ; + guint hover_visible_timestamp ; }; #define DISABLE_HOVER_TIMEOUT(group) if(group->hover_timeout != 0) {g_source_remove(group->hover_timeout); group->hover_timeout=0;} @@ -2254,16 +2256,14 @@ static gboolean xfce_taskbar_group_button_release_event { GtkWidget *panel_plugin; GtkWidget *menu_widget; - + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (group->button), FALSE); //Disable the timeout, if active DISABLE_HOVER_TIMEOUT(group); - panel_return_val_if_fail (XFCE_IS_taskbar (group->taskbar), FALSE); - if (event->type != GDK_BUTTON_RELEASE || xfce_taskbar_is_locked (group->taskbar)) return FALSE; - + //Some hacky stuff for drag and drop if(group->taskbar->dragactive == TRUE) { @@ -2272,18 +2272,6 @@ static gboolean xfce_taskbar_group_button_release_event return FALSE ; } - /* send the event to the panel plugin if control is pressed */ - if (PANEL_HAS_FLAG (event->state, GDK_CONTROL_MASK)) - { - /* send the event to the panel plugin */ - panel_plugin = xfce_taskbar_get_panel_plugin (group->taskbar); - if (G_LIKELY (panel_plugin != NULL)) - { - gtk_widget_event (panel_plugin, (GdkEvent *) event); - } - return TRUE; - } - //Check if there's a hover menu active, if so, disable it GList *attached = gtk_menu_get_for_attach_widget(group->button); guint list_length = g_list_length(attached); @@ -2292,7 +2280,15 @@ static gboolean xfce_taskbar_group_button_release_event if(list_length == 1) { GtkMenu *menu = attached->data; + gint time_diff = (gtk_get_current_event_time() - group->hover_visible_timestamp); menu_source = (size_t)(g_object_get_data(G_OBJECT(menu), "menu-source")); + //We don't want to dismiss the menu if the user generates a + //request for it very shortly after it has appeared + if(event->button == LEFTMOUSE && time_diff < HOVER_DISPLAY_COOLOFF) + { + return TRUE ; + } + gtk_widget_destroy (GTK_WIDGET(menu)); } @@ -2419,6 +2415,7 @@ static void xfce_taskbar_activate_hover_menu(GtkWidget *menu_widget, XfceTaskBar 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 (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; @@ -2450,6 +2447,9 @@ static gboolean xfce_taskbar_group_button_hover_timeout(gpointer group_ptr) //Create and raise the menu menu_widget = xfce_taskbar_group_button_menu_show_active (group); + //This isn;t a proper event, so we cannot use gtk_get_current_event_time(); + //Therefore we set hover_visible_timestamp in xfce_taskbar_group_button_enter_event + group->hover_visible_timestamp += GROUP_ICON_HOVER_TIMEOUT ; //Attach the menu widget to the button widget xfce_taskbar_activate_hover_menu(menu_widget, group, LEFTMOUSE); @@ -2488,7 +2488,8 @@ static gboolean xfce_taskbar_group_button_enter_event(GtkWidget *button, GdkEven if(xfce_taskbar_group_visible_count(group, wnck_screen_get_active_workspace (group->taskbar->screen)) > 0) { - group->hover_timeout = g_timeout_add(250, xfce_taskbar_group_button_hover_timeout, group); + group->hover_timeout = g_timeout_add(GROUP_ICON_HOVER_TIMEOUT, xfce_taskbar_group_button_hover_timeout, group); + group->hover_visible_timestamp = gtk_get_current_event_time(); } return TRUE ; } @@ -2615,6 +2616,12 @@ static XfceTaskBarGroup * xfce_taskbar_group_button_new (const char *group_name, //The timeout id, used when tracking a mouse hovering over the button group->hover_timeout = 0 ; + //This is a usability tweak, I frequently find that I click the group icon + //just after the hover menu appears, causing it to be removed, this timestamp + //will be used to ensure that a small window of time has elapsed before destroy + //the window based on a user mouse click + group->hover_visible_timestamp = 0 ; + group->button = xfce_arrow_button_new (GTK_ARROW_NONE); gtk_widget_set_parent (group->button, GTK_WIDGET (taskbar)); gtk_widget_set_tooltip_text (group->button, group_name); _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits