diff --git a/hw/xquartz/pbproxy/x-selection.m b/hw/xquartz/pbproxy/x-selection.m index 0feb4fd47e0b32fc797f6794b64f8346b2821c34..eea61247d4a6f01aca4109a14d57cdf3d1c2dc60 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. */