[gtk+] dnd: Make the drag gesture obey the button mask specified
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] dnd: Make the drag gesture obey the button mask specified
- Date: Thu, 4 Sep 2014 13:03:49 +0000 (UTC)
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]