Mercurial > emacs
annotate src/w16select.c @ 98007:883843ca3292
* verilog-mode.el (verilog-library-extensions): Enable .sv
filename extensions to call verilog-mode.
(verilog-auto, verilog-auto-inst, verilog-faq)
(verilog-submit-bug-report): Update author support URLs.
(verilog-delete-auto, verilog-auto-inout-module)
(verilog-auto-inout-comp, verilog-auto): Add AUTOINOUTCOMP for
creating complemented testbench modules. Suggested by Yishay
Belkind.
(verilog-auto-inst-port, verilog-simplify-range-expression): When
verilog-auto-inst-param-value is set, don't require a
AUTO_TEMPLATE to expand parameter substitutions. Suggested by
Yishay Belkind.
(verilog-auto-inst-param-value): Add safe variable.
(verilog-re-search-forward, verilog-re-search-backward): Fix
returning wrong search results on Emacs 22.1.
(verilog-modi-cache-results, verilog-auto): Fix warning message
about "toggling font-lock-mode."
(verilog-auto): Fix loosing font-lock on errors.
(verilog-auto-inst-param-value, verilog-mode-version)
(verilog-mode-version-date, verilog-read-inst-param-value)
(verilog-auto-inst, verilog-auto-inst-param)
(verilog-auto-inst-port, verilog-simplify-range-expression): Allow
parameters to be replaced with their values, on the expansion of
an AUTOINST with Verilog 2001 style parameter settings. Suggested
by David Rogoff.
* verilog-mode.el (verilog-beg-block-re-ordered, verilog-calc-1):
Better support for the property statement. Sometimes this keyword
introduces a statement which requires an endproperty keyword, and
sometimes it doesn't, dependening on the work before the property
word. If property is prefixed with assert, assume or cover
keyword, then the statement is ended with a ';' Otherwise,
property is like task or specify, and is followed by some number
of statements, which are ended with an endproperty keyword.
(electric-verilog-tab): Support Emacs 22.2 style handling of tab
in a highlighted region: indent each line in region according to
mode. Supply this so it works in XEmacs and older Emacs.
author | Dan Nicolaescu <dann@ics.uci.edu> |
---|---|
date | Fri, 05 Sep 2008 22:13:55 +0000 |
parents | 455b25c4ebc2 |
children | e038c1a8307c |
rev | line source |
---|---|
21709
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
1 /* 16-bit Windows Selection processing for emacs on MS-Windows |
64770
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64084
diff
changeset
|
2 Copyright (C) 1996, 1997, 2001, 2002, 2003, 2004, |
79759 | 3 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
45333 | 4 |
17451 | 5 This file is part of GNU Emacs. |
6 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91327
diff
changeset
|
7 GNU Emacs is free software: you can redistribute it and/or modify |
17451 | 8 it under the terms of the GNU General Public License as published by |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91327
diff
changeset
|
9 the Free Software Foundation, either version 3 of the License, or |
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91327
diff
changeset
|
10 (at your option) any later version. |
17451 | 11 |
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. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
91327
diff
changeset
|
18 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
17451 | 19 |
20 /* These functions work by using WinOldAp interface. WinOldAp | |
21 (WINOLDAP.MOD) is a Microsoft Windows extension supporting | |
22 "old" (character-mode) application access to Dynamic Data Exchange, | |
23 menus, and the Windows clipboard. */ | |
24 | |
25 /* Written by Dale P. Smith <dpsm@en.com> */ | |
26 /* Adapted to DJGPP v1 by Eli Zaretskii <eliz@is.elta.co.il> */ | |
27 | |
28 #ifdef MSDOS | |
29 | |
30 #include <config.h> | |
31 #include <string.h> | |
32 #include <dpmi.h> | |
33 #include <go32.h> | |
34 #include <sys/farptr.h> | |
35 #include "lisp.h" | |
36 #include "dispextern.h" /* frame.h seems to want this */ | |
37 #include "frame.h" /* Need this to get the X window of selected_frame */ | |
38 #include "blockinput.h" | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
39 #include "buffer.h" |
88351
aac41b50c875
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
43475
diff
changeset
|
40 #include "character.h" |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
41 #include "coding.h" |
45988
37913830a881
Include composite.h
Juanma Barranquero <lekktu@gmail.com>
parents:
45982
diff
changeset
|
42 #include "composite.h" |
17451 | 43 |
44 /* If ever some function outside this file will need to call any | |
45 clipboard-related function, the following prototypes and constants | |
46 should be put on a header file. Right now, nobody else uses them. */ | |
47 | |
48 #define CF_TEXT 0x01 | |
49 #define CF_BITMAP 0x02 | |
50 #define CF_METAFILE 0x03 | |
51 #define CF_SYLK 0x04 | |
52 #define CF_DIF 0x05 | |
53 #define CF_TIFF 0x06 | |
54 #define CF_OEMTEXT 0x07 | |
55 #define CF_DIBBITMAP 0x08 | |
56 #define CF_WINWRITE 0x80 | |
57 #define CF_DSPTEXT 0x81 | |
58 #define CF_DSPBITMAP 0x82 | |
59 | |
60 unsigned identify_winoldap_version (void); | |
61 unsigned open_clipboard (void); | |
62 unsigned empty_clipboard (void); | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
63 unsigned set_clipboard_data (unsigned, void *, unsigned, int); |
17451 | 64 unsigned get_clipboard_data_size (unsigned); |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
65 unsigned get_clipboard_data (unsigned, void *, unsigned, int); |
17451 | 66 unsigned close_clipboard (void); |
67 unsigned clipboard_compact (unsigned); | |
68 | |
69 Lisp_Object QCLIPBOARD, QPRIMARY; | |
70 | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
71 /* Coding system for communicating with other Windows programs via the |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
72 clipboard. */ |
22904
37738fa8626a
(Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents:
22749
diff
changeset
|
73 static Lisp_Object Vselection_coding_system; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
74 |
23164
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
75 /* Coding system for the next communicating with other Windows programs. */ |
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
76 static Lisp_Object Vnext_selection_coding_system; |
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
77 |
17451 | 78 /* The segment address and the size of the buffer in low |
79 memory used to move data between us and WinOldAp module. */ | |
80 static struct { | |
81 unsigned long size; | |
82 unsigned short rm_segment; | |
83 } clipboard_xfer_buf_info; | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
84 |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
85 /* The last text we put into the clipboard. This is used to prevent |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
86 passing back our own text from the clipboard, instead of using the |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
87 kill ring. The former is undesirable because the clipboard data |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
88 could be MULEtilated by inappropriately chosen |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
89 (next-)selection-coding-system. For this reason, we must store the |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
90 text *after* it was encoded/Unix-to-DOS-converted. */ |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
91 static unsigned char *last_clipboard_text; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
92 |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
93 /* The size of allocated storage for storing the clipboard data. */ |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
94 static size_t clipboard_storage_size; |
17451 | 95 |
96 /* Emulation of `__dpmi_int' and friends for DJGPP v1.x */ | |
97 | |
98 #if __DJGPP__ < 2 | |
99 | |
100 typedef _go32_dpmi_registers __dpmi_regs; | |
101 #define __tb _go32_info_block.linear_address_of_transfer_buffer | |
102 #define _dos_ds _go32_info_block.selector_for_linear_memory | |
103 | |
104 static int | |
105 __dpmi_int (intno, regs) | |
106 int intno; | |
107 __dpmi_regs *regs; | |
108 { | |
109 regs->x.ss = regs->x.sp = regs->x.flags = 0; | |
110 return _go32_dpmi_simulate_int (intno, regs); | |
111 } | |
112 | |
113 #endif /* __DJGPP__ < 2 */ | |
114 | |
115 /* C functions to access the Windows 3.1x clipboard from DOS apps. | |
116 | |
117 The information was obtained from the Microsoft Knowledge Base, | |
118 article Q67675 and can be found at: | |
119 http://www.microsoft.com/kb/developr/win_dk/q67675.htm */ | |
120 | |
121 /* See also Ralf Brown's Interrupt List. | |
122 | |
123 I also seem to remember reading about this in Dr. Dobbs Journal a | |
124 while ago, but if you knew my memory... :-) | |
125 | |
126 Dale P. Smith <dpsm@en.com> */ | |
127 | |
128 /* Return the WinOldAp support version, or 0x1700 if not supported. */ | |
129 unsigned | |
130 identify_winoldap_version () | |
131 { | |
132 __dpmi_regs regs; | |
133 | |
134 /* Calls Int 2Fh/AX=1700h | |
135 Return Values AX == 1700H: Clipboard functions not available | |
136 <> 1700H: AL = Major version number | |
137 AH = Minor version number */ | |
138 regs.x.ax = 0x1700; | |
139 __dpmi_int(0x2f, ®s); | |
140 return regs.x.ax; | |
141 } | |
142 | |
143 /* Open the clipboard, return non-zero if successfull. */ | |
144 unsigned | |
145 open_clipboard () | |
146 { | |
147 __dpmi_regs regs; | |
148 | |
149 /* Is WINOLDAP supported? */ | |
150 /* Kludge alert!! If WinOldAp is not supported, we return a 0, | |
151 which is the same as ``Clipboard already open''. Currently, | |
152 this is taken as an error by all the functions that use | |
153 `open_clipboard', but if somebody someday will use that ``open'' | |
154 clipboard, they will have interesting time debugging it... */ | |
155 if (identify_winoldap_version () == 0x1700) | |
156 return 0; | |
157 | |
158 /* Calls Int 2Fh/AX=1701h | |
159 Return Values AX == 0: Clipboard already open | |
160 <> 0: Clipboard opened */ | |
161 regs.x.ax = 0x1701; | |
162 __dpmi_int(0x2f, ®s); | |
163 return regs.x.ax; | |
164 } | |
165 | |
166 /* Empty clipboard, return non-zero if successfull. */ | |
167 unsigned | |
168 empty_clipboard () | |
169 { | |
170 __dpmi_regs regs; | |
45333 | 171 |
17451 | 172 /* Calls Int 2Fh/AX=1702h |
173 Return Values AX == 0: Error occurred | |
174 <> 0: OK, Clipboard emptied */ | |
175 regs.x.ax = 0x1702; | |
176 __dpmi_int(0x2f, ®s); | |
177 return regs.x.ax; | |
178 } | |
179 | |
180 /* Ensure we have a buffer in low memory with enough memory for data | |
181 of size WANT_SIZE. Return the linear address of the buffer. */ | |
182 static unsigned long | |
183 alloc_xfer_buf (want_size) | |
184 unsigned want_size; | |
185 { | |
186 __dpmi_regs regs; | |
187 | |
188 /* If the usual DJGPP transfer buffer is large enough, use that. */ | |
189 if (want_size <= _go32_info_block.size_of_transfer_buffer) | |
190 return __tb & 0xfffff; | |
191 | |
21709
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
192 /* Don't even try to allocate more than 1MB of memory: DOS cannot |
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
193 possibly handle that (it will overflow the BX register below). */ |
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
194 if (want_size > 0xfffff) |
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
195 return 0; |
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
196 |
17451 | 197 /* Need size rounded up to the nearest paragraph, and in |
198 paragraph units (1 paragraph = 16 bytes). */ | |
199 clipboard_xfer_buf_info.size = (want_size + 15) >> 4; | |
200 | |
201 /* The NT DPMI host crashes us if we free DOS memory via the | |
202 DPMI service. Work around by calling DOS allocate/free block. */ | |
203 regs.h.ah = 0x48; | |
204 regs.x.bx = clipboard_xfer_buf_info.size; | |
205 __dpmi_int (0x21, ®s); | |
206 if (regs.x.flags & 1) | |
207 { | |
208 clipboard_xfer_buf_info.size = 0; | |
209 return 0; | |
210 } | |
211 | |
212 clipboard_xfer_buf_info.rm_segment = regs.x.ax; | |
213 return (((int)clipboard_xfer_buf_info.rm_segment) << 4) & 0xfffff; | |
214 } | |
215 | |
216 /* Free our clipboard buffer. We always free it after use, because | |
217 keeping it leaves less free conventional memory for subprocesses. | |
218 The clipboard buffer tends to be large in size, because for small | |
219 clipboard data sizes we use the DJGPP transfer buffer. */ | |
220 static void | |
221 free_xfer_buf () | |
222 { | |
223 /* If the size is 0, we used DJGPP transfer buffer, so don't free. */ | |
224 if (clipboard_xfer_buf_info.size) | |
225 { | |
226 __dpmi_regs regs; | |
227 | |
228 /* The NT DPMI host crashes us if we free DOS memory via | |
229 the DPMI service. Work around by calling DOS free block. */ | |
230 regs.h.ah = 0x49; | |
231 regs.x.es = clipboard_xfer_buf_info.rm_segment; | |
232 __dpmi_int (0x21, ®s); | |
233 clipboard_xfer_buf_info.size = 0; | |
234 } | |
235 } | |
236 | |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
237 /* Copy data into the clipboard, return zero if successfull. */ |
17451 | 238 unsigned |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
239 set_clipboard_data (Format, Data, Size, Raw) |
17451 | 240 unsigned Format; |
241 void *Data; | |
242 unsigned Size; | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
243 int Raw; |
17451 | 244 { |
245 __dpmi_regs regs; | |
246 unsigned truelen; | |
247 unsigned long xbuf_addr, buf_offset; | |
248 unsigned char *dp = Data, *dstart = dp; | |
249 | |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
250 if (Format != CF_OEMTEXT) |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
251 return 3; |
17451 | 252 |
253 /* need to know final size after '\r' chars are inserted (the | |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
254 standard CF_OEMTEXT clipboard format uses CRLF line endings, |
17451 | 255 while Emacs uses just LF internally). */ |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
256 truelen = Size + 1; /* +1 for the terminating null */ |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
257 |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
258 if (!Raw) |
17451 | 259 { |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
260 /* avoid using strchr because it recomputes the length everytime */ |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
261 while ((dp = memchr (dp, '\n', Size - (dp - dstart))) != 0) |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
262 { |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
263 truelen++; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
264 dp++; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
265 } |
17451 | 266 } |
267 | |
268 if (clipboard_compact (truelen) < truelen) | |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
269 return 1; |
17451 | 270 |
271 if ((xbuf_addr = alloc_xfer_buf (truelen)) == 0) | |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
272 return 1; |
17451 | 273 |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
274 /* Move the buffer into the low memory, convert LF into CR-LF if needed. */ |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
275 if (Raw) |
24251
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
276 { |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
277 dosmemput (Data, Size, xbuf_addr); |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
278 |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
279 /* Terminate with a null, otherwise Windows does strange things |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
280 when the text size is an integral multiple of 32 bytes. */ |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
281 _farpokeb (_dos_ds, xbuf_addr + Size, '\0'); |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
282 } |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
283 else |
17451 | 284 { |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
285 dp = Data; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
286 buf_offset = xbuf_addr; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
287 _farsetsel (_dos_ds); |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
288 while (Size--) |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
289 { |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
290 /* Don't allow them to put binary data into the clipboard, since |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
291 it will cause yanked data to be truncated at the first null. */ |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
292 if (*dp == '\0') |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
293 return 2; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
294 if (*dp == '\n') |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
295 _farnspokeb (buf_offset++, '\r'); |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
296 _farnspokeb (buf_offset++, *dp++); |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
297 } |
24251
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
298 |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
299 /* Terminate with a null, otherwise Windows does strange things |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
300 when the text size is an integral multiple of 32 bytes. */ |
2394581ada26
(set_clipboard_data): Correctly null-terminate the
Eli Zaretskii <eliz@gnu.org>
parents:
24003
diff
changeset
|
301 _farnspokeb (buf_offset, '\0'); |
17451 | 302 } |
303 | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
304 /* Stash away the data we are about to put into the clipboard, so we |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
305 could later check inside get_clipboard_data whether the clipboard |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
306 still holds our data. */ |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
307 if (clipboard_storage_size < truelen) |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
308 { |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
309 clipboard_storage_size = truelen + 100; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
310 last_clipboard_text = |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
311 (char *) xrealloc (last_clipboard_text, clipboard_storage_size); |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
312 } |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
313 if (last_clipboard_text) |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
314 dosmemget (xbuf_addr, truelen, last_clipboard_text); |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
315 |
17451 | 316 /* Calls Int 2Fh/AX=1703h with: |
317 DX = WinOldAp-Supported Clipboard format | |
318 ES:BX = Pointer to data | |
319 SI:CX = Size of data in bytes | |
320 Return Values AX == 0: Error occurred | |
321 <> 0: OK. Data copied into the Clipboard. */ | |
322 regs.x.ax = 0x1703; | |
323 regs.x.dx = Format; | |
324 regs.x.si = truelen >> 16; | |
325 regs.x.cx = truelen & 0xffff; | |
326 regs.x.es = xbuf_addr >> 4; | |
327 regs.x.bx = xbuf_addr & 15; | |
328 __dpmi_int(0x2f, ®s); | |
329 | |
330 free_xfer_buf (); | |
331 | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
332 /* If the above failed, invalidate the local copy of the clipboard. */ |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
333 if (regs.x.ax == 0) |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
334 *last_clipboard_text = '\0'; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
335 |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
336 /* Zero means success, otherwise (1, 2, or 3) it's an error. */ |
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
337 return regs.x.ax > 0 ? 0 : 3; |
17451 | 338 } |
339 | |
340 /* Return the size of the clipboard data of format FORMAT. */ | |
341 unsigned | |
342 get_clipboard_data_size (Format) | |
343 unsigned Format; | |
344 { | |
345 __dpmi_regs regs; | |
346 | |
347 /* Calls Int 2Fh/AX=1704h with: | |
348 DX = WinOldAp-Supported Clipboard format | |
349 Return Values DX:AX == Size of the data in bytes, including any | |
350 headers. | |
351 == 0 If data in this format is not in | |
352 the clipboard. */ | |
353 regs.x.ax = 0x1704; | |
354 regs.x.dx = Format; | |
355 __dpmi_int(0x2f, ®s); | |
356 return ( (((unsigned)regs.x.dx) << 16) | regs.x.ax); | |
357 } | |
358 | |
359 /* Get clipboard data, return its length. | |
360 Warning: this doesn't check whether DATA has enough space to hold | |
361 SIZE bytes. */ | |
362 unsigned | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
363 get_clipboard_data (Format, Data, Size, Raw) |
17451 | 364 unsigned Format; |
365 void *Data; | |
366 unsigned Size; | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
367 int Raw; |
17451 | 368 { |
369 __dpmi_regs regs; | |
370 unsigned long xbuf_addr; | |
371 unsigned char *dp = Data; | |
372 | |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
373 if (Format != CF_OEMTEXT) |
17451 | 374 return 0; |
375 | |
376 if (Size == 0) | |
377 return 0; | |
378 | |
379 if ((xbuf_addr = alloc_xfer_buf (Size)) == 0) | |
380 return 0; | |
381 | |
382 /* Calls Int 2Fh/AX=1705h with: | |
383 DX = WinOldAp-Supported Clipboard format | |
384 ES:BX = Pointer to data buffer to hold data | |
385 Return Values AX == 0: Error occurred (or data in this format is not | |
386 in the clipboard) | |
387 <> 0: OK */ | |
388 regs.x.ax = 0x1705; | |
389 regs.x.dx = Format; | |
390 regs.x.es = xbuf_addr >> 4; | |
391 regs.x.bx = xbuf_addr & 15; | |
392 __dpmi_int(0x2f, ®s); | |
393 if (regs.x.ax != 0) | |
394 { | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
395 unsigned char null_char = '\0'; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
396 unsigned long xbuf_beg = xbuf_addr; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
397 |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
398 /* If last_clipboard_text is NULL, we don't want to slow down |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
399 the next loop by an additional test. */ |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
400 register unsigned char *lcdp = |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
401 last_clipboard_text == NULL ? &null_char : last_clipboard_text; |
45333 | 402 |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
403 /* Copy data from low memory, remove CR |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
404 characters before LF if needed. */ |
17451 | 405 _farsetsel (_dos_ds); |
406 while (Size--) | |
407 { | |
408 register unsigned char c = _farnspeekb (xbuf_addr++); | |
409 | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
410 if (*lcdp == c) |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
411 lcdp++; |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
412 |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
413 if ((*dp++ = c) == '\r' && !Raw && _farnspeekb (xbuf_addr) == '\n') |
17451 | 414 { |
415 dp--; | |
416 *dp++ = '\n'; | |
417 xbuf_addr++; | |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
418 if (*lcdp == '\n') |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
419 lcdp++; |
17451 | 420 } |
421 /* Windows reportedly rounds up the size of clipboard data | |
24428
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
422 (passed in SIZE) to a multiple of 32, and removes trailing |
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
423 spaces from each line without updating SIZE. We therefore |
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
424 bail out when we see the first null character. */ |
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
425 else if (c == '\0') |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
426 break; |
17451 | 427 } |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
428 |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
429 /* If the text in clipboard is identical to what we put there |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
430 last time set_clipboard_data was called, pretend there's no |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
431 data in the clipboard. This is so we don't pass our own text |
24428
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
432 from the clipboard (which might be troublesome if the killed |
3d10131927a6
(get_clipboard_data): Always stop at the first null byte.
Eli Zaretskii <eliz@gnu.org>
parents:
24318
diff
changeset
|
433 text includes null characters). */ |
24260
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
434 if (last_clipboard_text && |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
435 xbuf_addr - xbuf_beg == (long)(lcdp - last_clipboard_text)) |
bd3ce96bc7eb
(last_clipboard_text, clipboard_storage_size): New
Eli Zaretskii <eliz@gnu.org>
parents:
24258
diff
changeset
|
436 dp = (unsigned char *)Data + 1; |
17451 | 437 } |
438 | |
439 free_xfer_buf (); | |
440 | |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
441 return (unsigned) (dp - (unsigned char *)Data - 1); |
17451 | 442 } |
443 | |
444 /* Close clipboard, return non-zero if successfull. */ | |
445 unsigned | |
446 close_clipboard () | |
447 { | |
448 __dpmi_regs regs; | |
449 | |
450 /* Calls Int 2Fh/AX=1708h | |
451 Return Values AX == 0: Error occurred | |
452 <> 0: OK */ | |
453 regs.x.ax = 0x1708; | |
454 __dpmi_int(0x2f, ®s); | |
455 return regs.x.ax; | |
456 } | |
457 | |
458 /* Compact clipboard data so that at least SIZE bytes is available. */ | |
459 unsigned | |
460 clipboard_compact (Size) | |
461 unsigned Size; | |
462 { | |
463 __dpmi_regs regs; | |
464 | |
465 /* Calls Int 2Fh/AX=1709H with: | |
466 SI:CX = Desired memory size in bytes. | |
467 Return Values DX:AX == Number of bytes of largest block of free memory. | |
468 == 0 if error or no memory */ | |
469 regs.x.ax = 0x1709; | |
470 regs.x.si = Size >> 16; | |
471 regs.x.cx = Size & 0xffff; | |
472 __dpmi_int(0x2f, ®s); | |
473 return ((unsigned)regs.x.dx << 16) | regs.x.ax; | |
474 } | |
475 | |
476 static char no_mem_msg[] = | |
477 "(Not enough DOS memory to put saved text into clipboard.)"; | |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
478 static char binary_msg[] = |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
479 "(Binary characters in saved text; clipboard data not set.)"; |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
480 static char system_error_msg[] = |
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
481 "(Clipboard interface failure; clipboard data not set.)"; |
17451 | 482 |
21709
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
483 DEFUN ("w16-set-clipboard-data", Fw16_set_clipboard_data, Sw16_set_clipboard_data, 1, 2, 0, |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
484 doc: /* This sets the clipboard data to the given text. */) |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
485 (string, frame) |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
486 Lisp_Object string, frame; |
17451 | 487 { |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
488 unsigned ok = 1, put_status = 0; |
45333 | 489 int nbytes, charset_info, no_crlf_conversion; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
490 unsigned char *src, *dst = NULL; |
17451 | 491 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39584
diff
changeset
|
492 CHECK_STRING (string); |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
493 |
17451 | 494 if (NILP (frame)) |
495 frame = Fselected_frame (); | |
496 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39584
diff
changeset
|
497 CHECK_LIVE_FRAME (frame); |
17451 | 498 if ( !FRAME_MSDOS_P (XFRAME (frame))) |
499 goto done; | |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
500 |
17451 | 501 BLOCK_INPUT; |
502 | |
97869
455b25c4ebc2
(Fw16_set_clipboard_data): Don't encode text if clipboard is unavailable.
Eli Zaretskii <eliz@gnu.org>
parents:
97651
diff
changeset
|
503 if (!open_clipboard ()) |
455b25c4ebc2
(Fw16_set_clipboard_data): Don't encode text if clipboard is unavailable.
Eli Zaretskii <eliz@gnu.org>
parents:
97651
diff
changeset
|
504 goto error; |
455b25c4ebc2
(Fw16_set_clipboard_data): Don't encode text if clipboard is unavailable.
Eli Zaretskii <eliz@gnu.org>
parents:
97651
diff
changeset
|
505 |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
45988
diff
changeset
|
506 nbytes = SBYTES (string); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
45988
diff
changeset
|
507 src = SDATA (string); |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
508 |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
509 /* Do we need to encode this text? */ |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
510 for (dst = src; dst < src + nbytes; dst++) |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
511 { |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
512 if (*dst == '\0' || *dst >= 0x80) |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
513 break; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
514 } |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
515 if (dst >= src + nbytes) |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
516 { |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
517 /* No multibyte characters in text. We need not encode it, but we |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
518 will have to convert it to DOS CR-LF style. */ |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
519 no_crlf_conversion = 0; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
520 Vlast_coding_system_used = Qraw_text; |
97869
455b25c4ebc2
(Fw16_set_clipboard_data): Don't encode text if clipboard is unavailable.
Eli Zaretskii <eliz@gnu.org>
parents:
97651
diff
changeset
|
521 dst = NULL; /* so we don't try to free a random pointer */ |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
522 } |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
523 else |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
524 { |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
525 /* We must encode contents of STRING according to what |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
526 clipboard-coding-system specifies. */ |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
527 int bufsize; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
528 struct coding_system coding; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
529 unsigned char *htext2; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
530 Lisp_Object coding_system = |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
531 NILP (Vnext_selection_coding_system) ? |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
532 Vselection_coding_system : Vnext_selection_coding_system; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
533 |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
534 setup_coding_system (Fcheck_coding_system (coding_system), &coding); |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
535 coding.dst_bytes = nbytes * 4; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
536 coding.destination = (unsigned char *) xmalloc (coding.dst_bytes); |
23164
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
537 Vnext_selection_coding_system = Qnil; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
538 coding.mode |= CODING_MODE_LAST_BLOCK; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
539 dst = coding.destination; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
540 encode_coding_object (&coding, string, 0, 0, |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
541 SCHARS (string), nbytes, Qnil); |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
542 no_crlf_conversion = 1; |
24257
7507c0552393
(Fw16_set_clipboard_data): When the text needs to be
Eli Zaretskii <eliz@gnu.org>
parents:
24251
diff
changeset
|
543 nbytes = coding.produced; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
544 Vlast_coding_system_used = CODING_ID_NAME (coding.id); |
24258 | 545 src = dst; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
546 } |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
547 |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
548 ok = empty_clipboard () |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
549 && ((put_status |
24258 | 550 = set_clipboard_data (CF_OEMTEXT, src, nbytes, no_crlf_conversion)) |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
551 == 0); |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
552 |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
553 if (!no_crlf_conversion) |
17451 | 554 close_clipboard (); |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
555 |
21707
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
556 if (ok) goto unblock; |
17451 | 557 |
558 error: | |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
559 |
17451 | 560 ok = 0; |
561 | |
21707
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
562 unblock: |
95481
4390d64d3328
Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents:
94963
diff
changeset
|
563 xfree (dst); |
21707
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
564 UNBLOCK_INPUT; |
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
565 |
17451 | 566 /* Notify user if the text is too large to fit into DOS memory. |
567 (This will happen somewhere after 600K bytes (470K in DJGPP v1.x), | |
568 depending on user system configuration.) If we just silently | |
569 fail the function, people might wonder why their text sometimes | |
570 doesn't make it to the clipboard. */ | |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
571 if (put_status) |
17451 | 572 { |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
573 switch (put_status) |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
574 { |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
575 case 1: |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
576 message2 (no_mem_msg, sizeof (no_mem_msg) - 1, 0); |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
577 break; |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
578 case 2: |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
579 message2 (binary_msg, sizeof (binary_msg) - 1, 0); |
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
580 break; |
30900
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
581 case 3: |
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
582 message2 (system_error_msg, sizeof (system_error_msg) - 1, 0); |
2bec1c202b13
(set_clipboard_data): If there's not enough memory
Eli Zaretskii <eliz@gnu.org>
parents:
29179
diff
changeset
|
583 break; |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
584 } |
74183
727f68fa1f38
(Fw16_set_clipboard_data): Fix the call to sit_for as per the calling sequence
Eli Zaretskii <eliz@gnu.org>
parents:
68651
diff
changeset
|
585 sit_for (make_number (2), 0, 2); |
17451 | 586 } |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
587 |
17451 | 588 done: |
589 | |
24003
5048f069091e
(set_clipboard_data): Terminate the text with a null
Eli Zaretskii <eliz@gnu.org>
parents:
23875
diff
changeset
|
590 return (ok && put_status == 0 ? string : Qnil); |
17451 | 591 } |
592 | |
21709
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
593 DEFUN ("w16-get-clipboard-data", Fw16_get_clipboard_data, Sw16_get_clipboard_data, 0, 1, 0, |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
594 doc: /* This gets the clipboard data in text format. */) |
17451 | 595 (frame) |
596 Lisp_Object frame; | |
597 { | |
598 unsigned data_size, truelen; | |
97869
455b25c4ebc2
(Fw16_set_clipboard_data): Don't encode text if clipboard is unavailable.
Eli Zaretskii <eliz@gnu.org>
parents:
97651
diff
changeset
|
599 unsigned char *htext = NULL; |
17451 | 600 Lisp_Object ret = Qnil; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
601 int no_crlf_conversion, require_decoding = 0; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
602 |
17451 | 603 if (NILP (frame)) |
604 frame = Fselected_frame (); | |
605 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39584
diff
changeset
|
606 CHECK_LIVE_FRAME (frame); |
17451 | 607 if ( !FRAME_MSDOS_P (XFRAME (frame))) |
608 goto done; | |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
609 |
17451 | 610 BLOCK_INPUT; |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
611 |
17451 | 612 if (!open_clipboard ()) |
21707
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
613 goto unblock; |
17451 | 614 |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
615 if ((data_size = get_clipboard_data_size (CF_OEMTEXT)) == 0 || |
17451 | 616 (htext = (unsigned char *)xmalloc (data_size)) == 0) |
617 goto closeclip; | |
618 | |
619 /* need to know final size after '\r' chars are removed because | |
620 we can't change the string size manually, and doing an extra | |
621 copy is silly */ | |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
622 if ((truelen = get_clipboard_data (CF_OEMTEXT, htext, data_size, 0)) == 0) |
17451 | 623 goto closeclip; |
624 | |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
625 /* Do we need to decode it? */ |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
626 { |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
627 /* If the clipboard data contains any 8-bit Latin-1 code, we |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
628 need to decode it. */ |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
629 int i; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
630 |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
631 for (i = 0; i < truelen; i++) |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
632 { |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
633 if (htext[i] >= 0x80) |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
634 { |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
635 require_decoding = 1; |
43460
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
636 break; |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
637 } |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
638 } |
aa52a9cea9f8
(Fw16_set_clipboard_data): Run pre-write-conversion
Eli Zaretskii <eliz@gnu.org>
parents:
41940
diff
changeset
|
639 } |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
640 if (require_decoding) |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
641 { |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
642 int bufsize; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
643 unsigned char *buf; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
644 struct coding_system coding; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
645 Lisp_Object coding_system = Vnext_selection_coding_system; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
646 |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
647 truelen = get_clipboard_data (CF_OEMTEXT, htext, data_size, 1); |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
648 if (NILP (coding_system)) |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
649 coding_system = Vselection_coding_system; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
650 setup_coding_system (Fcheck_coding_system (coding_system), &coding); |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
651 coding.source = htext; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
652 coding.mode |= CODING_MODE_LAST_BLOCK; |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
653 /* We explicitly disable composition handling because selection |
45982
864289635b41
(Fw16_get_clipboard_data): Disable composition handling.
Kenichi Handa <handa@m17n.org>
parents:
45333
diff
changeset
|
654 data should not contain any composition sequence. */ |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
655 coding.mode &= CODING_ANNOTATION_MASK; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
656 decode_coding_object (&coding, Qnil, 0, 0, truelen, truelen, Qt); |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
657 ret = coding.dst_object; |
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
658 Vlast_coding_system_used = CODING_ID_NAME (coding.id); |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
659 } |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
660 else |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
661 { |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
662 ret = make_unibyte_string ((char *) htext, truelen); |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
663 Vlast_coding_system_used = Qraw_text; |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
664 } |
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
665 |
17451 | 666 xfree (htext); |
97651
62ec1a5d873b
(Fw16_set_clipboard_data, Fw16_get_clipboard_data): Adjust for changes in
Eli Zaretskii <eliz@gnu.org>
parents:
95481
diff
changeset
|
667 Vnext_selection_coding_system = Qnil; |
17451 | 668 |
669 closeclip: | |
670 close_clipboard (); | |
21707
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
671 |
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
672 unblock: |
7b76832ac019
(Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents:
21417
diff
changeset
|
673 UNBLOCK_INPUT; |
45333 | 674 |
17451 | 675 done: |
45333 | 676 |
17451 | 677 return (ret); |
678 } | |
679 | |
680 /* Support checking for a clipboard selection. */ | |
681 | |
682 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p, | |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
683 0, 1, 0, |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
684 doc: /* Whether there is an owner for the given X Selection. |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
685 The arg should be the name of the selection in question, typically one of |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
686 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
687 \(Those are literal upper-case symbol names, since that's what X expects.) |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
688 For convenience, the symbol nil is the same as `PRIMARY', |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
689 and t is the same as `SECONDARY'. */) |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
690 (selection) |
17451 | 691 Lisp_Object selection; |
692 { | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39584
diff
changeset
|
693 CHECK_SYMBOL (selection); |
17451 | 694 |
695 /* Return nil for SECONDARY selection. For PRIMARY (or nil) | |
696 selection, check if there is some text on the kill-ring; | |
697 for CLIPBOARD, check if the clipboard currently has valid | |
698 text format contents. | |
699 | |
700 The test for killed text on the kill-ring emulates the Emacs | |
701 behavior on X, where killed text is also put into X selection | |
702 by the X interface code. (On MSDOS, killed text is only put | |
703 into the clipboard if we run under Windows, so we cannot check | |
704 the clipboard alone.) */ | |
705 if ((EQ (selection, Qnil) || EQ (selection, QPRIMARY)) | |
39584
6145836b795c
Use SYMBOL_VALUE/ SET_SYMBOL_VALUE macros instead of accessing
Gerd Moellmann <gerd@gnu.org>
parents:
30900
diff
changeset
|
706 && ! NILP (SYMBOL_VALUE (Fintern_soft (build_string ("kill-ring"), |
6145836b795c
Use SYMBOL_VALUE/ SET_SYMBOL_VALUE macros instead of accessing
Gerd Moellmann <gerd@gnu.org>
parents:
30900
diff
changeset
|
707 Qnil)))) |
17451 | 708 return Qt; |
709 | |
710 if (EQ (selection, QCLIPBOARD)) | |
711 { | |
712 Lisp_Object val = Qnil; | |
713 | |
714 if (open_clipboard ()) | |
715 { | |
22749
14bde44d261c
(set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents:
22729
diff
changeset
|
716 if (get_clipboard_data_size (CF_OEMTEXT)) |
17451 | 717 val = Qt; |
718 close_clipboard (); | |
719 } | |
720 return val; | |
721 } | |
722 return Qnil; | |
723 } | |
724 | |
45333 | 725 void |
17451 | 726 syms_of_win16select () |
727 { | |
21709
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
728 defsubr (&Sw16_set_clipboard_data); |
64adf1f4d54d
(alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents:
21707
diff
changeset
|
729 defsubr (&Sw16_get_clipboard_data); |
17451 | 730 defsubr (&Sx_selection_exists_p); |
731 | |
22904
37738fa8626a
(Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents:
22749
diff
changeset
|
732 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system, |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
733 doc: /* Coding system for communicating with other X clients. |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
734 When sending or receiving text via cut_buffer, selection, and clipboard, |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
735 the text is encoded or decoded by this coding system. |
47878
be195e2a4bfb
(syms_of_win16select): Fix docstring for `selection-coding-system'.
Juanma Barranquero <lekktu@gmail.com>
parents:
47279
diff
changeset
|
736 The default value is `iso-latin-1-dos'. */); |
be195e2a4bfb
(syms_of_win16select): Fix docstring for `selection-coding-system'.
Juanma Barranquero <lekktu@gmail.com>
parents:
47279
diff
changeset
|
737 Vselection_coding_system = intern ("iso-latin-1-dos"); |
23164
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
738 |
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
739 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system, |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
740 doc: /* Coding system for the next communication with other X clients. |
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
741 Usually, `selection-coding-system' is used for communicating with |
47279
06197dc11581
(syms_of_win16select): Fix spacing.
Juanma Barranquero <lekktu@gmail.com>
parents:
46370
diff
changeset
|
742 other X clients. But, if this variable is set, it is used for the |
06197dc11581
(syms_of_win16select): Fix spacing.
Juanma Barranquero <lekktu@gmail.com>
parents:
46370
diff
changeset
|
743 next communication only. After the communication, this variable is |
41940
63819c5d6049
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
744 set to nil. */); |
23164
ecc4641bf00a
(Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
22904
diff
changeset
|
745 Vnext_selection_coding_system = Qnil; |
22729
3537e1563a66
(Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
21709
diff
changeset
|
746 |
17451 | 747 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY); |
748 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD); | |
749 } | |
750 | |
751 #endif /* MSDOS */ | |
52401 | 752 |
753 /* arch-tag: 085a22c8-7324-436e-a6da-102464ce95d8 | |
754 (do not change this comment) */ |