From: Damjan Jovanovic Subject: [PATCH 7/7] winex11.drv: require DROPEFFECT_COPY to be offered for WM_DROPFILES drops Message-Id: Date: Mon, 25 Apr 2016 03:01:39 +0200 Windows requires DROPEFFECT_COPY to be offered and will reject WM_DROPFILES drops otherwise. Signed-off-by: Damjan Jovanovic --- dlls/winex11.drv/xdnd.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index d411537..d4d4be3 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -317,6 +317,7 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) XClientMessageEvent e; int accept = 0; /* Assume we're not accepting */ IDropTarget *dropTarget = NULL; + DWORD effectIn; DWORD effect; POINTL pointl; HWND targetWindow; @@ -330,7 +331,7 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) pointl.x = XDNDxy.x; pointl.y = XDNDxy.y; XDNDTimestamp = event->data.l[3]; - effect = X11DRV_XDND_ReadAllowedEffects(event->display, XDNDDropSourceWindow, event->data.l[4]); + effectIn = effect = X11DRV_XDND_ReadAllowedEffects(event->display, XDNDDropSourceWindow, event->data.l[4]); XDNDKeyState = X11DRV_XDND_GetKeyState(); if (!XDNDAccepted || XDNDLastTargetWnd != targetWindow) @@ -392,10 +393,12 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) if (XDNDAccepted) accept = 1; else if ((GetWindowLongW( hWnd, GWL_EXSTYLE ) & WS_EX_ACCEPTFILES) && + (effectIn & DROPEFFECT_COPY) && + (XDNDKeyState & MK_SHIFT) == 0 && X11DRV_XDND_HasHDROP()) { accept = 1; - effect = DROPEFFECT_COPY; + XDNDDropEffect = effect = DROPEFFECT_COPY; } TRACE("actionRequested(%ld) accept(%d) chosen(0x%x) at x(%d),y(%d)\n", @@ -485,6 +488,8 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event ) /* Only send WM_DROPFILES if Drop didn't succeed or DROPEFFECT_NONE was set. * Doing both causes winamp to duplicate the dropped files (#29081) */ if ((GetWindowLongW( hWnd, GWL_EXSTYLE ) & WS_EX_ACCEPTFILES) && + (XDNDDropEffect & DROPEFFECT_COPY) && + (XDNDKeyState & MK_SHIFT) == 0 && X11DRV_XDND_HasHDROP()) { HRESULT hr = X11DRV_XDND_SendDropFiles( hWnd );