[PATCH v2 1/8] winex11: Move XdndEnter event handler to event.c.

Jacek Caban wine at gitlab.winehq.org
Thu Apr 28 07:31:07 CDT 2022


From: Jacek Caban <jacek at codeweavers.com>

In preparation for xdnd.c being in PE file.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
---
 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 );
 }
 
 
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/11



More information about the wine-devel mailing list