annotate src/w16select.c @ 23323:0800a4f84757

(underlying_strftime): Set the buffer to a nonzero value before calling strftime, and check to see whether strftime has set the buffer to zero. This lets us distinguish between an empty buffer and an error. I'm installing this patch by hand now; it will be superseded whenever the glibc sources are propagated back to fsf.org.
author Paul Eggert <eggert@twinsun.com>
date Fri, 25 Sep 1998 21:40:23 +0000
parents ecc4641bf00a
children 4817632d3428
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
2 Copyright (C) 1996, 1997 Free Software Foundation.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
3
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
5
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
9 any later version.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
10
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
15
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
20
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
21 /* These functions work by using WinOldAp interface. WinOldAp
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
22 (WINOLDAP.MOD) is a Microsoft Windows extension supporting
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
23 "old" (character-mode) application access to Dynamic Data Exchange,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
24 menus, and the Windows clipboard. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
25
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
26 /* Written by Dale P. Smith <dpsm@en.com> */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
27 /* Adapted to DJGPP v1 by Eli Zaretskii <eliz@is.elta.co.il> */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
28
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
29 #ifdef MSDOS
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
30
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
31 #include <config.h>
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
32 #include <string.h>
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
33 #include <dpmi.h>
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
34 #include <go32.h>
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
35 #include <sys/farptr.h>
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
36 #include "lisp.h"
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
37 #include "dispextern.h" /* frame.h seems to want this */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
38 #include "frame.h" /* Need this to get the X window of selected_frame */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
39 #include "blockinput.h"
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
40 #include "buffer.h"
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
41 #include "charset.h"
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
42 #include "coding.h"
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
43
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
44 /* If ever some function outside this file will need to call any
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
45 clipboard-related function, the following prototypes and constants
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
46 should be put on a header file. Right now, nobody else uses them. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
47
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
48 #define CF_TEXT 0x01
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
49 #define CF_BITMAP 0x02
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
50 #define CF_METAFILE 0x03
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
51 #define CF_SYLK 0x04
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
52 #define CF_DIF 0x05
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
53 #define CF_TIFF 0x06
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
54 #define CF_OEMTEXT 0x07
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
55 #define CF_DIBBITMAP 0x08
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
56 #define CF_WINWRITE 0x80
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
57 #define CF_DSPTEXT 0x81
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
58 #define CF_DSPBITMAP 0x82
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
59
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
60 unsigned identify_winoldap_version (void);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
61 unsigned open_clipboard (void);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
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
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
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
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
66 unsigned close_clipboard (void);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
67 unsigned clipboard_compact (unsigned);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
68
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
69 Lisp_Object QCLIPBOARD, QPRIMARY;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
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
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
78 /* The segment address and the size of the buffer in low
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
79 memory used to move data between us and WinOldAp module. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
80
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
81 static struct {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
82 unsigned long size;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
83 unsigned short rm_segment;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
84 } clipboard_xfer_buf_info;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
85
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
86 /* Emulation of `__dpmi_int' and friends for DJGPP v1.x */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
87
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
88 #if __DJGPP__ < 2
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
89
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
90 typedef _go32_dpmi_registers __dpmi_regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
91 #define __tb _go32_info_block.linear_address_of_transfer_buffer
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
92 #define _dos_ds _go32_info_block.selector_for_linear_memory
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
93
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
94 static int
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
95 __dpmi_int (intno, regs)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
96 int intno;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
97 __dpmi_regs *regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
98 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
99 regs->x.ss = regs->x.sp = regs->x.flags = 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
100 return _go32_dpmi_simulate_int (intno, regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
101 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
102
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
103 #endif /* __DJGPP__ < 2 */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
104
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
105 /* C functions to access the Windows 3.1x clipboard from DOS apps.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
106
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
107 The information was obtained from the Microsoft Knowledge Base,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
108 article Q67675 and can be found at:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
109 http://www.microsoft.com/kb/developr/win_dk/q67675.htm */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
110
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
111 /* See also Ralf Brown's Interrupt List.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
112
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
113 I also seem to remember reading about this in Dr. Dobbs Journal a
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
114 while ago, but if you knew my memory... :-)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
115
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
116 Dale P. Smith <dpsm@en.com> */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
117
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
118 /* Return the WinOldAp support version, or 0x1700 if not supported. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
119 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
120 identify_winoldap_version ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
121 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
122 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
123
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
124 /* Calls Int 2Fh/AX=1700h
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
125 Return Values AX == 1700H: Clipboard functions not available
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
126 <> 1700H: AL = Major version number
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
127 AH = Minor version number */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
128 regs.x.ax = 0x1700;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
129 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
130 return regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
131 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
132
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
133 /* Open the clipboard, return non-zero if successfull. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
134 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
135 open_clipboard ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
136 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
137 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
138
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
139 /* Is WINOLDAP supported? */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
140 /* Kludge alert!! If WinOldAp is not supported, we return a 0,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
141 which is the same as ``Clipboard already open''. Currently,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
142 this is taken as an error by all the functions that use
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
143 `open_clipboard', but if somebody someday will use that ``open''
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
144 clipboard, they will have interesting time debugging it... */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
145 if (identify_winoldap_version () == 0x1700)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
146 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
147
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
148 /* Calls Int 2Fh/AX=1701h
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
149 Return Values AX == 0: Clipboard already open
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
150 <> 0: Clipboard opened */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
151 regs.x.ax = 0x1701;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
152 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
153 return regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
154 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
155
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
156 /* Empty clipboard, return non-zero if successfull. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
157 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
158 empty_clipboard ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
159 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
160 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
161
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
162 /* Calls Int 2Fh/AX=1702h
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
163 Return Values AX == 0: Error occurred
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
164 <> 0: OK, Clipboard emptied */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
165 regs.x.ax = 0x1702;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
166 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
167 return regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
168 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
169
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
170 /* Ensure we have a buffer in low memory with enough memory for data
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
171 of size WANT_SIZE. Return the linear address of the buffer. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
172 static unsigned long
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
173 alloc_xfer_buf (want_size)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
174 unsigned want_size;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
175 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
176 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
177
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
178 /* If the usual DJGPP transfer buffer is large enough, use that. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
179 if (want_size <= _go32_info_block.size_of_transfer_buffer)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
180 return __tb & 0xfffff;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
181
21709
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
182 /* 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
183 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
184 if (want_size > 0xfffff)
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
185 return 0;
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
186
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
187 /* Need size rounded up to the nearest paragraph, and in
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
188 paragraph units (1 paragraph = 16 bytes). */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
189 clipboard_xfer_buf_info.size = (want_size + 15) >> 4;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
190
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
191 /* The NT DPMI host crashes us if we free DOS memory via the
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
192 DPMI service. Work around by calling DOS allocate/free block. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
193 regs.h.ah = 0x48;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
194 regs.x.bx = clipboard_xfer_buf_info.size;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
195 __dpmi_int (0x21, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
196 if (regs.x.flags & 1)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
197 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
198 clipboard_xfer_buf_info.size = 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
199 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
200 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
201
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
202 clipboard_xfer_buf_info.rm_segment = regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
203 return (((int)clipboard_xfer_buf_info.rm_segment) << 4) & 0xfffff;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
204 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
205
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
206 /* Free our clipboard buffer. We always free it after use, because
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
207 keeping it leaves less free conventional memory for subprocesses.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
208 The clipboard buffer tends to be large in size, because for small
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
209 clipboard data sizes we use the DJGPP transfer buffer. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
210 static void
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
211 free_xfer_buf ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
212 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
213 /* If the size is 0, we used DJGPP transfer buffer, so don't free. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
214 if (clipboard_xfer_buf_info.size)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
215 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
216 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
217
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
218 /* The NT DPMI host crashes us if we free DOS memory via
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
219 the DPMI service. Work around by calling DOS free block. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
220 regs.h.ah = 0x49;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
221 regs.x.es = clipboard_xfer_buf_info.rm_segment;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
222 __dpmi_int (0x21, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
223 clipboard_xfer_buf_info.size = 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
224 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
225 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
226
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
227 /* Copy data into the clipboard, return non-zero if successfull. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
228 unsigned
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
229 set_clipboard_data (Format, Data, Size, Raw)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
230 unsigned Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
231 void *Data;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
232 unsigned Size;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
233 int Raw;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
234 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
235 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
236 unsigned truelen;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
237 unsigned long xbuf_addr, buf_offset;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
238 unsigned char *dp = Data, *dstart = dp;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
239
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
240 if (Format != CF_OEMTEXT)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
241 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
242
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
243 /* 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
244 standard CF_OEMTEXT clipboard format uses CRLF line endings,
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
245 while Emacs uses just LF internally). */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
246 truelen = Size;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
247
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
248 if (!Raw)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
249 {
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
250 /* avoid using strchr because it recomputes the length everytime */
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
251 while ((dp = memchr (dp, '\n', Size - (dp - dstart))) != 0)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
252 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
253 truelen++;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
254 dp++;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
255 }
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
256 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
257
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
258 if (clipboard_compact (truelen) < truelen)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
259 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
260
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
261 if ((xbuf_addr = alloc_xfer_buf (truelen)) == 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
262 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
263
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
264 /* 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
265 if (Raw)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
266 dosmemput (Data, truelen, __tb);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
267 else
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
268 {
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
269 dp = Data;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
270 buf_offset = xbuf_addr;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
271 _farsetsel (_dos_ds);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
272 while (Size--)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
273 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
274 if (*dp == '\n')
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
275 _farnspokeb (buf_offset++, '\r');
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
276 _farnspokeb (buf_offset++, *dp++);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
277 }
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
278 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
279
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
280 /* Calls Int 2Fh/AX=1703h with:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
281 DX = WinOldAp-Supported Clipboard format
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
282 ES:BX = Pointer to data
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
283 SI:CX = Size of data in bytes
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
284 Return Values AX == 0: Error occurred
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
285 <> 0: OK. Data copied into the Clipboard. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
286 regs.x.ax = 0x1703;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
287 regs.x.dx = Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
288 regs.x.si = truelen >> 16;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
289 regs.x.cx = truelen & 0xffff;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
290 regs.x.es = xbuf_addr >> 4;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
291 regs.x.bx = xbuf_addr & 15;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
292 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
293
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
294 free_xfer_buf ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
295
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
296 return regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
297 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
298
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
299 /* Return the size of the clipboard data of format FORMAT. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
300 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
301 get_clipboard_data_size (Format)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
302 unsigned Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
303 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
304 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
305
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
306 /* Calls Int 2Fh/AX=1704h with:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
307 DX = WinOldAp-Supported Clipboard format
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
308 Return Values DX:AX == Size of the data in bytes, including any
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
309 headers.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
310 == 0 If data in this format is not in
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
311 the clipboard. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
312 regs.x.ax = 0x1704;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
313 regs.x.dx = Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
314 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
315 return ( (((unsigned)regs.x.dx) << 16) | regs.x.ax);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
316 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
317
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
318 /* Get clipboard data, return its length.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
319 Warning: this doesn't check whether DATA has enough space to hold
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
320 SIZE bytes. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
321 unsigned
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
322 get_clipboard_data (Format, Data, Size, Raw)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
323 unsigned Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
324 void *Data;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
325 unsigned Size;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
326 int Raw;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
327 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
328 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
329 unsigned datalen = 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
330 unsigned long xbuf_addr;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
331 unsigned char *dp = Data;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
332
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
333 if (Format != CF_OEMTEXT)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
334 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
335
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
336 if (Size == 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
337 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
338
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
339 if ((xbuf_addr = alloc_xfer_buf (Size)) == 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
340 return 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
341
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
342 /* Calls Int 2Fh/AX=1705h with:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
343 DX = WinOldAp-Supported Clipboard format
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
344 ES:BX = Pointer to data buffer to hold data
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
345 Return Values AX == 0: Error occurred (or data in this format is not
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
346 in the clipboard)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
347 <> 0: OK */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
348 regs.x.ax = 0x1705;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
349 regs.x.dx = Format;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
350 regs.x.es = xbuf_addr >> 4;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
351 regs.x.bx = xbuf_addr & 15;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
352 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
353 if (regs.x.ax != 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
354 {
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
355 /* Copy data from low memory, remove CR
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
356 characters before LF if needed. */
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
357 _farsetsel (_dos_ds);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
358 while (Size--)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
359 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
360 register unsigned char c = _farnspeekb (xbuf_addr++);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
361
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
362 if ((*dp++ = c) == '\r' && !Raw && _farnspeekb (xbuf_addr) == '\n')
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
363 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
364 dp--;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
365 *dp++ = '\n';
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
366 xbuf_addr++;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
367 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
368 /* Windows reportedly rounds up the size of clipboard data
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
369 (passed in SIZE) to a multiple of 32. We therefore bail
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
370 out when we see the first null character. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
371 else if (c == '\0')
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
372 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
373 datalen = dp - (unsigned char *)Data - 1;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
374 break;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
375 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
376 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
377 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
378
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
379 free_xfer_buf ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
380
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
381 return datalen;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
382 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
383
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
384 /* Close clipboard, return non-zero if successfull. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
385 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
386 close_clipboard ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
387 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
388 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
389
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
390 /* Calls Int 2Fh/AX=1708h
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
391 Return Values AX == 0: Error occurred
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
392 <> 0: OK */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
393 regs.x.ax = 0x1708;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
394 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
395 return regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
396 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
397
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
398 /* Compact clipboard data so that at least SIZE bytes is available. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
399 unsigned
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
400 clipboard_compact (Size)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
401 unsigned Size;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
402 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
403 __dpmi_regs regs;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
404
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
405 /* Calls Int 2Fh/AX=1709H with:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
406 SI:CX = Desired memory size in bytes.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
407 Return Values DX:AX == Number of bytes of largest block of free memory.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
408 == 0 if error or no memory */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
409 regs.x.ax = 0x1709;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
410 regs.x.si = Size >> 16;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
411 regs.x.cx = Size & 0xffff;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
412 __dpmi_int(0x2f, &regs);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
413 return ((unsigned)regs.x.dx << 16) | regs.x.ax;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
414 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
415
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
416 static char no_mem_msg[] =
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
417 "(Not enough DOS memory to put saved text into clipboard.)";
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
418
21709
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
419 DEFUN ("w16-set-clipboard-data", Fw16_set_clipboard_data, Sw16_set_clipboard_data, 1, 2, 0,
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
420 "This sets the clipboard data to the given text.")
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
421 (string, frame)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
422 Lisp_Object string, frame;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
423 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
424 int ok = 1, ok1 = 1;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
425 int nbytes;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
426 unsigned char *src, *dst = NULL;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
427 int charsets[MAX_CHARSET + 1];
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
428 int num;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
429 int no_crlf_conversion;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
430
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
431 CHECK_STRING (string, 0);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
432
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
433 if (NILP (frame))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
434 frame = Fselected_frame ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
435
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
436 CHECK_LIVE_FRAME (frame, 0);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
437 if ( !FRAME_MSDOS_P (XFRAME (frame)))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
438 goto done;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
439
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
440 BLOCK_INPUT;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
441
22904
37738fa8626a (Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents: 22749
diff changeset
442 nbytes = STRING_BYTES (XSTRING (string));
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
443 src = XSTRING (string)->data;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
444
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
445 /* Since we are now handling multilingual text, we must consider
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
446 encoding text for the clipboard. */
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
447 bzero (charsets, (MAX_CHARSET + 1) * sizeof (int));
22904
37738fa8626a (Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents: 22749
diff changeset
448 num = ((nbytes <= 1 /* Check the possibility of short cut. */
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
449 || !STRING_MULTIBYTE (string)
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
450 || nbytes == XSTRING (string)->size)
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
451 ? 0
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
452 : find_charset_in_str (src, nbytes, charsets, Qnil, 1));
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
453
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
454 if (!num || (num == 1 && charsets[CHARSET_ASCII]))
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
455 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
456 /* No multibyte character in OBJ. We need not encode it, but we
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
457 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
458 no_crlf_conversion = 0;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
459 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
460 else
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
461 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
462 /* We must encode contents of STRING according to what
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
463 clipboard-coding-system specifies. */
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
464 int bufsize;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
465 struct coding_system coding;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
466 unsigned char *htext2;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
467
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
468 if (NILP (Vnext_selection_coding_system))
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
469 Vnext_selection_coding_system = Vselection_coding_system;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
470 setup_coding_system
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
471 (Fcheck_coding_system (Vnext_selection_coding_system), &coding);
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
472 Vnext_selection_coding_system = Qnil;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
473 coding.mode |= CODING_MODE_LAST_BLOCK;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
474 Vlast_coding_system_used = coding.symbol;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
475 bufsize = encoding_buffer_size (&coding, nbytes);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
476 dst = (unsigned char *) xmalloc (bufsize);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
477 encode_coding (&coding, src, dst, nbytes, bufsize);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
478 no_crlf_conversion = 1;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
479 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
480
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
481 if (!open_clipboard ())
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
482 goto error;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
483
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
484 ok = empty_clipboard ()
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
485 && (ok1 = set_clipboard_data (CF_OEMTEXT, src, nbytes, no_crlf_conversion));
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
486
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
487 if (!no_crlf_conversion)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
488 Vlast_coding_system_used = Qraw_text;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
489 close_clipboard ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
490
21707
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
491 if (ok) goto unblock;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
492
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
493 error:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
494
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
495 ok = 0;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
496
21707
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
497 unblock:
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
498 if (dst)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
499 xfree (dst);
21707
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
500 UNBLOCK_INPUT;
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
501
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
502 /* Notify user if the text is too large to fit into DOS memory.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
503 (This will happen somewhere after 600K bytes (470K in DJGPP v1.x),
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
504 depending on user system configuration.) If we just silently
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
505 fail the function, people might wonder why their text sometimes
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
506 doesn't make it to the clipboard. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
507 if (ok1 == 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
508 {
21417
7a310ef91b2d (Fwin16_set_clipboard_data): Call message2 with 3
Karl Heuer <kwzh@gnu.org>
parents: 17960
diff changeset
509 message2 (no_mem_msg, sizeof (no_mem_msg) - 1, 0);
17960
5c31b98be973 (Fwin16_set_clipboard_data): Pass new arg to sit_for.
Richard M. Stallman <rms@gnu.org>
parents: 17451
diff changeset
510 sit_for (2, 0, 0, 1, 1);
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
511 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
512
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
513 done:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
514
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
515 return (ok ? string : Qnil);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
516 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
517
21709
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
518 DEFUN ("w16-get-clipboard-data", Fw16_get_clipboard_data, Sw16_get_clipboard_data, 0, 1, 0,
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
519 "This gets the clipboard data in text format.")
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
520 (frame)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
521 Lisp_Object frame;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
522 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
523 unsigned data_size, truelen;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
524 unsigned char *htext;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
525 Lisp_Object ret = Qnil;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
526 int no_crlf_conversion;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
527 int require_encoding = 0;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
528
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
529 if (NILP (frame))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
530 frame = Fselected_frame ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
531
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
532 CHECK_LIVE_FRAME (frame, 0);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
533 if ( !FRAME_MSDOS_P (XFRAME (frame)))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
534 goto done;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
535
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
536 BLOCK_INPUT;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
537
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
538 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
539 goto unblock;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
540
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
541 if ((data_size = get_clipboard_data_size (CF_OEMTEXT)) == 0 ||
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
542 (htext = (unsigned char *)xmalloc (data_size)) == 0)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
543 goto closeclip;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
544
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
545 /* need to know final size after '\r' chars are removed because
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
546 we can't change the string size manually, and doing an extra
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
547 copy is silly */
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
548 if ((truelen = get_clipboard_data (CF_OEMTEXT, htext, data_size, 0)) == 0)
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
549 goto closeclip;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
550
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
551 /* Do we need to decode it? */
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
552 if (
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
553 #if 1
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
554 1
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
555 #else
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
556 ! NILP (buffer_defaults.enable_multibyte_characters)
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
557 #endif
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
558 )
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
559 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
560 /* If the clipboard data contains any 8-bit Latin-1 code, we
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
561 need to decode it. */
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
562 int i;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
563
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
564 for (i = 0; i < truelen; i++)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
565 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
566 if (htext[i] >= 0x80)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
567 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
568 require_encoding = 1;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
569 break;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
570 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
571 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
572 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
573 if (require_encoding)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
574 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
575 int bufsize;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
576 unsigned char *buf;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
577 struct coding_system coding;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
578
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
579 if (NILP (Vnext_selection_coding_system))
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
580 Vnext_selection_coding_system = Vselection_coding_system;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
581 setup_coding_system
23164
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
582 (Fcheck_coding_system (Vnext_selection_coding_system), &coding);
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
583 Vnext_selection_coding_system = Qnil;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
584 coding.mode |= CODING_MODE_LAST_BLOCK;
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
585 truelen = get_clipboard_data (CF_OEMTEXT, htext, data_size, 1);
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
586 bufsize = decoding_buffer_size (&coding, truelen);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
587 buf = (unsigned char *) xmalloc (bufsize);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
588 decode_coding (&coding, htext, buf, truelen, bufsize);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
589 truelen = (coding.fake_multibyte
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
590 ? multibyte_chars_in_text (buf, coding.produced)
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
591 : coding.produced_char);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
592 ret = make_string_from_bytes ((char *) buf, truelen, coding.produced);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
593 xfree (buf);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
594 Vlast_coding_system_used = coding.symbol;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
595 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
596 else
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
597 {
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
598 ret = make_unibyte_string ((char *) htext, truelen);
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
599 Vlast_coding_system_used = Qraw_text;
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
600 }
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
601
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
602 xfree (htext);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
603
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
604 closeclip:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
605 close_clipboard ();
21707
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
606
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
607 unblock:
7b76832ac019 (Fwin16_set_clipboard_data): Call UNBLOCK_INPUT before calling sit_for.
Eli Zaretskii <eliz@gnu.org>
parents: 21417
diff changeset
608 UNBLOCK_INPUT;
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
609
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
610 done:
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
611
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
612 return (ret);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
613 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
614
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
615 /* Support checking for a clipboard selection. */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
616
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
617 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
618 0, 1, 0,
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
619 "Whether there is an owner for the given X Selection.\n\
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
620 The arg should be the name of the selection in question, typically one of\n\
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
621 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
622 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
623 For convenience, the symbol nil is the same as `PRIMARY',\n\
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
624 and t is the same as `SECONDARY'.")
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
625 (selection)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
626 Lisp_Object selection;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
627 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
628 CHECK_SYMBOL (selection, 0);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
629
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
630 /* Return nil for SECONDARY selection. For PRIMARY (or nil)
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
631 selection, check if there is some text on the kill-ring;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
632 for CLIPBOARD, check if the clipboard currently has valid
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
633 text format contents.
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
634
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
635 The test for killed text on the kill-ring emulates the Emacs
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
636 behavior on X, where killed text is also put into X selection
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
637 by the X interface code. (On MSDOS, killed text is only put
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
638 into the clipboard if we run under Windows, so we cannot check
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
639 the clipboard alone.) */
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
640 if ((EQ (selection, Qnil) || EQ (selection, QPRIMARY))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
641 && ! NILP (XSYMBOL (Fintern_soft (build_string ("kill-ring"),
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
642 Qnil))->value))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
643 return Qt;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
644
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
645 if (EQ (selection, QCLIPBOARD))
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
646 {
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
647 Lisp_Object val = Qnil;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
648
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
649 if (open_clipboard ())
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
650 {
22749
14bde44d261c (set_clipboard_data, get_clipboard_data, Fw16_set_clipboard_data,
Eli Zaretskii <eliz@gnu.org>
parents: 22729
diff changeset
651 if (get_clipboard_data_size (CF_OEMTEXT))
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
652 val = Qt;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
653 close_clipboard ();
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
654 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
655 return val;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
656 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
657 return Qnil;
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
658 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
659
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
660 void
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
661 syms_of_win16select ()
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
662 {
21709
64adf1f4d54d (alloc_xfer_buf): If want_size is more than 1MB,
Eli Zaretskii <eliz@gnu.org>
parents: 21707
diff changeset
663 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
664 defsubr (&Sw16_get_clipboard_data);
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
665 defsubr (&Sx_selection_exists_p);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
666
22904
37738fa8626a (Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents: 22749
diff changeset
667 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system,
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
668 "Coding system for communicating with other X clients.\n\
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
669 When sending or receiving text via cut_buffer, selection, and clipboard,\n\
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
670 the text is encoded or decoded by this coding system.\n\
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
671 A default value is `iso-latin-1-dos'");
22904
37738fa8626a (Fw16_set_clipboard_data, Fw16_get_clipboard_data, syms_of_win16select):
Eli Zaretskii <eliz@gnu.org>
parents: 22749
diff changeset
672 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
673
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
674 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system,
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
675 "Coding system for the next communication with other X clients.\n\
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
676 Usually, `selection-coding-system' is used for communicating with\n\
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
677 other X clients. But, if this variable is set, it is used for the\n\
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
678 next communication only. After the communication, this variable is\n\
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
679 set to nil.");
ecc4641bf00a (Vnext_selection_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 22904
diff changeset
680 Vnext_selection_coding_system = Qnil;
22729
3537e1563a66 (Vclipboard_coding_system): New variable.
Eli Zaretskii <eliz@gnu.org>
parents: 21709
diff changeset
681
17451
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
682 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
683 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
684 }
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
685
0902196df62a Initial revision
Eli Zaretskii <eliz@gnu.org>
parents:
diff changeset
686 #endif /* MSDOS */