gdk/x11: Ensure to sync type list after sending XdndEnter
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 13 Jan 2020 23:02:12 +0000 (00:02 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 16 Jan 2020 12:33:57 +0000 (13:33 +0100)
Otherwise we are not ensured the GdkDrop is up-to-date, might even
be a stale one from an older DnD operation.

gdk/x11/gdkdrag-x11.c

index 55e157b52aec38f96b672f19d08c3eb0b896a540..4bf609a1de7b0c16096d101b9c8c7e88bc941d46 100644 (file)
@@ -1506,23 +1506,6 @@ gdk_x11_drag_drag_motion (GdkDrag *drag,
         }
     }
 
-  /* When we have a Xdnd target, make sure our XdndActionList
-   * matches the current actions;
-   */
-  if (protocol == GDK_DRAG_PROTO_XDND && drag_x11->xdnd_actions != gdk_drag_get_actions (drag))
-    {
-      if (proxy_xid)
-        {
-          GdkDisplay *display = gdk_drag_get_display (drag);
-          GdkDrop *drop = GDK_X11_DISPLAY (display)->current_drop;
-
-          if (drop && GDK_SURFACE_XID (gdk_drop_get_surface (drop)) == proxy_xid)
-            gdk_x11_drop_read_actions (drop);
-          else
-            xdnd_set_actions (drag_x11);
-        }
-    }
-
   if (drag_x11->proxy_xid != proxy_xid)
     {
       /* Send a leave to the last destination */
@@ -1562,6 +1545,23 @@ gdk_x11_drag_drag_motion (GdkDrag *drag,
       drag_x11->current_action = gdk_drag_get_selected_action (drag);
     }
 
+  /* When we have a Xdnd target, make sure our XdndActionList
+   * matches the current actions;
+   */
+  if (protocol == GDK_DRAG_PROTO_XDND && drag_x11->xdnd_actions != gdk_drag_get_actions (drag))
+    {
+      if (proxy_xid)
+        {
+          GdkDisplay *display = gdk_drag_get_display (drag);
+          GdkDrop *drop = GDK_X11_DISPLAY (display)->current_drop;
+
+          if (drop && GDK_SURFACE_XID (gdk_drop_get_surface (drop)) == proxy_xid)
+            gdk_x11_drop_read_actions (drop);
+          else
+            xdnd_set_actions (drag_x11);
+        }
+    }
+
   /* Send a drag-motion event */
 
   drag_x11->last_x = x_root;