Alexandre Julliard : winex11: Use a standard import function to retrieve the TARGETS property.

Alexandre Julliard julliard at winehq.org
Thu Sep 22 10:00:02 CDT 2016


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 22 12:50:34 2016 +0900

winex11: Use a standard import function to retrieve the TARGETS property.

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

---

 dlls/winex11.drv/clipboard.c | 83 ++++++++++++++------------------------------
 1 file changed, 27 insertions(+), 56 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index dcb1403..8457a03 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -135,6 +135,7 @@ static HANDLE import_string( Atom type, const void *data, size_t size );
 static HANDLE import_utf8_string( Atom type, const void *data, size_t size );
 static HANDLE import_compound_text( Atom type, const void *data, size_t size );
 static HANDLE import_text_uri_list( Atom type, const void *data, size_t size );
+static HANDLE import_targets( Atom type, const void *data, size_t size );
 
 static BOOL export_data( Display *display, Window win, Atom prop, Atom target, HANDLE handle );
 static BOOL export_string( Display *display, Window win, Atom prop, Atom target, HANDLE handle );
@@ -206,7 +207,7 @@ static const struct
     { PNGW, 0,               XATOM_image_png,           import_data,          export_data },
     { HTMLFormatW, 0,        XATOM_HTML_Format,         import_data,          export_data },
     { HTMLFormatW, 0,        XATOM_text_html,           import_data,          export_text_html },
-    { 0, 0,                  XATOM_TARGETS,             NULL,                 export_targets },
+    { 0, 0,                  XATOM_TARGETS,             import_targets,       export_targets },
     { 0, 0,                  XATOM_MULTIPLE,            NULL,                 export_multiple },
 };
 
@@ -1832,14 +1833,18 @@ static int is_window_error( Display *display, XErrorEvent *event, void *arg )
 }
 
 /**************************************************************************
- *		X11DRV_CLIPBOARD_InsertSelectionProperties
+ *		import_targets
  *
- * Mark properties available for future retrieval.
+ *  Import TARGETS and mark the corresponding clipboard formats as available.
  */
-static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* properties, UINT count)
+static HANDLE import_targets( Atom type, const void *data, size_t size )
 {
-     UINT i, nb_atoms = 0;
-     Atom *atoms = NULL;
+    UINT count = size / sizeof(Atom);
+    const Atom *properties = data;
+    UINT i, nb_atoms = 0;
+    Atom *atoms = NULL;
+
+    if (type != XA_ATOM && type != x11drv_atom(TARGETS)) return 0;
 
      /* Cache these formats in the clipboard cache */
      for (i = 0; i < count; i++)
@@ -1878,6 +1883,8 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p
          char **names = HeapAlloc( GetProcessHeap(), 0, nb_atoms * sizeof(*names) );
          if (names)
          {
+             Display *display = thread_display();
+
              X11DRV_expect_error( display, is_atom_error, NULL );
              if (!XGetAtomNames( display, atoms, nb_atoms, names )) nb_atoms = 0;
              if (X11DRV_check_error())
@@ -1909,6 +1916,7 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p
          }
          HeapFree( GetProcessHeap(), 0, atoms );
      }
+     return (HANDLE)1;
 }
 
 
@@ -1921,13 +1929,7 @@ static VOID X11DRV_CLIPBOARD_InsertSelectionProperties(Display *display, Atom* p
  */
 static int X11DRV_CLIPBOARD_QueryAvailableData(Display *display)
 {
-    Atom           atype=AnyPropertyType;
-    int		   aformat;
-    unsigned long  remain;
-    Atom*	   targetList=NULL;
     Window         w;
-    unsigned long  cSelectionTargets = 0;
-    Atom prop;
 
     if (selectionAcquired & (S_PRIMARY | S_CLIPBOARD))
     {
@@ -1949,26 +1951,29 @@ static int X11DRV_CLIPBOARD_QueryAvailableData(Display *display)
     if ((use_primary_selection && XGetSelectionOwner(display,XA_PRIMARY)) ||
         XGetSelectionOwner(display,x11drv_atom(CLIPBOARD)))
     {
-        if (use_primary_selection && (prop = convert_selection( display, w, XA_PRIMARY, x11drv_atom(TARGETS) )))
+        struct clipboard_format *format = X11DRV_CLIPBOARD_LookupProperty( NULL, x11drv_atom(TARGETS) );
+
+        assert( format );
+        if (use_primary_selection && import_selection( display, w, XA_PRIMARY, format ))
             selectionCacheSrc = XA_PRIMARY;
-        else if ((prop = convert_selection( display, w, x11drv_atom(CLIPBOARD), x11drv_atom(TARGETS) )))
+        else if (import_selection( display, w, x11drv_atom(CLIPBOARD), format ))
             selectionCacheSrc = x11drv_atom(CLIPBOARD);
         else
         {
-            Atom xstr = XA_STRING;
+            HANDLE handle;
 
+            format = X11DRV_CLIPBOARD_LookupProperty( NULL, XA_STRING );
+            assert( format );
             /* Selection Owner doesn't understand TARGETS, try retrieving XA_STRING */
-            if (convert_selection( display, w, XA_PRIMARY, XA_STRING ))
+            if (use_primary_selection && (handle = import_selection( display, w, XA_PRIMARY, format )))
             {
-                X11DRV_CLIPBOARD_InsertSelectionProperties(display, &xstr, 1);
+                X11DRV_CLIPBOARD_InsertClipboardData( format->id, handle, format, TRUE );
                 selectionCacheSrc = XA_PRIMARY;
-                return 1;
             }
-            else if (convert_selection( display, w, x11drv_atom(CLIPBOARD), XA_STRING ))
+            else if ((handle = import_selection( display, w, x11drv_atom(CLIPBOARD), format )))
             {
-                X11DRV_CLIPBOARD_InsertSelectionProperties(display, &xstr, 1);
+                X11DRV_CLIPBOARD_InsertClipboardData( format->id, handle, format, TRUE );
                 selectionCacheSrc = x11drv_atom(CLIPBOARD);
-                return 1;
             }
             else
             {
@@ -1976,43 +1981,9 @@ static int X11DRV_CLIPBOARD_QueryAvailableData(Display *display)
                 return -1;
             }
         }
+        return 1;
     }
     else return 0; /* No selection owner so report 0 targets available */
-
-    /* Read the TARGETS property contents */
-    if (!XGetWindowProperty(display, w, prop,
-        0, 0x3FFF, True, AnyPropertyType/*XA_ATOM*/, &atype, &aformat, &cSelectionTargets, 
-        &remain, (unsigned char**)&targetList))
-    {
-       TRACE( "type %s format %d count %ld remain %ld\n",
-              debugstr_xatom( atype ), aformat, cSelectionTargets, remain);
-       /*
-        * The TARGETS property should have returned us a list of atoms
-        * corresponding to each selection target format supported.
-        */
-       if (atype == XA_ATOM || atype == x11drv_atom(TARGETS))
-       {
-           if (aformat == 32)
-           {
-               X11DRV_CLIPBOARD_InsertSelectionProperties(display, targetList, cSelectionTargets);
-           }
-           else if (aformat == 8)  /* work around quartz-wm brain damage */
-           {
-               unsigned long i, count = cSelectionTargets / sizeof(CARD32);
-               Atom *atoms = HeapAlloc( GetProcessHeap(), 0, count * sizeof(Atom) );
-               for (i = 0; i < count; i++)
-                   atoms[i] = ((CARD32 *)targetList)[i];  /* FIXME: byte swapping */
-               X11DRV_CLIPBOARD_InsertSelectionProperties( display, atoms, count );
-               HeapFree( GetProcessHeap(), 0, atoms );
-           }
-       }
-
-       /* Free the list of targets */
-       XFree(targetList);
-    }
-    else WARN("Failed to read TARGETS property\n");
-
-    return cSelectionTargets;
 }
 
 




More information about the wine-cvs mailing list