Alexandre Julliard : winex11: Merge converting the selection and importing it.

Alexandre Julliard julliard at winehq.org
Wed Sep 21 10:14:50 CDT 2016


Module: wine
Branch: master
Commit: 2215d770c5bff07f06756dab793936757cd8d9b3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2215d770c5bff07f06756dab793936757cd8d9b3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 21 12:01:15 2016 +0900

winex11: Merge converting the selection and importing it.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winex11.drv/clipboard.c   | 62 ++++++++++++++++++++----------------------
 dlls/winex11.drv/x11drv.h      |  4 +--
 dlls/winex11.drv/x11drv_main.c |  1 -
 dlls/winex11.drv/xdnd.c        | 28 ++-----------------
 4 files changed, 34 insertions(+), 61 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index f2062f0..728d75c 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -1225,17 +1225,32 @@ static HANDLE import_data( Atom type, const void *data, size_t size )
 /**************************************************************************
  *		import_selection
  *
- * Import a selection target, depending on its type.
+ * Import the specified format from the selection and return a global handle to the data.
  */
-static HANDLE import_selection( Display *display, Window win, Atom prop, struct clipboard_format *format )
+static HANDLE import_selection( Display *display, Window win, Atom selection,
+                                struct clipboard_format *format )
 {
     unsigned char *data;
     unsigned long size;
-    Atom type;
+    Atom prop, type;
     HANDLE ret;
 
     if (!format->import) return 0;
-    if (!X11DRV_CLIPBOARD_ReadProperty( display, win, prop, &type, &data, &size )) return 0;
+
+    TRACE( "import %s from %s win %lx to format %s\n",
+           debugstr_xatom( format->atom ), debugstr_xatom( selection ),
+           win, debugstr_format( format->id ) );
+
+    if ((prop = convert_selection( display, win, selection, format->atom )) == None)
+    {
+        TRACE( "failed to convert selection\n" );
+        return 0;
+    }
+    if (!X11DRV_CLIPBOARD_ReadProperty( display, win, prop, &type, &data, &size ))
+    {
+        TRACE( "failed to read property\n" );
+        return 0;
+    }
     ret = format->import( type, data, size );
     HeapFree( GetProcessHeap(), 0, data );
     return ret;
@@ -1247,12 +1262,13 @@ static HANDLE import_selection( Display *display, Window win, Atom prop, struct
  *
  *  Import the X selection into the clipboard format registered for the given X target.
  */
-HANDLE X11DRV_CLIPBOARD_ImportSelection(Display *display, Atom target, Window win, Atom prop, UINT *windowsFormat)
+HANDLE X11DRV_CLIPBOARD_ImportSelection( Display *display, Window win, Atom selection,
+                                         Atom target, UINT *windowsFormat )
 {
     struct clipboard_format *format = X11DRV_CLIPBOARD_LookupProperty( NULL, target );
     if (!format) return 0;
     *windowsFormat = format->id;
-    return import_selection( display, win, prop, format );
+    return import_selection( display, win, selection, format );
 }
 
 
@@ -1872,9 +1888,7 @@ static int X11DRV_CLIPBOARD_QueryAvailableData(Display *display)
 static BOOL X11DRV_CLIPBOARD_ReadSelectionData(Display *display, LPWINE_CLIPDATA lpData)
 {
     BOOL bRet = FALSE;
-    Atom prop;
-
-    TRACE("%04x\n", lpData->wFormatID);
+    HANDLE hData;
 
     if (!lpData->lpFormat)
     {
@@ -1892,28 +1906,9 @@ static BOOL X11DRV_CLIPBOARD_ReadSelectionData(Display *display, LPWINE_CLIPDATA
             return FALSE;
         }
 
-        TRACE("Requesting conversion of %s property %s from selection type %08x\n",
-              debugstr_format( lpData->lpFormat->id ), debugstr_xatom( lpData->lpFormat->atom ),
-              (UINT)selectionCacheSrc);
-
-        prop = convert_selection( display, w, selectionCacheSrc, lpData->lpFormat->atom );
-        if (prop != None)
-        {
-            /*
-             *  Read the contents of the X selection property 
-             *  into WINE's clipboard cache and converting the 
-             *  data format if necessary.
-             */
-            HANDLE hData = import_selection( display, w, prop, lpData->lpFormat );
-            if (hData)
-                bRet = X11DRV_CLIPBOARD_InsertClipboardData(lpData->wFormatID, hData, lpData->lpFormat, TRUE);
-            else
-                TRACE("Import function failed\n");
-        }
-        else
-        {
-            TRACE("Failed to convert selection\n");
-        }
+        hData = import_selection( display, w, selectionCacheSrc, lpData->lpFormat );
+        if (hData)
+            bRet = X11DRV_CLIPBOARD_InsertClipboardData(lpData->wFormatID, hData, lpData->lpFormat, TRUE);
     }
     else
     {
@@ -1937,8 +1932,6 @@ static BOOL X11DRV_CLIPBOARD_GetProperty(Display *display, Window w, Atom prop,
     unsigned long pos = 0, nitems, remain, count;
     unsigned char *val = NULL, *buffer;
 
-    TRACE( "Reading property %s from X window %lx\n", debugstr_xatom( prop ), w );
-
     for (;;)
     {
         if (XGetWindowProperty(display, w, prop, pos, INT_MAX / 4, False,
@@ -1971,6 +1964,9 @@ static BOOL X11DRV_CLIPBOARD_GetProperty(Display *display, Window w, Atom prop,
         pos += count / sizeof(int);
     }
 
+    TRACE( "got property %s type %s format %u len %lu from window %lx\n",
+           debugstr_xatom( prop ), debugstr_xatom( *atype ), aformat, *datasize, w );
+
     /* Delete the property on the window now that we are done
      * This will send a PropertyNotify event to the selection owner. */
     XDeleteProperty(display, w, prop);
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 2d37138..48f3999 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -239,7 +239,8 @@ extern void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) DECL
 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;
-extern HANDLE X11DRV_CLIPBOARD_ImportSelection(Display *d, Atom target, Window w, Atom prop, UINT *windowsFormat) DECLSPEC_HIDDEN;
+extern HANDLE X11DRV_CLIPBOARD_ImportSelection( Display *display, Window win, Atom selection,
+                                                Atom target, UINT *windowsFormat ) DECLSPEC_HIDDEN;
 
 /**************************************************************************
  * X11 GDI driver
@@ -453,7 +454,6 @@ enum x11drv_atoms
     XATOM_XdndActionAsk,
     XATOM_XdndActionPrivate,
     XATOM_XdndSelection,
-    XATOM_XdndTarget,
     XATOM_XdndTypeList,
     XATOM_HTML_Format,
     XATOM_WCF_BITMAP,
diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index c2e0969..142c9b1 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -167,7 +167,6 @@ static const char * const atom_names[NB_XATOMS - FIRST_XATOM] =
     "XdndActionAsk",
     "XdndActionPrivate",
     "XdndSelection",
-    "XdndTarget",
     "XdndTypeList",
     "HTML Format",
     "WCF_BITMAP",
diff --git a/dlls/winex11.drv/xdnd.c b/dlls/winex11.drv/xdnd.c
index cbc917a..eb9b117 100644
--- a/dlls/winex11.drv/xdnd.c
+++ b/dlls/winex11.drv/xdnd.c
@@ -49,10 +49,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(xdnd);
 
-/* Maximum wait time for selection notify */
-#define SELECTION_RETRIES 500  /* wait for .1 seconds */
-#define SELECTION_WAIT    1000 /* us */
-
 typedef struct tagXDNDDATA
 {
     int cf_win;
@@ -496,9 +492,7 @@ void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event )
 static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm,
                                         Atom *types, unsigned long count)
 {
-    unsigned int i, j;
-    BOOL res;
-    XEvent xe;
+    unsigned int i;
     XDNDDATA *current, *next;
     BOOL haveHDROP = FALSE;
 
@@ -516,24 +510,8 @@ static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm,
         if (types[i] == 0)
             continue;
 
-        XConvertSelection(display, x11drv_atom(XdndSelection), types[i],
-                          x11drv_atom(XdndTarget), xwin, /*tm*/CurrentTime);
-
-        /*
-         * Wait for SelectionNotify
-         */
-        for (j = 0; j < SELECTION_RETRIES; j++)
-        {
-            res = XCheckTypedWindowEvent(display, xwin, SelectionNotify, &xe);
-            if (res && xe.xselection.selection == x11drv_atom(XdndSelection)) break;
-
-            usleep(SELECTION_WAIT);
-        }
-
-        if (xe.xselection.property == None)
-            continue;
-
-        contents = X11DRV_CLIPBOARD_ImportSelection(display, types[i], xwin, x11drv_atom(XdndTarget), &windowsFormat);
+        contents = X11DRV_CLIPBOARD_ImportSelection( display, xwin, x11drv_atom(XdndSelection),
+                                                     types[i], &windowsFormat );
         if (contents)
             X11DRV_XDND_InsertXDNDData(types[i], windowsFormat, contents);
     }




More information about the wine-cvs mailing list