Allow NS to handle non-text clipboard contents

* src/nsselect.m (ns_get_foreign_selection): Handle non-plain text
clipboard entries.
(ns_string_from_pasteboard): Remove EOL conversion.
(syms_of_nsselect): Define QTARGETS.
This commit is contained in:
Alan Third 2021-11-23 20:56:44 +00:00
parent e754973d4d
commit 7e3c2b553f

View file

@ -215,9 +215,74 @@ Updated by Christian Limpach (chris@nice.ch)
static Lisp_Object static Lisp_Object
ns_get_foreign_selection (Lisp_Object symbol, Lisp_Object target) ns_get_foreign_selection (Lisp_Object symbol, Lisp_Object target)
{ {
NSDictionary<NSString *, NSString *> *typeLookup;
id pb; id pb;
pb = ns_symbol_to_pb (symbol); pb = ns_symbol_to_pb (symbol);
return pb != nil ? ns_string_from_pasteboard (pb) : Qnil;
/* Dictionary for looking up NS types from MIME types, and vice versa. */
typeLookup
= [NSDictionary
dictionaryWithObjectsAndKeys:
@"text/plain", NSPasteboardTypeURL,
#if NS_USE_NSPasteboardTypeFileURL
@"text/plain", NSPasteboardTypeFileURL,
#else
@"text/plain", NSFilenamesPboardType,
#endif
@"text/html", NSPasteboardTypeHTML,
@"text/plain", NSPasteboardTypeMultipleTextSelection,
@"application/pdf", NSPasteboardTypePDF,
@"image/png", NSPasteboardTypePNG,
@"application/rtf", NSPasteboardTypeRTF,
@"application/rtfd", NSPasteboardTypeRTFD,
@"STRING", NSPasteboardTypeString,
@"text/plain", NSPasteboardTypeTabularText,
@"image/tiff", NSPasteboardTypeTIFF,
nil];
if (EQ (target, QTARGETS))
{
NSMutableArray *types = [NSMutableArray arrayWithCapacity:3];
NSString *type;
NSEnumerator *e = [[pb types] objectEnumerator];
while (type = [e nextObject])
{
NSString *val = [typeLookup valueForKey:type];
if (val && ! [types containsObject:val])
[types addObject:val];
}
Lisp_Object v = Fmake_vector (make_fixnum ([types count]+1), Qnil);
ASET (v, 0, QTARGETS);
for (int i = 0 ; i < [types count] ; i++)
ASET (v, i+1, intern ([[types objectAtIndex:i] UTF8String]));
return v;
}
else
{
NSData *d;
NSArray *availableTypes;
NSString *result, *t;
if (!NILP (target))
availableTypes
= [typeLookup allKeysForObject:
[NSString stringWithLispString:SYMBOL_NAME (target)]];
else
availableTypes = @[NSPasteboardTypeString];
t = [pb availableTypeFromArray:availableTypes];
result = [pb stringForType:t];
if (result)
return [result lispString];
d = [pb dataForType:t];
return make_string ([d bytes], [d length]);
}
} }
@ -234,8 +299,6 @@ Updated by Christian Limpach (chris@nice.ch)
ns_string_from_pasteboard (id pb) ns_string_from_pasteboard (id pb)
{ {
NSString *type, *str; NSString *type, *str;
const char *utfStr;
int length;
type = [pb availableTypeFromArray: ns_return_types]; type = [pb availableTypeFromArray: ns_return_types];
if (type == nil) if (type == nil)
@ -260,6 +323,14 @@ Updated by Christian Limpach (chris@nice.ch)
} }
} }
/* FIXME: Is the below EOL conversion even needed? I've removed it
for now so we can see if it causes problems. */
return [str lispString];
#if 0
const char *utfStr;
int length;
/* assume UTF8 */ /* assume UTF8 */
NS_DURING NS_DURING
{ {
@ -294,6 +365,7 @@ Updated by Christian Limpach (chris@nice.ch)
NS_ENDHANDLER NS_ENDHANDLER
return make_string (utfStr, length); return make_string (utfStr, length);
#endif
} }
@ -491,6 +563,8 @@ Updated by Christian Limpach (chris@nice.ch)
DEFSYM (QTEXT, "TEXT"); DEFSYM (QTEXT, "TEXT");
DEFSYM (QFILE_NAME, "FILE_NAME"); DEFSYM (QFILE_NAME, "FILE_NAME");
DEFSYM (QTARGETS, "TARGETS");
defsubr (&Sns_disown_selection_internal); defsubr (&Sns_disown_selection_internal);
defsubr (&Sns_get_selection); defsubr (&Sns_get_selection);
defsubr (&Sns_own_selection_internal); defsubr (&Sns_own_selection_internal);