gdkdrop-x11: Use the preferred action if possible
authorCorey Berla <corey@berla.me>
Sat, 16 Jul 2022 20:34:07 +0000 (13:34 -0700)
committerCorey Berla <corey@berla.me>
Sat, 16 Jul 2022 21:02:47 +0000 (14:02 -0700)
The XDND suggested action is a relic from when the source would control
the action for a drop.  With the new GtkDropTarget the target decides
the action (not the source).  That means the all of the returned
results from the ::enter and ::motion handlers will be unexpectely
ignored. Prefer to use the preferred action over the x11 suggested action.

Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4259
gdk/x11/gdkdrop-x11.c

index 3f7566d88df0f6a3de5a6070f49b53a3b51931ae..05b07ca9900f8b306ca388c853569deffef827e4 100644 (file)
@@ -769,22 +769,18 @@ gdk_x11_drop_status (GdkDrop       *drop,
 
   possible_actions = actions & gdk_drop_get_actions (drop);
 
-  if (drop_x11->suggested_action != 0)
+  if (preferred & possible_actions)
+    suggested_action = preferred;
+  else if (drop_x11->suggested_action & possible_actions)
     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 = preferred & possible_actions;
-
-  if (suggested_action == 0 && possible_actions != 0)
-    {
-      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;
-    }
+    suggested_action = 0;
 
   xev.xclient.type = ClientMessage;
   xev.xclient.message_type = gdk_x11_get_xatom_by_name_for_display (display, "XdndStatus");