summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-07-31 07:03:25 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-07-31 07:03:25 -0400
commite9e1e6bd1fe86e93b9ef65d6743edb9034095768 (patch)
treec3b309109125f46f438dd2a3a856986b37c333a3
parent6f194564ff465af37f0317b4e05ec26a7d44c26b (diff)
downloadgtk+-wip/matthiasc/filechooser-click.tar.gz
file chooser: Allow activating without double-clickwip/matthiasc/filechooser-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.
-rw-r--r--gtk/gtkfilechooserwidget.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 75470a8b7a..0a68e984f8 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,40 @@ 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 = g_getenv ("GTK_TEST_TOUCHSCREEN") != NULL ||
+ (gtk_get_debug_flags () & GTK_DEBUG_TOUCHSCREEN) != 0 ||
+ 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;