diff options
| author | Matthias Clasen <mclasen@redhat.com> | 2015-07-31 11:03:25 (GMT) |
|---|---|---|
| committer | Matthias Clasen <mclasen@redhat.com> | 2015-07-31 17:46:35 (GMT) |
| commit | fb0a13b7f070a14312dafa1e4df6ba03cf33be01 (patch) | |
| tree | 18b04e252744bbe93ca24a9c2ac7e451ea6906d8 /gtk/gtkfilechooserwidget.c | |
| parent | 28b4599f9b9907a1de49f83539e7f56f603fa892 (diff) | |
| download | gtk+-fb0a13b7f070a14312dafa1e4df6ba03cf33be01.zip gtk+-fb0a13b7f070a14312dafa1e4df6ba03cf33be01.tar.xz | |
file chooser: Allow activating without double-click
Interpret a unmodified primary click on the selection like a double
click. This makes it possible to activate a file or open a folder
without using double-click.
Diffstat (limited to 'gtk/gtkfilechooserwidget.c')
| -rw-r--r-- | gtk/gtkfilechooserwidget.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 75470a8..47f595f 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -75,6 +75,7 @@ #include "gtkseparator.h" #include "gtkmodelbutton.h" #include "gtkgesturelongpress.h" +#include "gtkdebug.h" #include <cairo-gobject.h> @@ -2341,6 +2342,25 @@ list_popup_menu_cb (GtkWidget *widget, return TRUE; } +static void +get_selection_modifiers (GtkWidget *widget, + GdkEventButton *event, + gboolean *modify, + gboolean *extend) +{ + GdkModifierType mask; + + *modify = FALSE; + *extend = FALSE; + + mask = gtk_widget_get_modifier_mask (widget, GDK_MODIFIER_INTENT_MODIFY_SELECTION); + if ((event->state & mask) == mask) + *modify = TRUE; + mask = gtk_widget_get_modifier_mask (widget, GDK_MODIFIER_INTENT_EXTEND_SELECTION); + if ((event->state & mask) == mask) + *extend = TRUE; +} + /* Callback used when a button is pressed on the file list. We trap button 3 to * bring up a popup menu. */ @@ -2351,10 +2371,39 @@ list_button_press_event_cb (GtkWidget *widget, { GtkFileChooserWidgetPrivate *priv = impl->priv; static gboolean in_press = FALSE; + GtkTreePath *path; + GtkTreeViewColumn *column; + GdkDevice *device; + gboolean modify, extend, is_touchscreen; if (in_press) return FALSE; + device = gdk_event_get_source_device ((GdkEvent *) event); + is_touchscreen = gtk_simulate_touchscreen () || + gdk_device_get_source (device) == GDK_SOURCE_TOUCHSCREEN; + + get_selection_modifiers (widget, event, &modify, &extend); + if (!is_touchscreen && + !modify && !extend && + event->button == GDK_BUTTON_PRIMARY && + gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->browse_files_tree_view), + event->x, event->y, + &path, &column, NULL, NULL)) + { + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view)); + if (gtk_tree_selection_path_is_selected (selection, path)) + { + list_row_activated (GTK_TREE_VIEW (priv->browse_files_tree_view), path, column, impl); + gtk_tree_path_free (path); + return TRUE; + } + + gtk_tree_path_free (path); + } + if (!gdk_event_triggers_context_menu ((GdkEvent *) event)) return FALSE; |
