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