Add file dragging support to NS port

* 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'.
This commit is contained in:
Po Lu 2022-05-28 09:18:09 +08:00
parent 3c5fbfe4ac
commit ffab237cbf
3 changed files with 32 additions and 2 deletions

View 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)."

View 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)

View file

@ -561,17 +561,34 @@ Updated by Christian Limpach (chris@nice.ch)
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 @@ Updated by Christian Limpach (chris@nice.ch)
{
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 @@ Updated by Christian Limpach (chris@nice.ch)
- `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.