xserver: Branch 'xorg-server-1.4-apple'

George Peter Staplin gstaplin at kemper.freedesktop.org
Wed Sep 17 11:07:16 PDT 2008


 hw/xquartz/pbproxy/x-selection.m |   62 +++++++++++++++++++++++----------------
 1 file changed, 37 insertions(+), 25 deletions(-)

New commits:
commit 12912adaeea759d30f96d8ae51a84fd1659ea0ac
Author: George Peter Staplin <gps at Georges-Workstation.local>
Date:   Wed Sep 17 11:59:36 2008 -0600

    XQuartz: pbproxy: Use an NSBitmapImageRep to convert an "image/png" selection
    to a TIFFRepresentation for use with NSPasteboard.
    
    This has been tested with the Gimp and works with some minor quartz-wm changes.
    The Finder clipboard shows the image updates after an Edit -> Copy.

diff --git a/hw/xquartz/pbproxy/x-selection.m b/hw/xquartz/pbproxy/x-selection.m
index 0feb4fd..eea6124 100644
--- a/hw/xquartz/pbproxy/x-selection.m
+++ b/hw/xquartz/pbproxy/x-selection.m
@@ -33,6 +33,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <X11/Xatom.h>
+#import <AppKit/NSBitmapImageRep.h>
 
 // These will be set by X11Controller.m once this is integrated into a server thread
 BOOL pbproxy_active = YES;
@@ -797,55 +798,66 @@ convert_1 (XSelectionRequestEvent *e, NSString *data, Atom target, Atom prop)
 		       _selection_window, CurrentTime);    
 }
 
-/*TODO I think this should convert to a standard NSPasteboard format, 
- * such as TIFF or PICT with a NSBitmapImageRep class.  */
 /* This handles the image type of selection (typically in CLIPBOARD). */
+/* We convert to a TIFF, so that other applications can paste more easily. */
 - (void) handle_image: (struct propdata *)pdata extension:(NSString *)fileext
 {
-    NSString *pbtype;
     NSArray *pbtypes;
     NSUInteger length;
-    NSData *data;
+    NSData *data, *tiff;
+    NSBitmapImageRep *bmimage;
 
     TRACE ();
 
-    pbtype = NSCreateFileContentsPboardType (fileext);
-    if (nil == pbtype) 
+    length = pdata->length;
+    data = [[NSData alloc] initWithBytes:pdata->data length:length];
+
+    if (nil == data)
     {
-	fprintf (stderr, "unknown extension or unable to create PboardType\n");
+	DB ("unable to create NSData object!\n");
 	return;
     }
-    
-    DB ("%s\n", [pbtype cStringUsingEncoding:NSISOLatin1StringEncoding]); 
-    
-    pbtypes = [NSArray arrayWithObjects: pbtype, nil];
-    if (nil == pbtypes) 
+
+    bmimage = [[NSBitmapImageRep alloc] initWithData:data];
+
+    if (nil == bmimage)
     {
-       DB ("error creating NSArray\n");
-       [pbtype release];
-       return;
+	DB ("unable to create NSBitmapImageRep!\n");
+	return;
     }
-    
-    length = pdata->length;
-    data = [[NSData alloc] initWithBytes:pdata->data length:length];
-    if (nil == data)
+
+    @try 
     {
-	[pbtype release];
-	[pbtypes release];
+	tiff = [bmimage TIFFRepresentation];
+    }
+
+    @catch (NSException *e) 
+    {
+	DB ("NSTIFFException!\n");
+	[data release];
+	[bmimage release];
 	return;
     }
+    
+    pbtypes = [NSArray arrayWithObjects:NSTIFFPboardType, nil];
+
+    if (nil == pbtypes)
+    {
+	[tiff release];
+	[data release];
+	[bmimage release];
+    }
 
     [_pasteboard declareTypes:pbtypes owner:self];
-    if (YES != [_pasteboard setData:data forType:pbtype])
+    if (YES != [_pasteboard setData:data forType:NSTIFFPboardType])
     {
 	DB ("writing pasteboard data failed!\n");
     }
 
-    [pbtype release];
     [pbtypes release];
     [data release];
-    
-    DB ("handled image\n");
+    [tiff release];
+    [bmimage release];
 }
 
 /* This handles the UTF8_STRING type of selection. */


More information about the xorg-commit mailing list