]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix encoding of multibyte ToolTalk filenames
authorPo Lu <luangruo@yahoo.com>
Sun, 12 Jun 2022 14:04:47 +0000 (22:04 +0800)
committerPo Lu <luangruo@yahoo.com>
Sun, 12 Jun 2022 14:04:47 +0000 (22:04 +0800)
* lisp/select.el (xselect-convert-to-dt-netfile): Encode file
name before computing its tooltalk name, since the indices work
on bytes.

* test/lisp/dnd-tests.el (dnd-tests-begin-file-drag): Add test.

lisp/select.el
test/lisp/dnd-tests.el

index 417968b25cba3f423cbfcc89a640caa8ca311aed..127a6a5c61fddb3853f8223df30a6b196405418f 100644 (file)
@@ -783,11 +783,14 @@ VALUE should be SELECTION's local value."
              (stringp value)
              (file-exists-p value)
              (not (file-remote-p value)))
-    (cons 'STRING
-          (encode-coding-string (xselect-tt-net-file value)
-                                (or file-name-coding-system
-                                    default-file-name-coding-system)
-                                t))))
+    (let ((name (encode-coding-string value
+                                      (or file-name-coding-system
+                                          default-file-name-coding-system))))
+      (cons 'STRING
+            (encode-coding-string (xselect-tt-net-file name)
+                                  (or file-name-coding-system
+                                      default-file-name-coding-system)
+                                  t)))))
 
 (setq selection-converter-alist
       '((TEXT . xselect-convert-to-string)
index c4b7567f22efe50a29b5b981a035125763d4a0b1..dfd441b56df67ac88785ef71a6c35d8a01bade8a 100644 (file)
@@ -184,10 +184,15 @@ This function only tries to handle strings."
                     (not (eq window-system 'x))))
   (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test")
                                             temporary-file-directory))
+        (normal-multibyte-file (expand-file-name
+                                (make-temp-name "тест-на-перетаскивание")
+                                temporary-file-directory))
         (remote-temp-file (dnd-tests-make-temp-name)))
     ;; Touch those files if they don't exist.
     (unless (file-exists-p normal-temp-file)
       (write-region "" 0 normal-temp-file))
+    (unless (file-exists-p normal-multibyte-file)
+      (write-region "" 0 normal-multibyte-file))
     (unless (file-exists-p remote-temp-file)
       (write-region "" 0 remote-temp-file))
     (unwind-protect
@@ -239,8 +244,20 @@ This function only tries to handle strings."
                     (dnd-begin-file-drag normal-temp-file)
                     (not dnd-last-dragged-remote-file)))
           ;; Test that links to remote files can't be created.
-          (should-error (dnd-begin-file-drag remote-temp-file nil 'link)))
+          (should-error (dnd-begin-file-drag remote-temp-file nil 'link))
+          ;; Test dragging a file with a multibyte filename.
+          (should (eq (dnd-begin-file-drag normal-multibyte-file) 'copy))
+          ;; Test that the ToolTalk filename is encodes and decodes correctly.
+          (let* ((netfile-data (cdr (dnd-tests-verify-selection-data '_DT_NETFILE)))
+                 (parsed (dnd-tests-parse-tt-netfile netfile-data))
+                 (filename (encode-coding-string normal-multibyte-file
+                                                 (or file-name-coding-system
+                                                     default-file-name-coding-system))))
+            (should (equal (nth 0 parsed) (system-name)))
+            (should (equal (nth 1 parsed) filename))
+            (should (equal (nth 2 parsed) filename))))
       (delete-file normal-temp-file)
+      (delete-file normal-multibyte-file)
       (delete-file remote-temp-file))))
 
 (ert-deftest dnd-tests-begin-drag-files ()