1 /* Selection processing for Emacs on the Microsoft W32 API.
3 Copyright (C) 1993-1994, 2001-2012 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 /* Written by Kevin Gallo, Benjamin Riefenstahl */
24 * Notes on usage of selection-coding-system and
25 * next-selection-coding-system on MS Windows:
27 * The selection coding system variables apply only to the version of
28 * the clipboard data that is closest in type, i.e. when a 16-bit
29 * Unicode coding system is given, they apply to he Unicode clipboard
30 * (CF_UNICODETEXT), when a well-known console codepage is given, they
31 * apply to the console version of the clipboard data (CF_OEMTEXT),
32 * else they apply to the normal 8-bit text clipboard (CF_TEXT).
34 * When pasting (getting data from the OS), the clipboard format that
35 * matches the {next-}selection-coding-system is retrieved. If
36 * Unicode is requested, but not available, 8-bit text (CF_TEXT) is
37 * used. In all other cases the OS will transparently convert
38 * formats, so no other fallback is needed.
40 * When copying or cutting (sending data to the OS), the data is
41 * announced and stored internally, but only actually rendered on
42 * request. The requestor determines the format provided. The
43 * {next-}selection-coding-system is only used, when its corresponding
44 * clipboard type matches the type requested.
46 * Scenarios to use the facilities for customizing the selection
49 * ;; Generally use KOI8-R instead of the russian MS codepage for
50 * ;; the 8-bit clipboard.
51 * (set-selection-coding-system 'koi8-r-dos)
55 * ;; Create a special clipboard copy function that uses codepage
56 * ;; 1253 (Greek) to copy Greek text to a specific non-Unicode
58 * (defun greek-copy (beg end)
60 * (set-next-selection-coding-system 'cp1253-dos)
61 * (copy-region-as-kill beg end))
62 * (global-set-key "\C-c\C-c" 'greek-copy)
66 * Ideas for further directions:
68 * The encoding and decoding routines could be moved to Lisp code
69 * similar to how xselect.c does it (using well-known routine names
70 * for the delayed rendering). If the definition of which clipboard
71 * types should be supported is also moved to Lisp, functionality
72 * could be expanded to CF_HTML, CF_RTF and maybe other types.
78 #include "w32term.h" /* for all of the w32 includes */
79 #include "w32heap.h" /* os_subtype */
80 #include "blockinput.h"
83 #include "composite.h"
86 static HGLOBAL
convert_to_handle_as_ascii (void);
87 static HGLOBAL
convert_to_handle_as_coded (Lisp_Object coding_system
);
88 static Lisp_Object
render (Lisp_Object oformat
);
89 static Lisp_Object
render_locale (void);
90 static Lisp_Object
render_all (Lisp_Object ignore
);
91 static void run_protected (Lisp_Object (*code
) (Lisp_Object
), Lisp_Object arg
);
92 static Lisp_Object
lisp_error_handler (Lisp_Object error
);
93 static LRESULT CALLBACK
owner_callback (HWND win
, UINT msg
,
94 WPARAM wp
, LPARAM lp
);
95 static HWND
create_owner (void);
97 static void setup_config (void);
98 static BOOL WINAPI
enum_locale_callback (/*const*/ char* loc_string
);
99 static UINT
cp_from_locale (LCID lcid
, UINT format
);
100 static Lisp_Object
coding_from_cp (UINT codepage
);
101 static Lisp_Object
validate_coding_system (Lisp_Object coding_system
);
102 static void setup_windows_coding_system (Lisp_Object coding_system
,
103 struct coding_system
* coding
);
106 /* A remnant from X11: Symbol for the CLIPBORD selection type. Other
107 selections are not used on Windows, so we don't need symbols for
108 PRIMARY and SECONDARY. */
109 Lisp_Object QCLIPBOARD
;
111 /* Internal pseudo-constants, initialized in globals_of_w32select()
112 based on current system parameters. */
113 static LCID DEFAULT_LCID
;
114 static UINT ANSICP
, OEMCP
;
115 static Lisp_Object QUNICODE
, QANSICP
, QOEMCP
;
117 /* A hidden window just for the clipboard management. */
118 static HWND clipboard_owner
;
119 /* A flag to tell WM_DESTROYCLIPBOARD who is to blame this time (just
120 checking GetClipboardOwner() doesn't work, sadly). */
121 static int modifying_clipboard
= 0;
123 /* Configured transfer parameters, based on the last inspection of
124 selection-coding-system. */
125 static Lisp_Object cfg_coding_system
;
126 static UINT cfg_codepage
;
127 static LCID cfg_lcid
;
128 static UINT cfg_clipboard_type
;
130 /* The current state for delayed rendering. */
131 static Lisp_Object current_text
;
132 static Lisp_Object current_coding_system
;
133 static int current_requires_encoding
, current_num_nls
;
134 static UINT current_clipboard_type
;
135 static LCID current_lcid
;
138 #define ONTRACE(stmt) stmt
140 #define ONTRACE(stmt) /*stmt*/
144 /* This function assumes that there is no multibyte character in
145 current_text, so we can short-cut encoding. */
148 convert_to_handle_as_ascii (void)
150 HGLOBAL htext
= NULL
;
156 ONTRACE (fprintf (stderr
, "convert_to_handle_as_ascii\n"));
158 nbytes
= SBYTES (current_text
) + 1;
159 src
= SDATA (current_text
);
161 /* We need to add to the size the number of LF chars where we have
162 to insert CR chars (the standard CF_TEXT clipboard format uses
163 CRLF line endings, while Emacs uses just LF internally). */
165 truelen
= nbytes
+ current_num_nls
;
167 if ((htext
= GlobalAlloc (GMEM_MOVEABLE
| GMEM_DDESHARE
, truelen
)) == NULL
)
170 if ((dst
= (unsigned char *) GlobalLock (htext
)) == NULL
)
176 /* convert to CRLF line endings expected by clipboard */
180 /* copy next line or remaining bytes including '\0' */
181 next
= _memccpy (dst
, src
, '\n', nbytes
);
184 /* copied one line ending with '\n' */
185 int copied
= next
- dst
;
188 /* insert '\r' before '\n' */
194 /* copied remaining partial line -> now finished */
198 GlobalUnlock (htext
);
203 /* This function assumes that there are multibyte or NUL characters in
204 current_text, or that we need to construct Unicode. It runs the
205 text through the encoding machinery. */
208 convert_to_handle_as_coded (Lisp_Object coding_system
)
211 unsigned char *dst
= NULL
;
212 struct coding_system coding
;
214 ONTRACE (fprintf (stderr
, "convert_to_handle_as_coded: %s\n",
215 SDATA (SYMBOL_NAME (coding_system
))));
217 setup_windows_coding_system (coding_system
, &coding
);
218 coding
.dst_bytes
= SBYTES (current_text
) * 2;
219 coding
.destination
= (unsigned char *) xmalloc (coding
.dst_bytes
);
220 encode_coding_object (&coding
, current_text
, 0, 0,
221 SCHARS (current_text
), SBYTES (current_text
), Qnil
);
223 htext
= GlobalAlloc (GMEM_MOVEABLE
| GMEM_DDESHARE
, coding
.produced
+2);
226 dst
= (unsigned char *) GlobalLock (htext
);
230 memcpy (dst
, coding
.destination
, coding
.produced
);
231 /* Add the string terminator. Add two NULs in case we are
232 producing Unicode here. */
233 dst
[coding
.produced
] = dst
[coding
.produced
+1] = '\0';
235 GlobalUnlock (htext
);
238 xfree (coding
.destination
);
244 render (Lisp_Object oformat
)
246 HGLOBAL htext
= NULL
;
247 UINT format
= XFASTINT (oformat
);
249 ONTRACE (fprintf (stderr
, "render\n"));
251 if (NILP (current_text
))
254 if (current_requires_encoding
|| format
== CF_UNICODETEXT
)
256 if (format
== current_clipboard_type
)
257 htext
= convert_to_handle_as_coded (current_coding_system
);
262 htext
= convert_to_handle_as_coded (QUNICODE
);
268 cs
= coding_from_cp (cp_from_locale (current_lcid
, format
));
269 htext
= convert_to_handle_as_coded (cs
);
275 htext
= convert_to_handle_as_ascii ();
277 ONTRACE (fprintf (stderr
, "render: htext = 0x%08X\n", (unsigned) htext
));
282 if (SetClipboardData (format
, htext
) == NULL
)
294 HANDLE hlocale
= NULL
;
297 ONTRACE (fprintf (stderr
, "render_locale\n"));
299 if (current_lcid
== LOCALE_NEUTRAL
|| current_lcid
== DEFAULT_LCID
)
302 hlocale
= GlobalAlloc (GMEM_MOVEABLE
| GMEM_DDESHARE
, sizeof (current_lcid
));
306 if ((lcid_ptr
= (LCID
*) GlobalLock (hlocale
)) == NULL
)
308 GlobalFree (hlocale
);
312 *lcid_ptr
= current_lcid
;
313 GlobalUnlock (hlocale
);
315 if (SetClipboardData (CF_LOCALE
, hlocale
) == NULL
)
317 GlobalFree (hlocale
);
324 /* At the end of the program, we want to ensure that our clipboard
325 data survives us. This code will do that. */
328 render_all (Lisp_Object ignore
)
330 ONTRACE (fprintf (stderr
, "render_all\n"));
332 /* According to the docs we should not call OpenClipboard() here,
333 but testing on W2K and working code in other projects shows that
334 it is actually necessary. */
336 OpenClipboard (NULL
);
338 /* There is no useful means to report errors here, there are none
339 expected anyway, and even if there were errors, they wouldn't do
340 any harm. So we just go ahead and do what has to be done without
341 bothering with error handling. */
343 ++modifying_clipboard
;
345 --modifying_clipboard
;
347 /* For text formats that we don't render here, the OS can use its
348 own translation rules instead, so we don't really need to offer
349 everything. To minimize memory consumption we cover three
350 possible situations based on our primary format as detected from
351 selection-coding-system (see setup_config()):
353 - Post CF_TEXT only. Let the OS convert to CF_OEMTEXT and the OS
354 (on NT) or the application (on 9x/Me) convert to
357 - Post CF_OEMTEXT only. Similar automatic conversions happen as
360 - Post CF_UNICODETEXT + CF_TEXT. 9x itself ignores
361 CF_UNICODETEXT, even though some applications can still handle
364 Note 1: We render the less capable CF_TEXT *before* the more
365 capable CF_UNICODETEXT, to prevent clobbering through automatic
366 conversions, just in case.
368 Note 2: We could check os_subtype here and only render the
369 additional CF_TEXT on 9x/Me. But OTOH with
370 current_clipboard_type == CF_UNICODETEXT we don't involve the
371 automatic conversions anywhere else, so to get consistent
372 results, we probably don't want to rely on it here either. */
376 if (current_clipboard_type
== CF_UNICODETEXT
)
377 render (make_number (CF_TEXT
));
378 render (make_number (current_clipboard_type
));
386 run_protected (Lisp_Object (*code
) (Lisp_Object
), Lisp_Object arg
)
388 /* FIXME: This works but it doesn't feel right. Too much fiddling
389 with global variables and calling strange looking functions. Is
390 this really the right way to run Lisp callbacks? */
392 extern int waiting_for_input
; /* from keyboard.c */
397 /* Fsignal calls abort() if it sees that waiting_for_input is
399 owfi
= waiting_for_input
;
400 waiting_for_input
= 0;
402 internal_condition_case_1 (code
, arg
, Qt
, lisp_error_handler
);
404 waiting_for_input
= owfi
;
410 lisp_error_handler (Lisp_Object error
)
412 Vsignaling_function
= Qnil
;
413 cmd_error_internal (error
, "Error in delayed clipboard rendering: ");
419 static LRESULT CALLBACK
420 owner_callback (HWND win
, UINT msg
, WPARAM wp
, LPARAM lp
)
424 case WM_RENDERFORMAT
:
425 ONTRACE (fprintf (stderr
, "WM_RENDERFORMAT\n"));
426 run_protected (render
, make_number (wp
));
429 case WM_RENDERALLFORMATS
:
430 ONTRACE (fprintf (stderr
, "WM_RENDERALLFORMATS\n"));
431 run_protected (render_all
, Qnil
);
434 case WM_DESTROYCLIPBOARD
:
435 if (!modifying_clipboard
)
437 ONTRACE (fprintf (stderr
, "WM_DESTROYCLIPBOARD (other)\n"));
439 current_coding_system
= Qnil
;
443 ONTRACE (fprintf (stderr
, "WM_DESTROYCLIPBOARD (self)\n"));
448 if (win
== clipboard_owner
)
449 clipboard_owner
= NULL
;
453 return DefWindowProc (win
, msg
, wp
, lp
);
459 static const char CLASSNAME
[] = "Emacs Clipboard";
462 memset (&wc
, 0, sizeof (wc
));
463 wc
.lpszClassName
= CLASSNAME
;
464 wc
.lpfnWndProc
= owner_callback
;
467 return CreateWindow (CLASSNAME
, CLASSNAME
, 0, 0, 0, 0, 0, NULL
, NULL
,
471 /* Called on exit by term_ntproc() in w32.c */
474 term_w32select (void)
476 /* This is needed to trigger WM_RENDERALLFORMATS. */
477 if (clipboard_owner
!= NULL
)
478 DestroyWindow (clipboard_owner
);
484 const char *coding_name
;
488 Lisp_Object coding_system
;
489 Lisp_Object dos_coding_system
;
491 CHECK_SYMBOL (Vselection_coding_system
);
493 coding_system
= NILP (Vnext_selection_coding_system
) ?
494 Vselection_coding_system
: Vnext_selection_coding_system
;
496 dos_coding_system
= validate_coding_system (coding_system
);
497 if (NILP (dos_coding_system
))
499 list2 (build_string ("Coding system is invalid or doesn't have "
500 "an eol variant for dos line ends"),
503 /* Check if we have it cached */
504 if (!NILP (cfg_coding_system
)
505 && EQ (cfg_coding_system
, dos_coding_system
))
507 cfg_coding_system
= dos_coding_system
;
509 /* Set some sensible fallbacks */
510 cfg_codepage
= ANSICP
;
511 cfg_lcid
= LOCALE_NEUTRAL
;
512 cfg_clipboard_type
= CF_TEXT
;
514 /* Interpret the coding system symbol name */
515 coding_name
= SDATA (SYMBOL_NAME (cfg_coding_system
));
517 /* "(.*-)?utf-16.*" -> CF_UNICODETEXT */
518 cp
= strstr (coding_name
, "utf-16");
519 if (cp
!= NULL
&& (cp
== coding_name
|| cp
[-1] == '-'))
521 cfg_clipboard_type
= CF_UNICODETEXT
;
525 /* "cp[0-9]+.*" or "windows-[0-9]+.*" -> CF_TEXT or CF_OEMTEXT */
526 slen
= strlen (coding_name
);
527 if (slen
>= 4 && coding_name
[0] == 'c' && coding_name
[1] == 'p')
528 cp
= coding_name
+ 2;
529 else if (slen
>= 10 && memcmp (coding_name
, "windows-", 8) == 0)
530 cp
= coding_name
+ 8;
535 cfg_codepage
= strtol (cp
, &end
, 10);
537 /* Error return from strtol() or number of digits < 2 -> Restore the
538 default and drop it. */
539 if (cfg_codepage
== 0 || (end
-cp
) < 2 )
541 cfg_codepage
= ANSICP
;
545 /* Is it the currently active system default? */
546 if (cfg_codepage
== ANSICP
)
548 /* cfg_clipboard_type = CF_TEXT; */
551 if (cfg_codepage
== OEMCP
)
553 cfg_clipboard_type
= CF_OEMTEXT
;
557 /* Else determine a suitable locale the hard way. */
558 EnumSystemLocales (enum_locale_callback
, LCID_INSTALLED
);
562 enum_locale_callback (/*const*/ char* loc_string
)
567 lcid
= strtoul (loc_string
, NULL
, 16);
569 /* Is the wanted codepage the "ANSI" codepage for this locale? */
570 codepage
= cp_from_locale (lcid
, CF_TEXT
);
571 if (codepage
== cfg_codepage
)
574 cfg_clipboard_type
= CF_TEXT
;
575 return FALSE
; /* Stop enumeration */
578 /* Is the wanted codepage the OEM codepage for this locale? */
579 codepage
= cp_from_locale (lcid
, CF_OEMTEXT
);
580 if (codepage
== cfg_codepage
)
583 cfg_clipboard_type
= CF_OEMTEXT
;
584 return FALSE
; /* Stop enumeration */
587 return TRUE
; /* Continue enumeration */
591 cp_from_locale (LCID lcid
, UINT format
)
593 char buffer
[20] = "";
597 format
== CF_TEXT
? LOCALE_IDEFAULTANSICODEPAGE
: LOCALE_IDEFAULTCODEPAGE
;
599 GetLocaleInfo (lcid
, variant
, buffer
, sizeof (buffer
));
600 cp
= strtoul (buffer
, NULL
, 10);
604 else if (cp
== CP_OEMCP
)
611 coding_from_cp (UINT codepage
)
614 sprintf (buffer
, "cp%d-dos", (int) codepage
);
615 return intern (buffer
);
616 /* We don't need to check that this coding system actually exists
617 right here, because that is done later for all coding systems
618 used, regardless of where they originate. */
622 validate_coding_system (Lisp_Object coding_system
)
624 Lisp_Object eol_type
;
626 /* Make sure the input is valid. */
627 if (NILP (Fcoding_system_p (coding_system
)))
630 /* Make sure we use a DOS coding system as mandated by the system
632 eol_type
= Fcoding_system_eol_type (coding_system
);
634 /* Already a DOS coding system? */
635 if (EQ (eol_type
, make_number (1)))
636 return coding_system
;
638 /* Get EOL_TYPE vector of the base of CODING_SYSTEM. */
639 if (!VECTORP (eol_type
))
641 eol_type
= Fcoding_system_eol_type (Fcoding_system_base (coding_system
));
642 if (!VECTORP (eol_type
))
646 return AREF (eol_type
, 1);
650 setup_windows_coding_system (Lisp_Object coding_system
,
651 struct coding_system
* coding
)
653 memset (coding
, 0, sizeof (*coding
));
654 setup_coding_system (coding_system
, coding
);
656 /* Unset CODING_ANNOTATE_COMPOSITION_MASK. Previous code had
657 comments about crashes in encode_coding_iso2022 trying to
658 dereference a null pointer when composition was on. Selection
659 data should not contain any composition sequence on Windows.
661 CODING_ANNOTATION_MASK also includes
662 CODING_ANNOTATE_DIRECTION_MASK and CODING_ANNOTATE_CHARSET_MASK,
663 which both apply to ISO6429 only. We don't know if these really
664 need to be unset on Windows, but it probably doesn't hurt
666 coding
->mode
&= ~CODING_ANNOTATION_MASK
;
667 coding
->mode
|= CODING_MODE_LAST_BLOCK
| CODING_MODE_SAFE_ENCODING
;
672 DEFUN ("w32-set-clipboard-data", Fw32_set_clipboard_data
,
673 Sw32_set_clipboard_data
, 1, 2, 0,
674 doc
: /* This sets the clipboard data to the given text. */)
675 (Lisp_Object string
, Lisp_Object ignored
)
683 /* This parameter used to be the current frame, but we don't use
687 CHECK_STRING (string
);
691 current_text
= string
;
692 current_coding_system
= cfg_coding_system
;
693 current_clipboard_type
= cfg_clipboard_type
;
694 current_lcid
= cfg_lcid
;
696 current_requires_encoding
= 0;
700 /* Check for non-ASCII characters. While we are at it, count the
701 number of LFs, so we know how many CRs we will have to add later
702 (just in the case where we can use our internal ASCII rendering,
703 see code and comment in convert_to_handle_as_ascii() above). */
704 nbytes
= SBYTES (string
);
705 src
= SDATA (string
);
707 for (dst
= src
, end
= src
+nbytes
; dst
< end
; dst
++)
711 else if (*dst
>= 0x80 || *dst
== 0)
713 current_requires_encoding
= 1;
718 if (!current_requires_encoding
)
720 /* If all we have is ASCII we don't need to pretend we offer
722 current_coding_system
= Qraw_text
;
723 current_clipboard_type
= CF_TEXT
;
724 current_lcid
= LOCALE_NEUTRAL
;
727 if (!OpenClipboard (clipboard_owner
))
730 ++modifying_clipboard
;
731 ok
= EmptyClipboard ();
732 --modifying_clipboard
;
734 /* If we have something non-ASCII we may want to set a locale. We
735 do that directly (non-delayed), as it's just a small bit. */
737 ok
= !NILP (render_locale ());
741 if (clipboard_owner
== NULL
)
743 /* If for some reason we don't have a clipboard_owner, we
744 just set the text format as chosen by the configuration
745 and than forget about the whole thing. */
746 ok
= !NILP (render (make_number (current_clipboard_type
)));
748 current_coding_system
= Qnil
;
752 /* Advertise all supported formats so that whatever the
753 requestor chooses, only one encoding step needs to be
754 made. This is intentionally different from what we do in
755 the handler for WM_RENDERALLFORMATS. */
756 SetClipboardData (CF_UNICODETEXT
, NULL
);
757 SetClipboardData (CF_TEXT
, NULL
);
758 SetClipboardData (CF_OEMTEXT
, NULL
);
764 /* With delayed rendering we haven't really "used" this coding
765 system yet, and it's even unclear if we ever will. But this is a
766 way to tell the upper level what we *would* use under ideal
769 We don't signal the actually used coding-system later when we
770 finally render, because that can happen at any time and we don't
771 want to disturb the "foreground" action. */
773 Vlast_coding_system_used
= current_coding_system
;
775 Vnext_selection_coding_system
= Qnil
;
783 current_coding_system
= Qnil
;
788 return (ok
? string
: Qnil
);
792 DEFUN ("w32-get-clipboard-data", Fw32_get_clipboard_data
,
793 Sw32_get_clipboard_data
, 0, 1, 0,
794 doc
: /* This gets the clipboard data in text format. */)
795 (Lisp_Object ignored
)
798 Lisp_Object ret
= Qnil
;
799 UINT actual_clipboard_type
;
800 int use_configured_coding_system
= 1;
802 /* This parameter used to be the current frame, but we don't use
806 /* Don't pass our own text from the clipboard (which might be
807 troublesome if the killed text includes null characters). */
808 if (!NILP (current_text
))
812 actual_clipboard_type
= cfg_clipboard_type
;
816 if (!OpenClipboard (clipboard_owner
))
819 if ((htext
= GetClipboardData (actual_clipboard_type
)) == NULL
)
821 /* If we want CF_UNICODETEXT but can't get it, the current
822 coding system is useless. OTOH we can still try and decode
823 CF_TEXT based on the locale that the system gives us and that
824 we get down below. */
825 if (actual_clipboard_type
== CF_UNICODETEXT
)
827 htext
= GetClipboardData (CF_TEXT
);
830 actual_clipboard_type
= CF_TEXT
;
831 use_configured_coding_system
= 0;
843 int require_decoding
= 0;
845 if ((src
= (unsigned char *) GlobalLock (htext
)) == NULL
)
848 /* If the clipboard data contains any non-ascii code, we need to
849 decode it with a coding system. */
850 if (actual_clipboard_type
== CF_UNICODETEXT
)
852 nbytes
= lstrlenW ((WCHAR
*)src
) * 2;
853 require_decoding
= 1;
859 nbytes
= strlen (src
);
861 for (i
= 0; i
< nbytes
; i
++)
865 require_decoding
= 1;
871 if (require_decoding
)
873 struct coding_system coding
;
874 Lisp_Object coding_system
= Qnil
;
875 Lisp_Object dos_coding_system
;
877 /* `next-selection-coding-system' should override everything,
878 even when the locale passed by the system disagrees. The
879 only exception is when `next-selection-coding-system'
880 requested CF_UNICODETEXT and we couldn't get that. */
881 if (use_configured_coding_system
882 && !NILP (Vnext_selection_coding_system
))
883 coding_system
= Vnext_selection_coding_system
;
885 /* If we have CF_TEXT or CF_OEMTEXT, we want to check out
887 else if (actual_clipboard_type
!= CF_UNICODETEXT
)
890 LCID lcid
= DEFAULT_LCID
;
893 /* Documentation says that the OS always generates
894 CF_LOCALE info automatically, so the locale handle
895 should always be present. Fact is that this is not
896 always true on 9x ;-(. */
897 hlocale
= GetClipboardData (CF_LOCALE
);
900 const LCID
* lcid_ptr
;
901 lcid_ptr
= (const LCID
*) GlobalLock (hlocale
);
902 if (lcid_ptr
!= NULL
)
905 GlobalUnlock (hlocale
);
908 /* 9x has garbage as the sort order (to be exact there
909 is another instance of the language id in the upper
910 word). We don't care about sort order anyway, so
911 we just filter out the unneeded mis-information to
912 avoid irritations. */
913 lcid
= MAKELCID (LANGIDFROMLCID (lcid
), SORT_DEFAULT
);
916 /* If we are using fallback from CF_UNICODETEXT, we can't
917 use the configured coding system. Also we don't want
918 to use it, if the system has supplied us with a locale
919 and it is not just the system default. */
920 if (!use_configured_coding_system
|| lcid
!= DEFAULT_LCID
)
922 cp
= cp_from_locale (lcid
, actual_clipboard_type
);
923 /* If it's just our current standard setting anyway,
924 use the coding system that the user has selected.
925 Otherwise create a new spec to match the locale
926 that was specified by the other side or the
928 if (!use_configured_coding_system
|| cp
!= cfg_codepage
)
929 coding_system
= coding_from_cp (cp
);
933 if (NILP (coding_system
))
934 coding_system
= Vselection_coding_system
;
935 Vnext_selection_coding_system
= Qnil
;
937 dos_coding_system
= validate_coding_system (coding_system
);
938 if (!NILP (dos_coding_system
))
940 setup_windows_coding_system (dos_coding_system
, &coding
);
942 decode_coding_object (&coding
, Qnil
, 0, 0, nbytes
, nbytes
, Qt
);
943 ret
= coding
.dst_object
;
945 Vlast_coding_system_used
= CODING_ID_NAME (coding
.id
);
950 /* FIXME: We may want to repeat the code in this branch for
953 /* Need to know final size after CR chars are removed because
954 we can't change the string size manually, and doing an
955 extra copy is silly. We only remove CR when it appears as
960 /* avoid using strchr because it recomputes the length everytime */
961 while ((dst
= memchr (dst
, '\r', nbytes
- (dst
- src
))) != NULL
)
963 if (dst
[1] == '\n') /* safe because of trailing '\0' */
968 ret
= make_uninit_string (truelen
);
970 /* Convert CRLF line endings (the standard CF_TEXT clipboard
971 format) to LF endings as used internally by Emacs. */
977 /* copy next line or remaining bytes excluding '\0' */
978 next
= _memccpy (dst
, src
, '\r', nbytes
);
981 /* copied one line ending with '\r' */
982 int copied
= next
- dst
;
987 dst
--; /* overwrite '\r' with '\n' */
990 /* copied remaining partial line -> now finished */
994 Vlast_coding_system_used
= Qraw_text
;
997 GlobalUnlock (htext
);
1009 /* Support checking for a clipboard selection. */
1011 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
1013 doc
: /* Whether there is an owner for the given X selection.
1014 SELECTION should be the name of the selection in question, typically
1015 one of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. (X expects
1016 these literal upper-case names.) The symbol nil is the same as
1017 `PRIMARY', and t is the same as `SECONDARY'.
1019 TERMINAL should be a terminal object or a frame specifying the X
1020 server to query. If omitted or nil, that stands for the selected
1021 frame's display, or the first available X display. */)
1022 (Lisp_Object selection
, Lisp_Object terminal
)
1024 CHECK_SYMBOL (selection
);
1026 /* Return nil for PRIMARY and SECONDARY selections; for CLIPBOARD, check
1027 if the clipboard currently has valid text format contents. */
1029 if (EQ (selection
, QCLIPBOARD
))
1031 Lisp_Object val
= Qnil
;
1035 if (OpenClipboard (NULL
))
1038 while ((format
= EnumClipboardFormats (format
)))
1039 /* Check CF_TEXT in addition to cfg_clipboard_type,
1040 because we can fall back on that if CF_UNICODETEXT is
1041 not available. Actually a check for CF_TEXT only
1042 should be enough. */
1043 if (format
== cfg_clipboard_type
|| format
== CF_TEXT
)
1055 /* One-time init. Called in the un-dumped Emacs, but not in the
1059 syms_of_w32select (void)
1061 defsubr (&Sw32_set_clipboard_data
);
1062 defsubr (&Sw32_get_clipboard_data
);
1063 defsubr (&Sx_selection_exists_p
);
1065 DEFVAR_LISP ("selection-coding-system", Vselection_coding_system
,
1066 doc
: /* Coding system for communicating with other programs.
1068 For MS-Windows and MS-DOS:
1069 When sending or receiving text via selection and clipboard, the text
1070 is encoded or decoded by this coding system. The default value is
1071 the current system default encoding on 9x/Me, `utf-16le-dos'
1072 \(Unicode) on NT/W2K/XP, and `iso-latin-1-dos' on MS-DOS.
1075 When sending text via selection and clipboard, if the target
1076 data-type matches with the type of this coding system, it is used
1077 for encoding the text. Otherwise (including the case that this
1078 variable is nil), a proper coding system is used as below:
1080 data-type coding system
1081 --------- -------------
1083 COMPOUND_TEXT compound-text-with-extensions
1085 C_STRING no-conversion
1087 When receiving text, if this coding system is non-nil, it is used
1088 for decoding regardless of the data-type. If this is nil, a
1089 proper coding system is used according to the data-type as above.
1091 See also the documentation of the variable `x-select-request-type' how
1092 to control which data-type to request for receiving text.
1094 The default value is nil. */);
1095 /* The actual value is set dynamically in the dumped Emacs, see
1097 Vselection_coding_system
= Qnil
;
1099 DEFVAR_LISP ("next-selection-coding-system", Vnext_selection_coding_system
,
1100 doc
: /* Coding system for the next communication with other programs.
1101 Usually, `selection-coding-system' is used for communicating with
1102 other programs (X Windows clients or MS Windows programs). But, if this
1103 variable is set, it is used for the next communication only.
1104 After the communication, this variable is set to nil. */);
1105 Vnext_selection_coding_system
= Qnil
;
1107 DEFSYM (QCLIPBOARD
, "CLIPBOARD");
1109 cfg_coding_system
= Qnil
; staticpro (&cfg_coding_system
);
1110 current_text
= Qnil
; staticpro (¤t_text
);
1111 current_coding_system
= Qnil
; staticpro (¤t_coding_system
);
1113 DEFSYM (QUNICODE
, "utf-16le-dos");
1114 QANSICP
= Qnil
; staticpro (&QANSICP
);
1115 QOEMCP
= Qnil
; staticpro (&QOEMCP
);
1118 /* One-time init. Called in the dumped Emacs, but not in the
1119 un-dumped version. */
1122 globals_of_w32select (void)
1124 DEFAULT_LCID
= GetUserDefaultLCID ();
1125 /* Drop the sort order from the LCID, so we can compare this with
1126 CF_LOCALE objects that have the same fix on 9x. */
1127 DEFAULT_LCID
= MAKELCID (LANGIDFROMLCID (DEFAULT_LCID
), SORT_DEFAULT
);
1130 OEMCP
= GetOEMCP ();
1132 QANSICP
= coding_from_cp (ANSICP
);
1133 QOEMCP
= coding_from_cp (OEMCP
);
1135 if (os_subtype
== OS_NT
)
1136 Vselection_coding_system
= QUNICODE
;
1137 else if (inhibit_window_system
)
1138 Vselection_coding_system
= QOEMCP
;
1140 Vselection_coding_system
= QANSICP
;
1142 clipboard_owner
= create_owner ();