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