changeset 51777:940c7de274a2

(last_clipboard_sequence_number): New variable. (Fw32_set_clipboard_data, Fw32_get_clipboard_data): Use sequence number if possible.
author Jason Rumney <jasonr@gnu.org>
date Sun, 06 Jul 2003 21:58:40 +0000
parents 6a03280c654a
children 2d00a74e78bc
files src/w32select.c
diffstat 1 files changed, 35 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32select.c	Sun Jul 06 21:58:12 2003 +0000
+++ b/src/w32select.c	Sun Jul 06 21:58:40 2003 +0000
@@ -41,9 +41,14 @@
 /* Coding system for the next communicating with other Windows programs.  */
 static Lisp_Object Vnext_selection_coding_system;
 
-/* The last text we put into the clipboard.  This is used to prevent
-   passing back our own text from the clipboard, instead of using the
-   kill ring.  The former is undesirable because the clipboard data
+/* Sequence number, used where possible to detect when we are pasting
+   our own text.  */
+static DWORD last_clipboard_sequence_number;
+extern ClipboardSequence_Proc clipboard_sequence_fn;
+
+/* The last text we put into the clipboard.  This is used when the OS
+   does not support sequence numbers (NT4, 95). It is undesirable to
+   use data put on the clipboard by Emacs because the clipboard data
    could be MULEtilated by inappropriately chosen
    (next-)selection-coding-system.  For this reason, we must store the
    text *after* it was encoded/Unix-to-DOS-converted.  */
@@ -217,17 +222,23 @@
 	encode_coding (&coding, src, dst, nbytes, bufsize);
 	Vlast_coding_system_used = coding.symbol;
 
-        /* Stash away the data we are about to put into the clipboard, so we
-           could later check inside Fw32_get_clipboard_data whether
-           the clipboard still holds our data.  */
-        if (clipboard_storage_size < coding.produced)
-          {
-            clipboard_storage_size = coding.produced + 100;
-            last_clipboard_text = (char *) xrealloc (last_clipboard_text,
-                                                     clipboard_storage_size);
-          }
-        if (last_clipboard_text)
-          memcpy (last_clipboard_text, dst, coding.produced);
+	/* If clipboard sequence numbers are not supported, keep a copy for
+	   later comparison.  */
+	if (!clipboard_sequence_fn)
+	  {
+	    /* Stash away the data we are about to put into the
+	       clipboard, so we could later check inside
+	       Fw32_get_clipboard_data whether the clipboard still
+	       holds our data.  */
+	    if (clipboard_storage_size < coding.produced)
+	      {
+		clipboard_storage_size = coding.produced + 100;
+		last_clipboard_text = (char *) xrealloc (last_clipboard_text,
+							 clipboard_storage_size);
+	      }
+	    if (last_clipboard_text)
+	      memcpy (last_clipboard_text, dst, coding.produced);
+	  }
 
 	GlobalUnlock (htext);
 
@@ -243,6 +254,9 @@
 
   ok = EmptyClipboard () && SetClipboardData (CF_TEXT, htext);
 
+  if (clipboard_sequence_fn)
+    last_clipboard_sequence_number = clipboard_sequence_fn ();
+
   CloseClipboard ();
 
   if (ok) goto done;
@@ -254,6 +268,8 @@
   if (last_clipboard_text)
     *last_clipboard_text = '\0';
 
+  last_clipboard_sequence_number = 0;
+
  done:
   UNBLOCK_INPUT;
 
@@ -297,9 +313,11 @@
        data in the clipboard.  This is so we don't pass our own text
        from the clipboard (which might be troublesome if the killed
        text includes null characters).  */
-    if (last_clipboard_text
-        && clipboard_storage_size >= nbytes
-        && memcmp(last_clipboard_text, src, nbytes) == 0)
+    if ((clipboard_sequence_fn
+	 && clipboard_sequence_fn () == last_clipboard_sequence_number)
+	|| (last_clipboard_text
+	    && clipboard_storage_size >= nbytes
+	    && memcmp(last_clipboard_text, src, nbytes) == 0))
       goto closeclip;
 
     {