From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Kenichi Handa Newsgroups: gmane.emacs.bugs Subject: Re: X11 umlaut pasting Date: Tue, 27 Aug 2002 10:34:22 +0900 (JST) Sender: bug-gnu-emacs-admin@gnu.org Message-ID: <200208270134.KAA28575@etlken.m17n.org> References: <20020825163439.7575ec4d.occitan@esperanto.org> <200208260705.QAA27367@etlken.m17n.org> <20020826204159.46a58c57.occitan@esperanto.org> NNTP-Posting-Host: localhost.gmane.org Mime-Version: 1.0 (generated by SEMI 1.14.3 - "Ushinoya") Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Trace: main.gmane.org 1030412034 30829 127.0.0.1 (27 Aug 2002 01:33:54 GMT) X-Complaints-To: usenet@main.gmane.org NNTP-Posting-Date: Tue, 27 Aug 2002 01:33:54 +0000 (UTC) Cc: eliz@is.elta.co.il, bug-gnu-emacs@gnu.org Return-path: Original-Received: from monty-python.gnu.org ([199.232.76.173]) by main.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 17jVEs-00080Q-00 for ; Tue, 27 Aug 2002 03:33:51 +0200 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.10) id 17jVGC-0000S5-00; Mon, 26 Aug 2002 21:35:12 -0400 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.10) id 17jVFX-0000RC-00 for bug-gnu-emacs@gnu.org; Mon, 26 Aug 2002 21:34:31 -0400 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10) id 17jVFU-0000R0-00 for bug-gnu-emacs@gnu.org; Mon, 26 Aug 2002 21:34:30 -0400 Original-Received: from tsukuba.m17n.org ([192.47.44.130]) by monty-python.gnu.org with esmtp (Exim 4.10) id 17jVFT-0000Qw-00 for bug-gnu-emacs@gnu.org; Mon, 26 Aug 2002 21:34:27 -0400 Original-Received: from fs.m17n.org (fs.m17n.org [192.47.44.2]) by tsukuba.m17n.org (8.11.6/3.7W-20010518204228) with ESMTP id g7R1YMl25333; Tue, 27 Aug 2002 10:34:22 +0900 (JST) (envelope-from handa@m17n.org) Original-Received: from etlken.m17n.org (etlken.m17n.org [192.47.44.125]) by fs.m17n.org (8.11.3/3.7W-20010823150639) with ESMTP id g7R1YM920432; Tue, 27 Aug 2002 10:34:22 +0900 (JST) Original-Received: (from handa@localhost) by etlken.m17n.org (8.8.8+Sun/3.7W-2001040620) id KAA28575; Tue, 27 Aug 2002 10:34:22 +0900 (JST) Original-To: occitan@esperanto.org In-Reply-To: <20020826204159.46a58c57.occitan@esperanto.org> (message from Daniel Pfeiffer on Mon, 26 Aug 2002 20:41:59 +0200) User-Agent: SEMI/1.14.3 (Ushinoya) FLIM/1.14.2 (Yagi-Nishiguchi) APEL/10.2 Emacs/21.1.30 (sparc-sun-solaris2.6) MULE/5.0 (SAKAKI) Errors-To: bug-gnu-emacs-admin@gnu.org X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: Bug reports for GNU Emacs, the Swiss army knife of text editors List-Unsubscribe: , List-Archive: Xref: main.gmane.org gmane.emacs.bugs:3313 X-Report-Spam: http://spam.gmane.org/gmane.emacs.bugs:3313 In article <20020826204159.46a58c57.occitan@esperanto.org>, Daniel Pfeiffer= writes: >> > I opened a file containing only ascii (modeline --:--) and >> > started writing a text in german with umlauts (=E4, =F6, =FC, =DF) >> > and pasted the text with the mouse to sylpheed (a Gtk+ 11 >> > app). All umlauts disappeared. To my amazement the >> > portuguese word abra=E7o got pasted without a hitch! >> We recently fixed some cut&paste problem on XFree86 4.?. >> Could you please try the latest CVS code? > Sorry, I appreciate the great work on XFree, but this one > is too big for me. Glad you fix things, though! As I'm not native English, I may be misunderstanding, but... We don't fix any code of XFree86. We just fix Emacs to work better on XFree86. So, what you need is it to use the latest Emacs, not the latest XFree86. If you really mean that downloading Emacs is too big, the attached are the patches to lisp/select.el, src/xselect.c, src/xterm.c, src/xterm.h. --- Ken'ichi HANDA handa@etl.go.jp Index: select.el =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/emacs/lisp/select.el,v retrieving revision 1.17 retrieving revision 1.18 diff -u -c -r1.17 -r1.18 cvs server: conflicting specifications of output style *** select.el 5 Jun 2002 17:14:16 -0000 1.17 --- select.el 14 Aug 2002 00:57:55 -0000 1.18 *************** *** 133,161 **** ;;; for TIMESTAMP, which is a special case. =20 (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))) =20 (defun xselect-convert-to-length (selection type value) (let ((value --- 133,216 ---- ;;; for TIMESTAMP, which is a special case. =20 (defun xselect-convert-to-string (selection type value) ! (let (str coding) ! ;; Get the actual string from VALUE. ! (cond ((stringp value) ! (setq str value)) !=20 ! ((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)))))) !=20 ! (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)))))) ! =20 ! ((eq type 'COMPOUND_TEXT) ! (setq str (encode-coding-string str coding))) !=20 ! ((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)))) !=20 ! ((eq type 'UTF8_STRING) ! (setq str (encode-coding-string str 'utf-8))) !=20 ! (t ! (error "Unknow selection type: %S" type)) ! )) !=20 ! (setq next-selection-coding-system nil) ! (cons type str)))) !=20 =20 (defun xselect-convert-to-length (selection type value) (let ((value *************** *** 304,309 **** --- 359,365 ---- '((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) Index: xselect.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/emacs/src/xselect.c,v retrieving revision 1.123 retrieving revision 1.124 diff -u -c -r1.123 -r1.124 cvs server: conflicting specifications of output style *** xselect.c 15 Jul 2002 00:00:41 -0000 1.123 --- xselect.c 14 Aug 2002 00:58:39 -0000 1.124 *************** *** 40,46 **** static Atom symbol_to_x_atom P_ ((struct x_display_info *, Display *, Lisp_Object)); static void x_own_selection P_ ((Lisp_Object, Lisp_Object)); ! static Lisp_Object x_get_local_selection P_ ((Lisp_Object, Lisp_Object)); static void x_decline_selection_request P_ ((struct input_event *)); static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object)); static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object)); --- 40,46 ---- static Atom symbol_to_x_atom P_ ((struct x_display_info *, Display *, Lisp_Object)); static void x_own_selection P_ ((Lisp_Object, Lisp_Object)); ! static Lisp_Object x_get_local_selection P_ ((Lisp_Object, Lisp_Object, i= nt)); static void x_decline_selection_request P_ ((struct input_event *)); static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object)); static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object)); *************** *** 96,101 **** --- 96,102 ---- QATOM_PAIR; =20 Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */ + Lisp_Object QUTF8_STRING; /* This is a type of selection. */ =20 Lisp_Object Qcompound_text_with_extensions; =20 *************** *** 182,187 **** --- 183,189 ---- if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP; if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT; if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT; + if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING; if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE; if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE; if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR; *************** *** 264,269 **** --- 266,273 ---- return QTEXT; if (atom =3D=3D dpyinfo->Xatom_COMPOUND_TEXT) return QCOMPOUND_TEXT; + if (atom =3D=3D dpyinfo->Xatom_UTF8_STRING) + return QUTF8_STRING; if (atom =3D=3D dpyinfo->Xatom_DELETE) return QDELETE; if (atom =3D=3D dpyinfo->Xatom_MULTIPLE) *************** *** 350,363 **** /* Given a selection-name and desired type, look up our local copy of the selection value and convert it to the type. The value is nil or a string. ! This function is used both for remote requests ! and for local x-get-selection-internal. =20 This calls random Lisp code, and may signal or gc. */ =20 static Lisp_Object ! x_get_local_selection (selection_symbol, target_type) Lisp_Object selection_symbol, target_type; { Lisp_Object local_value; Lisp_Object handler_fn, value, type, check; --- 354,368 ---- /* Given a selection-name and desired type, look up our local copy of the selection value and convert it to the type. The value is nil or a string. ! This function is used both for remote requests (LOCAL_REQUEST is zero) ! and for local x-get-selection-internal (LOCAL_REQUEST is nonzero). =20 This calls random Lisp code, and may signal or gc. */ =20 static Lisp_Object ! x_get_local_selection (selection_symbol, target_type, local_request) Lisp_Object selection_symbol, target_type; + int local_request; { Lisp_Object local_value; Lisp_Object handler_fn, value, type, check; *************** *** 404,410 **** pair =3D XVECTOR (pairs)->contents [i]; XVECTOR (pair)->contents [1] =3D x_get_local_selection (XVECTOR (pair)->contents [0], ! XVECTOR (pair)->contents [1]); } return pairs; } --- 409,416 ---- pair =3D XVECTOR (pairs)->contents [i]; XVECTOR (pair)->contents [1] =3D x_get_local_selection (XVECTOR (pair)->contents [0], ! XVECTOR (pair)->contents [1], ! local_request); } return pairs; } *************** *** 421,427 **** handler_fn =3D Fcdr (Fassq (target_type, Vselection_converter_alist= )); if (!NILP (handler_fn)) value =3D call3 (handler_fn, ! selection_symbol, target_type, XCAR (XCDR (local_value))); else value =3D Qnil; --- 427,433 ---- handler_fn =3D Fcdr (Fassq (target_type, Vselection_converter_alist= )); if (!NILP (handler_fn)) value =3D call3 (handler_fn, ! selection_symbol, (local_request ? Qnil : target_type), XCAR (XCDR (local_value))); else value =3D Qnil; *************** *** 801,807 **** /* Convert lisp objects back into binary data */ =20 converted_selection ! =3D x_get_local_selection (selection_symbol, target_symbol); =20 if (! NILP (converted_selection)) { --- 807,813 ---- /* Convert lisp objects back into binary data */ =20 converted_selection ! =3D x_get_local_selection (selection_symbol, target_symbol, 0); =20 if (! NILP (converted_selection)) { *************** *** 1758,1799 **** } else if (STRINGP (obj)) { ! /* Since we are now handling multilingual text, we must consider ! sending back compound text. */ ! int stringp; ! extern Lisp_Object Qcompound_text; !=20 ! if (NILP (Vnext_selection_coding_system)) ! Vnext_selection_coding_system =3D Vselection_coding_system; !=20 ! *format_ret =3D 8; ! /* If the requested type is STRING, we must encode the selected ! text as a string, even if the coding system set by the user ! is ctext or its derivatives. */ ! if (EQ (type, QSTRING) ! && (EQ (Vnext_selection_coding_system, Qcompound_text) ! || EQ (Vnext_selection_coding_system, ! Qcompound_text_with_extensions))) ! { ! Lisp_Object unibyte_string; !=20 ! unibyte_string =3D string_make_unibyte (obj); ! *data_ret =3D SDATA (unibyte_string); ! *nofree_ret =3D 1; ! *size_ret =3D SBYTES (unibyte_string); ! } ! else ! { ! *data_ret =3D x_encode_text (obj, Vnext_selection_coding_system, 1, ! (int *) size_ret, &stringp); ! *nofree_ret =3D (*data_ret =3D=3D SDATA (obj)); ! } if (NILP (type)) ! type =3D (stringp ? QSTRING : QCOMPOUND_TEXT); ! Vlast_coding_system_used =3D (*nofree_ret ! ? Qraw_text ! : Vnext_selection_coding_system); ! Vnext_selection_coding_system =3D Qnil; } else if (SYMBOLP (obj)) { --- 1764,1776 ---- } else if (STRINGP (obj)) { ! xassert (! STRING_MULTIBYTE (obj)); if (NILP (type)) ! type =3D QSTRING; ! *format_ret =3D 8; ! *size_ret =3D SBYTES (obj); ! *data_ret =3D SDATA (obj); ! *nofree_ret =3D 1; } else if (SYMBOLP (obj)) { *************** *** 2025,2031 **** #endif CHECK_SYMBOL (target_type); =20 ! val =3D x_get_local_selection (selection_symbol, target_type); =20 if (NILP (val)) { --- 2002,2008 ---- #endif CHECK_SYMBOL (target_type); =20 ! val =3D x_get_local_selection (selection_symbol, target_type, 1); =20 if (NILP (val)) { *************** *** 2446,2451 **** --- 2423,2429 ---- QTIMESTAMP =3D intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); QTEXT =3D intern ("TEXT"); staticpro (&QTEXT); QCOMPOUND_TEXT =3D intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT= ); + QUTF8_STRING =3D intern ("UTF8_STRING"); staticpro (&QUTF8_STRING); QTIMESTAMP =3D intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); QDELETE =3D intern ("DELETE"); staticpro (&QDELETE); QMULTIPLE =3D intern ("MULTIPLE"); staticpro (&QMULTIPLE); Index: xterm.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/emacs/src/xterm.c,v retrieving revision 1.749 retrieving revision 1.750 diff -u -c -r1.749 -r1.750 cvs server: conflicting specifications of output style *** xterm.c 5 Aug 2002 16:28:41 -0000 1.749 --- xterm.c 14 Aug 2002 00:59:01 -0000 1.750 *************** *** 15017,15022 **** --- 15017,15024 ---- =3D XInternAtom (dpyinfo->display, "TEXT", False); dpyinfo->Xatom_COMPOUND_TEXT =3D XInternAtom (dpyinfo->display, "COMPOUND_TEXT", False); + dpyinfo->Xatom_UTF8_STRING + =3D XInternAtom (dpyinfo->display, "UTF8_STRING", False); dpyinfo->Xatom_DELETE =3D XInternAtom (dpyinfo->display, "DELETE", False); dpyinfo->Xatom_MULTIPLE Index: xterm.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/emacs/src/xterm.h,v retrieving revision 1.133 retrieving revision 1.134 diff -u -c -r1.133 -r1.134 cvs server: conflicting specifications of output style *** xterm.h 27 Jul 2002 18:56:36 -0000 1.133 --- xterm.h 14 Aug 2002 00:59:15 -0000 1.134 *************** *** 289,295 **** =20 /* More atoms, which are selection types. */ Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE, ! Xatom_COMPOUND_TEXT, Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL, Xatom_ATOM_PAIR; =20 --- 289,295 ---- =20 /* More atoms, which are selection types. */ Atom Xatom_CLIPBOARD, Xatom_TIMESTAMP, Xatom_TEXT, Xatom_DELETE, ! Xatom_COMPOUND_TEXT, Xatom_UTF8_STRING, Xatom_MULTIPLE, Xatom_INCR, Xatom_EMACS_TMP, Xatom_TARGETS, Xatom_NULL, Xatom_ATOM_PAIR; =20