[gtk+] wayland: Move DnD grab breaking function into gdkdevice-wayland.c



commit b84d9ea7ff3f30e4101e98853cefda1762bcb86d
Author: Carlos Garnacho <carlosg gnome org>
Date:   Mon Jun 1 14:55:20 2015 +0100

    wayland: Move DnD grab breaking function into gdkdevice-wayland.c
    
    This has little to do with GdkDragContext, and a lot to do with
    the GdkDevice that triggered it, seems to make more sense in
    gdkdevice-wayland.c.

 gdk/wayland/gdkdevice-wayland.c    |   61 ++++++++++++++++++++++++++++++++---
 gdk/wayland/gdkdnd-wayland.c       |   53 -------------------------------
 gdk/wayland/gdkprivate-wayland.h   |    4 +-
 gdk/wayland/gdkselection-wayland.c |    4 +-
 4 files changed, 59 insertions(+), 63 deletions(-)
---
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 23197ad..9ef8968 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -707,12 +707,7 @@ data_device_drop (void                  *data,
   local_dnd_owner = gdk_selection_owner_get_for_display (device->display, gdk_drag_get_selection 
(device->drop_context));
 
   if (local_dnd_owner)
-    {
-      GdkDragContext *source_context;
-
-      source_context = gdk_wayland_drag_context_lookup_by_source_window (local_dnd_owner);
-      gdk_wayland_drag_context_undo_grab (source_context);
-    }
+    gdk_wayland_device_unset_grab (device->pointer);
 
   _gdk_wayland_drag_context_emit_event (device->drop_context,
                                         GDK_DROP_START, GDK_CURRENT_TIME);
@@ -2103,3 +2098,57 @@ gdk_wayland_device_set_selection (GdkDevice             *gdk_device,
   wl_data_device_set_selection (device->data_device, source,
                                 _gdk_wayland_display_get_serial (display_wayland));
 }
+
+void
+gdk_wayland_device_unset_grab (GdkDevice *gdk_device)
+{
+  GdkWaylandDeviceData *device;
+  GdkEventSequence *sequence;
+  GdkModifierType state;
+  GdkEvent *event;
+  guint button;
+  gdouble x, y;
+
+  device = GDK_WAYLAND_DEVICE (gdk_device)->device;
+  _gdk_wayland_device_get_last_implicit_grab_serial (GDK_WAYLAND_DEVICE (gdk_device), &sequence);
+  gdk_window_get_device_position_double (device->pointer_grab_window,
+                                         gdk_device, &x, &y, &state);
+
+  if (sequence)
+    {
+      event = gdk_event_new (GDK_TOUCH_END);
+      event->touch.window = g_object_ref (device->pointer_grab_window);
+      event->touch.send_event = TRUE;
+      event->touch.sequence = sequence;
+      event->touch.time = GDK_CURRENT_TIME;
+      event->touch.x = event->touch.x_root = x;
+      event->touch.y = event->touch.y_root = y;
+    }
+  else if (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))
+    {
+      if (state & GDK_BUTTON1_MASK)
+        button = 1;
+      else if (state & GDK_BUTTON2_MASK)
+        button = 2;
+      else if (state & GDK_BUTTON3_MASK)
+        button = 3;
+      else
+        return;
+
+      event = gdk_event_new (GDK_BUTTON_RELEASE);
+      event->button.window = g_object_ref (device->pointer_grab_window);
+      event->button.send_event = TRUE;
+      event->button.button = button;
+      event->button.time = GDK_CURRENT_TIME;
+      event->button.x = event->button.x_root = x;
+      event->button.y = event->button.y_root = y;
+    }
+  else
+    return;
+
+  device->button_modifiers = 0;
+  gdk_event_set_device (event, gdk_device);
+  gdk_event_set_source_device (event, gdk_device);
+
+  _gdk_wayland_display_deliver_event (gdk_device_get_display (gdk_device), event);
+}
diff --git a/gdk/wayland/gdkdnd-wayland.c b/gdk/wayland/gdkdnd-wayland.c
index 9936e54..fea4480 100644
--- a/gdk/wayland/gdkdnd-wayland.c
+++ b/gdk/wayland/gdkdnd-wayland.c
@@ -463,59 +463,6 @@ gdk_wayland_drag_context_get_data_source (GdkDragContext *context)
   return GDK_WAYLAND_DRAG_CONTEXT (context)->data_source;
 }
 
-void
-gdk_wayland_drag_context_undo_grab (GdkDragContext *context)
-{
-  GdkEventSequence *sequence;
-  GdkModifierType state;
-  GdkDevice *device;
-  GdkEvent *event;
-  guint button;
-  gdouble x, y;
-
-  device = gdk_drag_context_get_device (context);
-  _gdk_wayland_device_get_last_implicit_grab_serial (GDK_WAYLAND_DEVICE (device), &sequence);
-  gdk_window_get_device_position_double (gdk_drag_context_get_source_window (context),
-                                         device, &x, &y, &state);
-
-  if (sequence)
-    {
-      event = gdk_event_new (GDK_TOUCH_END);
-      event->touch.window = g_object_ref (gdk_drag_context_get_source_window (context));
-      event->touch.send_event = TRUE;
-      event->touch.sequence = sequence;
-      event->touch.time = GDK_CURRENT_TIME;
-      event->touch.x = event->touch.x_root = x;
-      event->touch.y = event->touch.y_root = y;
-    }
-  else if (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK))
-    {
-      if (state & GDK_BUTTON1_MASK)
-        button = 1;
-      else if (state & GDK_BUTTON2_MASK)
-        button = 2;
-      else if (state & GDK_BUTTON3_MASK)
-        button = 3;
-      else
-        return;
-
-      event = gdk_event_new (GDK_BUTTON_RELEASE);
-      event->button.window = g_object_ref (gdk_drag_context_get_source_window (context));
-      event->button.send_event = TRUE;
-      event->button.button = button;
-      event->button.time = GDK_CURRENT_TIME;
-      event->button.x = event->button.x_root = x;
-      event->button.y = event->button.y_root = y;
-    }
-  else
-    return;
-
-  gdk_event_set_device (event, device);
-  gdk_event_set_source_device (event, device);
-
-  _gdk_wayland_display_deliver_event (gdk_device_get_display (device), event);
-}
-
 GdkWindow *
 gdk_wayland_drag_context_get_dnd_window (GdkDragContext *context)
 {
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index cd2e171..beb489a 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -125,8 +125,6 @@ GdkDragContext * gdk_wayland_drag_context_lookup_by_data_source   (struct wl_dat
 GdkDragContext * gdk_wayland_drag_context_lookup_by_source_window (GdkWindow *window);
 struct wl_data_source * gdk_wayland_drag_context_get_data_source  (GdkDragContext *context);
 
-void gdk_wayland_drag_context_undo_grab (GdkDragContext *context);
-
 void gdk_wayland_drop_context_update_targets (GdkDragContext *context);
 
 void _gdk_wayland_display_create_window_impl (GdkDisplay    *display,
@@ -187,6 +185,8 @@ struct wl_data_device * gdk_wayland_device_get_data_device (GdkDevice *gdk_devic
 void gdk_wayland_device_set_selection (GdkDevice             *gdk_device,
                                        struct wl_data_source *source);
 
+void gdk_wayland_device_unset_grab       (GdkDevice        *device);
+
 void gdk_wayland_device_unset_touch_grab (GdkDevice        *device,
                                           GdkEventSequence *sequence);
 
diff --git a/gdk/wayland/gdkselection-wayland.c b/gdk/wayland/gdkselection-wayland.c
index 5fc2c21..a2b83ba 100644
--- a/gdk/wayland/gdkselection-wayland.c
+++ b/gdk/wayland/gdkselection-wayland.c
@@ -651,7 +651,7 @@ data_source_send (void                  *data,
 
   if (context)
     {
-      gdk_wayland_drag_context_undo_grab (context);
+      gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context));
       _gdk_wayland_drag_context_emit_event (context, GDK_DROP_FINISHED,
                                             GDK_CURRENT_TIME);
     }
@@ -679,7 +679,7 @@ data_source_cancelled (void                  *data,
       context = gdk_wayland_drag_context_lookup_by_data_source (source);
 
       if (context)
-        gdk_wayland_drag_context_undo_grab (context);
+        gdk_wayland_device_unset_grab (gdk_drag_context_get_device (context));
     }
   else if (source == wayland_selection->clipboard_source)
     gdk_wayland_selection_unset_data_source (display, atoms[ATOM_CLIPBOARD]);


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