]> git.eshelyaron.com Git - emacs.git/commitdiff
Add file dragging support to NS port
authorPo Lu <luangruo@yahoo.com>
Sat, 28 May 2022 01:18:09 +0000 (09:18 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 28 May 2022 01:18:09 +0000 (09:18 +0800)
* lisp/dired.el (dired-mouse-drag-files): Document that
`dired-mouse-drag-files' now works on NS.

* lisp/term/ns-win.el (x-begin-drag): Handle FILE_NAME.
* src/nsselect.m (ns_decode_data_to_pasteboard): Handle file URL
type.
(ns_lisp_to_pasteboard, Fns_begin_drag): Handle new type `file'.

lisp/dired.el
lisp/term/ns-win.el
src/nsselect.m

index fbf26dbce7a8117295e1c2f81702a604595555e9..6ed4a949e0ab0c619ac29c0841569fd5083253ee 100644 (file)
@@ -254,7 +254,7 @@ The target is used in the prompt for file copy, rename etc."
 Dragging the mouse and then releasing it over the window of
 another program will result in that program opening the file, or
 creating a copy of it.  This feature is supported only on X
-Windows and Haiku.
+Windows, Haiku, and Nextstep (macOS or GNUstep).
 
 If the value is `link', then a symbolic link will be created to
 the file instead by the other program (usually a file manager)."
index 42b8d72c269c41d1ff850278e99d8af176493ccc..b49143fbc205ac056106c1156f7801ce55a12721 100644 (file)
@@ -903,6 +903,13 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
     (when (and (member "STRING" targets)
                (stringp ns-dnd-selection-value))
       (push (cons 'string ns-dnd-selection-value) pasteboard))
+    (when (and (member "FILE_NAME" targets)
+               (file-exists-p ns-dnd-selection-value))
+      (push (cons 'file
+                  (url-encode-url (concat "file://"
+                                          (expand-file-name
+                                           ns-dnd-selection-value))))
+            pasteboard))
     (ns-begin-drag frame pasteboard action)))
 
 (provide 'ns-win)
index a481e80d770d066d121a539ca3b85fcc69ed499e..0bd840d92b7585591d6ffc960f806ac1ef0d81b4 100644 (file)
@@ -561,17 +561,34 @@ static void
 ns_decode_data_to_pasteboard (Lisp_Object type, Lisp_Object data,
                              NSPasteboard *pasteboard)
 {
+  NSArray *types, *new;
+
+  types = [pasteboard types];
+
   CHECK_SYMBOL (type);
 
   if (EQ (type, Qstring))
     {
       CHECK_STRING (data);
 
-      [pasteboard declareTypes: [NSArray arrayWithObject: NSPasteboardTypeString]
+      new = [types arrayByAddingObject: NSPasteboardTypeString];
+
+      [pasteboard declareTypes: new
                         owner: nil];
       [pasteboard setString: [NSString stringWithLispString: data]
                    forType: NSPasteboardTypeString];
     }
+  else if (EQ (type, Qfile))
+    {
+      CHECK_STRING (data);
+
+      new = [types arrayByAddingObject: NSPasteboardTypeFileURL];
+
+      [pasteboard declareTypes: new
+                        owner: nil];
+      [pasteboard setString: [NSString stringWithLispString: data]
+                   forType: NSPasteboardTypeFileURL];
+    }
   else
     signal_error ("Unknown pasteboard type", type);
 }
@@ -582,6 +599,9 @@ ns_lisp_to_pasteboard (Lisp_Object object,
 {
   Lisp_Object tem, type, data;
 
+  [pasteboard declareTypes: [NSArray array]
+                    owner: nil];
+
   CHECK_LIST (object);
   for (tem = object; CONSP (tem); tem = XCDR (tem))
     {
@@ -642,6 +662,9 @@ the meaning of DATA:
   - `string' means DATA should be a string describing text that will
     be dragged to another program.
 
+  - `file' means DATA should be a file URL that will be dragged to
+    another program.
+
 ACTION is the action that will be taken by the drop target towards the
 data inside PBOARD.