From: Damjan Jovanovic Subject: [PATCH 1/7] ole32/user32: try using native drag and drop if possible (try 3) Message-Id: Date: Sat, 18 Jul 2015 10:42:36 +0200 If possible, try using the drag and drop implemented by the native windowing system instead of the one implemented by our ole32. This patch just provides the framework, the next patch actually implements all drag and drop over XDND. Try 2 implements loaderdrv_DoDragDrop. Try 3: no changes. Damjan Jovanovic --- dlls/ole32/ole2.c | 6 ++++++ dlls/user32/clipboard.c | 8 ++++++++ dlls/user32/driver.c | 13 +++++++++++++ dlls/user32/user32.spec | 1 + dlls/user32/user_private.h | 3 +++ include/winuser.h | 1 + 6 files changed, 32 insertions(+) diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c index 09cbccf..3c2bbc3 100644 --- a/dlls/ole32/ole2.c +++ b/dlls/ole32/ole2.c @@ -767,9 +767,15 @@ HRESULT WINAPI DoDragDrop ( TrackerWindowInfo trackerInfo; HWND hwndTrackWindow; MSG msg; + HRESULT hr; TRACE("(%p, %p, %08x, %p)\n", pDataObject, pDropSource, dwOKEffect, pdwEffect); + /* Try a fully native drag and drop, if supported */ + hr = __wine_do_drag_drop(pDataObject, pDropSource, dwOKEffect, pdwEffect); + if (hr != E_NOTIMPL) + return hr; + if (!pDataObject || !pDropSource || !pdwEffect) return E_INVALIDARG; diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index dec738a..8610cfd 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -514,3 +514,11 @@ BOOL WINAPI RemoveClipboardFormatListener(HWND hwnd) FIXME("%p: stub\n", hwnd); return TRUE; } + +/***************************************************************************** + * __wine_do_drag_drop (USER32.@) + */ +HRESULT CDECL __wine_do_drag_drop(void *pDataObj, void *pDropSource, DWORD pdwOKEffect, DWORD *pdwEffect) +{ + return USER_Driver->pDoDragDrop((IDataObject*)pDataObj, (IDropSource*)pDropSource, pdwOKEffect, pdwEffect); +} diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index ced8836..db74fcb0 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -120,6 +120,7 @@ static const USER_DRIVER *load_driver(void) GET_USER_FUNC(GetCursorPos); GET_USER_FUNC(SetCursorPos); GET_USER_FUNC(ClipCursor); + GET_USER_FUNC(DoDragDrop); GET_USER_FUNC(EmptyClipboard); GET_USER_FUNC(SetClipboardData); GET_USER_FUNC(GetClipboardData); @@ -338,6 +339,11 @@ static BOOL CDECL nulldrv_CountClipboardFormats(void) return 0; } +static HRESULT CDECL nulldrv_DoDragDrop( IDataObject *pDataObj, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect ) +{ + return E_NOTIMPL; +} + static void CDECL nulldrv_EmptyClipboard(void) { } @@ -531,6 +537,7 @@ static USER_DRIVER null_driver = nulldrv_ClipCursor, /* clipboard functions */ nulldrv_CountClipboardFormats, + nulldrv_DoDragDrop, nulldrv_EmptyClipboard, nulldrv_EndClipboardUpdate, nulldrv_EnumClipboardFormats, @@ -672,6 +679,11 @@ static BOOL CDECL loaderdrv_CountClipboardFormats(void) return load_driver()->pCountClipboardFormats(); } +static HRESULT CDECL loaderdrv_DoDragDrop( IDataObject *pDataObj, IDropSource *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect ) +{ + return load_driver()->pDoDragDrop( pDataObj, pDropSource, dwOKEffect, pdwEffect ); +} + static void CDECL loaderdrv_EmptyClipboard(void) { load_driver()->pEmptyClipboard(); @@ -780,6 +792,7 @@ static USER_DRIVER lazy_load_driver = loaderdrv_ClipCursor, /* clipboard functions */ loaderdrv_CountClipboardFormats, + loaderdrv_DoDragDrop, loaderdrv_EmptyClipboard, loaderdrv_EndClipboardUpdate, loaderdrv_EnumClipboardFormats, diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 5cc0f55..068d1f0 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -787,5 +787,6 @@ # All functions must be prefixed with '__wine_' (for internal functions) # or 'wine_' (for user-visible functions) to avoid namespace conflicts. # +@ cdecl __wine_do_drag_drop(ptr ptr long ptr) @ cdecl __wine_send_input(long ptr) @ cdecl __wine_set_pixel_format(long long) diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index d3affb0..5a26d65 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -28,6 +28,8 @@ #include "winuser.h" #include "winreg.h" #include "winternl.h" +#include "objbase.h" +#include "oleidl.h" #define GET_WORD(ptr) (*(const WORD *)(ptr)) #define GET_DWORD(ptr) (*(const DWORD *)(ptr)) @@ -81,6 +83,7 @@ typedef struct tagUSER_DRIVER { BOOL (CDECL *pClipCursor)(LPCRECT); /* clipboard functions */ BOOL (CDECL *pCountClipboardFormats)(void); /* Count available clipboard formats */ + HRESULT (CDECL *pDoDragDrop)(IDataObject*,IDropSource*,DWORD,DWORD*); /* Perform a drag and drop operation */ void (CDECL *pEmptyClipboard)(void); /* Empty clipboard data */ void (CDECL *pEndClipboardUpdate)(void); /* End clipboard update */ UINT (CDECL *pEnumClipboardFormats)(UINT); /* Enumerate clipboard formats */ diff --git a/include/winuser.h b/include/winuser.h index 118aa73..ad867e0 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -4061,6 +4061,7 @@ WORD WINAPI SYSTEM_KillSystemTimer( WORD ); #ifdef __WINESRC__ WINUSERAPI BOOL CDECL __wine_send_input( HWND hwnd, const INPUT *input ); +WINUSERAPI HRESULT CDECL __wine_do_drag_drop( void *pDataObject, void *pDropSource, DWORD dwOKEffect, DWORD *pdwEffect ); #endif #ifdef __cplusplus