]> git.eshelyaron.com Git - emacs.git/commitdiff
Ensure that X selection convertors properly encode returned strings.
authorChong Yidong <cyd@gnu.org>
Tue, 24 Apr 2012 05:34:50 +0000 (13:34 +0800)
committerChong Yidong <cyd@gnu.org>
Tue, 24 Apr 2012 05:34:50 +0000 (13:34 +0800)
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
lisp/select.el

index eb293610a6750b74d587c84256162158538a2606..834f54bc96e9af838b6e4ffee472dc630d8343ca 100644 (file)
@@ -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>
 
        * simple.el (delete-active-region): Move to killing custom group.
index 0260eba4682a901f96c9a2ffa2b32adc43844d51..3948fcc5456efdcc04ab110d1af4e0a8b88ef2a3 100644 (file)
@@ -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.