winex11.drv: Don't call IDropTarget::{DragOver,DragLeave,Drop} functions if DragEnter fails.

Signed-off-by: Piotr Caban <piotr@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Piotr Caban 2015-11-20 11:44:26 +01:00 committed by Alexandre Julliard
parent 701bb45203
commit a19fe8d9c8
1 changed files with 36 additions and 30 deletions

View File

@ -285,7 +285,7 @@ void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event )
/* Notify OLE of DragEnter. Result determines if we accept */
HWND dropTargetWindow;
if (XDNDLastDropTargetWnd)
if (XDNDAccepted && XDNDLastDropTargetWnd)
{
dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd);
if (dropTarget)
@ -387,35 +387,38 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event )
TRACE("\n");
/* Notify OLE of Drop */
dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd);
if (dropTarget)
if (XDNDAccepted)
{
HRESULT hr;
POINTL pointl;
pointl.x = XDNDxy.x;
pointl.y = XDNDxy.y;
hr = IDropTarget_Drop(dropTarget, &XDNDDataObject, MK_LBUTTON,
pointl, &effect);
if (hr == S_OK)
dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd);
if (dropTarget)
{
if (effect != DROPEFFECT_NONE)
HRESULT hr;
POINTL pointl;
pointl.x = XDNDxy.x;
pointl.y = XDNDxy.y;
hr = IDropTarget_Drop(dropTarget, &XDNDDataObject, MK_LBUTTON,
pointl, &effect);
if (hr == S_OK)
{
TRACE("drop succeeded\n");
accept = 1;
if (effect != DROPEFFECT_NONE)
{
TRACE("drop succeeded\n");
accept = 1;
drop_file = FALSE;
}
else
TRACE("the application refused the drop\n");
}
else if (FAILED(hr))
WARN("drop failed, error 0x%08X\n", hr);
else
{
WARN("drop returned 0x%08X\n", hr);
drop_file = FALSE;
}
else
TRACE("the application refused the drop\n");
IDropTarget_Release(dropTarget);
}
else if (FAILED(hr))
WARN("drop failed, error 0x%08X\n", hr);
else
{
WARN("drop returned 0x%08X\n", hr);
drop_file = FALSE;
}
IDropTarget_Release(dropTarget);
}
if (drop_file)
@ -465,13 +468,16 @@ void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event )
TRACE("DND Operation canceled\n");
/* Notify OLE of DragLeave */
dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd);
if (dropTarget)
if (XDNDAccepted)
{
HRESULT hr = IDropTarget_DragLeave(dropTarget);
if (FAILED(hr))
WARN("IDropTarget_DragLeave failed, error 0x%08X\n", hr);
IDropTarget_Release(dropTarget);
dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd);
if (dropTarget)
{
HRESULT hr = IDropTarget_DragLeave(dropTarget);
if (FAILED(hr))
WARN("IDropTarget_DragLeave failed, error 0x%08X\n", hr);
IDropTarget_Release(dropTarget);
}
}
X11DRV_XDND_FreeDragDropOp();