From: Jacek Caban jacek@codeweavers.com
In preparation for xdnd.c being in PE file. --- dlls/winex11.drv/event.c | 76 +++++++++++++++++++++++++++++++++- dlls/winex11.drv/x11drv.h | 3 +- dlls/winex11.drv/xdnd.c | 86 ++------------------------------------- 3 files changed, 80 insertions(+), 85 deletions(-)
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index e1bcd70d35a..c8cd3fd5ef1 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -49,6 +49,7 @@ #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(event); +WINE_DECLARE_DEBUG_CHANNEL(xdnd);
extern BOOL ximInComposeMode;
@@ -1752,6 +1753,79 @@ static void handle_dnd_protocol( HWND hwnd, XClientMessageEvent *event ) }
+/************************************************************************** + * handle_xdnd_enter_event + * + * Handle an XdndEnter event. + */ +static void handle_xdnd_enter_event( HWND hWnd, XClientMessageEvent *event ) +{ + struct format_entry *data; + unsigned long count = 0; + Atom *xdndtypes; + size_t size; + int version; + + version = (event->data.l[1] & 0xFF000000) >> 24; + + TRACE( "ver(%d) check-XdndTypeList(%ld) data=%ld,%ld,%ld,%ld,%ld\n", + version, (event->data.l[1] & 1), + event->data.l[0], event->data.l[1], event->data.l[2], + event->data.l[3], event->data.l[4] ); + + if (version > WINE_XDND_VERSION) + { + ERR("ignoring unsupported XDND version %d\n", version); + return; + } + + /* If the source supports more than 3 data types we retrieve + * the entire list. */ + if (event->data.l[1] & 1) + { + Atom acttype; + int actfmt; + unsigned long bytesret; + + /* Request supported formats from source window */ + XGetWindowProperty( event->display, event->data.l[0], x11drv_atom(XdndTypeList), + 0, 65535, FALSE, AnyPropertyType, &acttype, &actfmt, &count, + &bytesret, (unsigned char **)&xdndtypes ); + } + else + { + count = 3; + xdndtypes = (Atom *)&event->data.l[2]; + } + + if (TRACE_ON(xdnd)) + { + unsigned int i; + + for (i = 0; i < count; i++) + { + if (xdndtypes[i] != 0) + { + char * pn = XGetAtomName( event->display, xdndtypes[i] ); + TRACE( "XDNDEnterAtom %ld: %s\n", xdndtypes[i], pn ); + XFree( pn ); + } + } + } + + data = import_xdnd_selection( event->display, event->window, x11drv_atom(XdndSelection), + xdndtypes, count, &size ); + if (data) + { + handle_dnd_enter_event( data, size ); + free( data ); + } + + if (event->data.l[1] & 1) + XFree(xdndtypes); +} + + struct client_message_handler { int atom; /* protocol atom */ @@ -1764,7 +1838,7 @@ static const struct client_message_handler client_messages[] = { XATOM_WM_PROTOCOLS, handle_wm_protocols }, { XATOM__XEMBED, handle_xembed_protocol }, { XATOM_DndProtocol, handle_dnd_protocol }, - { XATOM_XdndEnter, X11DRV_XDND_EnterEvent }, + { XATOM_XdndEnter, handle_xdnd_enter_event }, { XATOM_XdndPosition, X11DRV_XDND_PositionEvent }, { XATOM_XdndDrop, X11DRV_XDND_DropEvent }, { XATOM_XdndLeave, X11DRV_XDND_LeaveEvent } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index f6d28122fc3..9339c1c08e6 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -293,7 +293,6 @@ extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, DWORD dwReadLen) DECLSPEC_HIDDEN; extern void IME_SetResultString(LPWSTR lpResult, DWORD dwResultlen) DECLSPEC_HIDDEN;
-extern void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN; extern void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN; extern void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN; extern void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN; @@ -305,6 +304,8 @@ struct format_entry char data[1]; };
+extern void handle_dnd_enter_event( struct format_entry *formats, ULONG size ) DECLSPEC_HIDDEN; + extern struct format_entry *import_xdnd_selection( Display *display, Window win, Atom selection, Atom *targets, UINT count, size_t *size ) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c index 34cb2a47081..e56fc964ada 100644 --- a/dlls/winex11.drv/xdnd.c +++ b/dlls/winex11.drv/xdnd.c @@ -55,8 +55,6 @@ static HWND XDNDLastTargetWnd; /* might be an ancestor of XDNDLastTargetWnd */ static HWND XDNDLastDropTargetWnd;
-static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm, - Atom *types, unsigned long count); static BOOL X11DRV_XDND_HasHDROP(void); static HRESULT X11DRV_XDND_SendDropFiles(HWND hwnd); static void X11DRV_XDND_FreeDragDropOp(void); @@ -180,73 +178,6 @@ static long X11DRV_XDND_DROPEFFECTToXdndAction(DWORD effect) return x11drv_atom(XdndActionCopy); }
-/************************************************************************** - * X11DRV_XDND_EnterEvent - * - * Handle an XdndEnter event. - */ -void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) -{ - int version; - Atom *xdndtypes; - unsigned long count = 0; - - version = (event->data.l[1] & 0xFF000000) >> 24; - TRACE("ver(%d) check-XdndTypeList(%ld) data=%ld,%ld,%ld,%ld,%ld\n", - version, (event->data.l[1] & 1), - event->data.l[0], event->data.l[1], event->data.l[2], - event->data.l[3], event->data.l[4]); - - if (version > WINE_XDND_VERSION) - { - ERR("ignoring unsupported XDND version %d\n", version); - return; - } - - XDNDAccepted = FALSE; - - /* If the source supports more than 3 data types we retrieve - * the entire list. */ - if (event->data.l[1] & 1) - { - Atom acttype; - int actfmt; - unsigned long bytesret; - - /* Request supported formats from source window */ - XGetWindowProperty(event->display, event->data.l[0], x11drv_atom(XdndTypeList), - 0, 65535, FALSE, AnyPropertyType, &acttype, &actfmt, &count, - &bytesret, (unsigned char**)&xdndtypes); - } - else - { - count = 3; - xdndtypes = (Atom*) &event->data.l[2]; - } - - if (TRACE_ON(xdnd)) - { - unsigned int i; - - for (i = 0; i < count; i++) - { - if (xdndtypes[i] != 0) - { - char * pn = XGetAtomName(event->display, xdndtypes[i]); - TRACE("XDNDEnterAtom %ld: %s\n", xdndtypes[i], pn); - XFree(pn); - } - } - } - - /* Do a one-time data read and cache results */ - X11DRV_XDND_ResolveProperty(event->display, event->window, - event->data.l[1], xdndtypes, count); - - if (event->data.l[1] & 1) - XFree(xdndtypes); -} - /* Recursively searches for a window on given coordinates in a drag&drop specific manner. * * Don't use WindowFromPoint instead, because it omits the STATIC and transparent @@ -514,29 +445,18 @@ void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event )
/************************************************************************** - * X11DRV_XDND_ResolveProperty - * - * Resolve all MIME types to windows clipboard formats. All data is cached. + * handle_dnd_enter_event */ -static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm, - Atom *types, unsigned long count) +void handle_dnd_enter_event( struct format_entry *formats, ULONG size ) { - struct format_entry *formats; - size_t size; - - TRACE("count(%ld)\n", count); - + XDNDAccepted = FALSE; X11DRV_XDND_FreeDragDropOp(); /* Clear previously cached data */
- formats = import_xdnd_selection( display, xwin, x11drv_atom(XdndSelection), types, count, &size ); - if (!formats) return; - if ((xdnd_formats = HeapAlloc( GetProcessHeap(), 0, size ))) { memcpy( xdnd_formats, formats, size ); xdnd_formats_end = (struct format_entry *)((char *)xdnd_formats + size); } - free( formats ); }