]> git.eshelyaron.com Git - emacs.git/commitdiff
(Vnext_selection_coding_system): New variable.
authorGeoff Voelker <voelker@cs.washington.edu>
Wed, 28 Oct 1998 03:50:07 +0000 (03:50 +0000)
committerGeoff Voelker <voelker@cs.washington.edu>
Wed, 28 Oct 1998 03:50:07 +0000 (03:50 +0000)
(syms_of_w32select): DEFVAR_LISP it.
(Fw32_set_clipboard_data): Use Vnext_selection_coding_system if
non-nil.  Always convert multibyte strings.
(Fw32_get_clipboard_data): Use Vnext_selection_coding_system if
non-nil.  Always convert a string that includes non-ASCII characters.

src/w32select.c

index 5191b2a2ed237bc790ca2609772658ad7bad5759..da01576ddf3721b38904750eca2d609705f6ff21 100644 (file)
@@ -36,6 +36,9 @@ Lisp_Object QCLIPBOARD;
    clipboard.  */
 static Lisp_Object Vselection_coding_system;
 
+/* Coding system for the next communicating with other X clients.  */
+static Lisp_Object Vnext_selection_coding_system;
+
 #if 0
 DEFUN ("w32-open-clipboard", Fw32_open_clipboard, Sw32_open_clipboard, 0, 1, 0,
        "This opens the clipboard with the given frame pointer.")
@@ -117,8 +120,9 @@ DEFUN ("w32-set-clipboard-data", Fw32_set_clipboard_data, Sw32_set_clipboard_dat
     int num;
 
     bzero (charsets, (MAX_CHARSET + 1) * sizeof (int));
-    num = ((nbytes <= 2        /* Check the possibility of short cut.  */
-           || NILP (buffer_defaults.enable_multibyte_characters))
+    num = ((nbytes <= 1        /* Check the possibility of short cut.  */
+           || !STRING_MULTIBYTE (string)
+           || nbytes == XSTRING (string)->size)
           ? 0
           : find_charset_in_str (src, nbytes, charsets, Qnil, 0));
 
@@ -181,8 +185,11 @@ DEFUN ("w32-set-clipboard-data", Fw32_set_clipboard_data, Sw32_set_clipboard_dat
        struct coding_system coding;
        HANDLE htext2;
 
+       if (NILP (Vnext_selection_coding_system))
+         Vnext_selection_coding_system = Vselection_coding_system;
        setup_coding_system
-         (Fcheck_coding_system (Vselection_coding_system), &coding);
+         (Fcheck_coding_system (Vnext_selection_coding_system), &coding);
+       Vnext_selection_coding_system = Qnil;
        coding.mode |= CODING_MODE_LAST_BLOCK;
        bufsize = encoding_buffer_size (&coding, nbytes);
        if ((htext = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, bufsize)) == NULL)
@@ -242,20 +249,46 @@ DEFUN ("w32-get-clipboard-data", Fw32_get_clipboard_data, Sw32_get_clipboard_dat
     unsigned char *dst;
     int nbytes;
     int truelen;
+    int require_encoding = 0;
     
     if ((src = (unsigned char *) GlobalLock (htext)) == NULL)
       goto closeclip;
     
     nbytes = strlen (src);
 
-    if (! NILP (buffer_defaults.enable_multibyte_characters))
+    if (
+#if 1
+       1
+#else
+       ! NILP (buffer_defaults.enable_multibyte_characters)
+#endif
+       )
+      {
+       /* If the clipboard data contains any 8-bit Latin-1 code, we
+          need to decode it.  */
+       int i;
+
+       for (i = 0; i < nbytes; i++)
+         {
+           if (src[i] >= 0x80)
+             {
+               require_encoding = 1;
+               break;
+             }
+         }
+      }
+    
+    if (require_encoding)
       {
        int bufsize;
        unsigned char *buf;
        struct coding_system coding;
 
+       if (NILP (Vnext_selection_coding_system))
+         Vnext_selection_coding_system = Vselection_coding_system;
        setup_coding_system
-         (Fcheck_coding_system(Vselection_coding_system), &coding);
+         (Fcheck_coding_system (Vnext_selection_coding_system), &coding);
+       Vnext_selection_coding_system = Qnil;
        coding.mode |= CODING_MODE_LAST_BLOCK;
        bufsize = decoding_buffer_size (&coding, nbytes);
        buf = (unsigned char *) xmalloc (bufsize);
@@ -378,5 +411,13 @@ the text is encoded or decoded by this coding system.\n\
 A default value is `compound-text'");
   Vselection_coding_system=intern ("iso-latin-1-dos");
 
+  DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system,
+    "Coding system for the next communication with other X clients.\n\
+Usually, `selection-coding-system' is used for communicating with\n\
+other X clients.   But, if this variable is set, it is used for the\n\
+next communication only.   After the communication, this variable is\n\
+set to nil.");
+  Vnext_selection_coding_system = Qnil;
+
   QCLIPBOARD = intern ("CLIPBOARD");   staticpro (&QCLIPBOARD);
 }