/* 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. */
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);
ok = EmptyClipboard () && SetClipboardData (CF_TEXT, htext);
+ if (clipboard_sequence_fn)
+ last_clipboard_sequence_number = clipboard_sequence_fn ();
+
CloseClipboard ();
if (ok) goto done;
if (last_clipboard_text)
*last_clipboard_text = '\0';
+ last_clipboard_sequence_number = 0;
+
done:
UNBLOCK_INPUT;
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;
{