emacs-diffs
[Top][All Lists]
Advanced

[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);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]