Alexandre Julliard : winex11: If multiple clipboard formats can be exported, use the first available one.

Alexandre Julliard julliard at winehq.org
Fri Sep 23 10:25:16 CDT 2016


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Sep 23 12:20:32 2016 +0900

winex11: If multiple clipboard formats can be exported, use the first available one.

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

---

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

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index 0850448..f557c80 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -1793,27 +1793,37 @@ static BOOL export_targets( Display *display, Window win, Atom prop, Atom target
  */
 static BOOL export_selection( Display *display, Window win, Atom prop, Atom target )
 {
-    struct clipboard_format *format = X11DRV_CLIPBOARD_LookupProperty( NULL, target );
+    struct clipboard_format *format;
     HANDLE handle = 0;
-    BOOL ret = FALSE;
-
-    if (!format || !format->export) return FALSE;
-
-    TRACE( "win %lx prop %s target %s exporting %s\n", win,
-           debugstr_xatom( prop ), debugstr_xatom( target ), debugstr_format( format->id ) );
-
-    if (!format->id) return format->export( display, win, prop, target, 0 );
+    BOOL open = FALSE, ret = FALSE;
 
-    if (!OpenClipboard( 0 ))
+    LIST_FOR_EACH_ENTRY( format, &format_list, struct clipboard_format, entry )
     {
-        ERR( "failed to open clipboard for %s\n", debugstr_format( format->id ));
-        return FALSE;
-    }
-
-    if ((handle = GetClipboardData( format->id )))
-        ret = format->export( display, win, prop, target, handle );
+        if (format->atom != target) continue;
+        if (!format->export) continue;
+        if (!format->id)
+        {
+            TRACE( "win %lx prop %s target %s\n", win, debugstr_xatom( prop ), debugstr_xatom( target ));
+            ret = format->export( display, win, prop, target, 0 );
+            break;
+        }
+        if (!open && !(open = OpenClipboard( 0 )))
+        {
+            ERR( "failed to open clipboard for %s\n", debugstr_xatom( target ));
+            return FALSE;
+        }
+        if ((handle = GetClipboardData( format->id )))
+        {
+            TRACE( "win %lx prop %s target %s exporting %s %p\n",
+                   win, debugstr_xatom( prop ), debugstr_xatom( target ),
+                   debugstr_format( format->id ), handle );
 
-    CloseClipboard();
+            ret = format->export( display, win, prop, target, handle );
+            break;
+        }
+        /* keep looking for another Win32 format mapping to the same target */
+    }
+    if (open) CloseClipboard();
     return ret;
 }
 




More information about the wine-cvs mailing list