gdk/x11: Forward suggested action (if any) to XdndStatus
authorCarlos Garnacho <carlosg@gnome.org>
Sun, 5 Jan 2020 19:20:20 +0000 (20:20 +0100)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 8 Jan 2020 23:48:21 +0000 (18:48 -0500)
Go ahead with the suggested action, so the drag source may update
cursor feedback properly, and eventually result in the correct
action.

gdk/x11/gdkdrop-x11.c

index b0d9457b3b41bd7f97705d45b88d640347817f39..bbf377f898d9c0cd99d49822b2756c1c588ee068 100644 (file)
@@ -747,7 +747,7 @@ gdk_x11_drop_status (GdkDrop       *drop,
                      GdkDragAction  actions)
 {
   GdkX11Drop *drop_x11 = GDK_X11_DROP (drop);
-  GdkDragAction possible_actions;
+  GdkDragAction possible_actions, suggested_action;
   XEvent xev;
   GdkDisplay *display;
 
@@ -755,6 +755,17 @@ gdk_x11_drop_status (GdkDrop       *drop,
 
   possible_actions = actions & gdk_drop_get_actions (drop);
 
+  if (drop_x11->suggested_action != 0)
+    suggested_action = drop_x11->suggested_action;
+  else if (possible_actions & GDK_ACTION_COPY)
+    suggested_action = GDK_ACTION_COPY;
+  else if (possible_actions & GDK_ACTION_MOVE)
+    suggested_action = GDK_ACTION_MOVE;
+  else if (possible_actions & GDK_ACTION_ASK)
+    suggested_action = GDK_ACTION_ASK;
+  else
+    suggested_action = 0;
+
   xev.xclient.type = ClientMessage;
   xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "XdndStatus");
   xev.xclient.format = 32;
@@ -764,7 +775,7 @@ gdk_x11_drop_status (GdkDrop       *drop,
   xev.xclient.data.l[1] = (possible_actions != 0) ? (2 | 1) : 0;
   xev.xclient.data.l[2] = 0;
   xev.xclient.data.l[3] = 0;
-  xev.xclient.data.l[4] = xdnd_action_to_atom (display, possible_actions);
+  xev.xclient.data.l[4] = xdnd_action_to_atom (display, suggested_action);
 
   if (gdk_drop_get_drag (drop))
     {