emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 396355f: Re-fix charset issues when yanking non-plain-text elemen


From: Lars Ingebrigtsen
Subject: master 396355f: Re-fix charset issues when yanking non-plain-text elements
Date: Wed, 10 Nov 2021 23:22:10 -0500 (EST)

branch: master
commit 396355f46b964d6a63ced9fe48fb6c7fb43d8f06
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Re-fix charset issues when yanking non-plain-text elements
    
    * lisp/select.el (gui-get-selection): Make (gui-get-selection
    'CLIPBOARD 'text/html) get decoded correctly (bug#31149), but still
    avoid the logic on Windows.
---
 lisp/select.el | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/lisp/select.el b/lisp/select.el
index 3c9f961..43424d9 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -304,22 +304,32 @@ the formats available in the clipboard if TYPE is 
`CLIPBOARD'."
   (let ((data (gui-backend-get-selection (or type 'PRIMARY)
                                          (or data-type 'STRING))))
     (when (and (stringp data)
-              (setq data-type (get-text-property 0 'foreign-selection data)))
+               ;; If this text property is set, then the data needs to
+               ;; be decoded -- otherwise it has already been decoded
+               ;; by the lower level functions.
+               (get-text-property 0 'foreign-selection data))
       (let ((coding (or next-selection-coding-system
                         selection-coding-system
                         (pcase data-type
                           ('UTF8_STRING 'utf-8)
                           ('COMPOUND_TEXT 'compound-text-with-extensions)
                           ('C_STRING nil)
-                          ('STRING 'iso-8859-1)
-                          (_ (error "Unknown selection data type: %S"
-                                    type))))))
-        (setq data (if coding (decode-coding-string data coding)
-                     ;; This is for C_STRING case.
+                          ('STRING 'iso-8859-1)))))
+        (setq data
+              (cond (coding (decode-coding-string data coding))
                      ;; We want to convert each non-ASCII byte to the
                      ;; corresponding eight-bit character, which has
                      ;; a codepoint >= #x3FFF00.
-                     (string-to-multibyte data))))
+                    ((eq data-type 'C_STRING)
+                     (string-to-multibyte data))
+                    ;; Guess at the charset for types like text/html
+                    ;; -- it can be anything, and different
+                    ;; applications use different encodings.
+                    ((string-match-p "\\`text/" (symbol-name data-type))
+                     (decode-coding-string
+                      data (car (detect-coding-string data))))
+                    ;; Do nothing.
+                    (t data))))
       (setq next-selection-coding-system nil)
       (put-text-property 0 (length data) 'foreign-selection data-type data))
     data))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]