Last round of cleanup before moving the code to user32.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xdnd.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 14e33bcc087..149b3cf9c1b 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -35,8 +35,6 @@ static POINT XDNDxy = { 0, 0 }; static IDataObject *xdnd_data_object; static BOOL XDNDAccepted = FALSE; static DWORD XDNDDropEffect = DROPEFFECT_NONE; -/* the last window the mouse was over */ -static HWND XDNDLastTargetWnd; /* might be an ancestor of XDNDLastTargetWnd */ static HWND XDNDLastDropTargetWnd;
@@ -94,6 +92,8 @@ struct data_object IDataObject IDataObject_iface; LONG refcount;
+ HWND target_hwnd; /* the last window the mouse was over */ + struct format_entry *entries_end; struct format_entry entries[]; }; @@ -560,7 +560,7 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) XDNDxy = params->point; targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), XDNDxy );
- if (!XDNDAccepted || XDNDLastTargetWnd != targetWindow) + if (!XDNDAccepted || object->target_hwnd != targetWindow) { /* Notify OLE of DragEnter. Result determines if we accept */ HWND dropTargetWindow; @@ -581,7 +581,7 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) { dropTarget = get_droptarget_pointer(dropTargetWindow); } while (dropTarget == NULL && (dropTargetWindow = GetParent(dropTargetWindow)) != NULL); - XDNDLastTargetWnd = targetWindow; + object->target_hwnd = targetWindow; XDNDLastDropTargetWnd = dropTargetWindow; if (dropTarget) { @@ -601,7 +601,7 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) IDropTarget_Release(dropTarget); } } - if (XDNDAccepted && XDNDLastTargetWnd == targetWindow) + if (XDNDAccepted && object->target_hwnd == targetWindow) { /* If drag accepted notify OLE of DragOver */ dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); @@ -793,7 +793,6 @@ static void X11DRV_XDND_FreeDragDropOp(void) EnterCriticalSection(&xdnd_cs);
XDNDxy.x = XDNDxy.y = 0; - XDNDLastTargetWnd = NULL; XDNDLastDropTargetWnd = NULL; XDNDAccepted = FALSE;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xdnd.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 149b3cf9c1b..b7a36bff55a 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -31,7 +31,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
-static POINT XDNDxy = { 0, 0 }; static IDataObject *xdnd_data_object; static BOOL XDNDAccepted = FALSE; static DWORD XDNDDropEffect = DROPEFFECT_NONE; @@ -93,6 +92,7 @@ struct data_object LONG refcount;
HWND target_hwnd; /* the last window the mouse was over */ + POINT target_pos;
struct format_entry *entries_end; struct format_entry entries[]; @@ -557,8 +557,8 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size )
if (!(object = get_data_object( FALSE ))) return STATUS_INVALID_PARAMETER;
- XDNDxy = params->point; - targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), XDNDxy ); + object->target_pos = params->point; + targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), object->target_pos );
if (!XDNDAccepted || object->target_hwnd != targetWindow) { @@ -654,11 +654,9 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); if (dropTarget && effect!=DROPEFFECT_NONE) { + POINTL pointl = {object->target_pos.x, object->target_pos.y}; HRESULT hr; - POINTL pointl;
- pointl.x = XDNDxy.x; - pointl.y = XDNDxy.y; hr = IDropTarget_Drop(dropTarget, &object->IDataObject_iface, MK_LBUTTON, pointl, &effect); if (hr == S_OK) @@ -694,7 +692,7 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) { /* Only send WM_DROPFILES if Drop didn't succeed or DROPEFFECT_NONE was set. * Doing both causes winamp to duplicate the dropped files (#29081) */ - HWND hwnd_drop = window_accepting_files(window_from_point_dnd( hwnd, XDNDxy )); + HWND hwnd_drop = window_accepting_files(window_from_point_dnd( hwnd, object->target_pos )); FORMATETC format = {.cfFormat = CF_HDROP}; STGMEDIUM medium;
@@ -704,10 +702,8 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) void *files = (char *)drop + drop->pFiles; RECT rect;
- drop->pt.x = XDNDxy.x; - drop->pt.y = XDNDxy.y; - drop->fNC = !ScreenToClient( hwnd, &drop->pt ) || !GetClientRect( hwnd, &rect ) || !PtInRect( &rect, drop->pt ); - + drop->pt = object->target_pos; + drop->fNC = !ScreenToClient( hwnd, &drop->pt ) || !GetClientRect( hwnd, &rect ) || !PtInRect( &rect, drop->pt ); TRACE( "Sending WM_DROPFILES: hwnd %p, pt %s, fNC %u, files %p (%s)\n", hwnd, wine_dbgstr_point( &drop->pt), drop->fNC, files, debugstr_w(files) ); GlobalUnlock( medium.hGlobal ); @@ -719,7 +715,7 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) }
TRACE("effectRequested(0x%lx) accept(%d) performed(0x%lx) at x(%ld),y(%ld)\n", - XDNDDropEffect, accept, effect, XDNDxy.x, XDNDxy.y); + XDNDDropEffect, accept, effect, object->target_pos.x, object->target_pos.y);
if (!accept) effect = DROPEFFECT_NONE; IDataObject_Release( &object->IDataObject_iface ); @@ -792,7 +788,6 @@ static void X11DRV_XDND_FreeDragDropOp(void)
EnterCriticalSection(&xdnd_cs);
- XDNDxy.x = XDNDxy.y = 0; XDNDLastDropTargetWnd = NULL; XDNDAccepted = FALSE;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xdnd.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index b7a36bff55a..97295daaa5f 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -33,7 +33,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
static IDataObject *xdnd_data_object; static BOOL XDNDAccepted = FALSE; -static DWORD XDNDDropEffect = DROPEFFECT_NONE; /* might be an ancestor of XDNDLastTargetWnd */ static HWND XDNDLastDropTargetWnd;
@@ -93,6 +92,7 @@ struct data_object
HWND target_hwnd; /* the last window the mouse was over */ POINT target_pos; + DWORD target_effect;
struct format_entry *entries_end; struct format_entry entries[]; @@ -609,14 +609,14 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) { hr = IDropTarget_DragOver(dropTarget, MK_LBUTTON, pointl, &effect); if (hr == S_OK) - XDNDDropEffect = effect; + object->target_effect = effect; else WARN("IDropTarget_DragOver failed, error 0x%08lx\n", hr); IDropTarget_Release(dropTarget); } }
- if (XDNDAccepted && XDNDDropEffect != DROPEFFECT_NONE) + if (XDNDAccepted && object->target_effect != DROPEFFECT_NONE) accept = 1; else { @@ -641,12 +641,13 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) struct dnd_drop_event_params *params = args; HWND hwnd = UlongToHandle( params->hwnd ); IDropTarget *dropTarget; - DWORD effect = XDNDDropEffect; + DWORD effect; int accept = 0; /* Assume we're not accepting */ struct data_object *object; BOOL drop_file = TRUE;
if (!(object = get_data_object( TRUE ))) return STATUS_INVALID_PARAMETER; + effect = object->target_effect;
/* Notify OLE of Drop */ if (XDNDAccepted) @@ -715,7 +716,7 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) }
TRACE("effectRequested(0x%lx) accept(%d) performed(0x%lx) at x(%ld),y(%ld)\n", - XDNDDropEffect, accept, effect, object->target_pos.x, object->target_pos.y); + object->target_effect, accept, effect, object->target_pos.x, object->target_pos.y);
if (!accept) effect = DROPEFFECT_NONE; IDataObject_Release( &object->IDataObject_iface );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xdnd.c | 143 ++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 86 deletions(-)
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 97295daaa5f..cb2593dd052 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -32,9 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
static IDataObject *xdnd_data_object; -static BOOL XDNDAccepted = FALSE; -/* might be an ancestor of XDNDLastTargetWnd */ -static HWND XDNDLastDropTargetWnd; +static IDropTarget *xdnd_drop_target;
static void X11DRV_XDND_FreeDragDropOp(void);
@@ -548,7 +546,6 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) { struct dnd_position_event_params *params = arg; int accept = 0; /* Assume we're not accepting */ - IDropTarget *dropTarget = NULL; DWORD effect = params->effect; POINTL pointl = { .x = params->point.x, .y = params->point.y }; struct data_object *object; @@ -560,63 +557,46 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) object->target_pos = params->point; targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), object->target_pos );
- if (!XDNDAccepted || object->target_hwnd != targetWindow) + if (!xdnd_drop_target || object->target_hwnd != targetWindow) { /* Notify OLE of DragEnter. Result determines if we accept */ HWND dropTargetWindow;
- if (XDNDAccepted && XDNDLastDropTargetWnd) + if (xdnd_drop_target) { - dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); - if (dropTarget) - { - hr = IDropTarget_DragLeave(dropTarget); - if (FAILED(hr)) - WARN("IDropTarget_DragLeave failed, error 0x%08lx\n", hr); - IDropTarget_Release(dropTarget); - } + hr = IDropTarget_DragLeave( xdnd_drop_target ); + if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); + IDropTarget_Release( xdnd_drop_target ); + xdnd_drop_target = NULL; } + dropTargetWindow = targetWindow; - do - { - dropTarget = get_droptarget_pointer(dropTargetWindow); - } while (dropTarget == NULL && (dropTargetWindow = GetParent(dropTargetWindow)) != NULL); + do { xdnd_drop_target = get_droptarget_pointer( dropTargetWindow ); } + while (!xdnd_drop_target && !!(dropTargetWindow = GetParent( dropTargetWindow ))); object->target_hwnd = targetWindow; - XDNDLastDropTargetWnd = dropTargetWindow; - if (dropTarget) + + if (xdnd_drop_target) { DWORD effect_ignore = effect; - hr = IDropTarget_DragEnter(dropTarget, &object->IDataObject_iface, - MK_LBUTTON, pointl, &effect_ignore); - if (hr == S_OK) - { - XDNDAccepted = TRUE; - TRACE("the application accepted the drop (effect = %ld)\n", effect_ignore); - } + hr = IDropTarget_DragEnter( xdnd_drop_target, &object->IDataObject_iface, + MK_LBUTTON, pointl, &effect_ignore ); + if (hr == S_OK) TRACE( "the application accepted the drop (effect = %ld)\n", effect_ignore ); else { - XDNDAccepted = FALSE; - WARN("IDropTarget_DragEnter failed, error 0x%08lx\n", hr); + WARN( "IDropTarget_DragEnter returned %#lx\n", hr ); + IDropTarget_Release( xdnd_drop_target ); + xdnd_drop_target = NULL; } - IDropTarget_Release(dropTarget); } } - if (XDNDAccepted && object->target_hwnd == targetWindow) + else if (xdnd_drop_target) { - /* If drag accepted notify OLE of DragOver */ - dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); - if (dropTarget) - { - hr = IDropTarget_DragOver(dropTarget, MK_LBUTTON, pointl, &effect); - if (hr == S_OK) - object->target_effect = effect; - else - WARN("IDropTarget_DragOver failed, error 0x%08lx\n", hr); - IDropTarget_Release(dropTarget); - } + hr = IDropTarget_DragOver( xdnd_drop_target, MK_LBUTTON, pointl, &effect ); + if (hr == S_OK) object->target_effect = effect; + else WARN( "IDropTarget_DragOver returned %#lx\n", hr ); }
- if (XDNDAccepted && object->target_effect != DROPEFFECT_NONE) + if (xdnd_drop_target && object->target_effect != DROPEFFECT_NONE) accept = 1; else { @@ -640,7 +620,6 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) { struct dnd_drop_event_params *params = args; HWND hwnd = UlongToHandle( params->hwnd ); - IDropTarget *dropTarget; DWORD effect; int accept = 0; /* Assume we're not accepting */ struct data_object *object; @@ -650,44 +629,39 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) effect = object->target_effect;
/* Notify OLE of Drop */ - if (XDNDAccepted) + if (xdnd_drop_target && effect != DROPEFFECT_NONE) { - dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); - if (dropTarget && effect!=DROPEFFECT_NONE) - { - POINTL pointl = {object->target_pos.x, object->target_pos.y}; - HRESULT hr; + POINTL pointl = {object->target_pos.x, object->target_pos.y}; + HRESULT hr;
- hr = IDropTarget_Drop(dropTarget, &object->IDataObject_iface, MK_LBUTTON, - pointl, &effect); - if (hr == S_OK) - { - 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%08lx\n", hr); - else + hr = IDropTarget_Drop( xdnd_drop_target, &object->IDataObject_iface, + MK_LBUTTON, pointl, &effect ); + if (hr == S_OK) + { + if (effect != DROPEFFECT_NONE) { - WARN("drop returned 0x%08lx\n", hr); + TRACE("drop succeeded\n"); + accept = 1; drop_file = FALSE; } - IDropTarget_Release(dropTarget); + else + TRACE("the application refused the drop\n"); } - else if (dropTarget) + else if (FAILED(hr)) + WARN("drop failed, error 0x%08lx\n", hr); + else { - HRESULT hr = IDropTarget_DragLeave(dropTarget); - if (FAILED(hr)) - WARN("IDropTarget_DragLeave failed, error 0x%08lx\n", hr); - IDropTarget_Release(dropTarget); + WARN("drop returned 0x%08lx\n", hr); + drop_file = FALSE; } } + else if (xdnd_drop_target) + { + HRESULT hr = IDropTarget_DragLeave( xdnd_drop_target ); + if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); + IDropTarget_Release( xdnd_drop_target ); + xdnd_drop_target = NULL; + }
if (drop_file) { @@ -731,22 +705,17 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) */ NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size ) { - IDropTarget *dropTarget; struct data_object *object;
TRACE("DND Operation canceled\n");
/* Notify OLE of DragLeave */ - if (XDNDAccepted) + if (xdnd_drop_target) { - dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); - if (dropTarget) - { - HRESULT hr = IDropTarget_DragLeave(dropTarget); - if (FAILED(hr)) - WARN("IDropTarget_DragLeave failed, error 0x%08lx\n", hr); - IDropTarget_Release(dropTarget); - } + HRESULT hr = IDropTarget_DragLeave( xdnd_drop_target ); + if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); + IDropTarget_Release( xdnd_drop_target ); + xdnd_drop_target = NULL; }
if ((object = get_data_object( TRUE ))) IDataObject_Release( &object->IDataObject_iface ); @@ -765,7 +734,6 @@ NTSTATUS WINAPI x11drv_dnd_enter_event( void *args, ULONG size ) struct dnd_enter_event_params *params = args; IDataObject *object, *previous;
- XDNDAccepted = FALSE; X11DRV_XDND_FreeDragDropOp(); /* Clear previously cached data */
if (FAILED(data_object_create( formats_size, params->entries, &object ))) return STATUS_NO_MEMORY; @@ -789,8 +757,11 @@ static void X11DRV_XDND_FreeDragDropOp(void)
EnterCriticalSection(&xdnd_cs);
- XDNDLastDropTargetWnd = NULL; - XDNDAccepted = FALSE; + if (xdnd_drop_target) + { + IDropTarget_Release( xdnd_drop_target ); + xdnd_drop_target = NULL; + }
LeaveCriticalSection(&xdnd_cs); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/xdnd.c | 90 ++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 55 deletions(-)
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index cb2593dd052..174b764aa63 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -32,9 +32,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
static IDataObject *xdnd_data_object; -static IDropTarget *xdnd_drop_target; - -static void X11DRV_XDND_FreeDragDropOp(void);
static CRITICAL_SECTION xdnd_cs; static CRITICAL_SECTION_DEBUG critsect_debug = @@ -91,6 +88,7 @@ struct data_object HWND target_hwnd; /* the last window the mouse was over */ POINT target_pos; DWORD target_effect; + IDropTarget *drop_target;
struct format_entry *entries_end; struct format_entry entries[]; @@ -270,8 +268,21 @@ static ULONG WINAPI data_object_Release( IDataObject *iface ) { struct data_object *object = data_object_from_IDataObject( iface ); ULONG ref = InterlockedDecrement( &object->refcount ); + TRACE( "object %p decreasing refcount to %lu.\n", object, ref ); - if (!ref) free( object ); + + if (!ref) + { + if (object->drop_target) + { + HRESULT hr = IDropTarget_DragLeave( object->drop_target ); + if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); + IDropTarget_Release( object->drop_target ); + } + + free( object ); + } + return ref; }
@@ -557,46 +568,46 @@ NTSTATUS WINAPI x11drv_dnd_position_event( void *arg, ULONG size ) object->target_pos = params->point; targetWindow = window_from_point_dnd( UlongToHandle( params->hwnd ), object->target_pos );
- if (!xdnd_drop_target || object->target_hwnd != targetWindow) + if (!object->drop_target || object->target_hwnd != targetWindow) { /* Notify OLE of DragEnter. Result determines if we accept */ HWND dropTargetWindow;
- if (xdnd_drop_target) + if (object->drop_target) { - hr = IDropTarget_DragLeave( xdnd_drop_target ); + hr = IDropTarget_DragLeave( object->drop_target ); if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); - IDropTarget_Release( xdnd_drop_target ); - xdnd_drop_target = NULL; + IDropTarget_Release( object->drop_target ); + object->drop_target = NULL; }
dropTargetWindow = targetWindow; - do { xdnd_drop_target = get_droptarget_pointer( dropTargetWindow ); } - while (!xdnd_drop_target && !!(dropTargetWindow = GetParent( dropTargetWindow ))); + do { object->drop_target = get_droptarget_pointer( dropTargetWindow ); } + while (!object->drop_target && !!(dropTargetWindow = GetParent( dropTargetWindow ))); object->target_hwnd = targetWindow;
- if (xdnd_drop_target) + if (object->drop_target) { DWORD effect_ignore = effect; - hr = IDropTarget_DragEnter( xdnd_drop_target, &object->IDataObject_iface, + hr = IDropTarget_DragEnter( object->drop_target, &object->IDataObject_iface, MK_LBUTTON, pointl, &effect_ignore ); if (hr == S_OK) TRACE( "the application accepted the drop (effect = %ld)\n", effect_ignore ); else { WARN( "IDropTarget_DragEnter returned %#lx\n", hr ); - IDropTarget_Release( xdnd_drop_target ); - xdnd_drop_target = NULL; + IDropTarget_Release( object->drop_target ); + object->drop_target = NULL; } } } - else if (xdnd_drop_target) + else if (object->drop_target) { - hr = IDropTarget_DragOver( xdnd_drop_target, MK_LBUTTON, pointl, &effect ); + hr = IDropTarget_DragOver( object->drop_target, MK_LBUTTON, pointl, &effect ); if (hr == S_OK) object->target_effect = effect; else WARN( "IDropTarget_DragOver returned %#lx\n", hr ); }
- if (xdnd_drop_target && object->target_effect != DROPEFFECT_NONE) + if (object->drop_target && object->target_effect != DROPEFFECT_NONE) accept = 1; else { @@ -629,12 +640,12 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) effect = object->target_effect;
/* Notify OLE of Drop */ - if (xdnd_drop_target && effect != DROPEFFECT_NONE) + if (object->drop_target && effect != DROPEFFECT_NONE) { POINTL pointl = {object->target_pos.x, object->target_pos.y}; HRESULT hr;
- hr = IDropTarget_Drop( xdnd_drop_target, &object->IDataObject_iface, + hr = IDropTarget_Drop( object->drop_target, &object->IDataObject_iface, MK_LBUTTON, pointl, &effect ); if (hr == S_OK) { @@ -655,12 +666,12 @@ NTSTATUS WINAPI x11drv_dnd_drop_event( void *args, ULONG size ) drop_file = FALSE; } } - else if (xdnd_drop_target) + else if (object->drop_target) { - HRESULT hr = IDropTarget_DragLeave( xdnd_drop_target ); + HRESULT hr = IDropTarget_DragLeave( object->drop_target ); if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); - IDropTarget_Release( xdnd_drop_target ); - xdnd_drop_target = NULL; + IDropTarget_Release( object->drop_target ); + object->drop_target = NULL; }
if (drop_file) @@ -709,18 +720,7 @@ NTSTATUS WINAPI x11drv_dnd_leave_event( void *params, ULONG size )
TRACE("DND Operation canceled\n");
- /* Notify OLE of DragLeave */ - if (xdnd_drop_target) - { - HRESULT hr = IDropTarget_DragLeave( xdnd_drop_target ); - if (FAILED(hr)) WARN( "IDropTarget_DragLeave returned %#lx\n", hr ); - IDropTarget_Release( xdnd_drop_target ); - xdnd_drop_target = NULL; - } - if ((object = get_data_object( TRUE ))) IDataObject_Release( &object->IDataObject_iface ); - - X11DRV_XDND_FreeDragDropOp(); return STATUS_SUCCESS; }
@@ -734,8 +734,6 @@ NTSTATUS WINAPI x11drv_dnd_enter_event( void *args, ULONG size ) struct dnd_enter_event_params *params = args; IDataObject *object, *previous;
- X11DRV_XDND_FreeDragDropOp(); /* Clear previously cached data */ - if (FAILED(data_object_create( formats_size, params->entries, &object ))) return STATUS_NO_MEMORY;
EnterCriticalSection( &xdnd_cs ); @@ -748,24 +746,6 @@ NTSTATUS WINAPI x11drv_dnd_enter_event( void *args, ULONG size ) }
-/************************************************************************** - * X11DRV_XDND_FreeDragDropOp - */ -static void X11DRV_XDND_FreeDragDropOp(void) -{ - TRACE("\n"); - - EnterCriticalSection(&xdnd_cs); - - if (xdnd_drop_target) - { - IDropTarget_Release( xdnd_drop_target ); - xdnd_drop_target = NULL; - } - - LeaveCriticalSection(&xdnd_cs); -} - NTSTATUS WINAPI x11drv_dnd_post_drop( void *args, ULONG size ) { UINT drop_size = size - offsetof(struct dnd_post_drop_params, drop);