From: Damjan Jovanovic <damjan.jov@gmail.com>
Subject: [PATCH 1/3] winex11.drv: support XDnD version 5
Message-Id: <CAJm2B-mgzePeM=cwakv-UdBXG5LwpQp=Mz4iGzCzKfGcFMqtoQ@mail.gmail.com>
Date: Mon, 2 Mar 2015 06:32:08 +0200

Support XDnD version 5, which allows the drop target to report whether
the drop succeeded and what action was taken, something Windows does
too.

Damjan Jovanovic
---
 dlls/winex11.drv/x11drv.h |  2 +-
 dlls/winex11.drv/xdnd.c   | 11 ++++++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 0adf7f3..533af2c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -61,7 +61,7 @@ typedef int Status;
 
 #define MAX_DASHLEN 16
 
-#define WINE_XDND_VERSION 4
+#define WINE_XDND_VERSION 5
 
   /* X physical pen */
 typedef struct
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c
index 6618edd..f6ce5e9 100644
--- a/dlls/winex11.drv/xdnd.c
+++ b/dlls/winex11.drv/xdnd.c
@@ -373,6 +373,8 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
 {
     XClientMessageEvent e;
     IDropTarget *dropTarget;
+    DWORD effect = XDNDDropEffect;
+    int accept = 0; /* Assume we're not accepting */
 
     TRACE("\n");
 
@@ -386,7 +388,6 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
     {
         HRESULT hr;
         POINTL pointl;
-        DWORD effect = XDNDDropEffect;
 
         pointl.x = XDNDxy.x;
         pointl.y = XDNDxy.y;
@@ -395,7 +396,10 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
         if (SUCCEEDED(hr))
         {
             if (effect != DROPEFFECT_NONE)
+            {
                 TRACE("drop succeeded\n");
+                accept = 1;
+            }
             else
                 TRACE("the application refused the drop\n");
         }
@@ -414,6 +418,11 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
     e.message_type = x11drv_atom(XdndFinished);
     e.format = 32;
     e.data.l[0] = event->window;
+    e.data.l[1] = accept;
+    if (accept)
+        e.data.l[2] = X11DRV_XDND_DROPEFFECTToXdndAction(effect);
+    else
+        e.data.l[2] = None;
     XSendEvent(event->display, event->data.l[0], False, NoEventMask, (XEvent*)&e);
 }