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.
This commit is contained in:
Lars Ingebrigtsen 2021-11-11 05:22:02 +01:00
parent 42037d8948
commit 396355f46b

View file

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