annotate src/select-msw.c @ 5908:6174848f3e6c

Use parse_integer() in read_atom(); support bases with ratios like integers src/ChangeLog addition: 2015-05-08 Aidan Kehoe <kehoea@parhasard.net> * data.c (init_errors_once_early): Move the Qunsupported_type here from numbers.c, so it's available when the majority of our types are not supported. * general-slots.h: Add it here, too. * number.c: Remove the definition of Qunsupported_type from here. * lread.c (read_atom): Check if the first character could reflect a rational, if so, call parse_integer(), don't check the syntax of the other characters. This allows us to accept the non-ASCII digit characters too. If that worked partially, but not completely, and the next char is a slash, try to parse as a ratio. If that fails, try isfloat_string(), but only if the first character could plausibly be part of a float. Otherwise, treat as a symbol. * lread.c (read_rational): Rename from read_integer. Handle ratios with the same radix specification as was used for integers. * lread.c (read1): Rename read_integer in this function. Support the Common Lisp #NNNrMMM syntax for parsing a number MMM of arbitrary radix NNN. man/ChangeLog addition: 2015-05-08 Aidan Kehoe <kehoea@parhasard.net> * lispref/numbers.texi (Numbers): Describe the newly-supported arbitrary-base syntax for rationals (integers and ratios). Describe that ratios can take the same base specification as integers, something also new. tests/ChangeLog addition: 2015-05-08 Aidan Kehoe <kehoea@parhasard.net> * automated/lisp-reader-tests.el: Check the arbitrary-base integer reader syntax support, just added. Check the reader base support for ratios, just added. Check the non-ASCII-digit support in the reader, just added.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 09 May 2015 00:40:57 +0100
parents 56144c8593a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* mswindows selection processing for XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 771
diff changeset
3 Copyright (C) 2000, 2001, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4982
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4982
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4982
diff changeset
10 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4982
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 /* Synched up with: Not synched with FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
22 /* This file Mule-ized 7-00?? Needs some Unicode review. --ben */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
23
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Authorship:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 Written by Kevin Gallo for FSF Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 Rewritten for mswindows by Jonathan Harris, December 1997 for 21.0.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
28 Rewritten April 2000 by Ben Wing -- support device methods, Mule-ize.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
29 Hacked by Alastair Houghton, July 2000 for enhanced clipboard support.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
30 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include "lisp.h"
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
34 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
35 #include "frame-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "select.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
37 #include "opaque.h"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
38 #include "file-coding.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
40 #include "console-msw-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
42 static int in_own_selection;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
43
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
44 /* A list of handles that we must release. Not accessible from Lisp. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
45 static Lisp_Object Vhandle_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
46
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
47 void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
48 mswindows_handle_destroyclipboard (void)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
49 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
50 /* We also receive a destroy message when we call EmptyClipboard() and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
51 we already own it. In this case we don't want to call
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
52 handle_selection_clear() because it will remove what we're trying
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
53 to add! */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
54 if (!in_own_selection)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
55 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
56 /* We own the clipboard and someone else wants it. Delete our
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
57 cached copy of the clipboard contents so we'll ask for it from
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
58 Windows again when someone does a paste, and destroy any memory
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
59 objects we hold on the clipboard that are not in the list of types
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
60 that Windows will delete itself. */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
61 mswindows_destroy_selection (QCLIPBOARD);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
62 handle_selection_clear (QCLIPBOARD);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
63 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
64 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
65
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
66 static int
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
67 mswindows_empty_clipboard (void)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
68 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
69 int retval;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
70
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
71 in_own_selection = 1;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
72 retval = EmptyClipboard ();
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
73 in_own_selection = 0;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
74 return retval;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
75 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
76
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
77 /* Test if this is an X symbol that we understand */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
78 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
79 x_sym_p (Lisp_Object value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
80 {
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
81 if (NILP (value) || FIXNUMP (value))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
82 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
83
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
84 /* Check for some of the X symbols */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
85 if (EQ (value, QSTRING)) return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
86 if (EQ (value, QTEXT)) return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
87 if (EQ (value, QCOMPOUND_TEXT)) return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
88
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
89 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
90 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
91
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
92 /* This converts a Lisp symbol to an MS-Windows clipboard format.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
93 We have symbols for all predefined clipboard formats, but that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
94 doesn't mean we support them all ;-)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
95 The name of this function is actually a lie - it also knows about
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
96 integers and strings... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
97 static UINT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
98 symbol_to_ms_cf (Lisp_Object value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
100 /* If it's NIL, we're in trouble. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
101 if (NILP (value)) return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
102
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
103 /* If it's an integer, assume it's a format ID */
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
104 if (FIXNUMP (value)) return (UINT) (XFIXNUM (value));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
105
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
106 /* If it's a string, register the format(!) */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
107 if (STRINGP (value))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
108 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
109 Extbyte *valext;
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
110 valext = LISP_STRING_TO_TSTR (value);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
111 return qxeRegisterClipboardFormat (valext);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
112 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
113
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
114 /* Check for Windows clipboard format symbols */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
115 if (EQ (value, QCF_TEXT)) return CF_TEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
116 if (EQ (value, QCF_BITMAP)) return CF_BITMAP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
117 if (EQ (value, QCF_METAFILEPICT)) return CF_METAFILEPICT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
118 if (EQ (value, QCF_SYLK)) return CF_SYLK;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
119 if (EQ (value, QCF_DIF)) return CF_DIF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
120 if (EQ (value, QCF_TIFF)) return CF_TIFF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
121 if (EQ (value, QCF_OEMTEXT)) return CF_OEMTEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
122 if (EQ (value, QCF_DIB)) return CF_DIB;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
123 #ifdef CF_DIBV5
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
124 if (EQ (value, QCF_DIBV5)) return CF_DIBV5;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
125 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
126 if (EQ (value, QCF_PALETTE)) return CF_PALETTE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
127 if (EQ (value, QCF_PENDATA)) return CF_PENDATA;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
128 if (EQ (value, QCF_RIFF)) return CF_RIFF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
129 if (EQ (value, QCF_WAVE)) return CF_WAVE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
130 if (EQ (value, QCF_UNICODETEXT)) return CF_UNICODETEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
131 if (EQ (value, QCF_ENHMETAFILE)) return CF_ENHMETAFILE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
132 if (EQ (value, QCF_HDROP)) return CF_HDROP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
133 if (EQ (value, QCF_LOCALE)) return CF_LOCALE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
134 if (EQ (value, QCF_OWNERDISPLAY)) return CF_OWNERDISPLAY;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
135 if (EQ (value, QCF_DSPTEXT)) return CF_DSPTEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
136 if (EQ (value, QCF_DSPBITMAP)) return CF_DSPBITMAP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
137 if (EQ (value, QCF_DSPMETAFILEPICT)) return CF_DSPMETAFILEPICT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
138 if (EQ (value, QCF_DSPENHMETAFILE)) return CF_DSPENHMETAFILE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
139
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
140 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
141 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
142
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
143 /* This converts an MS-Windows clipboard format to its corresponding
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
144 Lisp symbol, or a Lisp integer otherwise. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
145 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
146 ms_cf_to_symbol (UINT format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
147 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
148 switch (format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
149 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
150 case CF_TEXT: return QCF_TEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
151 case CF_BITMAP: return QCF_BITMAP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
152 case CF_METAFILEPICT: return QCF_METAFILEPICT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
153 case CF_SYLK: return QCF_SYLK;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
154 case CF_DIF: return QCF_DIF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
155 case CF_TIFF: return QCF_TIFF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
156 case CF_OEMTEXT: return QCF_OEMTEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
157 case CF_DIB: return QCF_DIB;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
158 #ifdef CF_DIBV5
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
159 case CF_DIBV5: return QCF_DIBV5;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
160 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
161 case CF_PALETTE: return QCF_PALETTE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
162 case CF_PENDATA: return QCF_PENDATA;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
163 case CF_RIFF: return QCF_RIFF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
164 case CF_WAVE: return QCF_WAVE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
165 case CF_UNICODETEXT: return QCF_UNICODETEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
166 case CF_ENHMETAFILE: return QCF_ENHMETAFILE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
167 case CF_HDROP: return QCF_HDROP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
168 case CF_LOCALE: return QCF_LOCALE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
169 case CF_OWNERDISPLAY: return QCF_OWNERDISPLAY;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
170 case CF_DSPTEXT: return QCF_DSPTEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
171 case CF_DSPBITMAP: return QCF_DSPBITMAP;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
172 case CF_DSPMETAFILEPICT: return QCF_DSPMETAFILEPICT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
173 case CF_DSPENHMETAFILE: return QCF_DSPENHMETAFILE;
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
174 default: return make_fixnum ((int) format);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
175 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
176 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
178 /* Test if the specified clipboard format is auto-released by the OS. If
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
179 not, we must remember the handle on Vhandle_alist, and free it if
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
180 the clipboard is emptied or if we set data with the same format. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
181 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
182 cf_is_autofreed (UINT format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
183 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
184 switch (format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
185 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
186 /* This list comes from the SDK documentation */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
187 case CF_DSPENHMETAFILE:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
188 case CF_DSPMETAFILEPICT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
189 case CF_ENHMETAFILE:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
190 case CF_METAFILEPICT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
191 case CF_BITMAP:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
192 case CF_DSPBITMAP:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
193 case CF_PALETTE:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
194 case CF_DIB:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
195 #ifdef CF_DIBV5
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
196 case CF_DIBV5:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
197 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
198 case CF_DSPTEXT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
199 case CF_OEMTEXT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
200 case CF_TEXT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
201 case CF_UNICODETEXT:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
202 return TRUE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
203
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
204 default:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
205 return FALSE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
206 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
207 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
208
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
209 /* Do protocol to assert ourself as a selection owner.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
210
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
211 Under mswindows, we:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
212
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
213 * Only set the clipboard if (eq selection-name 'CLIPBOARD)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
214
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
215 * Check if an X atom name has been passed. If so, convert to CF_TEXT
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
216 (or CF_UNICODETEXT) remembering to perform LF -> CR-LF conversion.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
217
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
218 * Otherwise assume the data is formatted appropriately for the data type
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
219 that was passed.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
220
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
221 Then set the clipboard as necessary.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
222 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
223 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
224 mswindows_own_selection (Lisp_Object selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
225 Lisp_Object selection_value,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
226 Lisp_Object how_to_add,
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 442
diff changeset
227 Lisp_Object selection_type,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1726
diff changeset
228 int UNUSED (owned_p))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
229 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
230 HGLOBAL hValue = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
231 UINT cfType;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
232 int is_X_type = FALSE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
233 Lisp_Object cfObject;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
234 Lisp_Object data = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
235 int size;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
236 void *src, *dst;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
237 struct frame *f = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
239 /* Only continue if we're trying to set the clipboard - mswindows doesn't
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
240 use the same selection model as X */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
241 if (!EQ (selection_name, QCLIPBOARD))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
242 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
243
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
244 /* If this is one of the X-style atom name symbols, or NIL, convert it
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
245 as appropriate */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
246 if (NILP (selection_type) || x_sym_p (selection_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
247 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
248 /* Should COMPOUND_TEXT map to CF_UNICODETEXT? */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
249 if (XEUNICODE_P)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
250 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
251 cfType = CF_UNICODETEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
252 cfObject = QCF_UNICODETEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
253 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
254 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
255 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
256 cfType = CF_TEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
257 cfObject = QCF_TEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
258 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
259 is_X_type = TRUE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
260 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
261 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
262 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
263 cfType = symbol_to_ms_cf (selection_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
264
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
265 /* Only continue if we can figure out a clipboard type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
266 if (!cfType)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
267 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
268
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
269 cfObject = selection_type;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
270 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
271
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
272 /* Convert things appropriately */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
273 data = select_convert_out (selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
274 cfObject,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
275 selection_value);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
277 if (NILP (data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
278 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
279
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
280 if (CONSP (data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
281 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
282 if (!EQ (XCAR (data), cfObject))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
283 cfType = symbol_to_ms_cf (XCAR (data));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
284
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
285 if (!cfType)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
286 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
287
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
288 data = XCDR (data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
289 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
290
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
291 /* We support opaque or string values, but we only mention string
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
292 values for now...
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
293 #### where do the opaque objects come from? currently they're not
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
294 allowed to be exported to the lisp level! */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
295 if (!OPAQUEP (data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
296 && !STRINGP (data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
297 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
298
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
299 /* Find the frame */
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
300 f = selected_frame ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
301
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
302 /* Open the clipboard */
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
303 if (!OpenClipboard (FRAME_MSWINDOWS_HANDLE (f)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
306 /* Obtain the data */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
307 if (OPAQUEP (data))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
308 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
309 src = XOPAQUE_DATA (data);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
310 size = XOPAQUE_SIZE (data);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
311 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
312 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
313 /* we do NOT append a zero byte. we don't know whether we're dealing
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
314 with regular text, unicode text, binary data, etc. */
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 800
diff changeset
315 TO_EXTERNAL_FORMAT (LISP_STRING, data, MALLOC, (src, size),
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
316 Qbinary);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
317
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
318 /* Allocate memory */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
319 hValue = GlobalAlloc (GMEM_DDESHARE | GMEM_MOVEABLE, size);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
320
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
321 if (!hValue)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 CloseClipboard ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
324
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
325 xfree (src);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
326 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
327 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
328
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
329 dst = GlobalLock (hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
330
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
331 if (!dst)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
332 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
333 GlobalFree (hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
334 CloseClipboard ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
335
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
336 xfree (src);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
339
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
340 memcpy (dst, src, size);
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
341 xfree (src);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
342
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
343 GlobalUnlock (hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
344
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
345 /* Empty the clipboard if we're replacing everything */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
346 if (NILP (how_to_add) || EQ (how_to_add, Qreplace_all))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
348 if (!mswindows_empty_clipboard ())
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
350 CloseClipboard ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
351 GlobalFree (hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
352
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
353 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
354 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
356
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
357 /* Append is currently handled in select.el; perhaps this should change,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
358 but it only really makes sense for ordinary text in any case... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
359
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
360 SetClipboardData (cfType, hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
361
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
362 if (!cf_is_autofreed (cfType))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
363 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
364 Lisp_Object alist_elt = Qnil, rest;
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
365 Lisp_Object cfType_int = make_fixnum (cfType);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
366
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
367 /* First check if there's an element in the alist for this type
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
368 already. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
369 alist_elt = assq_no_quit (cfType_int, Vhandle_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
370
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
371 /* Add an element to the alist */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
372 Vhandle_alist = Fcons (Fcons (cfType_int, make_opaque_ptr (hValue)),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
373 Vhandle_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
374
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
375 if (!NILP (alist_elt))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
376 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
377 /* Free the original handle */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
378 GlobalFree ((HGLOBAL) get_opaque_ptr (XCDR (alist_elt)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
379
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
380 /* Remove the original one (adding first makes life easier,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
381 because we don't have to special case this being the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
382 first element) */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
383 for (rest = Vhandle_alist; !NILP (rest); rest = Fcdr (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
384 if (EQ (cfType_int, Fcar (XCDR (rest))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
385 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
386 XCDR (rest) = Fcdr (XCDR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
387 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
388 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
389 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
390 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
391
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 CloseClipboard ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
393
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
394 /* #### Should really return a time, though this is because of the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
395 X model (by the looks of things) */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
396 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 static Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
400 mswindows_available_selection_types (Lisp_Object selection_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
401 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
402 Lisp_Object types = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
403 UINT format = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
404 struct frame *f = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
405
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
406 if (!EQ (selection_name, QCLIPBOARD))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
407 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
408
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
409 /* Find the frame */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
410 f = selected_frame ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
411
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
412 /* Open the clipboard */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
413 if (!OpenClipboard (FRAME_MSWINDOWS_HANDLE (f)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
414 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
415
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
416 /* [[ ajh - Should there be an unwind-protect handler around this?
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
417 It could (well it probably won't, but it's always better to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
418 be safe) run out of memory and leave the clipboard open... ]]
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
419 -- xemacs in general makes no provisions for out-of-memory errors;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
420 we will probably just crash. fixing this is a huge amount of work,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
421 so don't bother protecting in this case. --ben */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
422
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
423 while ((format = EnumClipboardFormats (format)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
424 types = Fcons (ms_cf_to_symbol (format), types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
425
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
426 /* Close it */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
427 CloseClipboard ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
428
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
429 return types;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
430 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
431
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
432 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
433 mswindows_register_selection_data_type (Lisp_Object type_name)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
435 /* Type already checked in select.c */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
436 Extbyte *nameext;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
437 UINT format;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
438
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
439 nameext = LISP_STRING_TO_TSTR (type_name);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
440 format = qxeRegisterClipboardFormat (nameext);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
441
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
442 if (format)
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
443 return make_fixnum ((int) format);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
444 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
445 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
446 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
447
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
448 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
449 mswindows_selection_data_type_name (Lisp_Object type_id)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
450 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
451 UINT format;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
452 Extbyte *namebuf;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
453 int numchars;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
454
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
455 /* If it's an integer, convert to a symbol if appropriate */
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
456 if (FIXNUMP (type_id))
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
457 type_id = ms_cf_to_symbol (XFIXNUM (type_id));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
458
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
459 /* If this is a symbol, return it */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
460 if (SYMBOLP (type_id))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
461 return type_id;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
462
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
463 /* Find the format code */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
464 format = symbol_to_ms_cf (type_id);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
465
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
466 if (!format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
467 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
468
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
469 /* Microsoft, stupid Microsoft */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
470 {
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 771
diff changeset
471 int size = 64;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
472 do
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
473 {
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 771
diff changeset
474 size *= 2;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
475 namebuf = alloca_extbytes (size * XETCHAR_SIZE);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
476 numchars = qxeGetClipboardFormatName (format, namebuf, size);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
477 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
478 while (numchars >= size - 1);
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
479 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
480
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
481 if (numchars)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
482 return build_tstr_string (namebuf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
487 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
488 mswindows_get_foreign_selection (Lisp_Object selection_symbol,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
489 Lisp_Object target_type)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
491 HGLOBAL hValue = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
492 UINT cfType;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
493 Lisp_Object cfObject = Qnil, ret = Qnil, value = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
494 int is_X_type = FALSE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
495 int size;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
496 void *data;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
497 struct frame *f = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
498 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
499
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
500 /* Only continue if we're trying to read the clipboard - mswindows doesn't
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
501 use the same selection model as X */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
502 if (!EQ (selection_symbol, QCLIPBOARD))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
503 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
505 /* If this is one of the X-style atom name symbols, or NIL, convert it
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
506 as appropriate */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
507 if (NILP (target_type) || x_sym_p (target_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
508 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
509 /* Should COMPOUND_TEXT map to CF_UNICODETEXT? */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
510 if (XEUNICODE_P)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
511 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
512 cfType = CF_UNICODETEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
513 cfObject = QCF_UNICODETEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
514 }
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
515 else
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
516 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
517 cfType = CF_TEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
518 cfObject = QCF_TEXT;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
519 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
520 is_X_type = TRUE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
521 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
522 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
523 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
524 cfType = symbol_to_ms_cf (target_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
525
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
526 /* Only continue if we can figure out a clipboard type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
527 if (!cfType)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
528 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
529
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
530 cfObject = ms_cf_to_symbol (cfType);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
531 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
532
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
533 /* Find the frame */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
534 f = selected_frame ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
535
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
536 /* Open the clipboard */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
537 if (!OpenClipboard (FRAME_MSWINDOWS_HANDLE (f)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
540 /* Read the clipboard */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
541 hValue = GetClipboardData (cfType);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
542
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
543 if (!hValue)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
545 CloseClipboard ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
547 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
548 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
550 /* Find the data */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
551 size = GlobalSize (hValue);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
552 data = GlobalLock (hValue);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
554 if (!data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
555 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
556 CloseClipboard ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
557
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
558 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
561 /* Place it in a Lisp string */
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 2286
diff changeset
562 ret = make_extstring ((Extbyte *) data, size, Qbinary);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
563
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
564 GlobalUnlock (data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 CloseClipboard ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
567 GCPRO1 (ret);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
569 /* Convert this to the appropriate type. If we can't find anything,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
570 then we return a cons of the form (DATA-TYPE . STRING), where the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
571 string contains the raw binary data. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
572 value = select_convert_in (selection_symbol,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
573 cfObject,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
574 ret);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
576 UNGCPRO;
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
577
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
578 if (NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
579 return Fcons (cfObject, ret);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
580 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
581 return value;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1726
diff changeset
585 mswindows_disown_selection (Lisp_Object selection,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1726
diff changeset
586 Lisp_Object UNUSED (timeval))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 if (EQ (selection, QCLIPBOARD))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
589 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
590 BOOL success = OpenClipboard (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
591 if (success)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
592 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
593 /* the caller calls handle_selection_clear(). */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
594 success = mswindows_empty_clipboard ();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
595 /* Close it regardless of whether empty worked. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
596 if (!CloseClipboard ())
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
597 success = FALSE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
598 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
599
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
600 /* #### return success ? Qt : Qnil; */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
601 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
602 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
603
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
604 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
605 mswindows_destroy_selection (Lisp_Object selection)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
606 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
607 /* Do nothing if this isn't for the clipboard. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
608 if (!EQ (selection, QCLIPBOARD))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
609 return;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
610
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
611 /* Right. We need to delete everything in Vhandle_alist. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
612 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
613 LIST_LOOP_2 (elt, Vhandle_alist)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
614 GlobalFree ((HGLOBAL) get_opaque_ptr (XCDR (elt)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
615 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
616
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
617 Vhandle_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
618 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
619
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
620 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
621 mswindows_selection_exists_p (Lisp_Object selection,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
622 Lisp_Object selection_type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
623 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
624 /* We used to be picky about the format, but now we support anything. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
625 if (EQ (selection, QCLIPBOARD))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
626 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
627 if (NILP (selection_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
628 return CountClipboardFormats () ? Qt : Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
629 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
630 return IsClipboardFormatAvailable (symbol_to_ms_cf (selection_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
631 ? Qt : Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
632 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
633 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
634 return Qnil;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 console_type_create_select_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 CONSOLE_HAS_METHOD (mswindows, own_selection);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 CONSOLE_HAS_METHOD (mswindows, disown_selection);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
647 CONSOLE_HAS_METHOD (mswindows, selection_exists_p);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 CONSOLE_HAS_METHOD (mswindows, get_foreign_selection);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
649 CONSOLE_HAS_METHOD (mswindows, available_selection_types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
650 CONSOLE_HAS_METHOD (mswindows, register_selection_data_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
651 CONSOLE_HAS_METHOD (mswindows, selection_data_type_name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 syms_of_select_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 vars_of_select_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
662 /* Initialise Vhandle_alist */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
663 Vhandle_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
664 staticpro (&Vhandle_alist);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
666
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
667 void
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
668 init_select_mswindows (void)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
669 {
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
670 /* Reinitialise Vhandle_alist */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
671 /* #### Why do we need to do this? Somehow I added this. --ben */
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
672 Vhandle_alist = Qnil;
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 593
diff changeset
673 }