Mercurial > emacs
changeset 46879:f7c325954eca
(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).
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 14 Aug 2002 00:57:55 +0000 |
parents | 901426f0ae5f |
children | 12873c268a23 |
files | lisp/select.el |
diffstat | 1 files changed, 79 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/select.el Tue Aug 13 22:55:18 2002 +0000 +++ b/lisp/select.el Wed Aug 14 00:57:55 2002 +0000 @@ -133,29 +133,84 @@ ;;; 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 @@ '((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)