1 /* Selection processing for Emacs on the Microsoft W32 API.
2 Copyright (C) 1993, 1994 Free Software Foundation.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
21 /* Written by Kevin Gallo */
25 #include "w32term.h" /* for all of the w32 includes */
26 #include "dispextern.h" /* frame.h seems to want this */
28 #include "frame.h" /* Need this to get the X window of selected_frame */
29 #include "blockinput.h"
33 #include "composite.h"
35 Lisp_Object QCLIPBOARD
;
37 /* Coding system for communicating with other Windows programs via the
39 static Lisp_Object Vselection_coding_system
;
41 /* Coding system for the next communicating with other Windows programs. */
42 static Lisp_Object Vnext_selection_coding_system
;
44 /* Sequence number, used where possible to detect when we are pasting
46 static DWORD last_clipboard_sequence_number
;
47 extern ClipboardSequence_Proc clipboard_sequence_fn
;
49 /* The last text we put into the clipboard. This is used when the OS
50 does not support sequence numbers (NT4, 95). It is undesirable to
51 use data put on the clipboard by Emacs because the clipboard data
52 could be MULEtilated by inappropriately chosen
53 (next-)selection-coding-system. For this reason, we must store the
54 text *after* it was encoded/Unix-to-DOS-converted. */
55 static unsigned char *last_clipboard_text
= NULL
;
56 static size_t clipboard_storage_size
= 0;
59 DEFUN ("w32-open-clipboard", Fw32_open_clipboard
, Sw32_open_clipboard
, 0, 1, 0,
60 doc
: /* This opens the clipboard with the given frame pointer. */)
67 CHECK_LIVE_FRAME (frame
);
71 ok
= OpenClipboard ((!NILP (frame
) && FRAME_W32_P (XFRAME (frame
))) ? FRAME_W32_WINDOW (XFRAME (frame
)) : NULL
);
75 return (ok
? frame
: Qnil
);
78 DEFUN ("w32-empty-clipboard", Fw32_empty_clipboard
,
79 Sw32_empty_clipboard
, 0, 0, 0,
80 doc
: /* Empty the clipboard.
81 Assigns ownership of the clipboard to the window which opened it. */)
88 ok
= EmptyClipboard ();
92 return (ok
? Qt
: Qnil
);
95 DEFUN ("w32-close-clipboard", Fw32_close_clipboard
,
96 Sw32_close_clipboard
, 0, 0, 0,
97 doc
: /* Close the clipboard. */)
104 ok
= CloseClipboard ();
108 return (ok
? Qt
: Qnil
);
113 DEFUN ("w32-set-clipboard-data", Fw32_set_clipboard_data
,
114 Sw32_set_clipboard_data
, 1, 2, 0,
115 doc
: /* This sets the clipboard data to the given text. */)
117 Lisp_Object string
, frame
;
122 int truelen
, nlines
= 0;
126 CHECK_STRING (string
);
129 CHECK_LIVE_FRAME (frame
);
133 nbytes
= SBYTES (string
) + 1;
134 src
= SDATA (string
);
137 /* We need to know how many lines there are, since we need CRLF line
138 termination for compatibility with other Windows Programs.
139 avoid using strchr because it recomputes the length every time */
140 while ((dst
= memchr (dst
, '\n', nbytes
- (dst
- src
))) != NULL
)
147 /* Since we are now handling multilingual text, we must consider
148 encoding text for the clipboard. */
149 int result
= string_xstring_p (string
);
153 /* No multibyte character in OBJ. We need not encode it. */
155 /* Need to know final size after CR chars are inserted (the
156 standard CF_TEXT clipboard format uses CRLF line endings,
157 while Emacs uses just LF internally). */
159 truelen
= nbytes
+ nlines
;
161 if ((htext
= GlobalAlloc (GMEM_MOVEABLE
| GMEM_DDESHARE
, truelen
)) == NULL
)
164 if ((dst
= (unsigned char *) GlobalLock (htext
)) == NULL
)
167 /* convert to CRLF line endings expected by clipboard */
171 /* copy next line or remaining bytes including '\0' */
172 next
= _memccpy (dst
, src
, '\n', nbytes
);
175 /* copied one line ending with '\n' */
176 int copied
= next
- dst
;
179 /* insert '\r' before '\n' */
185 /* copied remaining partial line -> now finished */
189 GlobalUnlock (htext
);
191 Vlast_coding_system_used
= Qraw_text
;
195 /* We must encode contents of OBJ to the selection coding
197 struct coding_system coding
;
200 if (NILP (Vnext_selection_coding_system
))
201 Vnext_selection_coding_system
= Vselection_coding_system
;
203 (Fcheck_coding_system (Vnext_selection_coding_system
), &coding
);
204 coding
.mode
|= (CODING_MODE_SAFE_ENCODING
| CODING_MODE_LAST_BLOCK
);
206 Vnext_selection_coding_system
= Qnil
;
208 /* We suppress producing escape sequences for composition. */
209 coding
.common_flags
&= ~CODING_ANNOTATION_MASK
;
210 coding
.dst_bytes
= SCHARS (string
) * 2;
211 if ((htext
= GlobalAlloc (GMEM_MOVEABLE
| GMEM_DDESHARE
, coding
.dst_bytes
)) == NULL
)
213 if ((coding
.destination
= (unsigned char *) GlobalLock (htext
)) == NULL
)
215 encode_coding_object (&coding
, string
, 0, 0,
216 SCHARS (string
), SBYTES (string
), Qnil
);
217 Vlast_coding_system_used
= CODING_ID_NAME (coding
.id
);
219 /* If clipboard sequence numbers are not supported, keep a copy for
221 if (!clipboard_sequence_fn
)
223 /* Stash away the data we are about to put into the
224 clipboard, so we could later check inside
225 Fw32_get_clipboard_data whether the clipboard still
227 if (clipboard_storage_size
< coding
.produced
)
229 clipboard_storage_size
= coding
.produced
+ 100;
230 last_clipboard_text
= (char *) xrealloc (last_clipboard_text
,
231 clipboard_storage_size
);
233 if (last_clipboard_text
)
234 memcpy (last_clipboard_text
, coding
.destination
,
238 GlobalUnlock (htext
);
240 /* Shrink data block to actual size. */
241 htext2
= GlobalReAlloc (htext
, coding
.produced
,
242 GMEM_MOVEABLE
| GMEM_DDESHARE
);
243 if (htext2
!= NULL
) htext
= htext2
;
247 if (!OpenClipboard ((!NILP (frame
) && FRAME_W32_P (XFRAME (frame
))) ? FRAME_W32_WINDOW (XFRAME (frame
)) : NULL
))
250 ok
= EmptyClipboard () && SetClipboardData (CF_TEXT
, htext
);
252 if (clipboard_sequence_fn
)
253 last_clipboard_sequence_number
= clipboard_sequence_fn ();
262 if (htext
) GlobalFree (htext
);
263 if (last_clipboard_text
)
264 *last_clipboard_text
= '\0';
266 last_clipboard_sequence_number
= 0;
271 return (ok
? string
: Qnil
);
274 DEFUN ("w32-get-clipboard-data", Fw32_get_clipboard_data
,
275 Sw32_get_clipboard_data
, 0, 1, 0,
276 doc
: /* This gets the clipboard data in text format. */)
281 Lisp_Object ret
= Qnil
;
284 CHECK_LIVE_FRAME (frame
);
288 if (!OpenClipboard ((!NILP (frame
) && FRAME_W32_P (XFRAME (frame
))) ? FRAME_W32_WINDOW (XFRAME (frame
)) : NULL
))
291 if ((htext
= GetClipboardData (CF_TEXT
)) == NULL
)
299 int require_decoding
= 0;
301 if ((src
= (unsigned char *) GlobalLock (htext
)) == NULL
)
304 nbytes
= strlen (src
);
306 /* If the text in clipboard is identical to what we put there
307 last time w32_set_clipboard_data was called, pretend there's no
308 data in the clipboard. This is so we don't pass our own text
309 from the clipboard (which might be troublesome if the killed
310 text includes null characters). */
311 if ((clipboard_sequence_fn
312 && clipboard_sequence_fn () == last_clipboard_sequence_number
)
313 || (last_clipboard_text
314 && clipboard_storage_size
>= nbytes
315 && memcmp(last_clipboard_text
, src
, nbytes
) == 0))
319 /* If the clipboard data contains any non-ascii code, we
320 need to decode it. */
323 for (i
= 0; i
< nbytes
; i
++)
327 require_decoding
= 1;
333 if (require_decoding
)
335 struct coding_system coding
;
337 if (NILP (Vnext_selection_coding_system
))
338 Vnext_selection_coding_system
= Vselection_coding_system
;
340 (Fcheck_coding_system (Vnext_selection_coding_system
), &coding
);
341 coding
.src_multibyte
= 0;
342 coding
.dst_multibyte
= 1;
343 Vnext_selection_coding_system
= Qnil
;
344 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
345 /* We explicitly disable composition handling because
346 selection data should not contain any composition
348 coding
.common_flags
&= ~CODING_ANNOTATION_MASK
;
349 coding
.dst_bytes
= nbytes
* 2;
350 coding
.destination
= (unsigned char *) xmalloc (coding
.dst_bytes
);
351 decode_coding_c_string (&coding
, src
, nbytes
, Qnil
);
352 Vlast_coding_system_used
= CODING_ID_NAME (coding
.id
);
353 ret
= make_string_from_bytes ((char *) coding
.destination
,
354 coding
.produced_char
, coding
.produced
);
355 xfree (coding
.destination
);
359 /* Need to know final size after CR chars are removed because we
360 can't change the string size manually, and doing an extra
361 copy is silly. Note that we only remove CR when it appears
366 /* avoid using strchr because it recomputes the length everytime */
367 while ((dst
= memchr (dst
, '\r', nbytes
- (dst
- src
))) != NULL
)
369 if (dst
[1] == '\n') /* safe because of trailing '\0' */
374 ret
= make_uninit_string (truelen
);
376 /* Convert CRLF line endings (the standard CF_TEXT clipboard
377 format) to LF endings as used internally by Emacs. */
383 /* copy next line or remaining bytes excluding '\0' */
384 next
= _memccpy (dst
, src
, '\r', nbytes
);
387 /* copied one line ending with '\r' */
388 int copied
= next
- dst
;
393 dst
--; /* overwrite '\r' with '\n' */
396 /* copied remaining partial line -> now finished */
400 Vlast_coding_system_used
= Qraw_text
;
403 GlobalUnlock (htext
);
415 /* Support checking for a clipboard selection. */
417 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
419 doc
: /* Whether there is an owner for the given X Selection.
420 The arg should be the name of the selection in question, typically one of
421 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
422 \(Those are literal upper-case symbol names, since that's what X expects.)
423 For convenience, the symbol nil is the same as `PRIMARY',
424 and t is the same as `SECONDARY'. */)
426 Lisp_Object selection
;
428 CHECK_SYMBOL (selection
);
430 /* Return nil for PRIMARY and SECONDARY selections; for CLIPBOARD, check
431 if the clipboard currently has valid text format contents. */
433 if (EQ (selection
, QCLIPBOARD
))
435 Lisp_Object val
= Qnil
;
437 if (OpenClipboard (NULL
))
440 while (format
= EnumClipboardFormats (format
))
441 if (format
== CF_TEXT
)
457 defsubr (&Sw32_open_clipboard
);
458 defsubr (&Sw32_empty_clipboard
);
459 defsubr (&Sw32_close_clipboard
);
461 defsubr (&Sw32_set_clipboard_data
);
462 defsubr (&Sw32_get_clipboard_data
);
463 defsubr (&Sx_selection_exists_p
);
465 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system
,
466 doc
: /* Coding system for communicating with other programs.
467 When sending or receiving text via cut_buffer, selection, and clipboard,
468 the text is encoded or decoded by this coding system.
469 The default value is `iso-latin-1-dos'. */);
470 Vselection_coding_system
= intern ("iso-latin-1-dos");
472 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system
,
473 doc
: /* Coding system for the next communication with other programs.
474 Usually, `selection-coding-system' is used for communicating with
475 other programs. But, if this variable is set, it is used for the
476 next communication only. After the communication, this variable is
478 Vnext_selection_coding_system
= Qnil
;
480 QCLIPBOARD
= intern ("CLIPBOARD"); staticpro (&QCLIPBOARD
);
483 /* arch-tag: c96e9724-5eb1-4dad-be07-289f092fd2af
484 (do not change this comment) */