changeset 74094:1fee8f7da8cf

(x-last-cut-buffer-coding): New variable. (x-select-text): Set it. (x-cut-buffer-or-selection-value): Check also x-last-cut-buffer-coding when checking for newness.
author Jan Djärv <jan.h.d@swipnet.se>
date Mon, 20 Nov 2006 07:43:11 +0000
parents bc5d69739d5e
children 513c046e2d72
files lisp/term/x-win.el
diffstat 1 files changed, 21 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/term/x-win.el	Mon Nov 20 06:50:29 2006 +0000
+++ b/lisp/term/x-win.el	Mon Nov 20 07:43:11 2006 +0000
@@ -2138,6 +2138,8 @@
 (defvar x-last-selected-text-cut-encoded nil
   "The value of the X cut buffer last time we selected or pasted text.
 This is the actual text stored in the X cut buffer.")
+(defvar x-last-cut-buffer-coding 'iso-latin-1
+  "The coding we last used to encode/decode the text from the X cut buffer")
 
 (defvar x-cut-buffer-max 20000 ; Note this value is overridden below.
   "Max number of characters to put in the cut buffer.
@@ -2163,6 +2165,7 @@
 	       x-last-selected-text-cut-encoded ""))
 	(t
 	 (setq x-last-selected-text-cut text
+	       x-last-cut-buffer-coding 'iso-latin-1
 	       x-last-selected-text-cut-encoded
 	       ;; ICCCM says cut buffer always contain ISO-Latin-1
 	       (encode-coding-string text 'iso-latin-1))
@@ -2331,20 +2334,28 @@
     ;; from what we remebered them to be last time we did a
     ;; cut/paste operation.
     (setq cut-text
-	  (cond;; check cut buffer
-	   ((or (not cut-text) (string= cut-text ""))
-	    (setq x-last-selected-text-cut nil))
-	   (t
-	    ;; We can not compare  x-last-selected-text-cut-encoded with
-	    ;; cut-text because the next-selection-coding-system may have changed
-	    ;; so we need to re-decode anyway.
-	    (setq x-last-selected-text-cut-encoded cut-text
+	  (let ((next-coding (or next-selection-coding-system 'iso-latin-1)))
+	    (cond;; check cut buffer
+	     ((or (not cut-text) (string= cut-text ""))
+	      (setq x-last-selected-text-cut nil))
+	     ;; This short cut doesn't work because x-get-cut-buffer 	 
+	     ;; always returns a newly created string. 	 
+	     ;; ((eq      cut-text x-last-selected-text-cut) nil) 	 
+	     ((and (string= cut-text x-last-selected-text-cut-encoded)
+		   (eq x-last-cut-buffer-coding next-coding))
+	      ;; See the comment above.  No need of this recording. 	 
+	      ;; Record the newer string, 	 
+	      ;; so subsequent calls can use the `eq' test. 	 
+	      ;; (setq x-last-selected-text-cut cut-text) 	 
+	      nil)
+	     (t
+	      (setq x-last-selected-text-cut-encoded cut-text
+		  x-last-cut-buffer-coding next-coding
 		  x-last-selected-text-cut
 		  ;; ICCCM says cut buffer always contain ISO-Latin-1, but
 		  ;; use next-selection-coding-system if not nil.
 		  (decode-coding-string 
-		   cut-text 
-		   (or next-selection-coding-system 'iso-latin-1))))))
+		   cut-text next-coding))))))
 
     ;; As we have done one selection, clear this now.
     (setq next-selection-coding-system nil)