diff src/xselect.c @ 46881:970ca194ce9a

(QUTF8_STRING): New variable. (symbol_to_x_atom): Pay attention to QUTF8_STRING. (x_atom_to_symbol): Likewise. (x_get_local_selection): New argument local_request. If it is nonzero, call handler_fn with the second arg nil. (x_handle_selection_request): Call x_get_local_selection with local_request 0. (lisp_data_to_selection_data): Don't encode the string here. (Fx_get_selection_internal): Call x_get_local_selection with local_request 1. (syms_of_xselect): Intern and staticpro QUTF8_STRING.
author Kenichi Handa <handa@m17n.org>
date Wed, 14 Aug 2002 00:58:39 +0000
parents 40db0673e6f0
children 9d5666b8bf1a
line wrap: on
line diff
--- a/src/xselect.c	Wed Aug 14 00:58:23 2002 +0000
+++ b/src/xselect.c	Wed Aug 14 00:58:39 2002 +0000
@@ -40,7 +40,7 @@
 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 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,6 +96,7 @@
   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,6 +183,7 @@
   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,6 +266,8 @@
     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,14 +354,15 @@
 /* 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 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)
+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,7 +409,8 @@
 	  pair = XVECTOR (pairs)->contents [i];
 	  XVECTOR (pair)->contents [1]
 	    = x_get_local_selection (XVECTOR (pair)->contents [0],
-				     XVECTOR (pair)->contents [1]);
+				     XVECTOR (pair)->contents [1],
+				     local_request);
 	}
       return pairs;
     }
@@ -421,7 +427,7 @@
       handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
       if (!NILP (handler_fn))
 	value = call3 (handler_fn,
-		       selection_symbol, target_type,
+		       selection_symbol, (local_request ? Qnil : target_type),
 		       XCAR (XCDR (local_value)));
       else
 	value = Qnil;
@@ -801,7 +807,7 @@
   /* Convert lisp objects back into binary data */
 
   converted_selection
-    = x_get_local_selection (selection_symbol, target_symbol);
+    = x_get_local_selection (selection_symbol, target_symbol, 0);
 
   if (! NILP (converted_selection))
     {
@@ -1758,42 +1764,13 @@
     }
   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;
-
+      xassert (! STRING_MULTIBYTE (obj));
+      if (NILP (type))
+	type = QSTRING;
       *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;
+      *size_ret = SBYTES (obj);
+      *data_ret = SDATA (obj);
+      *nofree_ret = 1;
     }
   else if (SYMBOLP (obj))
     {
@@ -2025,7 +2002,7 @@
 #endif
     CHECK_SYMBOL (target_type);
 
-  val = x_get_local_selection (selection_symbol, target_type);
+  val = x_get_local_selection (selection_symbol, target_type, 1);
 
   if (NILP (val))
     {
@@ -2446,6 +2423,7 @@
   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);