Updating branch refs/heads/master to bb96457d8cf1a83052197b1e722eda3c59eb7433 (commit) from b461fc9f02c38a0e862696f2b22175d0f146ce5b (commit)
commit bb96457d8cf1a83052197b1e722eda3c59eb7433 Author: Nick Schermer <n...@xfce.org> Date: Thu Dec 27 12:21:45 2012 +0100 Revert "Remove right-click drag possibility (bug #3549)." This reverts commit edc8e5da5777813956cd8b30a4f64f586c97a3ee. With a modification to always allow a minimum timeout value of 225ms to still fix bug #3549. thunar/thunar-abstract-icon-view.c | 2 +- thunar/thunar-standard-view.c | 145 ++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 1 deletions(-) diff --git a/thunar/thunar-abstract-icon-view.c b/thunar/thunar-abstract-icon-view.c index b45bfc0..c79b747 100644 --- a/thunar/thunar-abstract-icon-view.c +++ b/thunar/thunar-abstract-icon-view.c @@ -500,7 +500,7 @@ thunar_abstract_icon_view_button_press_event (ExoIconView *view, gtk_tree_path_free (path); /* queue the menu popup */ - thunar_standard_view_context_menu (THUNAR_STANDARD_VIEW (abstract_icon_view), event->button, event->time); + thunar_standard_view_queue_popup (THUNAR_STANDARD_VIEW (abstract_icon_view), event); } else if ((event->state & gtk_accelerator_get_default_mod_mask ()) == 0) { diff --git a/thunar/thunar-standard-view.c b/thunar/thunar-standard-view.c index 7cdaadb..e82d271 100644 --- a/thunar/thunar-standard-view.c +++ b/thunar/thunar-standard-view.c @@ -206,6 +206,12 @@ static GClosure *thunar_standard_view_new_files_closure (Thu GtkWidget *source_view); static void thunar_standard_view_new_files (ThunarStandardView *standard_view, GList *path_list); +static gboolean thunar_standard_view_button_release_event (GtkWidget *view, + GdkEventButton *event, + ThunarStandardView *standard_view); +static gboolean thunar_standard_view_motion_notify_event (GtkWidget *view, + GdkEventMotion *event, + ThunarStandardView *standard_view); static gboolean thunar_standard_view_key_press_event (GtkWidget *view, GdkEventKey *event, ThunarStandardView *standard_view); @@ -272,6 +278,8 @@ static void thunar_standard_view_sort_column_changed (Gtk static void thunar_standard_view_loading_unbound (gpointer user_data); static gboolean thunar_standard_view_drag_scroll_timer (gpointer user_data); static void thunar_standard_view_drag_scroll_timer_destroy (gpointer user_data); +static gboolean thunar_standard_view_drag_timer (gpointer user_data); +static void thunar_standard_view_drag_timer_destroy (gpointer user_data); static void thunar_standard_view_finished_thumbnailing (ThunarThumbnailer *thumbnailer, guint request, ThunarStandardView *standard_view); @@ -332,6 +340,7 @@ struct _ThunarStandardViewPrivate /* right-click drag/popup support */ GList *drag_g_file_list; guint drag_scroll_timer_id; + guint drag_timer_id; gint drag_x; gint drag_y; @@ -808,6 +817,10 @@ thunar_standard_view_dispose (GObject *object) if (G_UNLIKELY (standard_view->priv->drag_scroll_timer_id != 0)) g_source_remove (standard_view->priv->drag_scroll_timer_id); + /* be sure to cancel any pending drag timer */ + if (G_UNLIKELY (standard_view->priv->drag_timer_id != 0)) + g_source_remove (standard_view->priv->drag_timer_id); + /* reset the UI manager property */ thunar_component_set_ui_manager (THUNAR_COMPONENT (standard_view), NULL); @@ -2921,6 +2934,56 @@ thunar_standard_view_new_files (ThunarStandardView *standard_view, static gboolean +thunar_standard_view_button_release_event (GtkWidget *view, + GdkEventButton *event, + ThunarStandardView *standard_view) +{ + _thunar_return_val_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view), FALSE); + _thunar_return_val_if_fail (standard_view->priv->drag_timer_id != 0, FALSE); + + /* cancel the pending drag timer */ + g_source_remove (standard_view->priv->drag_timer_id); + + /* fire up the context menu */ + thunar_standard_view_context_menu (standard_view, 0, event->time); + + return TRUE; +} + + + +static gboolean +thunar_standard_view_motion_notify_event (GtkWidget *view, + GdkEventMotion *event, + ThunarStandardView *standard_view) +{ + GdkDragContext *context; + GtkTargetList *target_list; + + _thunar_return_val_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view), FALSE); + _thunar_return_val_if_fail (standard_view->priv->drag_timer_id != 0, FALSE); + + /* check if we passed the DnD threshold */ + if (gtk_drag_check_threshold (view, standard_view->priv->drag_x, standard_view->priv->drag_y, event->x, event->y)) + { + /* cancel the drag timer, as we won't popup the menu anymore */ + g_source_remove (standard_view->priv->drag_timer_id); + + /* allocate the drag context (preferred action is to ask the user) */ + target_list = gtk_target_list_new (drag_targets, G_N_ELEMENTS (drag_targets)); + context = gtk_drag_begin (view, target_list, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK, 3, (GdkEvent *) event); + context->suggested_action = GDK_ACTION_ASK; + gtk_target_list_unref (target_list); + + return TRUE; + } + + return FALSE; +} + + + +static gboolean thunar_standard_view_scroll_event (GtkWidget *view, GdkEventScroll *event, ThunarStandardView *standard_view) @@ -3769,6 +3832,34 @@ thunar_standard_view_drag_scroll_timer_destroy (gpointer user_data) +static gboolean +thunar_standard_view_drag_timer (gpointer user_data) +{ + ThunarStandardView *standard_view = THUNAR_STANDARD_VIEW (user_data); + + /* fire up the context menu */ + GDK_THREADS_ENTER (); + thunar_standard_view_context_menu (standard_view, 3, gtk_get_current_event_time ()); + GDK_THREADS_LEAVE (); + + return FALSE; +} + + + +static void +thunar_standard_view_drag_timer_destroy (gpointer user_data) +{ + /* unregister the motion notify and button release event handlers (thread-safe) */ + g_signal_handlers_disconnect_by_func (GTK_BIN (user_data)->child, thunar_standard_view_button_release_event, user_data); + g_signal_handlers_disconnect_by_func (GTK_BIN (user_data)->child, thunar_standard_view_motion_notify_event, user_data); + + /* reset the drag timer source id */ + THUNAR_STANDARD_VIEW (user_data)->priv->drag_timer_id = 0; +} + + + static void thunar_standard_view_finished_thumbnailing (ThunarThumbnailer *thumbnailer, guint request, @@ -4058,6 +4149,60 @@ thunar_standard_view_context_menu (ThunarStandardView *standard_view, /** + * thunar_standard_view_queue_popup: + * @standard_view : a #ThunarStandardView. + * @event : the right click event. + * + * Schedules a context menu popup in response to + * a right-click button event. Right-click events + * need to be handled in a special way, as the + * user may also start a drag using the right + * mouse button and therefore this function + * schedules a timer, which - once expired - + * opens the context menu. If the user moves + * the mouse prior to expiration, a right-click + * drag (with #GDK_ACTION_ASK) will be started + * instead. + **/ +void +thunar_standard_view_queue_popup (ThunarStandardView *standard_view, + GdkEventButton *event) +{ + GtkSettings *settings; + GtkWidget *view; + gint delay; + + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + _thunar_return_if_fail (event != NULL); + + /* check if we have already scheduled a drag timer */ + if (G_LIKELY (standard_view->priv->drag_timer_id == 0)) + { + /* remember the new coordinates */ + standard_view->priv->drag_x = event->x; + standard_view->priv->drag_y = event->y; + + /* figure out the real view */ + view = GTK_BIN (standard_view)->child; + + /* we use the menu popup delay here, note that we onyl use this to + * allow higher values! see bug #3549 */ + settings = gtk_settings_get_for_screen (gtk_widget_get_screen (view)); + g_object_get (G_OBJECT (settings), "gtk-menu-popup-delay", &delay, NULL); + + /* schedule the timer */ + standard_view->priv->drag_timer_id = g_timeout_add_full (G_PRIORITY_LOW, MAX (225, delay), thunar_standard_view_drag_timer, + standard_view, thunar_standard_view_drag_timer_destroy); + + /* register the motion notify and the button release events on the real view */ + g_signal_connect (G_OBJECT (view), "button-release-event", G_CALLBACK (thunar_standard_view_button_release_event), standard_view); + g_signal_connect (G_OBJECT (view), "motion-notify-event", G_CALLBACK (thunar_standard_view_motion_notify_event), standard_view); + } +} + + + +/** * thunar_standard_view_selection_changed: * @standard_view : a #ThunarStandardView instance. * _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits