From: Po Lu Date: Fri, 1 Apr 2022 01:50:58 +0000 (+0800) Subject: Make dropping files on Motif programs work X-Git-Tag: emacs-29.0.90~1931^2~845 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=540e7298a96e4e1668bd7f7b5540653391b3f534;p=emacs.git Make dropping files on Motif programs work * lisp/dired.el (dired-mouse-drag): Announce "FILE" and "FILE_NAME" as targets as well. * lisp/select.el (xselect-convert-to-filename): Handle XdndSelection specially. (xselect-convert-to-xm-file): New function. (selection-converter-alist): Add new converters. --- diff --git a/lisp/dired.el b/lisp/dired.el index 0b5f2cab417..0524ac16c24 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -1749,8 +1749,8 @@ when Emacs exits or the user drags another file.") (add-hook 'kill-emacs-hook #'dired-remove-last-dragged-local-file)) (gui-backend-set-selection 'XdndSelection filename) - (x-begin-drag '("text/uri-list" - "text/x-dnd-username") + (x-begin-drag '("text/uri-list" "text/x-dnd-username" + "FILE_NAME" "FILE") (if (eq 'dired-mouse-drag-files 'link) 'XdndActionLink 'XdndActionCopy) diff --git a/lisp/select.el b/lisp/select.el index ee65678c69d..c352a482616 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -567,9 +567,13 @@ two markers or an overlay. Otherwise, it is nil." ;; done the conversion (and any side-effects) but have no value to return. 'NULL) -(defun xselect-convert-to-filename (_selection _type value) - (when (setq value (xselect--selection-bounds value)) - (xselect--encode-string 'TEXT (buffer-file-name (nth 2 value))))) +(defun xselect-convert-to-filename (selection _type value) + (if (not (eq selection 'XdndSelection)) + (when (setq value (xselect--selection-bounds value)) + (xselect--encode-string 'TEXT (buffer-file-name (nth 2 value)))) + (when (and (stringp value) + (file-exists-p value)) + (xselect--encode-string 'C_STRING value)))) (defun xselect-convert-to-charpos (_selection _type value) (when (setq value (xselect--selection-bounds value)) @@ -648,6 +652,13 @@ This function returns the string \"emacs\"." (concat "file://" (expand-file-name value))) "\n"))) +(defun xselect-convert-to-xm-file (selection _type value) + (when (and (stringp value) + (file-exists-p value) + (eq selection 'XdndSelection)) + (xselect--encode-string 'C_STRING + (concat value [0])))) + (defun xselect-uri-list-available-p (selection _type value) "Return whether or not `text/uri-list' is a valid target for SELECTION. VALUE is the local selection value of SELECTION." @@ -667,6 +678,7 @@ VALUE is the local selection value of SELECTION." (text/plain\;charset=utf-8 . xselect-convert-to-string) (text/uri-list . (xselect-uri-list-available-p . xselect-convert-to-text-uri-list)) (text/x-xdnd-username . xselect-convert-to-username) + (FILE . (xselect-uri-list-available-p . xselect-convert-to-xm-file)) (TARGETS . xselect-convert-to-targets) (LENGTH . xselect-convert-to-length) (DELETE . xselect-convert-to-delete)