Mercurial > emacs
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; {