summaryrefslogtreecommitdiffstats
path: root/gtk/gtkfilechooserwidget.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-07-31 11:03:25 (GMT)
committerMatthias Clasen <mclasen@redhat.com>2015-07-31 17:46:35 (GMT)
commitfb0a13b7f070a14312dafa1e4df6ba03cf33be01 (patch)
tree18b04e252744bbe93ca24a9c2ac7e451ea6906d8 /gtk/gtkfilechooserwidget.c
parent28b4599f9b9907a1de49f83539e7f56f603fa892 (diff)
downloadgtk+-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.c49
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;