summaryrefslogtreecommitdiff
path: root/lisp/select.el
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2002-08-14 00:57:55 +0000
committerKenichi Handa <handa@m17n.org>2002-08-14 00:57:55 +0000
commiteb1416b9bcf82289fd2ad9389bafe135da9483db (patch)
treeb218e0ab290d5498e242a99d1b8c53c2d99a062e /lisp/select.el
parent79fab26b4fcbb64d4f6e79cb4abb852b65b94ea2 (diff)
downloademacs-eb1416b9bcf82289fd2ad9389bafe135da9483db.tar.gz
(xselect-convert-to-string): If TYPE is non-nil,
encode the selection data string. Always return cons of type and string. (selection-converter-alist): Add (UTF8_STRING . xselect-convert-to-string).
Diffstat (limited to 'lisp/select.el')
-rw-r--r--lisp/select.el102
1 files changed, 79 insertions, 23 deletions
diff --git a/lisp/select.el b/lisp/select.el
index 801db31cb61..6f9fa1fd042 100644
--- a/lisp/select.el
+++ b/lisp/select.el
@@ -133,29 +133,84 @@ Cut buffers are considered obsolete; you should use selections instead."
;;; for TIMESTAMP, which is a special case.
(defun xselect-convert-to-string (selection type value)
- (cond ((stringp value)
- ;; Return the type as well, so that xselect.c could honor
- ;; requests whose type is STRING.
- (cons type value))
- ((overlayp value)
- (save-excursion
- (or (buffer-name (overlay-buffer value))
- (error "selection is in a killed buffer"))
- (set-buffer (overlay-buffer value))
- (buffer-substring (overlay-start value)
- (overlay-end value))))
- ((and (consp value)
- (markerp (car value))
- (markerp (cdr value)))
- (or (eq (marker-buffer (car value)) (marker-buffer (cdr value)))
- (signal 'error
- (list "markers must be in the same buffer"
- (car value) (cdr value))))
- (save-excursion
- (set-buffer (or (marker-buffer (car value))
- (error "selection is in a killed buffer")))
- (buffer-substring (car value) (cdr value))))
- (t nil)))
+ (let (str coding)
+ ;; Get the actual string from VALUE.
+ (cond ((stringp value)
+ (setq str value))
+
+ ((overlayp value)
+ (save-excursion
+ (or (buffer-name (overlay-buffer value))
+ (error "selection is in a killed buffer"))
+ (set-buffer (overlay-buffer value))
+ (setq str (buffer-substring (overlay-start value)
+ (overlay-end value)))))
+ ((and (consp value)
+ (markerp (car value))
+ (markerp (cdr value)))
+ (or (eq (marker-buffer (car value)) (marker-buffer (cdr value)))
+ (signal 'error
+ (list "markers must be in the same buffer"
+ (car value) (cdr value))))
+ (save-excursion
+ (set-buffer (or (marker-buffer (car value))
+ (error "selection is in a killed buffer")))
+ (setq str (buffer-substring (car value) (cdr 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
+ (setq coding (coding-system-base coding))
+ (setq coding 'raw-text))
+ ;; Suppress producing escape sequences for compositions.
+ (remove-text-properties 0 (length str) '(composition nil) str)
+ (cond
+ ((eq type 'TEXT)
+ (if (not (multibyte-string-p str))
+ ;; Don't have to encode unibyte string.
+ (setq type 'STRING)
+ ;; If STR contains only ASCII, Latin-1, and raw bytes,
+ ;; encode STR by iso-latin-1, and return it as type
+ ;; `STRING'. Otherwise, encode STR by CODING. In that
+ ;; case, the returing type depends on CODING.
+ (let ((charsets (find-charset-string str)))
+ (setq charsets
+ (delq 'ascii
+ (delq 'latin-iso8859-1
+ (delq 'eight-bit-control
+ (delq 'eight-bit-graphic charsets)))))
+ (if charsets
+ (setq str (encode-coding-string str coding)
+ type (if (memq coding '(compound-text
+ compound-text-with-extensions))
+ 'COMPOUND_TEXT
+ 'STRING))
+ (setq type 'STRING
+ str (encode-coding-string str 'iso-latin-1))))))
+
+ ((eq type 'COMPOUND_TEXT)
+ (setq str (encode-coding-string str coding)))
+
+ ((eq type 'STRING)
+ (if (memq coding '(compound-text
+ compound-text-with-extensions))
+ (setq str (string-make-unibyte str))
+ (setq str (encode-coding-string str coding))))
+
+ ((eq type 'UTF8_STRING)
+ (setq str (encode-coding-string str 'utf-8)))
+
+ (t
+ (error "Unknow selection type: %S" type))
+ ))
+
+ (setq next-selection-coding-system nil)
+ (cons type str))))
+
(defun xselect-convert-to-length (selection type value)
(let ((value
@@ -304,6 +359,7 @@ This function returns the string \"emacs\"."
'((TEXT . xselect-convert-to-string)
(COMPOUND_TEXT . xselect-convert-to-string)
(STRING . xselect-convert-to-string)
+ (UTF8_STRING . xselect-convert-to-string)
(TARGETS . xselect-convert-to-targets)
(LENGTH . xselect-convert-to-length)
(DELETE . xselect-convert-to-delete)