[gtk+] dnd: Make the drag gesture obey the button mask specified



commit 6f538950d41e2b97437afccde613d15fb931b712
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Sep 4 13:23:26 2014 +0200

    dnd: Make the drag gesture obey the button mask specified
    
    This was forgotten when making DnD use a GtkGesture in the handlers
    attached to the widget in gtk_drag_source_set(). The gesture must obey
    the specified button mask, and switch to denied state if the pressed
    button isn't part of the given mask.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=735965

 gtk/gtkdnd.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)
---
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 6fabf68..8a100fd 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -250,6 +250,9 @@ static void gtk_drag_cancel                    (GtkDragSourceInfo *info,
                                                 GtkDragResult      result,
                                                 guint32            time);
 
+static void gtk_drag_source_gesture_begin      (GtkGesture       *gesture,
+                                                GdkEventSequence *sequence,
+                                                gpointer          data);
 static gboolean gtk_drag_source_event_cb       (GtkWidget         *widget,
                                                 GdkEvent          *event,
                                                 gpointer           data);
@@ -2783,6 +2786,9 @@ gtk_drag_source_set (GtkWidget            *widget,
       gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (site->drag_gesture),
                                                   GTK_PHASE_NONE);
       gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (site->drag_gesture), 0);
+      g_signal_connect (site->drag_gesture, "begin",
+                        G_CALLBACK (gtk_drag_source_gesture_begin),
+                        site);
 
       g_signal_connect (widget, "button-press-event",
                         G_CALLBACK (gtk_drag_source_event_cb),
@@ -3867,6 +3873,23 @@ gtk_drag_drop (GtkDragSourceInfo *info,
 /*
  * Source side callbacks.
  */
+static void
+gtk_drag_source_gesture_begin (GtkGesture       *gesture,
+                               GdkEventSequence *sequence,
+                               gpointer          data)
+{
+  GtkDragSourceSite *site = data;
+  guint button;
+
+  if (gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)))
+    button = 1;
+  else
+    button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+
+  if (!site->start_button_mask ||
+      !(site->start_button_mask & (GDK_BUTTON1_MASK << (button - 1))))
+    gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED);
+}
 
 static gboolean
 gtk_drag_source_event_cb (GtkWidget *widget,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]