mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-27 10:54:40 +00:00
Ensure that X selection convertors properly encode returned strings.
Though not itself a regression, this bug was exposed by the support for MULTIPLE selections, which is new to Emacs 24 (see Bug#11315). * lisp/select.el (xselect--encode-string): New function, split from xselect-convert-to-string. (xselect-convert-to-string): Use it. (xselect-convert-to-filename, xselect-convert-to-os) (xselect-convert-to-host, xselect-convert-to-user): Ensure that returned strings are properly encoded.
This commit is contained in:
parent
9be2fd9b4f
commit
acb71f1dad
@ -1,3 +1,12 @@
|
|||||||
|
2012-04-24 Chong Yidong <cyd@gnu.org>
|
||||||
|
|
||||||
|
* select.el (xselect--encode-string): New function, split from
|
||||||
|
xselect-convert-to-string.
|
||||||
|
(xselect-convert-to-string): Use it.
|
||||||
|
(xselect-convert-to-filename, xselect-convert-to-os)
|
||||||
|
(xselect-convert-to-host, xselect-convert-to-user): Ensure that
|
||||||
|
returned strings are properly encoded (Bug#11315).
|
||||||
|
|
||||||
2012-04-22 Chong Yidong <cyd@gnu.org>
|
2012-04-22 Chong Yidong <cyd@gnu.org>
|
||||||
|
|
||||||
* simple.el (delete-active-region): Move to killing custom group.
|
* simple.el (delete-active-region): Move to killing custom group.
|
||||||
|
@ -213,30 +213,25 @@ two markers or an overlay. Otherwise, it is nil."
|
|||||||
(defun xselect--int-to-cons (n)
|
(defun xselect--int-to-cons (n)
|
||||||
(cons (ash n -16) (logand n 65535)))
|
(cons (ash n -16) (logand n 65535)))
|
||||||
|
|
||||||
(defun xselect-convert-to-string (_selection type value)
|
(defun xselect--encode-string (type str &optional can-modify)
|
||||||
(let (str coding)
|
(when str
|
||||||
;; Get the actual string from VALUE.
|
;; If TYPE is nil, this is a local request; return STR as-is.
|
||||||
(cond ((stringp value)
|
(if (null type)
|
||||||
(setq str value))
|
str
|
||||||
((setq value (xselect--selection-bounds value))
|
;; Otherwise, encode STR.
|
||||||
(with-current-buffer (nth 2 value)
|
(let ((coding (or next-selection-coding-system
|
||||||
(setq str (buffer-substring (nth 0 value)
|
selection-coding-system)))
|
||||||
(nth 1 value))))))
|
|
||||||
(when str
|
|
||||||
;; If TYPE is nil, this is a local request, thus return STR as
|
|
||||||
;; is. Otherwise, encode STR.
|
|
||||||
(if (not type)
|
|
||||||
str
|
|
||||||
(setq coding (or next-selection-coding-system selection-coding-system))
|
|
||||||
(if coding
|
(if coding
|
||||||
(setq coding (coding-system-base coding)))
|
(setq coding (coding-system-base coding)))
|
||||||
(let ((inhibit-read-only t))
|
(let ((inhibit-read-only t))
|
||||||
;; Suppress producing escape sequences for compositions.
|
;; Suppress producing escape sequences for compositions.
|
||||||
|
;; But avoid modifying the string if it's a buffer name etc.
|
||||||
|
(unless can-modify (setq str (substring str 0)))
|
||||||
(remove-text-properties 0 (length str) '(composition nil) str)
|
(remove-text-properties 0 (length str) '(composition nil) str)
|
||||||
|
;; TEXT is a polymorphic target. Select the actual type
|
||||||
|
;; from `UTF8_STRING', `COMPOUND_TEXT', `STRING', and
|
||||||
|
;; `C_STRING'.
|
||||||
(if (eq type 'TEXT)
|
(if (eq type 'TEXT)
|
||||||
;; TEXT is a polymorphic target. We must select the
|
|
||||||
;; actual type from `UTF8_STRING', `COMPOUND_TEXT',
|
|
||||||
;; `STRING', and `C_STRING'.
|
|
||||||
(if (not (multibyte-string-p str))
|
(if (not (multibyte-string-p str))
|
||||||
(setq type 'C_STRING)
|
(setq type 'C_STRING)
|
||||||
(let (non-latin-1 non-unicode eight-bit)
|
(let (non-latin-1 non-unicode eight-bit)
|
||||||
@ -279,6 +274,14 @@ two markers or an overlay. Otherwise, it is nil."
|
|||||||
(setq next-selection-coding-system nil)
|
(setq next-selection-coding-system nil)
|
||||||
(cons type str))))
|
(cons type str))))
|
||||||
|
|
||||||
|
(defun xselect-convert-to-string (_selection type value)
|
||||||
|
(let ((str (cond ((stringp value) value)
|
||||||
|
((setq value (xselect--selection-bounds value))
|
||||||
|
(with-current-buffer (nth 2 value)
|
||||||
|
(buffer-substring (nth 0 value)
|
||||||
|
(nth 1 value)))))))
|
||||||
|
(xselect--encode-string type str t)))
|
||||||
|
|
||||||
(defun xselect-convert-to-length (_selection _type value)
|
(defun xselect-convert-to-length (_selection _type value)
|
||||||
(let ((len (cond ((stringp value)
|
(let ((len (cond ((stringp value)
|
||||||
(length value))
|
(length value))
|
||||||
@ -311,7 +314,7 @@ two markers or an overlay. Otherwise, it is nil."
|
|||||||
|
|
||||||
(defun xselect-convert-to-filename (_selection _type value)
|
(defun xselect-convert-to-filename (_selection _type value)
|
||||||
(when (setq value (xselect--selection-bounds value))
|
(when (setq value (xselect--selection-bounds value))
|
||||||
(buffer-file-name (nth 2 value))))
|
(xselect--encode-string 'TEXT (buffer-file-name (nth 2 value)))))
|
||||||
|
|
||||||
(defun xselect-convert-to-charpos (_selection _type value)
|
(defun xselect-convert-to-charpos (_selection _type value)
|
||||||
(when (setq value (xselect--selection-bounds value))
|
(when (setq value (xselect--selection-bounds value))
|
||||||
@ -337,13 +340,13 @@ two markers or an overlay. Otherwise, it is nil."
|
|||||||
(xselect--int-to-cons (max beg end))))))))
|
(xselect--int-to-cons (max beg end))))))))
|
||||||
|
|
||||||
(defun xselect-convert-to-os (_selection _type _size)
|
(defun xselect-convert-to-os (_selection _type _size)
|
||||||
(symbol-name system-type))
|
(xselect--encode-string 'TEXT (symbol-name system-type)))
|
||||||
|
|
||||||
(defun xselect-convert-to-host (_selection _type _size)
|
(defun xselect-convert-to-host (_selection _type _size)
|
||||||
(system-name))
|
(xselect--encode-string 'TEXT (system-name)))
|
||||||
|
|
||||||
(defun xselect-convert-to-user (_selection _type _size)
|
(defun xselect-convert-to-user (_selection _type _size)
|
||||||
(user-full-name))
|
(xselect--encode-string 'TEXT (user-full-name)))
|
||||||
|
|
||||||
(defun xselect-convert-to-class (_selection _type _size)
|
(defun xselect-convert-to-class (_selection _type _size)
|
||||||
"Convert selection to class.
|
"Convert selection to class.
|
||||||
|
Loading…
Reference in New Issue
Block a user