From 811e9f5e9e9c07f4b8fb1e9a4d9df91a2e359221 Mon Sep 17 00:00:00 2001 From: George Peter Staplin Date: Wed, 17 Sep 2008 11:59:36 -0600 Subject: [PATCH] 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. (cherry picked from commit 12912adaeea759d30f96d8ae51a84fd1659ea0ac) --- hw/xquartz/pbproxy/x-selection.m | 66 +++++++++++++++++++------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/hw/xquartz/pbproxy/x-selection.m b/hw/xquartz/pbproxy/x-selection.m index 0feb4fd47..eea61247d 100644 --- a/hw/xquartz/pbproxy/x-selection.m +++ b/hw/xquartz/pbproxy/x-selection.m @@ -33,6 +33,7 @@ #include #include #include +#import // 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) - { - fprintf (stderr, "unknown extension or unable to create PboardType\n"); - return; - } - - DB ("%s\n", [pbtype cStringUsingEncoding:NSISOLatin1StringEncoding]); - - pbtypes = [NSArray arrayWithObjects: pbtype, nil]; - if (nil == pbtypes) - { - DB ("error creating NSArray\n"); - [pbtype release]; - return; - } - length = pdata->length; data = [[NSData alloc] initWithBytes:pdata->data length:length]; + if (nil == data) { - [pbtype release]; - [pbtypes release]; + DB ("unable to create NSData object!\n"); return; } + bmimage = [[NSBitmapImageRep alloc] initWithData:data]; + + if (nil == bmimage) + { + DB ("unable to create NSBitmapImageRep!\n"); + return; + } + + @try + { + 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. */