]> git.eshelyaron.com Git - emacs.git/commitdiff
Make dropping files on Motif programs work
authorPo Lu <luangruo@yahoo.com>
Fri, 1 Apr 2022 01:50:58 +0000 (09:50 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 1 Apr 2022 01:50:58 +0000 (09:50 +0800)
* 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.

lisp/dired.el
lisp/select.el

index 0b5f2cab417394443ced95c5805fd4f3429abdc2..0524ac16c247baef8b893d386e2f3bdb31a51c2f 100644 (file)
@@ -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)
index ee65678c69d0e7c32a28e4747986a9d6f4e9d346..c352a48261626d8fc9cfc30c48d73e1bba343dfe 100644 (file)
@@ -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)