bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: X11 umlaut pasting


From: Kenichi Handa
Subject: Re: X11 umlaut pasting
Date: Tue, 27 Aug 2002 10:34:22 +0900 (JST)
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)

In article <20020826204159.46a58c57.occitan@esperanto.org>, Daniel Pfeiffer 
<occitan@esperanto.org> writes:
>>  > I opened a file containing only ascii (modeline --:--) and
>>  > started writing a text in german with umlauts (ä, ö, ü, ß)
>>  > and pasted the text with the mouse to sylpheed (a Gtk+ 11
>>  > app).  All umlauts disappeared.  To my amazement the
>>  > portuguese word abraço 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
===================================================================
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.
  
  (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)))
  
  (defun xselect-convert-to-length (selection type value)
    (let ((value
--- 133,216 ----
  ;;; for TIMESTAMP, which is a special case.
  
  (defun xselect-convert-to-string (selection type value)
!   (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,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
===================================================================
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, int));
  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;
  
  Lisp_Object QCOMPOUND_TEXT;   /* This is a type of selection.  */
+ Lisp_Object QUTF8_STRING;     /* This is a type of selection.  */
  
  Lisp_Object Qcompound_text_with_extensions;
  
***************
*** 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 == dpyinfo->Xatom_COMPOUND_TEXT)
      return QCOMPOUND_TEXT;
+   if (atom == dpyinfo->Xatom_UTF8_STRING)
+     return QUTF8_STRING;
    if (atom == dpyinfo->Xatom_DELETE)
      return QDELETE;
    if (atom == 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.
  
     This calls random Lisp code, and may signal or gc.  */
  
  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).
  
     This calls random Lisp code, and may signal or gc.  */
  
  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 = XVECTOR (pairs)->contents [i];
          XVECTOR (pair)->contents [1]
            = x_get_local_selection (XVECTOR (pair)->contents [0],
!                                    XVECTOR (pair)->contents [1]);
        }
        return pairs;
      }
--- 409,416 ----
          pair = XVECTOR (pairs)->contents [i];
          XVECTOR (pair)->contents [1]
            = x_get_local_selection (XVECTOR (pair)->contents [0],
!                                    XVECTOR (pair)->contents [1],
!                                    local_request);
        }
        return pairs;
      }
***************
*** 421,427 ****
        handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
        if (!NILP (handler_fn))
        value = call3 (handler_fn,
!                      selection_symbol, target_type,
                       XCAR (XCDR (local_value)));
        else
        value = Qnil;
--- 427,433 ----
        handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
        if (!NILP (handler_fn))
        value = call3 (handler_fn,
!                      selection_symbol, (local_request ? Qnil : target_type),
                       XCAR (XCDR (local_value)));
        else
        value = Qnil;
***************
*** 801,807 ****
    /* Convert lisp objects back into binary data */
  
    converted_selection
!     = x_get_local_selection (selection_symbol, target_symbol);
  
    if (! NILP (converted_selection))
      {
--- 807,813 ----
    /* Convert lisp objects back into binary data */
  
    converted_selection
!     = x_get_local_selection (selection_symbol, target_symbol, 0);
  
    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;
! 
!       if (NILP (Vnext_selection_coding_system))
!       Vnext_selection_coding_system = Vselection_coding_system;
! 
!       *format_ret = 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;
! 
!         unibyte_string = string_make_unibyte (obj);
!         *data_ret = SDATA (unibyte_string);
!         *nofree_ret = 1;
!         *size_ret = SBYTES (unibyte_string);
!       }
!       else
!       {
!         *data_ret = x_encode_text (obj, Vnext_selection_coding_system, 1,
!                                    (int *) size_ret, &stringp);
!         *nofree_ret = (*data_ret == SDATA (obj));
!       }
        if (NILP (type))
!       type = (stringp ? QSTRING : QCOMPOUND_TEXT);
!       Vlast_coding_system_used = (*nofree_ret
!                                 ? Qraw_text
!                                 : Vnext_selection_coding_system);
!       Vnext_selection_coding_system = Qnil;
      }
    else if (SYMBOLP (obj))
      {
--- 1764,1776 ----
      }
    else if (STRINGP (obj))
      {
!       xassert (! STRING_MULTIBYTE (obj));
        if (NILP (type))
!       type = QSTRING;
!       *format_ret = 8;
!       *size_ret = SBYTES (obj);
!       *data_ret = SDATA (obj);
!       *nofree_ret = 1;
      }
    else if (SYMBOLP (obj))
      {
***************
*** 2025,2031 ****
  #endif
      CHECK_SYMBOL (target_type);
  
!   val = x_get_local_selection (selection_symbol, target_type);
  
    if (NILP (val))
      {
--- 2002,2008 ----
  #endif
      CHECK_SYMBOL (target_type);
  
!   val = x_get_local_selection (selection_symbol, target_type, 1);
  
    if (NILP (val))
      {
***************
*** 2446,2451 ****
--- 2423,2429 ----
    QTIMESTAMP = intern ("TIMESTAMP");  staticpro (&QTIMESTAMP);
    QTEXT      = intern ("TEXT");       staticpro (&QTEXT);
    QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
+   QUTF8_STRING = intern ("UTF8_STRING"); staticpro (&QUTF8_STRING);
    QTIMESTAMP = intern ("TIMESTAMP");  staticpro (&QTIMESTAMP);
    QDELETE    = intern ("DELETE");     staticpro (&QDELETE);
    QMULTIPLE  = intern ("MULTIPLE");   staticpro (&QMULTIPLE);

Index: xterm.c
===================================================================
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 ----
      = XInternAtom (dpyinfo->display, "TEXT", False);
    dpyinfo->Xatom_COMPOUND_TEXT
      = XInternAtom (dpyinfo->display, "COMPOUND_TEXT", False);
+   dpyinfo->Xatom_UTF8_STRING
+     = XInternAtom (dpyinfo->display, "UTF8_STRING", False);
    dpyinfo->Xatom_DELETE
      = XInternAtom (dpyinfo->display, "DELETE", False);
    dpyinfo->Xatom_MULTIPLE

Index: xterm.h
===================================================================
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 ****
  
    /* 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;
  
--- 289,295 ----
  
    /* 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;
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]