[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 7e3c2b5: Allow NS to handle non-text clipboard contents
From: |
Alan Third |
Subject: |
master 7e3c2b5: Allow NS to handle non-text clipboard contents |
Date: |
Wed, 24 Nov 2021 05:42:25 -0500 (EST) |
branch: master
commit 7e3c2b553fede9feeeb755dfeba875fece0c2f63
Author: Alan Third <alan@idiocy.org>
Commit: Alan Third <alan@idiocy.org>
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.
---
src/nsselect.m | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 77 insertions(+), 3 deletions(-)
diff --git a/src/nsselect.m b/src/nsselect.m
index 5ab3ef7..e999835 100644
--- a/src/nsselect.m
+++ b/src/nsselect.m
@@ -215,9 +215,74 @@ ns_get_local_selection (Lisp_Object selection_name,
static Lisp_Object
ns_get_foreign_selection (Lisp_Object symbol, Lisp_Object target)
{
+ NSDictionary<NSString *, NSString *> *typeLookup;
id pb;
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 @@ Lisp_Object
ns_string_from_pasteboard (id pb)
{
NSString *type, *str;
- const char *utfStr;
- int length;
type = [pb availableTypeFromArray: ns_return_types];
if (type == nil)
@@ -260,6 +323,14 @@ ns_string_from_pasteboard (id pb)
}
}
+ /* 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 */
NS_DURING
{
@@ -294,6 +365,7 @@ ns_string_from_pasteboard (id pb)
NS_ENDHANDLER
return make_string (utfStr, length);
+#endif
}
@@ -491,6 +563,8 @@ syms_of_nsselect (void)
DEFSYM (QTEXT, "TEXT");
DEFSYM (QFILE_NAME, "FILE_NAME");
+ DEFSYM (QTARGETS, "TARGETS");
+
defsubr (&Sns_disown_selection_internal);
defsubr (&Sns_get_selection);
defsubr (&Sns_own_selection_internal);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 7e3c2b5: Allow NS to handle non-text clipboard contents,
Alan Third <=