From: Damjan Jovanovic Subject: [PATCH 1/3] winex11.drv: support XDnD version 5 Message-Id: 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); }