(fix_submap_inheritance, get_keyelt, store_in_keymap,
[bpt/emacs.git] / src / xselect.c
CommitLineData
2408b3a1 1/* X Selection processing for Emacs.
4a2f9c6a 2 Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation.
ede4db72
RS
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
3b7ad313
EN
18the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
ede4db72 20
c6c5df7f 21
ede4db72
RS
22/* Rewritten by jwz */
23
18160b98 24#include <config.h>
ede4db72
RS
25#include "lisp.h"
26#include "xterm.h" /* for all of the X includes */
7da64e5c
RS
27#include "dispextern.h" /* frame.h seems to want this */
28#include "frame.h" /* Need this to get the X window of selected_frame */
9ac0d9e0 29#include "blockinput.h"
5faa9b45 30#include "buffer.h"
e6c7c988
KH
31#include "charset.h"
32#include "coding.h"
7da64e5c 33
ede4db72
RS
34#define CUT_BUFFER_SUPPORT
35
ede4db72
RS
36Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
37 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
38 QATOM_PAIR;
39
e6c7c988
KH
40Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
41
ede4db72
RS
42#ifdef CUT_BUFFER_SUPPORT
43Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3,
44 QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7;
45#endif
46
8f4f023f
RS
47static Lisp_Object Vx_lost_selection_hooks;
48static Lisp_Object Vx_sent_selection_hooks;
2584c9ec
KH
49/* Coding system for communicating with other X clients via cutbuffer,
50 selection, and clipboard. */
51static Lisp_Object Vclipboard_coding_system;
ede4db72
RS
52
53/* If this is a smaller number than the max-request-size of the display,
54 emacs will use INCR selection transfer when the selection is larger
55 than this. The max-request-size is usually around 64k, so if you want
56 emacs to use incremental selection transfers when the selection is
57 smaller than that, set this. I added this mostly for debugging the
8f4f023f 58 incremental transfer stuff, but it might improve server performance. */
ede4db72
RS
59#define MAX_SELECTION_QUANTUM 0xFFFFFF
60
c3498e64
JB
61#ifdef HAVE_X11R4
62#define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
63#else
64#define SELECTION_QUANTUM(dpy) (((dpy)->max_request_size << 2) - 100)
65#endif
ede4db72 66
7da64e5c 67/* The timestamp of the last input event Emacs received from the X server. */
29674445
KH
68/* Defined in keyboard.c. */
69extern unsigned long last_event_timestamp;
ede4db72
RS
70
71/* This is an association list whose elements are of the form
118bd841
RS
72 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
73 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
74 SELECTION-VALUE is the value that emacs owns for that selection.
ede4db72 75 It may be any kind of Lisp object.
118bd841 76 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
ede4db72 77 as a cons of two 16-bit numbers (making a 32 bit time.)
118bd841
RS
78 FRAME is the frame for which we made the selection.
79 If there is an entry in this alist, then it can be assumed that Emacs owns
ede4db72
RS
80 that selection.
81 The only (eq) parts of this list that are visible from Lisp are the
8f4f023f
RS
82 selection-values. */
83static Lisp_Object Vselection_alist;
ede4db72
RS
84
85/* This is an alist whose CARs are selection-types (whose names are the same
86 as the names of X Atoms) and whose CDRs are the names of Lisp functions to
87 call to convert the given Emacs selection value to a string representing
88 the given selection type. This is for Lisp-level extension of the emacs
8f4f023f
RS
89 selection handling. */
90static Lisp_Object Vselection_converter_alist;
ede4db72
RS
91
92/* If the selection owner takes too long to reply to a selection request,
8f4f023f
RS
93 we give up on it. This is in milliseconds (0 = no timeout.) */
94static int x_selection_timeout;
ede4db72
RS
95\f
96/* Utility functions */
97
98static void lisp_data_to_selection_data ();
99static Lisp_Object selection_data_to_lisp_data ();
100static Lisp_Object x_get_window_property_as_lisp_data ();
101
ede4db72
RS
102/* This converts a Lisp symbol to a server Atom, avoiding a server
103 roundtrip whenever possible. */
104
105static Atom
5c3a351a
RS
106symbol_to_x_atom (dpyinfo, display, sym)
107 struct x_display_info *dpyinfo;
ede4db72
RS
108 Display *display;
109 Lisp_Object sym;
110{
111 Atom val;
112 if (NILP (sym)) return 0;
113 if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
114 if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
115 if (EQ (sym, QSTRING)) return XA_STRING;
116 if (EQ (sym, QINTEGER)) return XA_INTEGER;
117 if (EQ (sym, QATOM)) return XA_ATOM;
5c3a351a
RS
118 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
119 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
120 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
e6c7c988 121 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
5c3a351a
RS
122 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
123 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
124 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
125 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP;
126 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS;
127 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL;
ede4db72
RS
128#ifdef CUT_BUFFER_SUPPORT
129 if (EQ (sym, QCUT_BUFFER0)) return XA_CUT_BUFFER0;
130 if (EQ (sym, QCUT_BUFFER1)) return XA_CUT_BUFFER1;
131 if (EQ (sym, QCUT_BUFFER2)) return XA_CUT_BUFFER2;
132 if (EQ (sym, QCUT_BUFFER3)) return XA_CUT_BUFFER3;
133 if (EQ (sym, QCUT_BUFFER4)) return XA_CUT_BUFFER4;
134 if (EQ (sym, QCUT_BUFFER5)) return XA_CUT_BUFFER5;
135 if (EQ (sym, QCUT_BUFFER6)) return XA_CUT_BUFFER6;
136 if (EQ (sym, QCUT_BUFFER7)) return XA_CUT_BUFFER7;
137#endif
138 if (!SYMBOLP (sym)) abort ();
139
140#if 0
141 fprintf (stderr, " XInternAtom %s\n", (char *) XSYMBOL (sym)->name->data);
142#endif
143 BLOCK_INPUT;
144 val = XInternAtom (display, (char *) XSYMBOL (sym)->name->data, False);
145 UNBLOCK_INPUT;
146 return val;
147}
148
149
150/* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
151 and calls to intern whenever possible. */
152
153static Lisp_Object
5c3a351a
RS
154x_atom_to_symbol (dpyinfo, display, atom)
155 struct x_display_info *dpyinfo;
ede4db72
RS
156 Display *display;
157 Atom atom;
158{
159 char *str;
160 Lisp_Object val;
161 if (! atom) return Qnil;
7da64e5c
RS
162 switch (atom)
163 {
164 case XA_PRIMARY:
165 return QPRIMARY;
166 case XA_SECONDARY:
167 return QSECONDARY;
168 case XA_STRING:
169 return QSTRING;
170 case XA_INTEGER:
171 return QINTEGER;
172 case XA_ATOM:
173 return QATOM;
ede4db72 174#ifdef CUT_BUFFER_SUPPORT
7da64e5c
RS
175 case XA_CUT_BUFFER0:
176 return QCUT_BUFFER0;
177 case XA_CUT_BUFFER1:
178 return QCUT_BUFFER1;
179 case XA_CUT_BUFFER2:
180 return QCUT_BUFFER2;
181 case XA_CUT_BUFFER3:
182 return QCUT_BUFFER3;
183 case XA_CUT_BUFFER4:
184 return QCUT_BUFFER4;
185 case XA_CUT_BUFFER5:
186 return QCUT_BUFFER5;
187 case XA_CUT_BUFFER6:
188 return QCUT_BUFFER6;
189 case XA_CUT_BUFFER7:
190 return QCUT_BUFFER7;
ede4db72 191#endif
7da64e5c
RS
192 }
193
5c3a351a 194 if (atom == dpyinfo->Xatom_CLIPBOARD)
7da64e5c 195 return QCLIPBOARD;
5c3a351a 196 if (atom == dpyinfo->Xatom_TIMESTAMP)
7da64e5c 197 return QTIMESTAMP;
5c3a351a 198 if (atom == dpyinfo->Xatom_TEXT)
7da64e5c 199 return QTEXT;
e6c7c988
KH
200 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
201 return QCOMPOUND_TEXT;
5c3a351a 202 if (atom == dpyinfo->Xatom_DELETE)
7da64e5c 203 return QDELETE;
5c3a351a 204 if (atom == dpyinfo->Xatom_MULTIPLE)
7da64e5c 205 return QMULTIPLE;
5c3a351a 206 if (atom == dpyinfo->Xatom_INCR)
7da64e5c 207 return QINCR;
5c3a351a 208 if (atom == dpyinfo->Xatom_EMACS_TMP)
7da64e5c 209 return QEMACS_TMP;
5c3a351a 210 if (atom == dpyinfo->Xatom_TARGETS)
7da64e5c 211 return QTARGETS;
5c3a351a 212 if (atom == dpyinfo->Xatom_NULL)
7da64e5c 213 return QNULL;
ede4db72
RS
214
215 BLOCK_INPUT;
216 str = XGetAtomName (display, atom);
217 UNBLOCK_INPUT;
218#if 0
219 fprintf (stderr, " XGetAtomName --> %s\n", str);
220#endif
221 if (! str) return Qnil;
222 val = intern (str);
223 BLOCK_INPUT;
0158abbc 224 /* This was allocated by Xlib, so use XFree. */
ede4db72
RS
225 XFree (str);
226 UNBLOCK_INPUT;
227 return val;
228}
8a89415e 229\f
ede4db72
RS
230/* Do protocol to assert ourself as a selection owner.
231 Update the Vselection_alist so that we can reply to later requests for
232 our selection. */
233
234static void
235x_own_selection (selection_name, selection_value)
236 Lisp_Object selection_name, selection_value;
237{
ede4db72 238 Window selecting_window = FRAME_X_WINDOW (selected_frame);
3834c318 239 Display *display = FRAME_X_DISPLAY (selected_frame);
7da64e5c 240 Time time = last_event_timestamp;
ede4db72 241 Atom selection_atom;
5c3a351a 242 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
5a499696 243 int count;
ede4db72
RS
244
245 CHECK_SYMBOL (selection_name, 0);
5c3a351a 246 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_name);
ede4db72
RS
247
248 BLOCK_INPUT;
5a499696 249 count = x_catch_errors (display);
ede4db72 250 XSetSelectionOwner (display, selection_atom, selecting_window, time);
a7b24d46 251 x_check_errors (display, "Can't set selection: %s");
5a499696 252 x_uncatch_errors (display, count);
ede4db72
RS
253 UNBLOCK_INPUT;
254
255 /* Now update the local cache */
256 {
257 Lisp_Object selection_time;
258 Lisp_Object selection_data;
259 Lisp_Object prev_value;
260
261 selection_time = long_to_cons ((unsigned long) time);
262 selection_data = Fcons (selection_name,
263 Fcons (selection_value,
118bd841
RS
264 Fcons (selection_time,
265 Fcons (Fselected_frame (), Qnil))));
ede4db72
RS
266 prev_value = assq_no_quit (selection_name, Vselection_alist);
267
268 Vselection_alist = Fcons (selection_data, Vselection_alist);
269
270 /* If we already owned the selection, remove the old selection data.
271 Perhaps we should destructively modify it instead.
272 Don't use Fdelq as that may QUIT. */
273 if (!NILP (prev_value))
274 {
275 Lisp_Object rest; /* we know it's not the CAR, so it's easy. */
276 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
277 if (EQ (prev_value, Fcar (XCONS (rest)->cdr)))
278 {
279 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
280 break;
281 }
282 }
283 }
284}
285\f
286/* Given a selection-name and desired type, look up our local copy of
287 the selection value and convert it to the type.
288 The value is nil or a string.
289 This function is used both for remote requests
7da64e5c 290 and for local x-get-selection-internal.
ede4db72
RS
291
292 This calls random Lisp code, and may signal or gc. */
293
294static Lisp_Object
295x_get_local_selection (selection_symbol, target_type)
296 Lisp_Object selection_symbol, target_type;
297{
298 Lisp_Object local_value;
299 Lisp_Object handler_fn, value, type, check;
300 int count;
301
302 local_value = assq_no_quit (selection_symbol, Vselection_alist);
303
304 if (NILP (local_value)) return Qnil;
305
306 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
307 if (EQ (target_type, QTIMESTAMP))
308 {
309 handler_fn = Qnil;
310 value = XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car;
311 }
312#if 0
313 else if (EQ (target_type, QDELETE))
314 {
315 handler_fn = Qnil;
316 Fx_disown_selection_internal
317 (selection_symbol,
318 XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car);
319 value = QNULL;
320 }
321#endif
322
323#if 0 /* #### MULTIPLE doesn't work yet */
324 else if (CONSP (target_type)
325 && XCONS (target_type)->car == QMULTIPLE)
326 {
9d2d1dd8
KH
327 Lisp_Object pairs;
328 int size;
ede4db72 329 int i;
9d2d1dd8
KH
330 pairs = XCONS (target_type)->cdr;
331 size = XVECTOR (pairs)->size;
ede4db72
RS
332 /* If the target is MULTIPLE, then target_type looks like
333 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
334 We modify the second element of each pair in the vector and
335 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
336 */
337 for (i = 0; i < size; i++)
338 {
9d2d1dd8
KH
339 Lisp_Object pair;
340 pair = XVECTOR (pairs)->contents [i];
ede4db72
RS
341 XVECTOR (pair)->contents [1]
342 = x_get_local_selection (XVECTOR (pair)->contents [0],
343 XVECTOR (pair)->contents [1]);
344 }
345 return pairs;
346 }
347#endif
348 else
349 {
350 /* Don't allow a quit within the converter.
351 When the user types C-g, he would be surprised
352 if by luck it came during a converter. */
353 count = specpdl_ptr - specpdl;
354 specbind (Qinhibit_quit, Qt);
355
356 CHECK_SYMBOL (target_type, 0);
357 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
1eb4d468
RS
358 if (!NILP (handler_fn))
359 value = call3 (handler_fn,
360 selection_symbol, target_type,
361 XCONS (XCONS (local_value)->cdr)->car);
362 else
363 value = Qnil;
ede4db72
RS
364 unbind_to (count, Qnil);
365 }
366
367 /* Make sure this value is of a type that we could transmit
368 to another X client. */
a87ed99c 369
ede4db72
RS
370 check = value;
371 if (CONSP (value)
372 && SYMBOLP (XCONS (value)->car))
373 type = XCONS (value)->car,
374 check = XCONS (value)->cdr;
375
376 if (STRINGP (check)
377 || VECTORP (check)
378 || SYMBOLP (check)
7da64e5c 379 || INTEGERP (check)
ede4db72
RS
380 || NILP (value))
381 return value;
a87ed99c 382 /* Check for a value that cons_to_long could handle. */
ede4db72 383 else if (CONSP (check)
7da64e5c
RS
384 && INTEGERP (XCONS (check)->car)
385 && (INTEGERP (XCONS (check)->cdr)
ede4db72
RS
386 ||
387 (CONSP (XCONS (check)->cdr)
7da64e5c 388 && INTEGERP (XCONS (XCONS (check)->cdr)->car)
ede4db72
RS
389 && NILP (XCONS (XCONS (check)->cdr)->cdr))))
390 return value;
391 else
392 return
393 Fsignal (Qerror,
a87ed99c 394 Fcons (build_string ("invalid data returned by selection-conversion function"),
ede4db72
RS
395 Fcons (handler_fn, Fcons (value, Qnil))));
396}
397\f
398/* Subroutines of x_reply_selection_request. */
399
5d0ba25b 400/* Send a SelectionNotify event to the requestor with property=None,
ede4db72
RS
401 meaning we were unable to do what they wanted. */
402
403static void
404x_decline_selection_request (event)
405 struct input_event *event;
406{
407 XSelectionEvent reply;
408 reply.type = SelectionNotify;
409 reply.display = SELECTION_EVENT_DISPLAY (event);
5d0ba25b 410 reply.requestor = SELECTION_EVENT_REQUESTOR (event);
ede4db72
RS
411 reply.selection = SELECTION_EVENT_SELECTION (event);
412 reply.time = SELECTION_EVENT_TIME (event);
413 reply.target = SELECTION_EVENT_TARGET (event);
414 reply.property = None;
415
416 BLOCK_INPUT;
5d0ba25b 417 XSendEvent (reply.display, reply.requestor, False, 0L,
7ffb2841 418 (XEvent *) &reply);
5c3a351a 419 XFlush (reply.display);
ede4db72
RS
420 UNBLOCK_INPUT;
421}
422
423/* This is the selection request currently being processed.
424 It is set to zero when the request is fully processed. */
425static struct input_event *x_selection_current_request;
426
427/* Used as an unwind-protect clause so that, if a selection-converter signals
2a1a4c9d 428 an error, we tell the requester that we were unable to do what they wanted
ede4db72
RS
429 before we throw to top-level or go into the debugger or whatever. */
430
431static Lisp_Object
432x_selection_request_lisp_error (ignore)
433 Lisp_Object ignore;
434{
435 if (x_selection_current_request != 0)
436 x_decline_selection_request (x_selection_current_request);
437 return Qnil;
438}
439\f
d1f21a66
RS
440
441/* This stuff is so that INCR selections are reentrant (that is, so we can
442 be servicing multiple INCR selection requests simultaneously.) I haven't
443 actually tested that yet. */
444
445/* Keep a list of the property changes that are awaited. */
446
447struct prop_location
448{
449 int identifier;
450 Display *display;
451 Window window;
452 Atom property;
453 int desired_state;
454 int arrived;
455 struct prop_location *next;
456};
457
458static struct prop_location *expect_property_change ();
459static void wait_for_property_change ();
460static void unexpect_property_change ();
461static int waiting_for_other_props_on_window ();
462
463static int prop_location_identifier;
464
465static Lisp_Object property_change_reply;
466
467static struct prop_location *property_change_reply_object;
468
469static struct prop_location *property_change_wait_list;
55b2d45d
RS
470
471static Lisp_Object
472queue_selection_requests_unwind (frame)
473 Lisp_Object frame;
474{
475 FRAME_PTR f = XFRAME (frame);
476
477 if (! NILP (frame))
478 x_stop_queuing_selection_requests (FRAME_X_DISPLAY (f));
ab552306 479 return Qnil;
55b2d45d
RS
480}
481
482/* Return some frame whose display info is DPYINFO.
483 Return nil if there is none. */
484
485static Lisp_Object
486some_frame_on_display (dpyinfo)
487 struct x_display_info *dpyinfo;
488{
489 Lisp_Object list, frame;
490
491 FOR_EACH_FRAME (list, frame)
492 {
493 if (FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
494 return frame;
495 }
496
497 return Qnil;
498}
d1f21a66 499\f
ede4db72
RS
500/* Send the reply to a selection request event EVENT.
501 TYPE is the type of selection data requested.
502 DATA and SIZE describe the data to send, already converted.
503 FORMAT is the unit-size (in bits) of the data to be transmitted. */
504
505static void
506x_reply_selection_request (event, format, data, size, type)
507 struct input_event *event;
508 int format, size;
509 unsigned char *data;
510 Atom type;
511{
512 XSelectionEvent reply;
513 Display *display = SELECTION_EVENT_DISPLAY (event);
5d0ba25b 514 Window window = SELECTION_EVENT_REQUESTOR (event);
ede4db72
RS
515 int bytes_remaining;
516 int format_bytes = format/8;
517 int max_bytes = SELECTION_QUANTUM (display);
5c3a351a 518 struct x_display_info *dpyinfo = x_display_info_for_display (display);
5a499696 519 int count;
ede4db72
RS
520
521 if (max_bytes > MAX_SELECTION_QUANTUM)
522 max_bytes = MAX_SELECTION_QUANTUM;
523
524 reply.type = SelectionNotify;
525 reply.display = display;
5d0ba25b 526 reply.requestor = window;
ede4db72
RS
527 reply.selection = SELECTION_EVENT_SELECTION (event);
528 reply.time = SELECTION_EVENT_TIME (event);
529 reply.target = SELECTION_EVENT_TARGET (event);
530 reply.property = SELECTION_EVENT_PROPERTY (event);
531 if (reply.property == None)
532 reply.property = reply.target;
533
534 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
afe1529d 535 BLOCK_INPUT;
ad7f9d12 536 count = x_catch_errors (display);
ede4db72 537
ede4db72
RS
538 /* Store the data on the requested property.
539 If the selection is large, only store the first N bytes of it.
540 */
541 bytes_remaining = size * format_bytes;
542 if (bytes_remaining <= max_bytes)
543 {
544 /* Send all the data at once, with minimal handshaking. */
545#if 0
546 fprintf (stderr,"\nStoring all %d\n", bytes_remaining);
547#endif
548 XChangeProperty (display, window, reply.property, type, format,
549 PropModeReplace, data, size);
550 /* At this point, the selection was successfully stored; ack it. */
2f65feb6 551 XSendEvent (display, window, False, 0L, (XEvent *) &reply);
ede4db72
RS
552 }
553 else
554 {
555 /* Send an INCR selection. */
d1f21a66 556 struct prop_location *wait_object;
afe1529d 557 int had_errors;
55b2d45d 558 Lisp_Object frame;
ede4db72 559
55b2d45d
RS
560 frame = some_frame_on_display (dpyinfo);
561
562 /* If the display no longer has frames, we can't expect
563 to get many more selection requests from it, so don't
564 bother trying to queue them. */
565 if (!NILP (frame))
566 {
567 x_start_queuing_selection_requests (display);
568
569 record_unwind_protect (queue_selection_requests_unwind,
570 frame);
571 }
2f65feb6 572
19126e11 573 if (x_window_to_frame (dpyinfo, window)) /* #### debug */
606140dd 574 error ("Attempt to transfer an INCR to ourself!");
ede4db72
RS
575#if 0
576 fprintf (stderr, "\nINCR %d\n", bytes_remaining);
577#endif
d1f21a66
RS
578 wait_object = expect_property_change (display, window, reply.property,
579 PropertyDelete);
ede4db72 580
5c3a351a 581 XChangeProperty (display, window, reply.property, dpyinfo->Xatom_INCR,
55b2d45d
RS
582 32, PropModeReplace,
583 (unsigned char *) &bytes_remaining, 1);
ede4db72
RS
584 XSelectInput (display, window, PropertyChangeMask);
585 /* Tell 'em the INCR data is there... */
55b2d45d 586 XSendEvent (display, window, False, 0L, (XEvent *) &reply);
5c3a351a 587 XFlush (display);
afe1529d
RS
588
589 had_errors = x_had_errors_p (display);
2f65feb6 590 UNBLOCK_INPUT;
ede4db72 591
2a1a4c9d 592 /* First, wait for the requester to ack by deleting the property.
ede4db72 593 This can run random lisp code (process handlers) or signal. */
afe1529d
RS
594 if (! had_errors)
595 wait_for_property_change (wait_object);
ede4db72
RS
596
597 while (bytes_remaining)
598 {
599 int i = ((bytes_remaining < max_bytes)
600 ? bytes_remaining
601 : max_bytes);
2f65feb6
RS
602
603 BLOCK_INPUT;
604
d1f21a66
RS
605 wait_object
606 = expect_property_change (display, window, reply.property,
607 PropertyDelete);
ede4db72
RS
608#if 0
609 fprintf (stderr," INCR adding %d\n", i);
610#endif
611 /* Append the next chunk of data to the property. */
612 XChangeProperty (display, window, reply.property, type, format,
613 PropModeAppend, data, i / format_bytes);
614 bytes_remaining -= i;
615 data += i;
5c3a351a 616 XFlush (display);
afe1529d 617 had_errors = x_had_errors_p (display);
2f65feb6 618 UNBLOCK_INPUT;
ede4db72 619
afe1529d
RS
620 if (had_errors)
621 break;
622
2a1a4c9d 623 /* Now wait for the requester to ack this chunk by deleting the
ede4db72
RS
624 property. This can run random lisp code or signal.
625 */
d1f21a66 626 wait_for_property_change (wait_object);
ede4db72 627 }
2a1a4c9d 628 /* Now write a zero-length chunk to the property to tell the requester
ede4db72
RS
629 that we're done. */
630#if 0
631 fprintf (stderr," INCR done\n");
632#endif
2f65feb6 633 BLOCK_INPUT;
ede4db72
RS
634 if (! waiting_for_other_props_on_window (display, window))
635 XSelectInput (display, window, 0L);
636
637 XChangeProperty (display, window, reply.property, type, format,
638 PropModeReplace, data, 0);
639 }
afe1529d
RS
640
641 XFlush (display);
5a499696 642 x_uncatch_errors (display, count);
afe1529d 643 UNBLOCK_INPUT;
ede4db72
RS
644}
645\f
646/* Handle a SelectionRequest event EVENT.
647 This is called from keyboard.c when such an event is found in the queue. */
648
649void
650x_handle_selection_request (event)
651 struct input_event *event;
652{
653 struct gcpro gcpro1, gcpro2, gcpro3;
9d2d1dd8 654 Lisp_Object local_selection_data;
ede4db72 655 Lisp_Object selection_symbol;
9d2d1dd8
KH
656 Lisp_Object target_symbol;
657 Lisp_Object converted_selection;
ede4db72 658 Time local_selection_time;
9d2d1dd8 659 Lisp_Object successful_p;
ede4db72 660 int count;
5c3a351a
RS
661 struct x_display_info *dpyinfo
662 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event));
ede4db72 663
9d2d1dd8
KH
664 local_selection_data = Qnil;
665 target_symbol = Qnil;
666 converted_selection = Qnil;
667 successful_p = Qnil;
668
ede4db72
RS
669 GCPRO3 (local_selection_data, converted_selection, target_symbol);
670
5c3a351a
RS
671 selection_symbol = x_atom_to_symbol (dpyinfo,
672 SELECTION_EVENT_DISPLAY (event),
ede4db72
RS
673 SELECTION_EVENT_SELECTION (event));
674
675 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
ede4db72
RS
676
677 if (NILP (local_selection_data))
678 {
679 /* Someone asked for the selection, but we don't have it any more.
680 */
681 x_decline_selection_request (event);
682 goto DONE;
683 }
684
685 local_selection_time = (Time)
686 cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car);
687
688 if (SELECTION_EVENT_TIME (event) != CurrentTime
7da64e5c 689 && local_selection_time > SELECTION_EVENT_TIME (event))
ede4db72
RS
690 {
691 /* Someone asked for the selection, and we have one, but not the one
692 they're looking for.
693 */
694 x_decline_selection_request (event);
695 goto DONE;
696 }
697
698 count = specpdl_ptr - specpdl;
699 x_selection_current_request = event;
700 record_unwind_protect (x_selection_request_lisp_error, Qnil);
701
5c3a351a 702 target_symbol = x_atom_to_symbol (dpyinfo, SELECTION_EVENT_DISPLAY (event),
ede4db72
RS
703 SELECTION_EVENT_TARGET (event));
704
705#if 0 /* #### MULTIPLE doesn't work yet */
706 if (EQ (target_symbol, QMULTIPLE))
707 target_symbol = fetch_multiple_target (event);
708#endif
709
710 /* Convert lisp objects back into binary data */
711
712 converted_selection
713 = x_get_local_selection (selection_symbol, target_symbol);
714
715 if (! NILP (converted_selection))
716 {
717 unsigned char *data;
718 unsigned int size;
719 int format;
720 Atom type;
aca39f42
RS
721 int nofree;
722
2f65feb6
RS
723 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event),
724 converted_selection,
aca39f42 725 &data, &type, &size, &format, &nofree);
ede4db72
RS
726
727 x_reply_selection_request (event, format, data, size, type);
728 successful_p = Qt;
729
730 /* Indicate we have successfully processed this event. */
7da64e5c 731 x_selection_current_request = 0;
ede4db72 732
4feb31b2 733 /* Use xfree, not XFree, because lisp_data_to_selection_data
0158abbc 734 calls xmalloc itself. */
aca39f42 735 if (!nofree)
4feb31b2 736 xfree (data);
ede4db72
RS
737 }
738 unbind_to (count, Qnil);
739
740 DONE:
741
742 UNGCPRO;
743
744 /* Let random lisp code notice that the selection has been asked for. */
745 {
9d2d1dd8
KH
746 Lisp_Object rest;
747 rest = Vx_sent_selection_hooks;
ede4db72
RS
748 if (!EQ (rest, Qunbound))
749 for (; CONSP (rest); rest = Fcdr (rest))
750 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
751 }
752}
753\f
754/* Handle a SelectionClear event EVENT, which indicates that some other
755 client cleared out our previously asserted selection.
756 This is called from keyboard.c when such an event is found in the queue. */
757
758void
759x_handle_selection_clear (event)
760 struct input_event *event;
761{
762 Display *display = SELECTION_EVENT_DISPLAY (event);
763 Atom selection = SELECTION_EVENT_SELECTION (event);
764 Time changed_owner_time = SELECTION_EVENT_TIME (event);
765
766 Lisp_Object selection_symbol, local_selection_data;
767 Time local_selection_time;
5c3a351a 768 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 769
5c3a351a 770 selection_symbol = x_atom_to_symbol (dpyinfo, display, selection);
ede4db72
RS
771
772 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
773
774 /* Well, we already believe that we don't own it, so that's just fine. */
775 if (NILP (local_selection_data)) return;
776
777 local_selection_time = (Time)
778 cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car);
779
780 /* This SelectionClear is for a selection that we no longer own, so we can
781 disregard it. (That is, we have reasserted the selection since this
782 request was generated.) */
783
784 if (changed_owner_time != CurrentTime
785 && local_selection_time > changed_owner_time)
786 return;
787
788 /* Otherwise, we're really honest and truly being told to drop it.
789 Don't use Fdelq as that may QUIT;. */
790
791 if (EQ (local_selection_data, Fcar (Vselection_alist)))
792 Vselection_alist = Fcdr (Vselection_alist);
793 else
794 {
795 Lisp_Object rest;
796 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
797 if (EQ (local_selection_data, Fcar (XCONS (rest)->cdr)))
798 {
799 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
800 break;
801 }
802 }
803
804 /* Let random lisp code notice that the selection has been stolen. */
805
806 {
d1f21a66
RS
807 Lisp_Object rest;
808 rest = Vx_lost_selection_hooks;
ede4db72 809 if (!EQ (rest, Qunbound))
d1f21a66
RS
810 {
811 for (; CONSP (rest); rest = Fcdr (rest))
812 call1 (Fcar (rest), selection_symbol);
7c6b2ea4 813 prepare_menu_bars ();
d1f21a66
RS
814 redisplay_preserve_echo_area ();
815 }
ede4db72
RS
816 }
817}
818
118bd841
RS
819/* Clear all selections that were made from frame F.
820 We do this when about to delete a frame. */
821
822void
823x_clear_frame_selections (f)
824 FRAME_PTR f;
825{
826 Lisp_Object frame;
827 Lisp_Object rest;
828
90851bbe 829 XSETFRAME (frame, f);
118bd841
RS
830
831 /* Otherwise, we're really honest and truly being told to drop it.
832 Don't use Fdelq as that may QUIT;. */
833
0d199f9c
RS
834 /* Delete elements from the beginning of Vselection_alist. */
835 while (!NILP (Vselection_alist)
836 && EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist)))))))
837 {
838 /* Let random Lisp code notice that the selection has been stolen. */
839 Lisp_Object hooks, selection_symbol;
840
841 hooks = Vx_lost_selection_hooks;
842 selection_symbol = Fcar (Fcar (Vselection_alist));
843
844 if (!EQ (hooks, Qunbound))
845 {
846 for (; CONSP (hooks); hooks = Fcdr (hooks))
847 call1 (Fcar (hooks), selection_symbol);
996b804d
MB
848#if 0 /* This can crash when deleting a frame
849 from x_connection_closed. Anyway, it seems unnecessary;
850 something else should cause a redisplay. */
0d199f9c 851 redisplay_preserve_echo_area ();
996b804d 852#endif
0d199f9c
RS
853 }
854
855 Vselection_alist = Fcdr (Vselection_alist);
856 }
857
858 /* Delete elements after the beginning of Vselection_alist. */
118bd841
RS
859 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
860 if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCONS (rest)->cdr)))))))
861 {
862 /* Let random Lisp code notice that the selection has been stolen. */
863 Lisp_Object hooks, selection_symbol;
864
865 hooks = Vx_lost_selection_hooks;
0d199f9c 866 selection_symbol = Fcar (Fcar (XCONS (rest)->cdr));
118bd841
RS
867
868 if (!EQ (hooks, Qunbound))
869 {
870 for (; CONSP (hooks); hooks = Fcdr (hooks))
871 call1 (Fcar (hooks), selection_symbol);
996b804d 872#if 0 /* See above */
118bd841 873 redisplay_preserve_echo_area ();
996b804d 874#endif
118bd841
RS
875 }
876 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr);
877 break;
878 }
879}
ede4db72 880\f
ede4db72
RS
881/* Nonzero if any properties for DISPLAY and WINDOW
882 are on the list of what we are waiting for. */
883
884static int
885waiting_for_other_props_on_window (display, window)
886 Display *display;
887 Window window;
888{
889 struct prop_location *rest = property_change_wait_list;
890 while (rest)
891 if (rest->display == display && rest->window == window)
892 return 1;
893 else
894 rest = rest->next;
895 return 0;
896}
897
898/* Add an entry to the list of property changes we are waiting for.
899 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
900 The return value is a number that uniquely identifies
901 this awaited property change. */
902
d1f21a66 903static struct prop_location *
ede4db72
RS
904expect_property_change (display, window, property, state)
905 Display *display;
906 Window window;
6c070502 907 Atom property;
ede4db72
RS
908 int state;
909{
910 struct prop_location *pl
911 = (struct prop_location *) xmalloc (sizeof (struct prop_location));
2f65feb6 912 pl->identifier = ++prop_location_identifier;
ede4db72
RS
913 pl->display = display;
914 pl->window = window;
915 pl->property = property;
916 pl->desired_state = state;
917 pl->next = property_change_wait_list;
d1f21a66 918 pl->arrived = 0;
ede4db72 919 property_change_wait_list = pl;
d1f21a66 920 return pl;
ede4db72
RS
921}
922
923/* Delete an entry from the list of property changes we are waiting for.
2f65feb6 924 IDENTIFIER is the number that uniquely identifies the entry. */
ede4db72
RS
925
926static void
d1f21a66
RS
927unexpect_property_change (location)
928 struct prop_location *location;
ede4db72
RS
929{
930 struct prop_location *prev = 0, *rest = property_change_wait_list;
931 while (rest)
932 {
d1f21a66 933 if (rest == location)
ede4db72
RS
934 {
935 if (prev)
936 prev->next = rest->next;
937 else
938 property_change_wait_list = rest->next;
4feb31b2 939 xfree (rest);
ede4db72
RS
940 return;
941 }
942 prev = rest;
943 rest = rest->next;
944 }
945}
946
2f65feb6
RS
947/* Remove the property change expectation element for IDENTIFIER. */
948
949static Lisp_Object
950wait_for_property_change_unwind (identifierval)
951 Lisp_Object identifierval;
952{
c4898489
KH
953 unexpect_property_change ((struct prop_location *)
954 (XFASTINT (XCONS (identifierval)->car) << 16
955 | XFASTINT (XCONS (identifierval)->cdr)));
ab552306 956 return Qnil;
2f65feb6
RS
957}
958
ede4db72 959/* Actually wait for a property change.
2f65feb6 960 IDENTIFIER should be the value that expect_property_change returned. */
ede4db72
RS
961
962static void
d1f21a66
RS
963wait_for_property_change (location)
964 struct prop_location *location;
ede4db72 965{
2f65feb6
RS
966 int secs, usecs;
967 int count = specpdl_ptr - specpdl;
d1f21a66
RS
968 Lisp_Object tem;
969
c4898489
KH
970 tem = Fcons (Qnil, Qnil);
971 XSETFASTINT (XCONS (tem)->car, (EMACS_UINT)location >> 16);
972 XSETFASTINT (XCONS (tem)->cdr, (EMACS_UINT)location & 0xffff);
2f65feb6
RS
973
974 /* Make sure to do unexpect_property_change if we quit or err. */
d1f21a66 975 record_unwind_protect (wait_for_property_change_unwind, tem);
2f65feb6 976
ede4db72 977 XCONS (property_change_reply)->car = Qnil;
2f65feb6 978
afe1529d
RS
979 property_change_reply_object = location;
980 /* If the event we are waiting for arrives beyond here, it will set
981 property_change_reply, because property_change_reply_object says so. */
d1f21a66
RS
982 if (! location->arrived)
983 {
d1f21a66
RS
984 secs = x_selection_timeout / 1000;
985 usecs = (x_selection_timeout % 1000) * 1000;
986 wait_reading_process_input (secs, usecs, property_change_reply, 0);
987
988 if (NILP (XCONS (property_change_reply)->car))
606140dd 989 error ("Timed out waiting for property-notify event");
d1f21a66 990 }
2f65feb6
RS
991
992 unbind_to (count, Qnil);
ede4db72
RS
993}
994
995/* Called from XTread_socket in response to a PropertyNotify event. */
996
997void
998x_handle_property_notify (event)
999 XPropertyEvent *event;
1000{
1001 struct prop_location *prev = 0, *rest = property_change_wait_list;
1002 while (rest)
1003 {
1004 if (rest->property == event->atom
1005 && rest->window == event->window
1006 && rest->display == event->display
1007 && rest->desired_state == event->state)
1008 {
1009#if 0
1010 fprintf (stderr, "Saw expected prop-%s on %s\n",
1011 (event->state == PropertyDelete ? "delete" : "change"),
5c3a351a 1012 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo, event->display,
ede4db72
RS
1013 event->atom))
1014 ->name->data);
1015#endif
1016
d1f21a66
RS
1017 rest->arrived = 1;
1018
ede4db72
RS
1019 /* If this is the one wait_for_property_change is waiting for,
1020 tell it to wake up. */
d1f21a66 1021 if (rest == property_change_reply_object)
ede4db72
RS
1022 XCONS (property_change_reply)->car = Qt;
1023
1024 if (prev)
1025 prev->next = rest->next;
1026 else
1027 property_change_wait_list = rest->next;
4feb31b2 1028 xfree (rest);
ede4db72
RS
1029 return;
1030 }
1031 prev = rest;
1032 rest = rest->next;
1033 }
1034#if 0
1035 fprintf (stderr, "Saw UNexpected prop-%s on %s\n",
1036 (event->state == PropertyDelete ? "delete" : "change"),
5c3a351a
RS
1037 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo,
1038 event->display, event->atom))
ede4db72
RS
1039 ->name->data);
1040#endif
1041}
1042
1043
1044\f
1045#if 0 /* #### MULTIPLE doesn't work yet */
1046
1047static Lisp_Object
1048fetch_multiple_target (event)
1049 XSelectionRequestEvent *event;
1050{
1051 Display *display = event->display;
5d0ba25b 1052 Window window = event->requestor;
ede4db72
RS
1053 Atom target = event->target;
1054 Atom selection_atom = event->selection;
1055 int result;
1056
1057 return
1058 Fcons (QMULTIPLE,
1059 x_get_window_property_as_lisp_data (display, window, target,
1060 QMULTIPLE, selection_atom));
1061}
1062
1063static Lisp_Object
1064copy_multiple_data (obj)
1065 Lisp_Object obj;
1066{
1067 Lisp_Object vec;
1068 int i;
1069 int size;
1070 if (CONSP (obj))
1071 return Fcons (XCONS (obj)->car, copy_multiple_data (XCONS (obj)->cdr));
1072
1073 CHECK_VECTOR (obj, 0);
1074 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil);
1075 for (i = 0; i < size; i++)
1076 {
1077 Lisp_Object vec2 = XVECTOR (obj)->contents [i];
1078 CHECK_VECTOR (vec2, 0);
1079 if (XVECTOR (vec2)->size != 2)
1080 /* ??? Confusing error message */
1081 Fsignal (Qerror, Fcons (build_string ("vectors must be of length 2"),
1082 Fcons (vec2, Qnil)));
1083 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil);
1084 XVECTOR (XVECTOR (vec)->contents [i])->contents [0]
1085 = XVECTOR (vec2)->contents [0];
1086 XVECTOR (XVECTOR (vec)->contents [i])->contents [1]
1087 = XVECTOR (vec2)->contents [1];
1088 }
1089 return vec;
1090}
1091
1092#endif
1093
1094\f
1095/* Variables for communication with x_handle_selection_notify. */
1096static Atom reading_which_selection;
1097static Lisp_Object reading_selection_reply;
1098static Window reading_selection_window;
1099
1100/* Do protocol to read selection-data from the server.
1101 Converts this to Lisp data and returns it. */
1102
1103static Lisp_Object
1104x_get_foreign_selection (selection_symbol, target_type)
1105 Lisp_Object selection_symbol, target_type;
1106{
5d0ba25b 1107 Window requestor_window = FRAME_X_WINDOW (selected_frame);
3834c318 1108 Display *display = FRAME_X_DISPLAY (selected_frame);
5c3a351a 1109 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
5d0ba25b 1110 Time requestor_time = last_event_timestamp;
5c3a351a
RS
1111 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1112 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
ede4db72 1113 Atom type_atom;
80da0190 1114 int secs, usecs;
5a499696 1115 int count;
55b2d45d 1116 Lisp_Object frame;
ede4db72
RS
1117
1118 if (CONSP (target_type))
5c3a351a 1119 type_atom = symbol_to_x_atom (dpyinfo, display, XCONS (target_type)->car);
ede4db72 1120 else
5c3a351a 1121 type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
ede4db72
RS
1122
1123 BLOCK_INPUT;
5a499696 1124 count = x_catch_errors (display);
ede4db72 1125 XConvertSelection (display, selection_atom, type_atom, target_property,
5d0ba25b 1126 requestor_window, requestor_time);
5c3a351a 1127 XFlush (display);
ede4db72
RS
1128
1129 /* Prepare to block until the reply has been read. */
5d0ba25b 1130 reading_selection_window = requestor_window;
ede4db72
RS
1131 reading_which_selection = selection_atom;
1132 XCONS (reading_selection_reply)->car = Qnil;
55b2d45d
RS
1133
1134 frame = some_frame_on_display (dpyinfo);
1135
1136 /* If the display no longer has frames, we can't expect
1137 to get many more selection requests from it, so don't
1138 bother trying to queue them. */
1139 if (!NILP (frame))
1140 {
1141 x_start_queuing_selection_requests (display);
1142
1143 record_unwind_protect (queue_selection_requests_unwind,
1144 frame);
1145 }
ede4db72
RS
1146 UNBLOCK_INPUT;
1147
80da0190
RS
1148 /* This allows quits. Also, don't wait forever. */
1149 secs = x_selection_timeout / 1000;
1150 usecs = (x_selection_timeout % 1000) * 1000;
1151 wait_reading_process_input (secs, usecs, reading_selection_reply, 0);
ede4db72 1152
7c6b2ea4 1153 BLOCK_INPUT;
a7b24d46 1154 x_check_errors (display, "Cannot get selection: %s");
5a499696 1155 x_uncatch_errors (display, count);
7c6b2ea4
RS
1156 UNBLOCK_INPUT;
1157
ede4db72 1158 if (NILP (XCONS (reading_selection_reply)->car))
606140dd
KH
1159 error ("Timed out waiting for reply from selection owner");
1160 if (EQ (XCONS (reading_selection_reply)->car, Qlambda))
1161 error ("No `%s' selection", XSYMBOL (selection_symbol)->name->data);
ede4db72
RS
1162
1163 /* Otherwise, the selection is waiting for us on the requested property. */
1164 return
5d0ba25b 1165 x_get_window_property_as_lisp_data (display, requestor_window,
ede4db72
RS
1166 target_property, target_type,
1167 selection_atom);
1168}
1169\f
1170/* Subroutines of x_get_window_property_as_lisp_data */
1171
4feb31b2 1172/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1173
ede4db72
RS
1174static void
1175x_get_window_property (display, window, property, data_ret, bytes_ret,
1176 actual_type_ret, actual_format_ret, actual_size_ret,
1177 delete_p)
1178 Display *display;
1179 Window window;
1180 Atom property;
1181 unsigned char **data_ret;
1182 int *bytes_ret;
1183 Atom *actual_type_ret;
1184 int *actual_format_ret;
1185 unsigned long *actual_size_ret;
1186 int delete_p;
1187{
1188 int total_size;
1189 unsigned long bytes_remaining;
1190 int offset = 0;
1191 unsigned char *tmp_data = 0;
1192 int result;
1193 int buffer_size = SELECTION_QUANTUM (display);
1194 if (buffer_size > MAX_SELECTION_QUANTUM) buffer_size = MAX_SELECTION_QUANTUM;
1195
1196 BLOCK_INPUT;
1197 /* First probe the thing to find out how big it is. */
1198 result = XGetWindowProperty (display, window, property,
137edb72 1199 0L, 0L, False, AnyPropertyType,
ede4db72
RS
1200 actual_type_ret, actual_format_ret,
1201 actual_size_ret,
1202 &bytes_remaining, &tmp_data);
ede4db72
RS
1203 if (result != Success)
1204 {
2f65feb6 1205 UNBLOCK_INPUT;
ede4db72
RS
1206 *data_ret = 0;
1207 *bytes_ret = 0;
1208 return;
1209 }
0158abbc
RS
1210 /* This was allocated by Xlib, so use XFree. */
1211 XFree ((char *) tmp_data);
ede4db72
RS
1212
1213 if (*actual_type_ret == None || *actual_format_ret == 0)
1214 {
2f65feb6 1215 UNBLOCK_INPUT;
ede4db72
RS
1216 return;
1217 }
1218
1219 total_size = bytes_remaining + 1;
1220 *data_ret = (unsigned char *) xmalloc (total_size);
1221
2a1a4c9d 1222 /* Now read, until we've gotten it all. */
ede4db72
RS
1223 while (bytes_remaining)
1224 {
1225#if 0
1226 int last = bytes_remaining;
1227#endif
1228 result
1229 = XGetWindowProperty (display, window, property,
137edb72 1230 (long)offset/4, (long)buffer_size/4,
2f65feb6 1231 False,
ede4db72
RS
1232 AnyPropertyType,
1233 actual_type_ret, actual_format_ret,
1234 actual_size_ret, &bytes_remaining, &tmp_data);
1235#if 0
1236 fprintf (stderr, "<< read %d\n", last-bytes_remaining);
1237#endif
1238 /* If this doesn't return Success at this point, it means that
1239 some clod deleted the selection while we were in the midst of
1240 reading it. Deal with that, I guess....
1241 */
1242 if (result != Success) break;
1243 *actual_size_ret *= *actual_format_ret / 8;
1244 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
1245 offset += *actual_size_ret;
0158abbc
RS
1246 /* This was allocated by Xlib, so use XFree. */
1247 XFree ((char *) tmp_data);
ede4db72 1248 }
2f65feb6 1249
5c3a351a 1250 XFlush (display);
ede4db72
RS
1251 UNBLOCK_INPUT;
1252 *bytes_ret = offset;
1253}
1254\f
4feb31b2 1255/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1256
ede4db72
RS
1257static void
1258receive_incremental_selection (display, window, property, target_type,
1259 min_size_bytes, data_ret, size_bytes_ret,
1260 type_ret, format_ret, size_ret)
1261 Display *display;
1262 Window window;
1263 Atom property;
1264 Lisp_Object target_type; /* for error messages only */
1265 unsigned int min_size_bytes;
1266 unsigned char **data_ret;
1267 int *size_bytes_ret;
1268 Atom *type_ret;
1269 unsigned long *size_ret;
1270 int *format_ret;
1271{
1272 int offset = 0;
d1f21a66 1273 struct prop_location *wait_object;
ede4db72
RS
1274 *size_bytes_ret = min_size_bytes;
1275 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
1276#if 0
1277 fprintf (stderr, "\nread INCR %d\n", min_size_bytes);
1278#endif
2f65feb6
RS
1279
1280 /* At this point, we have read an INCR property.
1281 Delete the property to ack it.
1282 (But first, prepare to receive the next event in this handshake.)
ede4db72
RS
1283
1284 Now, we must loop, waiting for the sending window to put a value on
1285 that property, then reading the property, then deleting it to ack.
1286 We are done when the sender places a property of length 0.
1287 */
2f65feb6
RS
1288 BLOCK_INPUT;
1289 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
1290 XDeleteProperty (display, window, property);
d1f21a66
RS
1291 wait_object = expect_property_change (display, window, property,
1292 PropertyNewValue);
5c3a351a 1293 XFlush (display);
2f65feb6
RS
1294 UNBLOCK_INPUT;
1295
ede4db72
RS
1296 while (1)
1297 {
1298 unsigned char *tmp_data;
1299 int tmp_size_bytes;
d1f21a66 1300 wait_for_property_change (wait_object);
ede4db72 1301 /* expect it again immediately, because x_get_window_property may
2a1a4c9d 1302 .. no it won't, I don't get it.
ede4db72
RS
1303 .. Ok, I get it now, the Xt code that implements INCR is broken.
1304 */
ede4db72
RS
1305 x_get_window_property (display, window, property,
1306 &tmp_data, &tmp_size_bytes,
1307 type_ret, format_ret, size_ret, 1);
1308
1309 if (tmp_size_bytes == 0) /* we're done */
1310 {
1311#if 0
1312 fprintf (stderr, " read INCR done\n");
1313#endif
2f65feb6
RS
1314 if (! waiting_for_other_props_on_window (display, window))
1315 XSelectInput (display, window, STANDARD_EVENT_SET);
d1f21a66 1316 unexpect_property_change (wait_object);
4feb31b2 1317 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1318 calls xmalloc itself. */
4feb31b2 1319 if (tmp_data) xfree (tmp_data);
ede4db72
RS
1320 break;
1321 }
2f65feb6
RS
1322
1323 BLOCK_INPUT;
1324 XDeleteProperty (display, window, property);
d1f21a66
RS
1325 wait_object = expect_property_change (display, window, property,
1326 PropertyNewValue);
5c3a351a 1327 XFlush (display);
2f65feb6
RS
1328 UNBLOCK_INPUT;
1329
ede4db72
RS
1330#if 0
1331 fprintf (stderr, " read INCR %d\n", tmp_size_bytes);
1332#endif
1333 if (*size_bytes_ret < offset + tmp_size_bytes)
1334 {
1335#if 0
1336 fprintf (stderr, " read INCR realloc %d -> %d\n",
1337 *size_bytes_ret, offset + tmp_size_bytes);
1338#endif
1339 *size_bytes_ret = offset + tmp_size_bytes;
1340 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
1341 }
018cfa07 1342 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
ede4db72 1343 offset += tmp_size_bytes;
4feb31b2 1344 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1345 calls xmalloc itself. */
4feb31b2 1346 xfree (tmp_data);
ede4db72
RS
1347 }
1348}
1349\f
1350/* Once a requested selection is "ready" (we got a SelectionNotify event),
1351 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1352 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1353
1354static Lisp_Object
1355x_get_window_property_as_lisp_data (display, window, property, target_type,
1356 selection_atom)
1357 Display *display;
1358 Window window;
1359 Atom property;
1360 Lisp_Object target_type; /* for error messages only */
1361 Atom selection_atom; /* for error messages only */
1362{
1363 Atom actual_type;
1364 int actual_format;
1365 unsigned long actual_size;
1366 unsigned char *data = 0;
1367 int bytes = 0;
1368 Lisp_Object val;
5c3a351a 1369 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72
RS
1370
1371 x_get_window_property (display, window, property, &data, &bytes,
1372 &actual_type, &actual_format, &actual_size, 1);
1373 if (! data)
1374 {
1375 int there_is_a_selection_owner;
1376 BLOCK_INPUT;
1377 there_is_a_selection_owner
1378 = XGetSelectionOwner (display, selection_atom);
1379 UNBLOCK_INPUT;
5a499696
RS
1380 Fsignal (Qerror,
1381 there_is_a_selection_owner
1382 ? Fcons (build_string ("selection owner couldn't convert"),
ede4db72
RS
1383 actual_type
1384 ? Fcons (target_type,
5c3a351a
RS
1385 Fcons (x_atom_to_symbol (dpyinfo, display,
1386 actual_type),
ede4db72
RS
1387 Qnil))
1388 : Fcons (target_type, Qnil))
5a499696
RS
1389 : Fcons (build_string ("no selection"),
1390 Fcons (x_atom_to_symbol (dpyinfo, display,
1391 selection_atom),
1392 Qnil)));
ede4db72
RS
1393 }
1394
5c3a351a 1395 if (actual_type == dpyinfo->Xatom_INCR)
ede4db72
RS
1396 {
1397 /* That wasn't really the data, just the beginning. */
1398
1399 unsigned int min_size_bytes = * ((unsigned int *) data);
1400 BLOCK_INPUT;
4feb31b2 1401 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1402 calls xmalloc itself. */
4feb31b2 1403 xfree ((char *) data);
ede4db72
RS
1404 UNBLOCK_INPUT;
1405 receive_incremental_selection (display, window, property, target_type,
1406 min_size_bytes, &data, &bytes,
1407 &actual_type, &actual_format,
1408 &actual_size);
1409 }
1410
2f65feb6
RS
1411 BLOCK_INPUT;
1412 XDeleteProperty (display, window, property);
5c3a351a 1413 XFlush (display);
2f65feb6
RS
1414 UNBLOCK_INPUT;
1415
ede4db72
RS
1416 /* It's been read. Now convert it to a lisp object in some semi-rational
1417 manner. */
1418 val = selection_data_to_lisp_data (display, data, bytes,
1419 actual_type, actual_format);
1420
4feb31b2 1421 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1422 calls xmalloc itself. */
4feb31b2 1423 xfree ((char *) data);
ede4db72
RS
1424 return val;
1425}
1426\f
1427/* These functions convert from the selection data read from the server into
1428 something that we can use from Lisp, and vice versa.
1429
1430 Type: Format: Size: Lisp Type:
1431 ----- ------- ----- -----------
1432 * 8 * String
1433 ATOM 32 1 Symbol
1434 ATOM 32 > 1 Vector of Symbols
1435 * 16 1 Integer
1436 * 16 > 1 Vector of Integers
1437 * 32 1 if <=16 bits: Integer
1438 if > 16 bits: Cons of top16, bot16
1439 * 32 > 1 Vector of the above
1440
1441 When converting a Lisp number to C, it is assumed to be of format 16 if
1442 it is an integer, and of format 32 if it is a cons of two integers.
1443
1444 When converting a vector of numbers from Lisp to C, it is assumed to be
1445 of format 16 if every element in the vector is an integer, and is assumed
1446 to be of format 32 if any element is a cons of two integers.
1447
1448 When converting an object to C, it may be of the form (SYMBOL . <data>)
1449 where SYMBOL is what we should claim that the type is. Format and
1450 representation are as above. */
1451
1452
1453
1454static Lisp_Object
1455selection_data_to_lisp_data (display, data, size, type, format)
1456 Display *display;
1457 unsigned char *data;
1458 Atom type;
1459 int size, format;
1460{
5c3a351a 1461 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1462
5c3a351a 1463 if (type == dpyinfo->Xatom_NULL)
ede4db72
RS
1464 return QNULL;
1465
1466 /* Convert any 8-bit data to a string, for compactness. */
1467 else if (format == 8)
e6c7c988
KH
1468 {
1469 Lisp_Object str;
f78da51e
KH
1470 int require_encoding = 0;
1471
5faa9b45 1472 if (! NILP (buffer_defaults.enable_multibyte_characters))
f78da51e 1473 {
5faa9b45
KH
1474 /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode
1475 DATA to Emacs internal format because DATA may be encoded
1476 in compound text format. In addtion, if TYPE is `STRING'
1477 and DATA contains any 8-bit Latin-1 code, we should also
1478 decode it. */
1479 if (type == dpyinfo->Xatom_TEXT
1480 || type == dpyinfo->Xatom_COMPOUND_TEXT)
1481 require_encoding = 1;
1482 else if (type == XA_STRING)
f78da51e 1483 {
5faa9b45
KH
1484 int i;
1485 for (i = 0; i < size; i++)
f78da51e 1486 {
5faa9b45
KH
1487 if (data[i] >= 0x80)
1488 {
1489 require_encoding = 1;
1490 break;
1491 }
f78da51e
KH
1492 }
1493 }
1494 }
1495 if (!require_encoding)
9391d06a 1496 str = make_unibyte_string ((char *) data, size);
e6c7c988
KH
1497 else
1498 {
9391d06a 1499 int bufsize;
e6c7c988
KH
1500 unsigned char *buf;
1501 struct coding_system coding;
e6c7c988 1502
2584c9ec
KH
1503 setup_coding_system
1504 (Fcheck_coding_system(Vclipboard_coding_system), &coding);
9391d06a 1505 coding.mode |= CODING_MODE_LAST_BLOCK;
e6c7c988
KH
1506 bufsize = decoding_buffer_size (&coding, size);
1507 buf = (unsigned char *) xmalloc (bufsize);
9391d06a
KH
1508 decode_coding (&coding, data, buf, size, bufsize);
1509 str = make_multibyte_string ((char *) buf,
1510 coding.produced_char, coding.produced);
4feb31b2 1511 xfree (buf);
e6c7c988
KH
1512 }
1513 return str;
1514 }
ede4db72
RS
1515 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1516 a vector of symbols.
1517 */
1518 else if (type == XA_ATOM)
1519 {
1520 int i;
1521 if (size == sizeof (Atom))
5c3a351a 1522 return x_atom_to_symbol (dpyinfo, display, *((Atom *) data));
ede4db72
RS
1523 else
1524 {
e607a484
RS
1525 Lisp_Object v = Fmake_vector (make_number (size / sizeof (Atom)),
1526 make_number (0));
ede4db72 1527 for (i = 0; i < size / sizeof (Atom); i++)
e607a484
RS
1528 Faset (v, make_number (i),
1529 x_atom_to_symbol (dpyinfo, display, ((Atom *) data) [i]));
ede4db72
RS
1530 return v;
1531 }
1532 }
1533
1534 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1535 If the number is > 16 bits, convert it to a cons of integers,
1536 16 bits in each half.
1537 */
1538 else if (format == 32 && size == sizeof (long))
1539 return long_to_cons (((unsigned long *) data) [0]);
1540 else if (format == 16 && size == sizeof (short))
1541 return make_number ((int) (((unsigned short *) data) [0]));
1542
1543 /* Convert any other kind of data to a vector of numbers, represented
1544 as above (as an integer, or a cons of two 16 bit integers.)
1545 */
1546 else if (format == 16)
1547 {
1548 int i;
937a3875
RS
1549 Lisp_Object v;
1550 v = Fmake_vector (make_number (size / 2), make_number (0));
1551 for (i = 0; i < size / 2; i++)
ede4db72
RS
1552 {
1553 int j = (int) ((unsigned short *) data) [i];
e607a484 1554 Faset (v, make_number (i), make_number (j));
ede4db72
RS
1555 }
1556 return v;
1557 }
1558 else
1559 {
1560 int i;
e607a484 1561 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0));
ede4db72
RS
1562 for (i = 0; i < size / 4; i++)
1563 {
1564 unsigned long j = ((unsigned long *) data) [i];
e607a484 1565 Faset (v, make_number (i), long_to_cons (j));
ede4db72
RS
1566 }
1567 return v;
1568 }
1569}
1570
1571
4feb31b2 1572/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1573
ede4db72
RS
1574static void
1575lisp_data_to_selection_data (display, obj,
aca39f42
RS
1576 data_ret, type_ret, size_ret,
1577 format_ret, nofree_ret)
ede4db72
RS
1578 Display *display;
1579 Lisp_Object obj;
1580 unsigned char **data_ret;
1581 Atom *type_ret;
1582 unsigned int *size_ret;
1583 int *format_ret;
aca39f42 1584 int *nofree_ret;
ede4db72
RS
1585{
1586 Lisp_Object type = Qnil;
5c3a351a 1587 struct x_display_info *dpyinfo = x_display_info_for_display (display);
aca39f42
RS
1588
1589 *nofree_ret = 0;
1590
ede4db72
RS
1591 if (CONSP (obj) && SYMBOLP (XCONS (obj)->car))
1592 {
1593 type = XCONS (obj)->car;
1594 obj = XCONS (obj)->cdr;
1595 if (CONSP (obj) && NILP (XCONS (obj)->cdr))
1596 obj = XCONS (obj)->car;
1597 }
1598
1599 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1600 { /* This is not the same as declining */
1601 *format_ret = 32;
1602 *size_ret = 0;
1603 *data_ret = 0;
1604 type = QNULL;
1605 }
1606 else if (STRINGP (obj))
1607 {
e6c7c988
KH
1608 /* Since we are now handling multilingual text, we must consider
1609 sending back compound text. */
fb5e77f7 1610 int charsets[MAX_CHARSET + 1];
e6c7c988
KH
1611 int num;
1612
ede4db72 1613 *format_ret = 8;
0120fdf9 1614 *size_ret = XSTRING (obj)->size_byte;
aca39f42 1615 *data_ret = XSTRING (obj)->data;
fb5e77f7 1616 bzero (charsets, (MAX_CHARSET + 1) * sizeof (int));
5faa9b45
KH
1617 num = ((*size_ret <= 1 /* Check the possibility of short cut. */
1618 || NILP (buffer_defaults.enable_multibyte_characters))
e6c7c988 1619 ? 0
f78da51e 1620 : find_charset_in_str (*data_ret, *size_ret, charsets, Qnil));
e6c7c988
KH
1621
1622 if (!num || (num == 1 && charsets[CHARSET_ASCII]))
1623 {
1624 /* No multibyte character in OBJ. We need not encode it. */
1625 *nofree_ret = 1;
1626 if (NILP (type)) type = QSTRING;
1627 }
1628 else
1629 {
1630 /* We must encode contents of OBJ to compound text format.
1631 The format is compatible with what the target `STRING'
1632 expects if OBJ contains only ASCII and Latin-1
1633 characters. */
9391d06a 1634 int bufsize;
e6c7c988
KH
1635 unsigned char *buf;
1636 struct coding_system coding;
e6c7c988 1637
2584c9ec
KH
1638 setup_coding_system
1639 (Fcheck_coding_system (Vclipboard_coding_system), &coding);
9391d06a 1640 coding.mode |= CODING_MODE_LAST_BLOCK;
e6c7c988
KH
1641 bufsize = encoding_buffer_size (&coding, *size_ret);
1642 buf = (unsigned char *) xmalloc (bufsize);
9391d06a
KH
1643 encode_coding (&coding, *data_ret, buf, *size_ret, bufsize);
1644 *size_ret = coding.produced;
e6c7c988 1645 *data_ret = buf;
5faa9b45 1646 if (charsets[charset_latin_iso8859_1]
e6c7c988
KH
1647 && (num == 1 || (num == 2 && charsets[CHARSET_ASCII])))
1648 {
1649 /* Ok, we can return it as `STRING'. */
1650 if (NILP (type)) type = QSTRING;
1651 }
1652 else
1653 {
1654 /* We must return it as `COMPOUND_TEXT'. */
1655 if (NILP (type)) type = QCOMPOUND_TEXT;
1656 }
1657 }
ede4db72
RS
1658 }
1659 else if (SYMBOLP (obj))
1660 {
1661 *format_ret = 32;
1662 *size_ret = 1;
1663 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
1664 (*data_ret) [sizeof (Atom)] = 0;
5c3a351a 1665 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj);
ede4db72
RS
1666 if (NILP (type)) type = QATOM;
1667 }
7da64e5c 1668 else if (INTEGERP (obj)
ede4db72
RS
1669 && XINT (obj) < 0xFFFF
1670 && XINT (obj) > -0xFFFF)
1671 {
1672 *format_ret = 16;
1673 *size_ret = 1;
1674 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
1675 (*data_ret) [sizeof (short)] = 0;
1676 (*(short **) data_ret) [0] = (short) XINT (obj);
1677 if (NILP (type)) type = QINTEGER;
1678 }
a87ed99c
RS
1679 else if (INTEGERP (obj)
1680 || (CONSP (obj) && INTEGERP (XCONS (obj)->car)
1681 && (INTEGERP (XCONS (obj)->cdr)
1682 || (CONSP (XCONS (obj)->cdr)
1683 && INTEGERP (XCONS (XCONS (obj)->cdr)->car)))))
ede4db72
RS
1684 {
1685 *format_ret = 32;
1686 *size_ret = 1;
1687 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
1688 (*data_ret) [sizeof (long)] = 0;
1689 (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
1690 if (NILP (type)) type = QINTEGER;
1691 }
1692 else if (VECTORP (obj))
1693 {
1694 /* Lisp_Vectors may represent a set of ATOMs;
1695 a set of 16 or 32 bit INTEGERs;
1696 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1697 */
1698 int i;
1699
1700 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1701 /* This vector is an ATOM set */
1702 {
1703 if (NILP (type)) type = QATOM;
1704 *size_ret = XVECTOR (obj)->size;
1705 *format_ret = 32;
1706 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
1707 for (i = 0; i < *size_ret; i++)
1708 if (SYMBOLP (XVECTOR (obj)->contents [i]))
1709 (*(Atom **) data_ret) [i]
5c3a351a 1710 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]);
ede4db72
RS
1711 else
1712 Fsignal (Qerror, /* Qselection_error */
1713 Fcons (build_string
1714 ("all elements of selection vector must have same type"),
1715 Fcons (obj, Qnil)));
1716 }
1717#if 0 /* #### MULTIPLE doesn't work yet */
1718 else if (VECTORP (XVECTOR (obj)->contents [0]))
1719 /* This vector is an ATOM_PAIR set */
1720 {
1721 if (NILP (type)) type = QATOM_PAIR;
1722 *size_ret = XVECTOR (obj)->size;
1723 *format_ret = 32;
1724 *data_ret = (unsigned char *)
1725 xmalloc ((*size_ret) * sizeof (Atom) * 2);
1726 for (i = 0; i < *size_ret; i++)
1727 if (VECTORP (XVECTOR (obj)->contents [i]))
1728 {
1729 Lisp_Object pair = XVECTOR (obj)->contents [i];
1730 if (XVECTOR (pair)->size != 2)
1731 Fsignal (Qerror,
1732 Fcons (build_string
1733 ("elements of the vector must be vectors of exactly two elements"),
1734 Fcons (pair, Qnil)));
1735
1736 (*(Atom **) data_ret) [i * 2]
5c3a351a
RS
1737 = symbol_to_x_atom (dpyinfo, display,
1738 XVECTOR (pair)->contents [0]);
ede4db72 1739 (*(Atom **) data_ret) [(i * 2) + 1]
5c3a351a
RS
1740 = symbol_to_x_atom (dpyinfo, display,
1741 XVECTOR (pair)->contents [1]);
ede4db72
RS
1742 }
1743 else
1744 Fsignal (Qerror,
1745 Fcons (build_string
1746 ("all elements of the vector must be of the same type"),
1747 Fcons (obj, Qnil)));
1748
1749 }
1750#endif
1751 else
1752 /* This vector is an INTEGER set, or something like it */
1753 {
1754 *size_ret = XVECTOR (obj)->size;
1755 if (NILP (type)) type = QINTEGER;
1756 *format_ret = 16;
1757 for (i = 0; i < *size_ret; i++)
1758 if (CONSP (XVECTOR (obj)->contents [i]))
1759 *format_ret = 32;
7da64e5c 1760 else if (!INTEGERP (XVECTOR (obj)->contents [i]))
ede4db72
RS
1761 Fsignal (Qerror, /* Qselection_error */
1762 Fcons (build_string
1763 ("elements of selection vector must be integers or conses of integers"),
1764 Fcons (obj, Qnil)));
1765
1766 *data_ret = (unsigned char *) xmalloc (*size_ret * (*format_ret/8));
1767 for (i = 0; i < *size_ret; i++)
1768 if (*format_ret == 32)
1769 (*((unsigned long **) data_ret)) [i]
1770 = cons_to_long (XVECTOR (obj)->contents [i]);
1771 else
1772 (*((unsigned short **) data_ret)) [i]
1773 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
1774 }
1775 }
1776 else
1777 Fsignal (Qerror, /* Qselection_error */
1778 Fcons (build_string ("unrecognised selection data"),
1779 Fcons (obj, Qnil)));
1780
5c3a351a 1781 *type_ret = symbol_to_x_atom (dpyinfo, display, type);
ede4db72
RS
1782}
1783
1784static Lisp_Object
1785clean_local_selection_data (obj)
1786 Lisp_Object obj;
1787{
1788 if (CONSP (obj)
7da64e5c 1789 && INTEGERP (XCONS (obj)->car)
ede4db72 1790 && CONSP (XCONS (obj)->cdr)
7da64e5c 1791 && INTEGERP (XCONS (XCONS (obj)->cdr)->car)
ede4db72
RS
1792 && NILP (XCONS (XCONS (obj)->cdr)->cdr))
1793 obj = Fcons (XCONS (obj)->car, XCONS (obj)->cdr);
1794
1795 if (CONSP (obj)
7da64e5c
RS
1796 && INTEGERP (XCONS (obj)->car)
1797 && INTEGERP (XCONS (obj)->cdr))
ede4db72
RS
1798 {
1799 if (XINT (XCONS (obj)->car) == 0)
1800 return XCONS (obj)->cdr;
1801 if (XINT (XCONS (obj)->car) == -1)
1802 return make_number (- XINT (XCONS (obj)->cdr));
1803 }
1804 if (VECTORP (obj))
1805 {
1806 int i;
1807 int size = XVECTOR (obj)->size;
1808 Lisp_Object copy;
1809 if (size == 1)
1810 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
e607a484 1811 copy = Fmake_vector (make_number (size), Qnil);
ede4db72
RS
1812 for (i = 0; i < size; i++)
1813 XVECTOR (copy)->contents [i]
1814 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
1815 return copy;
1816 }
1817 return obj;
1818}
1819\f
1820/* Called from XTread_socket to handle SelectionNotify events.
606140dd
KH
1821 If it's the selection we are waiting for, stop waiting
1822 by setting the car of reading_selection_reply to non-nil.
1823 We store t there if the reply is successful, lambda if not. */
ede4db72
RS
1824
1825void
1826x_handle_selection_notify (event)
1827 XSelectionEvent *event;
1828{
5d0ba25b 1829 if (event->requestor != reading_selection_window)
ede4db72
RS
1830 return;
1831 if (event->selection != reading_which_selection)
1832 return;
1833
606140dd
KH
1834 XCONS (reading_selection_reply)->car
1835 = (event->property != 0 ? Qt : Qlambda);
ede4db72
RS
1836}
1837
1838\f
a0d76c27
EN
1839DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
1840 Sx_own_selection_internal, 2, 2, 0,
ede4db72
RS
1841 "Assert an X selection of the given TYPE with the given VALUE.\n\
1842TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1843\(Those are literal upper-case symbol names, since that's what X expects.)\n\
1844VALUE is typically a string, or a cons of two markers, but may be\n\
a87ed99c 1845anything that the functions on `selection-converter-alist' know about.")
ede4db72
RS
1846 (selection_name, selection_value)
1847 Lisp_Object selection_name, selection_value;
1848{
703e0710 1849 check_x ();
ede4db72 1850 CHECK_SYMBOL (selection_name, 0);
606140dd 1851 if (NILP (selection_value)) error ("selection-value may not be nil");
ede4db72
RS
1852 x_own_selection (selection_name, selection_value);
1853 return selection_value;
1854}
1855
1856
1857/* Request the selection value from the owner. If we are the owner,
1858 simply return our selection value. If we are not the owner, this
1859 will block until all of the data has arrived. */
1860
a0d76c27
EN
1861DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
1862 Sx_get_selection_internal, 2, 2, 0,
ede4db72
RS
1863 "Return text selected from some X window.\n\
1864SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1865\(Those are literal upper-case symbol names, since that's what X expects.)\n\
a87ed99c 1866TYPE is the type of data desired, typically `STRING'.")
ede4db72
RS
1867 (selection_symbol, target_type)
1868 Lisp_Object selection_symbol, target_type;
1869{
1870 Lisp_Object val = Qnil;
1871 struct gcpro gcpro1, gcpro2;
1872 GCPRO2 (target_type, val); /* we store newly consed data into these */
703e0710 1873 check_x ();
ede4db72
RS
1874 CHECK_SYMBOL (selection_symbol, 0);
1875
1876#if 0 /* #### MULTIPLE doesn't work yet */
1877 if (CONSP (target_type)
1878 && XCONS (target_type)->car == QMULTIPLE)
1879 {
1880 CHECK_VECTOR (XCONS (target_type)->cdr, 0);
1881 /* So we don't destructively modify this... */
1882 target_type = copy_multiple_data (target_type);
1883 }
1884 else
1885#endif
1886 CHECK_SYMBOL (target_type, 0);
1887
1888 val = x_get_local_selection (selection_symbol, target_type);
1889
1890 if (NILP (val))
1891 {
1892 val = x_get_foreign_selection (selection_symbol, target_type);
1893 goto DONE;
1894 }
1895
1896 if (CONSP (val)
1897 && SYMBOLP (XCONS (val)->car))
1898 {
1899 val = XCONS (val)->cdr;
1900 if (CONSP (val) && NILP (XCONS (val)->cdr))
1901 val = XCONS (val)->car;
1902 }
1903 val = clean_local_selection_data (val);
1904 DONE:
1905 UNGCPRO;
1906 return val;
1907}
1908
a0d76c27
EN
1909DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
1910 Sx_disown_selection_internal, 1, 2, 0,
a87ed99c
RS
1911 "If we own the selection SELECTION, disown it.\n\
1912Disowning it means there is no such selection.")
ede4db72
RS
1913 (selection, time)
1914 Lisp_Object selection;
1915 Lisp_Object time;
1916{
ede4db72
RS
1917 Time timestamp;
1918 Atom selection_atom;
44d46531 1919 struct selection_input_event event;
3834c318 1920 Display *display;
5c3a351a 1921 struct x_display_info *dpyinfo;
ede4db72 1922
703e0710 1923 check_x ();
3834c318 1924 display = FRAME_X_DISPLAY (selected_frame);
5c3a351a 1925 dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
ede4db72
RS
1926 CHECK_SYMBOL (selection, 0);
1927 if (NILP (time))
7da64e5c 1928 timestamp = last_event_timestamp;
ede4db72
RS
1929 else
1930 timestamp = cons_to_long (time);
1931
1932 if (NILP (assq_no_quit (selection, Vselection_alist)))
1933 return Qnil; /* Don't disown the selection when we're not the owner. */
1934
5c3a351a 1935 selection_atom = symbol_to_x_atom (dpyinfo, display, selection);
ede4db72
RS
1936
1937 BLOCK_INPUT;
1938 XSetSelectionOwner (display, selection_atom, None, timestamp);
1939 UNBLOCK_INPUT;
1940
eb8c3be9 1941 /* It doesn't seem to be guaranteed that a SelectionClear event will be
ede4db72
RS
1942 generated for a window which owns the selection when that window sets
1943 the selection owner to None. The NCD server does, the MIT Sun4 server
1944 doesn't. So we synthesize one; this means we might get two, but
1945 that's ok, because the second one won't have any effect. */
8d47f8c4
RS
1946 SELECTION_EVENT_DISPLAY (&event) = display;
1947 SELECTION_EVENT_SELECTION (&event) = selection_atom;
1948 SELECTION_EVENT_TIME (&event) = timestamp;
44d46531 1949 x_handle_selection_clear ((struct input_event *) &event);
ede4db72
RS
1950
1951 return Qt;
1952}
1953
a87ed99c
RS
1954/* Get rid of all the selections in buffer BUFFER.
1955 This is used when we kill a buffer. */
1956
1957void
1958x_disown_buffer_selections (buffer)
1959 Lisp_Object buffer;
1960{
1961 Lisp_Object tail;
1962 struct buffer *buf = XBUFFER (buffer);
1963
1964 for (tail = Vselection_alist; CONSP (tail); tail = XCONS (tail)->cdr)
1965 {
1966 Lisp_Object elt, value;
1967 elt = XCONS (tail)->car;
1968 value = XCONS (elt)->cdr;
1969 if (CONSP (value) && MARKERP (XCONS (value)->car)
1970 && XMARKER (XCONS (value)->car)->buffer == buf)
1971 Fx_disown_selection_internal (XCONS (elt)->car, Qnil);
1972 }
1973}
ede4db72
RS
1974
1975DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
1976 0, 1, 0,
a87ed99c 1977 "Whether the current Emacs process owns the given X Selection.\n\
ede4db72
RS
1978The arg should be the name of the selection in question, typically one of\n\
1979the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1980\(Those are literal upper-case symbol names, since that's what X expects.)\n\
1981For convenience, the symbol nil is the same as `PRIMARY',\n\
1982and t is the same as `SECONDARY'.)")
1983 (selection)
1984 Lisp_Object selection;
1985{
703e0710 1986 check_x ();
ede4db72
RS
1987 CHECK_SYMBOL (selection, 0);
1988 if (EQ (selection, Qnil)) selection = QPRIMARY;
1989 if (EQ (selection, Qt)) selection = QSECONDARY;
1990
1991 if (NILP (Fassq (selection, Vselection_alist)))
1992 return Qnil;
1993 return Qt;
1994}
1995
1996DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
1997 0, 1, 0,
1998 "Whether there is an owner for the given X Selection.\n\
1999The arg should be the name of the selection in question, typically one of\n\
2000the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
2001\(Those are literal upper-case symbol names, since that's what X expects.)\n\
2002For convenience, the symbol nil is the same as `PRIMARY',\n\
2003and t is the same as `SECONDARY'.)")
2004 (selection)
2005 Lisp_Object selection;
2006{
2007 Window owner;
356ba514 2008 Atom atom;
3834c318
RS
2009 Display *dpy;
2010
b8c70430 2011 /* It should be safe to call this before we have an X frame. */
c6423dc1 2012 if (! FRAME_X_P (selected_frame))
b8c70430
RS
2013 return Qnil;
2014
3834c318 2015 dpy = FRAME_X_DISPLAY (selected_frame);
ede4db72
RS
2016 CHECK_SYMBOL (selection, 0);
2017 if (!NILP (Fx_selection_owner_p (selection)))
2018 return Qt;
356ba514
RS
2019 if (EQ (selection, Qnil)) selection = QPRIMARY;
2020 if (EQ (selection, Qt)) selection = QSECONDARY;
5c3a351a
RS
2021 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame),
2022 dpy, selection);
356ba514
RS
2023 if (atom == 0)
2024 return Qnil;
ede4db72 2025 BLOCK_INPUT;
356ba514 2026 owner = XGetSelectionOwner (dpy, atom);
ede4db72
RS
2027 UNBLOCK_INPUT;
2028 return (owner ? Qt : Qnil);
2029}
2030
2031\f
2032#ifdef CUT_BUFFER_SUPPORT
2033
ede4db72
RS
2034/* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2035static void
2036initialize_cut_buffers (display, window)
2037 Display *display;
2038 Window window;
2039{
2040 unsigned char *data = (unsigned char *) "";
2041 BLOCK_INPUT;
2042#define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2043 PropModeAppend, data, 0)
2044 FROB (XA_CUT_BUFFER0);
2045 FROB (XA_CUT_BUFFER1);
2046 FROB (XA_CUT_BUFFER2);
2047 FROB (XA_CUT_BUFFER3);
2048 FROB (XA_CUT_BUFFER4);
2049 FROB (XA_CUT_BUFFER5);
2050 FROB (XA_CUT_BUFFER6);
2051 FROB (XA_CUT_BUFFER7);
2052#undef FROB
2053 UNBLOCK_INPUT;
ede4db72
RS
2054}
2055
2056
a87ed99c 2057#define CHECK_CUT_BUFFER(symbol,n) \
ede4db72
RS
2058 { CHECK_SYMBOL ((symbol), (n)); \
2059 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2060 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2061 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2062 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2063 Fsignal (Qerror, \
a87ed99c 2064 Fcons (build_string ("doesn't name a cut buffer"), \
ede4db72
RS
2065 Fcons ((symbol), Qnil))); \
2066 }
2067
a87ed99c
RS
2068DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
2069 Sx_get_cut_buffer_internal, 1, 1, 0,
2070 "Returns the value of the named cut buffer (typically CUT_BUFFER0).")
ede4db72
RS
2071 (buffer)
2072 Lisp_Object buffer;
2073{
3834c318 2074 Window window;
ede4db72
RS
2075 Atom buffer_atom;
2076 unsigned char *data;
2077 int bytes;
2078 Atom type;
2079 int format;
2080 unsigned long size;
2081 Lisp_Object ret;
3834c318 2082 Display *display;
5c3a351a 2083 struct x_display_info *dpyinfo;
ede4db72 2084
703e0710 2085 check_x ();
3834c318 2086 display = FRAME_X_DISPLAY (selected_frame);
5c3a351a 2087 dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame);
3834c318 2088 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
a87ed99c 2089 CHECK_CUT_BUFFER (buffer, 0);
5c3a351a 2090 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer);
ede4db72
RS
2091
2092 x_get_window_property (display, window, buffer_atom, &data, &bytes,
2093 &type, &format, &size, 0);
2094 if (!data) return Qnil;
2095
2096 if (format != 8 || type != XA_STRING)
2097 Fsignal (Qerror,
2098 Fcons (build_string ("cut buffer doesn't contain 8-bit data"),
5c3a351a 2099 Fcons (x_atom_to_symbol (dpyinfo, display, type),
ede4db72
RS
2100 Fcons (make_number (format), Qnil))));
2101
2102 ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
4feb31b2 2103 /* Use xfree, not XFree, because x_get_window_property
0158abbc 2104 calls xmalloc itself. */
4feb31b2 2105 xfree (data);
ede4db72
RS
2106 return ret;
2107}
2108
2109
a87ed99c
RS
2110DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal,
2111 Sx_store_cut_buffer_internal, 2, 2, 0,
2112 "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
ede4db72
RS
2113 (buffer, string)
2114 Lisp_Object buffer, string;
2115{
3834c318 2116 Window window;
ede4db72
RS
2117 Atom buffer_atom;
2118 unsigned char *data;
2119 int bytes;
2120 int bytes_remaining;
3834c318
RS
2121 int max_bytes;
2122 Display *display;
ede4db72 2123
703e0710 2124 check_x ();
3834c318
RS
2125 display = FRAME_X_DISPLAY (selected_frame);
2126 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2127
2128 max_bytes = SELECTION_QUANTUM (display);
2129 if (max_bytes > MAX_SELECTION_QUANTUM)
2130 max_bytes = MAX_SELECTION_QUANTUM;
2131
a87ed99c 2132 CHECK_CUT_BUFFER (buffer, 0);
ede4db72 2133 CHECK_STRING (string, 0);
5c3a351a
RS
2134 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame),
2135 display, buffer);
ede4db72 2136 data = (unsigned char *) XSTRING (string)->data;
0120fdf9 2137 bytes = XSTRING (string)->size_byte;
ede4db72
RS
2138 bytes_remaining = bytes;
2139
04649dbc
KH
2140 if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized)
2141 {
2142 initialize_cut_buffers (display, window);
2143 FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1;
2144 }
ede4db72
RS
2145
2146 BLOCK_INPUT;
10608c8c
RS
2147
2148 /* Don't mess up with an empty value. */
2149 if (!bytes_remaining)
2150 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2151 PropModeReplace, data, 0);
2152
ede4db72
RS
2153 while (bytes_remaining)
2154 {
2155 int chunk = (bytes_remaining < max_bytes
2156 ? bytes_remaining : max_bytes);
2157 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2158 (bytes_remaining == bytes
2159 ? PropModeReplace
2160 : PropModeAppend),
2161 data, chunk);
2162 data += chunk;
2163 bytes_remaining -= chunk;
2164 }
2165 UNBLOCK_INPUT;
2166 return string;
2167}
2168
2169
a87ed99c
RS
2170DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal,
2171 Sx_rotate_cut_buffers_internal, 1, 1, 0,
88623f1c
RS
2172 "Rotate the values of the cut buffers by the given number of step.\n\
2173Positive means shift the values forward, negative means backward.")
ede4db72
RS
2174 (n)
2175 Lisp_Object n;
2176{
3834c318
RS
2177 Window window;
2178 Atom props[8];
2179 Display *display;
ede4db72 2180
703e0710 2181 check_x ();
3834c318
RS
2182 display = FRAME_X_DISPLAY (selected_frame);
2183 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
7da64e5c 2184 CHECK_NUMBER (n, 0);
3834c318
RS
2185 if (XINT (n) == 0)
2186 return n;
04649dbc
KH
2187 if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized)
2188 {
2189 initialize_cut_buffers (display, window);
2190 FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1;
2191 }
3834c318 2192
ede4db72
RS
2193 props[0] = XA_CUT_BUFFER0;
2194 props[1] = XA_CUT_BUFFER1;
2195 props[2] = XA_CUT_BUFFER2;
2196 props[3] = XA_CUT_BUFFER3;
2197 props[4] = XA_CUT_BUFFER4;
2198 props[5] = XA_CUT_BUFFER5;
2199 props[6] = XA_CUT_BUFFER6;
2200 props[7] = XA_CUT_BUFFER7;
2201 BLOCK_INPUT;
2202 XRotateWindowProperties (display, window, props, 8, XINT (n));
2203 UNBLOCK_INPUT;
2204 return n;
2205}
2206
2207#endif
2208\f
ede4db72
RS
2209void
2210syms_of_xselect ()
2211{
ede4db72
RS
2212 defsubr (&Sx_get_selection_internal);
2213 defsubr (&Sx_own_selection_internal);
2214 defsubr (&Sx_disown_selection_internal);
2215 defsubr (&Sx_selection_owner_p);
2216 defsubr (&Sx_selection_exists_p);
2217
2218#ifdef CUT_BUFFER_SUPPORT
a87ed99c
RS
2219 defsubr (&Sx_get_cut_buffer_internal);
2220 defsubr (&Sx_store_cut_buffer_internal);
2221 defsubr (&Sx_rotate_cut_buffers_internal);
ede4db72
RS
2222#endif
2223
2224 reading_selection_reply = Fcons (Qnil, Qnil);
2225 staticpro (&reading_selection_reply);
2226 reading_selection_window = 0;
2227 reading_which_selection = 0;
2228
2229 property_change_wait_list = 0;
2f65feb6 2230 prop_location_identifier = 0;
ede4db72
RS
2231 property_change_reply = Fcons (Qnil, Qnil);
2232 staticpro (&property_change_reply);
2233
2234 Vselection_alist = Qnil;
2235 staticpro (&Vselection_alist);
2236
2237 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
4cf066bb 2238 "An alist associating X Windows selection-types with functions.\n\
ede4db72
RS
2239These functions are called to convert the selection, with three args:\n\
2240the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2241a desired type to which the selection should be converted;\n\
2242and the local selection value (whatever was given to `x-own-selection').\n\
2243\n\
2244The function should return the value to send to the X server\n\
2245\(typically a string). A return value of nil\n\
2246means that the conversion could not be done.\n\
2247A return value which is the symbol `NULL'\n\
2248means that a side-effect was executed,\n\
2249and there is no meaningful selection value.");
2250 Vselection_converter_alist = Qnil;
2251
2252 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks,
4cf066bb 2253 "A list of functions to be called when Emacs loses an X selection.\n\
ede4db72
RS
2254\(This happens when some other X client makes its own selection\n\
2255or when a Lisp program explicitly clears the selection.)\n\
2256The functions are called with one argument, the selection type\n\
d31b6237 2257\(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD').");
ede4db72
RS
2258 Vx_lost_selection_hooks = Qnil;
2259
2260 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks,
4cf066bb 2261 "A list of functions to be called when Emacs answers a selection request.\n\
ede4db72
RS
2262The functions are called with four arguments:\n\
2263 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2264 - the selection-type which Emacs was asked to convert the\n\
2265 selection into before sending (for example, `STRING' or `LENGTH');\n\
2266 - a flag indicating success or failure for responding to the request.\n\
2267We might have failed (and declined the request) for any number of reasons,\n\
2268including being asked for a selection that we no longer own, or being asked\n\
2269to convert into a type that we don't know about or that is inappropriate.\n\
2270This hook doesn't let you change the behavior of Emacs's selection replies,\n\
2271it merely informs you that they have happened.");
2272 Vx_sent_selection_hooks = Qnil;
2273
4cf066bb
RS
2274 DEFVAR_LISP ("clipboard-coding-system", &Vclipboard_coding_system,
2275 "Coding system for communicating with other X clients.\n\
2276When sending or receiving text via cut_buffer, selection, and clipboard,\n\
2277the text is encoded or decoded by this coding system.\n\
9391d06a
KH
2278A default value is `compound-text'");
2279 Vclipboard_coding_system=intern ("compound-text");
2584c9ec
KH
2280 staticpro(&Vclipboard_coding_system);
2281
ede4db72 2282 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
4cf066bb 2283 "Number of milliseconds to wait for a selection reply.\n\
2a1a4c9d 2284If the selection owner doesn't reply in this time, we give up.\n\
ede4db72 2285A value of 0 means wait as long as necessary. This is initialized from the\n\
80da0190 2286\"*selectionTimeout\" resource.");
ede4db72
RS
2287 x_selection_timeout = 0;
2288
2289 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY);
2290 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY);
2291 QSTRING = intern ("STRING"); staticpro (&QSTRING);
2292 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER);
2293 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
2294 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2295 QTEXT = intern ("TEXT"); staticpro (&QTEXT);
e6c7c988 2296 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
ede4db72
RS
2297 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2298 QDELETE = intern ("DELETE"); staticpro (&QDELETE);
2299 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE);
2300 QINCR = intern ("INCR"); staticpro (&QINCR);
2301 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP);
2302 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS);
2303 QATOM = intern ("ATOM"); staticpro (&QATOM);
2304 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR);
2305 QNULL = intern ("NULL"); staticpro (&QNULL);
2306
2307#ifdef CUT_BUFFER_SUPPORT
2308 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
2309 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
2310 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
2311 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
2312 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
2313 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
2314 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
2315 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
2316#endif
2317
2318}