diff options
author | Matthias Clasen <mclasen@redhat.com> | 2018-01-07 19:33:27 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2018-01-16 14:14:10 -0500 |
commit | 270b6d3a845bccf7ecb697c75bacfcef4c298fa3 (patch) | |
tree | c6b3f0f54b924c16857317b9847f437dd810d802 | |
parent | c8a6a1138b4e1772817be661a435dd16941d6445 (diff) | |
download | gtk+-270b6d3a845bccf7ecb697c75bacfcef4c298fa3.tar.gz |
file chooser: Use a multipress gesture
This replaces the use of ::button-press-event. There's two
issues with this commit:
1) We don't have a good way to do the equivalent of
gdk_event_triggers_context_menu with gestures
2) We have to defer to and idle to avoid ordering
issues with the treeviews own gestures
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 51 | ||||
-rw-r--r-- | gtk/ui/gtkfilechooserwidget.ui | 1 |
2 files changed, 33 insertions, 19 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 65587eeb68..8623fcccaf 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -77,6 +77,7 @@ #include "gtkseparator.h" #include "gtkmodelbutton.h" #include "gtkgesturelongpress.h" +#include "gtkgesturemultipress.h" #include "gtkdebug.h" #include "gtkfilechoosererrorstackprivate.h" @@ -250,6 +251,7 @@ struct _GtkFileChooserWidgetPrivate { GFile *rename_file_source_file; GtkGesture *long_press_gesture; + GtkGesture *multipress_gesture; GtkFileSystemModel *browse_files_model; char *browse_files_last_selected_name; @@ -2301,31 +2303,39 @@ list_popup_menu_cb (GtkWidget *widget, /* Callback used when a button is pressed on the file list. We trap button 3 to * bring up a popup menu. */ -static gboolean -list_button_press_event_cb (GtkWidget *widget, - GdkEventButton *event, - GtkFileChooserWidget *impl) -{ - GtkFileChooserWidgetPrivate *priv = impl->priv; - static gboolean in_press = FALSE; + +typedef struct { + GtkFileChooserWidget *impl; double x; double y; +} PopoverData; - if (in_press) - return FALSE; +static gboolean +file_list_show_popover_in_idle (gpointer data) +{ + PopoverData *pd = data; - if (!gdk_event_triggers_context_menu ((GdkEvent *) event)) - return FALSE; + file_list_show_popover (pd->impl, pd->x, pd->y); + g_free (data); - in_press = TRUE; - gtk_widget_event (priv->browse_files_tree_view, (GdkEvent *) event); - in_press = FALSE; + return G_SOURCE_REMOVE; +} - gdk_event_get_coords ((GdkEvent *)event, &x, &y); +static void +multi_press_cb (GtkGesture *gesture, + int n_press, + double x, + double y, + GtkFileChooserWidget *impl) +{ + PopoverData *pd; - file_list_show_popover (impl, x, y); + pd = g_new (PopoverData, 1); + pd->impl = impl; + pd->x = x; + pd->y = y; - return TRUE; + g_idle_add (file_list_show_popover_in_idle, pd); } static void @@ -3537,6 +3547,7 @@ gtk_file_chooser_widget_dispose (GObject *object) } g_clear_object (&priv->long_press_gesture); + g_clear_object (&priv->multipress_gesture); G_OBJECT_CLASS (gtk_file_chooser_widget_parent_class)->dispose (object); } @@ -8381,7 +8392,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_callback (widget_class, file_list_drag_data_received_cb); gtk_widget_class_bind_template_callback (widget_class, list_popup_menu_cb); gtk_widget_class_bind_template_callback (widget_class, file_list_query_tooltip_cb); - gtk_widget_class_bind_template_callback (widget_class, list_button_press_event_cb); gtk_widget_class_bind_template_callback (widget_class, list_row_activated); gtk_widget_class_bind_template_callback (widget_class, file_list_drag_begin_cb); gtk_widget_class_bind_template_callback (widget_class, file_list_drag_motion_cb); @@ -8542,6 +8552,11 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) g_signal_connect (priv->long_press_gesture, "pressed", G_CALLBACK (long_press_cb), impl); + priv->multipress_gesture = gtk_gesture_multi_press_new (priv->browse_files_tree_view); + gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), GDK_BUTTON_SECONDARY); + g_signal_connect (priv->multipress_gesture, "pressed", + G_CALLBACK (multi_press_cb), impl); + /* Setup various attributes and callbacks in the UI * which cannot be done with GtkBuilder. */ diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui index f178927309..5186a7211b 100644 --- a/gtk/ui/gtkfilechooserwidget.ui +++ b/gtk/ui/gtkfilechooserwidget.ui @@ -143,7 +143,6 @@ <property name="AtkObject::accessible-name" translatable="yes">Files</property> </object> </child> - <signal name="button-press-event" handler="list_button_press_event_cb" swapped="no"/> <signal name="drag-data-received" handler="file_list_drag_data_received_cb" swapped="no"/> <signal name="drag-drop" handler="file_list_drag_drop_cb" swapped="no"/> <signal name="drag-begin" handler="file_list_drag_begin_cb" swapped="no"/> |