From acb71f1dad7b265eef5c5111bf15c3c612d1b19f Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Tue, 24 Apr 2012 13:34:50 +0800 Subject: [PATCH] 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. --- lisp/ChangeLog | 9 +++++++++ lisp/select.el | 47 +++++++++++++++++++++++++---------------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index eb293610a67..834f54bc96e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,12 @@ +2012-04-24 Chong Yidong + + * 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 * simple.el (delete-active-region): Move to killing custom group. diff --git a/lisp/select.el b/lisp/select.el index 0260eba4682..3948fcc5456 100644 --- a/lisp/select.el +++ b/lisp/select.el @@ -213,30 +213,25 @@ two markers or an overlay. Otherwise, it is nil." (defun xselect--int-to-cons (n) (cons (ash n -16) (logand n 65535))) -(defun xselect-convert-to-string (_selection type value) - (let (str coding) - ;; Get the actual string from VALUE. - (cond ((stringp value) - (setq str value)) - ((setq value (xselect--selection-bounds value)) - (with-current-buffer (nth 2 value) - (setq str (buffer-substring (nth 0 value) - (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)) +(defun xselect--encode-string (type str &optional can-modify) + (when str + ;; If TYPE is nil, this is a local request; return STR as-is. + (if (null type) + str + ;; Otherwise, encode STR. + (let ((coding (or next-selection-coding-system + selection-coding-system))) (if coding (setq coding (coding-system-base coding))) (let ((inhibit-read-only t)) ;; 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) + ;; TEXT is a polymorphic target. Select the actual type + ;; from `UTF8_STRING', `COMPOUND_TEXT', `STRING', and + ;; `C_STRING'. (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)) (setq type 'C_STRING) (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) (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) (let ((len (cond ((stringp value) (length value)) @@ -311,7 +314,7 @@ two markers or an overlay. Otherwise, it is nil." (defun xselect-convert-to-filename (_selection _type 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) (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)))))))) (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) - (system-name)) + (xselect--encode-string 'TEXT (system-name))) (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) "Convert selection to class. -- 2.39.2