Whitespace changes.
[bpt/emacs.git] / src / xselect.c
CommitLineData
2408b3a1 1/* X Selection processing for Emacs.
73b0cd50 2 Copyright (C) 1993-1997, 2000-2011 Free Software Foundation, Inc.
ede4db72
RS
3
4This file is part of GNU Emacs.
5
9ec0b715 6GNU Emacs is free software: you can redistribute it and/or modify
ede4db72 7it under the terms of the GNU General Public License as published by
9ec0b715
GM
8the Free Software Foundation, either version 3 of the License, or
9(at your option) any later version.
ede4db72
RS
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
9ec0b715 17along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
ede4db72 18
c6c5df7f 19
ede4db72
RS
20/* Rewritten by jwz */
21
18160b98 22#include <config.h>
be44ca6c 23#include <limits.h>
5b698285 24#include <stdio.h> /* termhooks.h needs this */
d7306fe6 25#include <setjmp.h>
678b3958
KS
26
27#ifdef HAVE_SYS_TYPES_H
28#include <sys/types.h>
29#endif
4004364e 30
678b3958 31#include <unistd.h>
678b3958 32
ede4db72
RS
33#include "lisp.h"
34#include "xterm.h" /* for all of the X includes */
7da64e5c
RS
35#include "dispextern.h" /* frame.h seems to want this */
36#include "frame.h" /* Need this to get the X window of selected_frame */
9ac0d9e0 37#include "blockinput.h"
5faa9b45 38#include "buffer.h"
dfcf069d 39#include "process.h"
1fb3821b 40#include "termhooks.h"
dd0fe424 41#include "keyboard.h"
f3d4e0a4 42#include "character.h"
1fb3821b
JD
43
44#include <X11/Xproto.h>
7da64e5c 45
d9c0d4a3 46struct prop_location;
e067f0c1 47struct selection_data;
d9c0d4a3 48
f57e2426 49static Lisp_Object x_atom_to_symbol (Display *dpy, Atom atom);
a9f737ee
CY
50static Atom symbol_to_x_atom (struct x_display_info *, Lisp_Object);
51static void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object);
52static Lisp_Object x_get_local_selection (Lisp_Object, Lisp_Object, int,
53 struct x_display_info *);
f57e2426
J
54static void x_decline_selection_request (struct input_event *);
55static Lisp_Object x_selection_request_lisp_error (Lisp_Object);
56static Lisp_Object queue_selection_requests_unwind (Lisp_Object);
f57e2426 57static Lisp_Object x_catch_errors_unwind (Lisp_Object);
e067f0c1
CY
58static void x_reply_selection_request (struct input_event *, struct x_display_info *);
59static int x_convert_selection (struct input_event *, Lisp_Object, Lisp_Object,
a9f737ee 60 Atom, int, struct x_display_info *);
f57e2426
J
61static int waiting_for_other_props_on_window (Display *, Window);
62static struct prop_location *expect_property_change (Display *, Window,
63 Atom, int);
64static void unexpect_property_change (struct prop_location *);
65static Lisp_Object wait_for_property_change_unwind (Lisp_Object);
66static void wait_for_property_change (struct prop_location *);
a9f737ee
CY
67static Lisp_Object x_get_foreign_selection (Lisp_Object, Lisp_Object,
68 Lisp_Object, Lisp_Object);
f57e2426
J
69static Lisp_Object x_get_window_property_as_lisp_data (Display *,
70 Window, Atom,
71 Lisp_Object, Atom);
eec47d6b
DN
72static Lisp_Object selection_data_to_lisp_data (Display *,
73 const unsigned char *,
864d7ce7 74 ptrdiff_t, Atom, int);
f57e2426
J
75static void lisp_data_to_selection_data (Display *, Lisp_Object,
76 unsigned char **, Atom *,
864d7ce7 77 ptrdiff_t *, int *, int *);
f57e2426 78static Lisp_Object clean_local_selection_data (Lisp_Object);
d9c0d4a3
GM
79
80/* Printing traces to stderr. */
81
82#ifdef TRACE_SELECTION
83#define TRACE0(fmt) \
84 fprintf (stderr, "%d: " fmt "\n", getpid ())
85#define TRACE1(fmt, a0) \
86 fprintf (stderr, "%d: " fmt "\n", getpid (), a0)
87#define TRACE2(fmt, a0, a1) \
88 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1)
9c3ad9e1
JD
89#define TRACE3(fmt, a0, a1, a2) \
90 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1, a2)
d9c0d4a3
GM
91#else
92#define TRACE0(fmt) (void) 0
93#define TRACE1(fmt, a0) (void) 0
94#define TRACE2(fmt, a0, a1) (void) 0
95#endif
96
97
955cbe7b 98static Lisp_Object QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
ede4db72 99 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
a9f737ee 100 QATOM_PAIR, QCLIPBOARD_MANAGER, QSAVE_TARGETS;
ede4db72 101
955cbe7b
PE
102static Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
103static Lisp_Object QUTF8_STRING; /* This is a type of selection. */
e6c7c988 104
955cbe7b 105static Lisp_Object Qcompound_text_with_extensions;
fbbe0ace 106
e57ad4d8 107static Lisp_Object Qforeign_selection;
cd18e7e3 108static Lisp_Object Qx_lost_selection_functions, Qx_sent_selection_functions;
e57ad4d8 109
864d7ce7
PE
110/* Bytes needed to represent 'long' data. This is as per libX11; it
111 is not necessarily sizeof (long). */
112#define X_LONG_SIZE 4
113
252c5ee1
PE
114/* Extreme 'short' and 'long' values suitable for libX11. */
115#define X_SHRT_MAX 0x7fff
116#define X_SHRT_MIN (-1 - X_SHRT_MAX)
117#define X_LONG_MAX 0x7fffffff
118#define X_LONG_MIN (-1 - X_LONG_MAX)
864d7ce7 119
ede4db72
RS
120/* If this is a smaller number than the max-request-size of the display,
121 emacs will use INCR selection transfer when the selection is larger
122 than this. The max-request-size is usually around 64k, so if you want
1b65481e 123 emacs to use incremental selection transfers when the selection is
ede4db72 124 smaller than that, set this. I added this mostly for debugging the
864d7ce7
PE
125 incremental transfer stuff, but it might improve server performance.
126
127 This value cannot exceed INT_MAX / max (X_LONG_SIZE, sizeof (long))
128 because it is multiplied by X_LONG_SIZE and by sizeof (long) in
129 subscript calculations. Similarly for PTRDIFF_MAX - 1 or SIZE_MAX
130 - 1 in place of INT_MAX. */
131#define MAX_SELECTION_QUANTUM \
132 ((int) min (0xFFFFFF, (min (INT_MAX, min (PTRDIFF_MAX, SIZE_MAX) - 1) \
133 / max (X_LONG_SIZE, sizeof (long)))))
ede4db72 134
864d7ce7
PE
135static int
136selection_quantum (Display *display)
137{
138 long mrs = XMaxRequestSize (display);
139 return (mrs < MAX_SELECTION_QUANTUM / X_LONG_SIZE + 25
140 ? (mrs - 25) * X_LONG_SIZE
141 : MAX_SELECTION_QUANTUM);
142}
ede4db72 143
a9f737ee
CY
144#define LOCAL_SELECTION(selection_symbol,dpyinfo) \
145 assq_no_quit (selection_symbol, dpyinfo->terminal->Vselection_alist)
dd0fe424
KS
146
147\f
678b3958
KS
148/* Define a queue to save up SELECTION_REQUEST_EVENT events for later
149 handling. */
dd0fe424
KS
150
151struct selection_event_queue
152 {
153 struct input_event event;
154 struct selection_event_queue *next;
155 };
156
157static struct selection_event_queue *selection_queue;
158
678b3958 159/* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
160
161static int x_queue_selection_requests;
162
678b3958 163/* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
dd0fe424
KS
164
165static void
971de7fb 166x_queue_event (struct input_event *event)
dd0fe424
KS
167{
168 struct selection_event_queue *queue_tmp;
169
678b3958
KS
170 /* Don't queue repeated requests.
171 This only happens for large requests which uses the incremental protocol. */
dd0fe424
KS
172 for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next)
173 {
72af86bd 174 if (!memcmp (&queue_tmp->event, event, sizeof (*event)))
dd0fe424 175 {
6f04d126 176 TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp);
678b3958 177 x_decline_selection_request (event);
dd0fe424
KS
178 return;
179 }
180 }
181
182 queue_tmp
183 = (struct selection_event_queue *) xmalloc (sizeof (struct selection_event_queue));
184
185 if (queue_tmp != NULL)
186 {
6f04d126 187 TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp);
dd0fe424
KS
188 queue_tmp->event = *event;
189 queue_tmp->next = selection_queue;
190 selection_queue = queue_tmp;
191 }
192}
193
678b3958 194/* Start queuing SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
195
196static void
971de7fb 197x_start_queuing_selection_requests (void)
dd0fe424
KS
198{
199 if (x_queue_selection_requests)
200 abort ();
201
202 x_queue_selection_requests++;
203 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
204}
205
678b3958 206/* Stop queuing SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
207
208static void
971de7fb 209x_stop_queuing_selection_requests (void)
dd0fe424
KS
210{
211 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
212 --x_queue_selection_requests;
213
214 /* Take all the queued events and put them back
215 so that they get processed afresh. */
216
217 while (selection_queue != NULL)
218 {
219 struct selection_event_queue *queue_tmp = selection_queue;
6f04d126 220 TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp);
dd0fe424
KS
221 kbd_buffer_unget_event (&queue_tmp->event);
222 selection_queue = queue_tmp->next;
223 xfree ((char *)queue_tmp);
224 }
225}
226\f
227
1b65481e 228/* This converts a Lisp symbol to a server Atom, avoiding a server
ede4db72
RS
229 roundtrip whenever possible. */
230
231static Atom
a9f737ee 232symbol_to_x_atom (struct x_display_info *dpyinfo, Lisp_Object sym)
ede4db72
RS
233{
234 Atom val;
235 if (NILP (sym)) return 0;
236 if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
237 if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
238 if (EQ (sym, QSTRING)) return XA_STRING;
239 if (EQ (sym, QINTEGER)) return XA_INTEGER;
240 if (EQ (sym, QATOM)) return XA_ATOM;
5c3a351a
RS
241 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
242 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
243 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
e6c7c988 244 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
5109c8dd 245 if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING;
5c3a351a
RS
246 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
247 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
248 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
249 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP;
250 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS;
251 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL;
ede4db72
RS
252 if (!SYMBOLP (sym)) abort ();
253
51b59d79 254 TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym)));
ede4db72 255 BLOCK_INPUT;
a9f737ee 256 val = XInternAtom (dpyinfo->display, SSDATA (SYMBOL_NAME (sym)), False);
ede4db72
RS
257 UNBLOCK_INPUT;
258 return val;
259}
260
261
262/* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
263 and calls to intern whenever possible. */
264
265static Lisp_Object
971de7fb 266x_atom_to_symbol (Display *dpy, Atom atom)
ede4db72 267{
d9c0d4a3 268 struct x_display_info *dpyinfo;
ede4db72
RS
269 char *str;
270 Lisp_Object val;
1b65481e 271
d9c0d4a3
GM
272 if (! atom)
273 return Qnil;
1b65481e 274
7da64e5c
RS
275 switch (atom)
276 {
277 case XA_PRIMARY:
278 return QPRIMARY;
279 case XA_SECONDARY:
280 return QSECONDARY;
281 case XA_STRING:
282 return QSTRING;
283 case XA_INTEGER:
284 return QINTEGER;
285 case XA_ATOM:
286 return QATOM;
7da64e5c
RS
287 }
288
d9c0d4a3 289 dpyinfo = x_display_info_for_display (dpy);
a9f737ee
CY
290 if (dpyinfo == NULL)
291 return Qnil;
5c3a351a 292 if (atom == dpyinfo->Xatom_CLIPBOARD)
7da64e5c 293 return QCLIPBOARD;
5c3a351a 294 if (atom == dpyinfo->Xatom_TIMESTAMP)
7da64e5c 295 return QTIMESTAMP;
5c3a351a 296 if (atom == dpyinfo->Xatom_TEXT)
7da64e5c 297 return QTEXT;
e6c7c988
KH
298 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
299 return QCOMPOUND_TEXT;
5109c8dd
KH
300 if (atom == dpyinfo->Xatom_UTF8_STRING)
301 return QUTF8_STRING;
5c3a351a 302 if (atom == dpyinfo->Xatom_DELETE)
7da64e5c 303 return QDELETE;
5c3a351a 304 if (atom == dpyinfo->Xatom_MULTIPLE)
7da64e5c 305 return QMULTIPLE;
5c3a351a 306 if (atom == dpyinfo->Xatom_INCR)
7da64e5c 307 return QINCR;
5c3a351a 308 if (atom == dpyinfo->Xatom_EMACS_TMP)
7da64e5c 309 return QEMACS_TMP;
5c3a351a 310 if (atom == dpyinfo->Xatom_TARGETS)
7da64e5c 311 return QTARGETS;
5c3a351a 312 if (atom == dpyinfo->Xatom_NULL)
7da64e5c 313 return QNULL;
ede4db72
RS
314
315 BLOCK_INPUT;
d9c0d4a3 316 str = XGetAtomName (dpy, atom);
ede4db72 317 UNBLOCK_INPUT;
d9c0d4a3 318 TRACE1 ("XGetAtomName --> %s", str);
ede4db72
RS
319 if (! str) return Qnil;
320 val = intern (str);
321 BLOCK_INPUT;
0158abbc 322 /* This was allocated by Xlib, so use XFree. */
ede4db72
RS
323 XFree (str);
324 UNBLOCK_INPUT;
325 return val;
326}
8a89415e 327\f
ede4db72 328/* Do protocol to assert ourself as a selection owner.
a9f737ee 329 FRAME shall be the owner; it must be a valid X frame.
1b65481e 330 Update the Vselection_alist so that we can reply to later requests for
ede4db72
RS
331 our selection. */
332
333static void
a9f737ee
CY
334x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value,
335 Lisp_Object frame)
ede4db72 336{
a9f737ee
CY
337 struct frame *f = XFRAME (frame);
338 Window selecting_window = FRAME_X_WINDOW (f);
339 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
340 Display *display = dpyinfo->display;
aa0daa9f 341 Time timestamp = last_event_timestamp;
a9f737ee 342 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_name);
ede4db72
RS
343
344 BLOCK_INPUT;
9ba8e10d 345 x_catch_errors (display);
aa0daa9f 346 XSetSelectionOwner (display, selection_atom, selecting_window, timestamp);
a7b24d46 347 x_check_errors (display, "Can't set selection: %s");
4545fa20 348 x_uncatch_errors ();
ede4db72
RS
349 UNBLOCK_INPUT;
350
351 /* Now update the local cache */
352 {
ede4db72
RS
353 Lisp_Object selection_data;
354 Lisp_Object prev_value;
355
16041401 356 selection_data = list4 (selection_name, selection_value,
be44ca6c 357 INTEGER_TO_CONS (timestamp), frame);
a9f737ee 358 prev_value = LOCAL_SELECTION (selection_name, dpyinfo);
ede4db72 359
a9f737ee
CY
360 dpyinfo->terminal->Vselection_alist
361 = Fcons (selection_data, dpyinfo->terminal->Vselection_alist);
ede4db72 362
a9f737ee
CY
363 /* If we already owned the selection, remove the old selection
364 data. Don't use Fdelq as that may QUIT. */
ede4db72
RS
365 if (!NILP (prev_value))
366 {
a9f737ee
CY
367 /* We know it's not the CAR, so it's easy. */
368 Lisp_Object rest = dpyinfo->terminal->Vselection_alist;
369 for (; CONSP (rest); rest = XCDR (rest))
8e713be6 370 if (EQ (prev_value, Fcar (XCDR (rest))))
ede4db72 371 {
a9f737ee 372 XSETCDR (rest, XCDR (XCDR (rest)));
ede4db72
RS
373 break;
374 }
375 }
376 }
377}
378\f
379/* Given a selection-name and desired type, look up our local copy of
380 the selection value and convert it to the type.
381 The value is nil or a string.
5109c8dd
KH
382 This function is used both for remote requests (LOCAL_REQUEST is zero)
383 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
ede4db72
RS
384
385 This calls random Lisp code, and may signal or gc. */
386
387static Lisp_Object
a9f737ee
CY
388x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
389 int local_request, struct x_display_info *dpyinfo)
ede4db72
RS
390{
391 Lisp_Object local_value;
6abdaa4a 392 Lisp_Object handler_fn, value, check;
ede4db72
RS
393 int count;
394
a9f737ee 395 local_value = LOCAL_SELECTION (selection_symbol, dpyinfo);
ede4db72
RS
396
397 if (NILP (local_value)) return Qnil;
398
a9f737ee 399 /* TIMESTAMP is a special case. */
ede4db72
RS
400 if (EQ (target_type, QTIMESTAMP))
401 {
402 handler_fn = Qnil;
8e713be6 403 value = XCAR (XCDR (XCDR (local_value)));
ede4db72 404 }
ede4db72
RS
405 else
406 {
407 /* Don't allow a quit within the converter.
408 When the user types C-g, he would be surprised
409 if by luck it came during a converter. */
aed13378 410 count = SPECPDL_INDEX ();
ede4db72
RS
411 specbind (Qinhibit_quit, Qt);
412
b7826503 413 CHECK_SYMBOL (target_type);
ede4db72 414 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
4f06187f
RS
415 /* gcpro is not needed here since nothing but HANDLER_FN
416 is live, and that ought to be a symbol. */
417
1eb4d468
RS
418 if (!NILP (handler_fn))
419 value = call3 (handler_fn,
5109c8dd 420 selection_symbol, (local_request ? Qnil : target_type),
8e713be6 421 XCAR (XCDR (local_value)));
1eb4d468
RS
422 else
423 value = Qnil;
ede4db72
RS
424 unbind_to (count, Qnil);
425 }
426
427 /* Make sure this value is of a type that we could transmit
428 to another X client. */
a87ed99c 429
ede4db72
RS
430 check = value;
431 if (CONSP (value)
8e713be6 432 && SYMBOLP (XCAR (value)))
8e713be6 433 check = XCDR (value);
1b65481e 434
ede4db72
RS
435 if (STRINGP (check)
436 || VECTORP (check)
437 || SYMBOLP (check)
7da64e5c 438 || INTEGERP (check)
ede4db72
RS
439 || NILP (value))
440 return value;
be44ca6c 441 /* Check for a value that CONS_TO_INTEGER could handle. */
ede4db72 442 else if (CONSP (check)
8e713be6
KR
443 && INTEGERP (XCAR (check))
444 && (INTEGERP (XCDR (check))
ede4db72 445 ||
8e713be6
KR
446 (CONSP (XCDR (check))
447 && INTEGERP (XCAR (XCDR (check)))
448 && NILP (XCDR (XCDR (check))))))
ede4db72 449 return value;
4d30ce50
KS
450
451 signal_error ("Invalid data returned by selection-conversion function",
452 list2 (handler_fn, value));
ede4db72
RS
453}
454\f
455/* Subroutines of x_reply_selection_request. */
456
5d0ba25b 457/* Send a SelectionNotify event to the requestor with property=None,
ede4db72
RS
458 meaning we were unable to do what they wanted. */
459
460static void
971de7fb 461x_decline_selection_request (struct input_event *event)
ede4db72 462{
65969f63
CY
463 XEvent reply_base;
464 XSelectionEvent *reply = &(reply_base.xselection);
1b65481e 465
65969f63
CY
466 reply->type = SelectionNotify;
467 reply->display = SELECTION_EVENT_DISPLAY (event);
468 reply->requestor = SELECTION_EVENT_REQUESTOR (event);
469 reply->selection = SELECTION_EVENT_SELECTION (event);
470 reply->time = SELECTION_EVENT_TIME (event);
471 reply->target = SELECTION_EVENT_TARGET (event);
472 reply->property = None;
ede4db72 473
d9c0d4a3
GM
474 /* The reason for the error may be that the receiver has
475 died in the meantime. Handle that case. */
ede4db72 476 BLOCK_INPUT;
65969f63
CY
477 x_catch_errors (reply->display);
478 XSendEvent (reply->display, reply->requestor, False, 0L, &reply_base);
479 XFlush (reply->display);
4545fa20 480 x_uncatch_errors ();
ede4db72
RS
481 UNBLOCK_INPUT;
482}
483
484/* This is the selection request currently being processed.
485 It is set to zero when the request is fully processed. */
486static struct input_event *x_selection_current_request;
487
ca29f2b8
GM
488/* Display info in x_selection_request. */
489
490static struct x_display_info *selection_request_dpyinfo;
491
e067f0c1
CY
492/* Raw selection data, for sending to a requestor window. */
493
494struct selection_data
495{
496 unsigned char *data;
864d7ce7 497 ptrdiff_t size;
e067f0c1
CY
498 int format;
499 Atom type;
500 int nofree;
501 Atom property;
502 /* This can be set to non-NULL during x_reply_selection_request, if
503 the selection is waiting for an INCR transfer to complete. Don't
504 free these; that's done by unexpect_property_change. */
505 struct prop_location *wait_object;
506 struct selection_data *next;
507};
508
509/* Linked list of the above (in support of MULTIPLE targets). */
510
0196f88a 511static struct selection_data *converted_selections;
e067f0c1
CY
512
513/* "Data" to send a requestor for a failed MULTIPLE subtarget. */
0196f88a 514static Atom conversion_fail_tag;
e067f0c1 515
ede4db72 516/* Used as an unwind-protect clause so that, if a selection-converter signals
2a1a4c9d 517 an error, we tell the requester that we were unable to do what they wanted
ede4db72
RS
518 before we throw to top-level or go into the debugger or whatever. */
519
520static Lisp_Object
971de7fb 521x_selection_request_lisp_error (Lisp_Object ignore)
ede4db72 522{
e067f0c1
CY
523 struct selection_data *cs, *next;
524
525 for (cs = converted_selections; cs; cs = next)
526 {
527 next = cs->next;
528 if (cs->nofree == 0 && cs->data)
529 xfree (cs->data);
530 xfree (cs);
531 }
532 converted_selections = NULL;
533
ca29f2b8
GM
534 if (x_selection_current_request != 0
535 && selection_request_dpyinfo->display)
ede4db72
RS
536 x_decline_selection_request (x_selection_current_request);
537 return Qnil;
538}
c525d842
CY
539
540static Lisp_Object
971de7fb 541x_catch_errors_unwind (Lisp_Object dummy)
c525d842
CY
542{
543 BLOCK_INPUT;
544 x_uncatch_errors ();
545 UNBLOCK_INPUT;
6f10509c 546 return Qnil;
c525d842 547}
ede4db72 548\f
d1f21a66
RS
549
550/* This stuff is so that INCR selections are reentrant (that is, so we can
551 be servicing multiple INCR selection requests simultaneously.) I haven't
552 actually tested that yet. */
553
554/* Keep a list of the property changes that are awaited. */
555
556struct prop_location
557{
558 int identifier;
559 Display *display;
560 Window window;
561 Atom property;
562 int desired_state;
563 int arrived;
564 struct prop_location *next;
565};
566
971de7fb
DN
567static struct prop_location *expect_property_change (Display *display, Window window, Atom property, int state);
568static void wait_for_property_change (struct prop_location *location);
569static void unexpect_property_change (struct prop_location *location);
570static int waiting_for_other_props_on_window (Display *display, Window window);
d1f21a66
RS
571
572static int prop_location_identifier;
573
574static Lisp_Object property_change_reply;
575
576static struct prop_location *property_change_reply_object;
577
578static struct prop_location *property_change_wait_list;
55b2d45d
RS
579
580static Lisp_Object
971de7fb 581queue_selection_requests_unwind (Lisp_Object tem)
55b2d45d 582{
dd0fe424 583 x_stop_queuing_selection_requests ();
ab552306 584 return Qnil;
55b2d45d
RS
585}
586
d1f21a66 587\f
e067f0c1 588/* Send the reply to a selection request event EVENT. */
ede4db72 589
46d47e41 590#ifdef TRACE_SELECTION
ca7af97a 591static int x_reply_selection_request_cnt;
46d47e41
GM
592#endif /* TRACE_SELECTION */
593
ede4db72 594static void
5e617bc2
JB
595x_reply_selection_request (struct input_event *event,
596 struct x_display_info *dpyinfo)
ede4db72 597{
65969f63
CY
598 XEvent reply_base;
599 XSelectionEvent *reply = &(reply_base.xselection);
ede4db72 600 Display *display = SELECTION_EVENT_DISPLAY (event);
5d0ba25b 601 Window window = SELECTION_EVENT_REQUESTOR (event);
864d7ce7
PE
602 ptrdiff_t bytes_remaining;
603 int max_bytes = selection_quantum (display);
9ba8e10d 604 int count = SPECPDL_INDEX ();
e067f0c1 605 struct selection_data *cs;
ede4db72 606
65969f63
CY
607 reply->type = SelectionNotify;
608 reply->display = display;
609 reply->requestor = window;
610 reply->selection = SELECTION_EVENT_SELECTION (event);
611 reply->time = SELECTION_EVENT_TIME (event);
612 reply->target = SELECTION_EVENT_TARGET (event);
613 reply->property = SELECTION_EVENT_PROPERTY (event);
614 if (reply->property == None)
615 reply->property = reply->target;
ede4db72 616
afe1529d 617 BLOCK_INPUT;
c525d842
CY
618 /* The protected block contains wait_for_property_change, which can
619 run random lisp code (process handlers) or signal. Therefore, we
620 put the x_uncatch_errors call in an unwind. */
621 record_unwind_protect (x_catch_errors_unwind, Qnil);
9ba8e10d 622 x_catch_errors (display);
ede4db72 623
e067f0c1
CY
624 /* Loop over converted selections, storing them in the requested
625 properties. If data is large, only store the first N bytes
626 (section 2.7.2 of ICCCM). Note that we store the data for a
627 MULTIPLE request in the opposite order; the ICCM says only that
628 the conversion itself must be done in the same order. */
629 for (cs = converted_selections; cs; cs = cs->next)
630 {
a9f737ee
CY
631 if (cs->property == None)
632 continue;
633
864d7ce7
PE
634 bytes_remaining = cs->size;
635 bytes_remaining *= cs->format >> 3;
a9f737ee 636 if (bytes_remaining <= max_bytes)
e067f0c1 637 {
a9f737ee 638 /* Send all the data at once, with minimal handshaking. */
864d7ce7 639 TRACE1 ("Sending all %"pD"d bytes", bytes_remaining);
a9f737ee
CY
640 XChangeProperty (display, window, cs->property,
641 cs->type, cs->format, PropModeReplace,
642 cs->data, cs->size);
643 }
644 else
645 {
646 /* Send an INCR tag to initiate incremental transfer. */
252c5ee1 647 long value[1];
a9f737ee 648
864d7ce7 649 TRACE2 ("Start sending %"pD"d bytes incrementally (%s)",
a9f737ee
CY
650 bytes_remaining, XGetAtomName (display, cs->property));
651 cs->wait_object
652 = expect_property_change (display, window, cs->property,
653 PropertyDelete);
654
655 /* XChangeProperty expects an array of long even if long is
656 more than 32 bits. */
252c5ee1 657 value[0] = min (bytes_remaining, X_LONG_MAX);
a9f737ee
CY
658 XChangeProperty (display, window, cs->property,
659 dpyinfo->Xatom_INCR, 32, PropModeReplace,
660 (unsigned char *) value, 1);
661 XSelectInput (display, window, PropertyChangeMask);
e067f0c1
CY
662 }
663 }
664
665 /* Now issue the SelectionNotify event. */
666 XSendEvent (display, window, False, 0L, &reply_base);
667 XFlush (display);
668
9c3ad9e1
JD
669#ifdef TRACE_SELECTION
670 {
65969f63
CY
671 char *sel = XGetAtomName (display, reply->selection);
672 char *tgt = XGetAtomName (display, reply->target);
e067f0c1
CY
673 TRACE3 ("Sent SelectionNotify: %s, target %s (%d)",
674 sel, tgt, ++x_reply_selection_request_cnt);
9c3ad9e1
JD
675 if (sel) XFree (sel);
676 if (tgt) XFree (tgt);
677 }
678#endif /* TRACE_SELECTION */
679
e067f0c1
CY
680 /* Finish sending the rest of each of the INCR values. This should
681 be improved; there's a chance of deadlock if more than one
682 subtarget in a MULTIPLE selection requires an INCR transfer, and
683 the requestor and Emacs loop waiting on different transfers. */
684 for (cs = converted_selections; cs; cs = cs->next)
685 if (cs->wait_object)
e22cf39c 686 {
e067f0c1
CY
687 int format_bytes = cs->format / 8;
688 int had_errors = x_had_errors_p (display);
689 UNBLOCK_INPUT;
1b65481e 690
864d7ce7
PE
691 bytes_remaining = cs->size;
692 bytes_remaining *= format_bytes;
ede4db72 693
e067f0c1
CY
694 /* Wait for the requester to ack by deleting the property.
695 This can run Lisp code (process handlers) or signal. */
696 if (! had_errors)
697 {
698 TRACE1 ("Waiting for ACK (deletion of %s)",
699 XGetAtomName (display, cs->property));
700 wait_for_property_change (cs->wait_object);
701 }
702 else
703 unexpect_property_change (cs->wait_object);
ede4db72 704
e067f0c1
CY
705 while (bytes_remaining)
706 {
707 int i = ((bytes_remaining < max_bytes)
708 ? bytes_remaining
709 : max_bytes) / format_bytes;
710 BLOCK_INPUT;
711
712 cs->wait_object
713 = expect_property_change (display, window, cs->property,
714 PropertyDelete);
715
716 TRACE1 ("Sending increment of %d elements", i);
717 TRACE1 ("Set %s to increment data",
718 XGetAtomName (display, cs->property));
719
720 /* Append the next chunk of data to the property. */
721 XChangeProperty (display, window, cs->property,
722 cs->type, cs->format, PropModeAppend,
723 cs->data, i);
724 bytes_remaining -= i * format_bytes;
a9f737ee
CY
725 cs->data += i * ((cs->format == 32) ? sizeof (long)
726 : format_bytes);
e067f0c1
CY
727 XFlush (display);
728 had_errors = x_had_errors_p (display);
729 UNBLOCK_INPUT;
ede4db72 730
e067f0c1 731 if (had_errors) break;
afe1529d 732
e067f0c1
CY
733 /* Wait for the requester to ack this chunk by deleting
734 the property. This can run Lisp code or signal. */
735 TRACE1 ("Waiting for increment ACK (deletion of %s)",
736 XGetAtomName (display, cs->property));
737 wait_for_property_change (cs->wait_object);
738 }
1b65481e 739
e067f0c1
CY
740 /* Now write a zero-length chunk to the property to tell the
741 requester that we're done. */
742 BLOCK_INPUT;
743 if (! waiting_for_other_props_on_window (display, window))
744 XSelectInput (display, window, 0L);
745
746 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
747 XGetAtomName (display, cs->property));
748 XChangeProperty (display, window, cs->property,
749 cs->type, cs->format, PropModeReplace,
750 cs->data, 0);
751 TRACE0 ("Done sending incrementally");
752 }
afe1529d 753
ceabd272 754 /* rms, 2003-01-03: I think I have fixed this bug. */
47a6ac17
GM
755 /* The window we're communicating with may have been deleted
756 in the meantime (that's a real situation from a bug report).
757 In this case, there may be events in the event queue still
758 refering to the deleted window, and we'll get a BadWindow error
759 in XTread_socket when processing the events. I don't have
760 an idea how to fix that. gerd, 2001-01-98. */
844fc085
JD
761 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
762 delivered before uncatch errors. */
763 XSync (display, False);
afe1529d 764 UNBLOCK_INPUT;
0608b1a0
JD
765
766 /* GTK queues events in addition to the queue in Xlib. So we
767 UNBLOCK to enter the event loop and get possible errors delivered,
768 and then BLOCK again because x_uncatch_errors requires it. */
769 BLOCK_INPUT;
c525d842 770 /* This calls x_uncatch_errors. */
9ba8e10d 771 unbind_to (count, Qnil);
afe1529d 772 UNBLOCK_INPUT;
ede4db72
RS
773}
774\f
775/* Handle a SelectionRequest event EVENT.
776 This is called from keyboard.c when such an event is found in the queue. */
777
dd0fe424 778static void
971de7fb 779x_handle_selection_request (struct input_event *event)
ede4db72 780{
e067f0c1 781 struct gcpro gcpro1, gcpro2;
ede4db72 782 Time local_selection_time;
e067f0c1
CY
783
784 Display *display = SELECTION_EVENT_DISPLAY (event);
785 struct x_display_info *dpyinfo = x_display_info_for_display (display);
e067f0c1
CY
786 Atom selection = SELECTION_EVENT_SELECTION (event);
787 Lisp_Object selection_symbol = x_atom_to_symbol (display, selection);
788 Atom target = SELECTION_EVENT_TARGET (event);
789 Lisp_Object target_symbol = x_atom_to_symbol (display, target);
790 Atom property = SELECTION_EVENT_PROPERTY (event);
a9f737ee 791 Lisp_Object local_selection_data;
e067f0c1
CY
792 int success = 0;
793 int count = SPECPDL_INDEX ();
e067f0c1 794 GCPRO2 (local_selection_data, target_symbol);
ede4db72 795
a9f737ee
CY
796 if (!dpyinfo) goto DONE;
797
798 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
799
e067f0c1
CY
800 /* Decline if we don't own any selections. */
801 if (NILP (local_selection_data)) goto DONE;
ede4db72 802
e067f0c1 803 /* Decline requests issued prior to our acquiring the selection. */
be44ca6c
PE
804 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
805 Time, local_selection_time);
ede4db72 806 if (SELECTION_EVENT_TIME (event) != CurrentTime
7da64e5c 807 && local_selection_time > SELECTION_EVENT_TIME (event))
e067f0c1 808 goto DONE;
ede4db72 809
ede4db72 810 x_selection_current_request = event;
ca29f2b8 811 selection_request_dpyinfo = dpyinfo;
ede4db72
RS
812 record_unwind_protect (x_selection_request_lisp_error, Qnil);
813
e067f0c1
CY
814 /* We might be able to handle nested x_handle_selection_requests,
815 but this is difficult to test, and seems unimportant. */
816 x_start_queuing_selection_requests ();
817 record_unwind_protect (queue_selection_requests_unwind, Qnil);
ede4db72 818
757c9275
CY
819 TRACE2 ("x_handle_selection_request: selection=%s, target=%s",
820 SDATA (SYMBOL_NAME (selection_symbol)),
821 SDATA (SYMBOL_NAME (target_symbol)));
822
ede4db72 823 if (EQ (target_symbol, QMULTIPLE))
e067f0c1
CY
824 {
825 /* For MULTIPLE targets, the event property names a list of atom
826 pairs; the first atom names a target and the second names a
827 non-None property. */
828 Window requestor = SELECTION_EVENT_REQUESTOR (event);
829 Lisp_Object multprop;
864d7ce7 830 ptrdiff_t j, nselections;
e067f0c1
CY
831
832 if (property == None) goto DONE;
a9f737ee
CY
833 multprop
834 = x_get_window_property_as_lisp_data (display, requestor, property,
835 QMULTIPLE, selection);
e067f0c1 836
757c9275 837 if (!VECTORP (multprop) || ASIZE (multprop) % 2)
e067f0c1
CY
838 goto DONE;
839
840 nselections = ASIZE (multprop) / 2;
841 /* Perform conversions. This can signal. */
842 for (j = 0; j < nselections; j++)
843 {
e067f0c1 844 Lisp_Object subtarget = AREF (multprop, 2*j);
a9f737ee 845 Atom subproperty = symbol_to_x_atom (dpyinfo,
e067f0c1
CY
846 AREF (multprop, 2*j+1));
847
848 if (subproperty != None)
849 x_convert_selection (event, selection_symbol, subtarget,
a9f737ee 850 subproperty, 1, dpyinfo);
e067f0c1
CY
851 }
852 success = 1;
853 }
854 else
855 {
856 if (property == None)
857 property = SELECTION_EVENT_TARGET (event);
858 success = x_convert_selection (event, selection_symbol,
a9f737ee
CY
859 target_symbol, property,
860 0, dpyinfo);
e067f0c1 861 }
1b65481e 862
e067f0c1 863 DONE:
1b65481e 864
e067f0c1
CY
865 if (success)
866 x_reply_selection_request (event, dpyinfo);
867 else
868 x_decline_selection_request (event);
869 x_selection_current_request = 0;
1b65481e 870
e067f0c1
CY
871 /* Run the `x-sent-selection-functions' abnormal hook. */
872 if (!NILP (Vx_sent_selection_functions)
873 && !EQ (Vx_sent_selection_functions, Qunbound))
ede4db72 874 {
e067f0c1 875 Lisp_Object args[4];
cd18e7e3 876 args[0] = Qx_sent_selection_functions;
e067f0c1
CY
877 args[1] = selection_symbol;
878 args[2] = target_symbol;
879 args[3] = success ? Qt : Qnil;
880 Frun_hook_with_args (4, args);
881 }
866f8518 882
e067f0c1
CY
883 unbind_to (count, Qnil);
884 UNGCPRO;
885}
1b65481e 886
e067f0c1
CY
887/* Perform the requested selection conversion, and write the data to
888 the converted_selections linked list, where it can be accessed by
889 x_reply_selection_request. If FOR_MULTIPLE is non-zero, write out
890 the data even if conversion fails, using conversion_fail_tag.
ede4db72 891
e067f0c1 892 Return 0 if the selection failed to convert, 1 otherwise. */
ede4db72 893
e067f0c1 894static int
a9f737ee
CY
895x_convert_selection (struct input_event *event, Lisp_Object selection_symbol,
896 Lisp_Object target_symbol, Atom property,
897 int for_multiple, struct x_display_info *dpyinfo)
e067f0c1
CY
898{
899 struct gcpro gcpro1;
900 Lisp_Object lisp_selection;
901 struct selection_data *cs;
902 GCPRO1 (lisp_selection);
866f8518 903
e067f0c1 904 lisp_selection
a9f737ee
CY
905 = x_get_local_selection (selection_symbol, target_symbol,
906 0, dpyinfo);
ede4db72 907
e067f0c1
CY
908 /* A nil return value means we can't perform the conversion. */
909 if (NILP (lisp_selection)
910 || (CONSP (lisp_selection) && NILP (XCDR (lisp_selection))))
911 {
912 if (for_multiple)
913 {
914 cs = xmalloc (sizeof (struct selection_data));
915 cs->data = (unsigned char *) &conversion_fail_tag;
916 cs->size = 1;
917 cs->format = 32;
918 cs->type = XA_ATOM;
919 cs->nofree = 1;
920 cs->property = property;
921 cs->wait_object = NULL;
922 cs->next = converted_selections;
923 converted_selections = cs;
924 }
ede4db72 925
18480f8f
SM
926 UNGCPRO;
927 return 0;
e067f0c1 928 }
4f06187f 929
e067f0c1
CY
930 /* Otherwise, record the converted selection to binary. */
931 cs = xmalloc (sizeof (struct selection_data));
932 cs->nofree = 1;
933 cs->property = property;
934 cs->wait_object = NULL;
935 cs->next = converted_selections;
936 converted_selections = cs;
937 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event),
938 lisp_selection,
939 &(cs->data), &(cs->type),
940 &(cs->size), &(cs->format),
941 &(cs->nofree));
18480f8f
SM
942 UNGCPRO;
943 return 1;
ede4db72
RS
944}
945\f
e18e6130 946/* Handle a SelectionClear event EVENT, which indicates that some
ede4db72
RS
947 client cleared out our previously asserted selection.
948 This is called from keyboard.c when such an event is found in the queue. */
949
dd0fe424 950static void
971de7fb 951x_handle_selection_clear (struct input_event *event)
ede4db72
RS
952{
953 Display *display = SELECTION_EVENT_DISPLAY (event);
954 Atom selection = SELECTION_EVENT_SELECTION (event);
955 Time changed_owner_time = SELECTION_EVENT_TIME (event);
1b65481e 956
ede4db72
RS
957 Lisp_Object selection_symbol, local_selection_data;
958 Time local_selection_time;
5c3a351a 959 struct x_display_info *dpyinfo = x_display_info_for_display (display);
a9f737ee 960 Lisp_Object Vselection_alist;
e18e6130 961
dd0fe424
KS
962 TRACE0 ("x_handle_selection_clear");
963
a9f737ee 964 if (!dpyinfo) return;
16041401 965
d9c0d4a3 966 selection_symbol = x_atom_to_symbol (display, selection);
a9f737ee 967 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
ede4db72
RS
968
969 /* Well, we already believe that we don't own it, so that's just fine. */
970 if (NILP (local_selection_data)) return;
971
be44ca6c
PE
972 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
973 Time, local_selection_time);
ede4db72 974
a9f737ee
CY
975 /* We have reasserted the selection since this SelectionClear was
976 generated, so we can disregard it. */
ede4db72
RS
977 if (changed_owner_time != CurrentTime
978 && local_selection_time > changed_owner_time)
979 return;
980
a9f737ee
CY
981 /* Otherwise, really clear. Don't use Fdelq as that may QUIT;. */
982 Vselection_alist = dpyinfo->terminal->Vselection_alist;
983 if (EQ (local_selection_data, CAR (Vselection_alist)))
984 Vselection_alist = XCDR (Vselection_alist);
ede4db72
RS
985 else
986 {
987 Lisp_Object rest;
99784d63 988 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
a9f737ee 989 if (EQ (local_selection_data, CAR (XCDR (rest))))
ede4db72 990 {
a9f737ee 991 XSETCDR (rest, XCDR (XCDR (rest)));
ede4db72
RS
992 break;
993 }
994 }
a9f737ee 995 dpyinfo->terminal->Vselection_alist = Vselection_alist;
ede4db72 996
a9f737ee 997 /* Run the `x-lost-selection-functions' abnormal hook. */
ede4db72 998 {
a9f737ee 999 Lisp_Object args[2];
cd18e7e3 1000 args[0] = Qx_lost_selection_functions;
a9f737ee
CY
1001 args[1] = selection_symbol;
1002 Frun_hook_with_args (2, args);
ede4db72 1003 }
a9f737ee
CY
1004
1005 prepare_menu_bars ();
1006 redisplay_preserve_echo_area (20);
ede4db72
RS
1007}
1008
dd0fe424 1009void
971de7fb 1010x_handle_selection_event (struct input_event *event)
dd0fe424
KS
1011{
1012 TRACE0 ("x_handle_selection_event");
e067f0c1 1013 if (event->kind != SELECTION_REQUEST_EVENT)
dd0fe424 1014 x_handle_selection_clear (event);
e067f0c1
CY
1015 else if (x_queue_selection_requests)
1016 x_queue_event (event);
1017 else
1018 x_handle_selection_request (event);
dd0fe424
KS
1019}
1020
1021
118bd841
RS
1022/* Clear all selections that were made from frame F.
1023 We do this when about to delete a frame. */
1024
1025void
971de7fb 1026x_clear_frame_selections (FRAME_PTR f)
118bd841
RS
1027{
1028 Lisp_Object frame;
1029 Lisp_Object rest;
a9f737ee
CY
1030 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
1031 struct terminal *t = dpyinfo->terminal;
118bd841 1032
90851bbe 1033 XSETFRAME (frame, f);
118bd841 1034
0d199f9c 1035 /* Delete elements from the beginning of Vselection_alist. */
a9f737ee
CY
1036 while (CONSP (t->Vselection_alist)
1037 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (t->Vselection_alist)))))))
0d199f9c 1038 {
a9f737ee
CY
1039 /* Run the `x-lost-selection-functions' abnormal hook. */
1040 Lisp_Object args[2];
cd18e7e3 1041 args[0] = Qx_lost_selection_functions;
a9f737ee
CY
1042 args[1] = Fcar (Fcar (t->Vselection_alist));
1043 Frun_hook_with_args (2, args);
0d199f9c 1044
a9f737ee 1045 t->Vselection_alist = XCDR (t->Vselection_alist);
0d199f9c
RS
1046 }
1047
1048 /* Delete elements after the beginning of Vselection_alist. */
a9f737ee
CY
1049 for (rest = t->Vselection_alist; CONSP (rest); rest = XCDR (rest))
1050 if (CONSP (XCDR (rest))
1051 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (XCDR (rest))))))))
118bd841 1052 {
a9f737ee 1053 Lisp_Object args[2];
cd18e7e3 1054 args[0] = Qx_lost_selection_functions;
a9f737ee
CY
1055 args[1] = XCAR (XCAR (XCDR (rest)));
1056 Frun_hook_with_args (2, args);
1057 XSETCDR (rest, XCDR (XCDR (rest)));
118bd841
RS
1058 break;
1059 }
1060}
ede4db72 1061\f
ede4db72
RS
1062/* Nonzero if any properties for DISPLAY and WINDOW
1063 are on the list of what we are waiting for. */
1064
1065static int
971de7fb 1066waiting_for_other_props_on_window (Display *display, Window window)
ede4db72
RS
1067{
1068 struct prop_location *rest = property_change_wait_list;
1069 while (rest)
1070 if (rest->display == display && rest->window == window)
1071 return 1;
1072 else
1073 rest = rest->next;
1074 return 0;
1075}
1076
1077/* Add an entry to the list of property changes we are waiting for.
1078 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1079 The return value is a number that uniquely identifies
1080 this awaited property change. */
1081
d1f21a66 1082static struct prop_location *
5e617bc2
JB
1083expect_property_change (Display *display, Window window,
1084 Atom property, int state)
ede4db72 1085{
d9c0d4a3 1086 struct prop_location *pl = (struct prop_location *) xmalloc (sizeof *pl);
2f65feb6 1087 pl->identifier = ++prop_location_identifier;
ede4db72
RS
1088 pl->display = display;
1089 pl->window = window;
1090 pl->property = property;
1091 pl->desired_state = state;
1092 pl->next = property_change_wait_list;
d1f21a66 1093 pl->arrived = 0;
ede4db72 1094 property_change_wait_list = pl;
d1f21a66 1095 return pl;
ede4db72
RS
1096}
1097
1098/* Delete an entry from the list of property changes we are waiting for.
2f65feb6 1099 IDENTIFIER is the number that uniquely identifies the entry. */
ede4db72
RS
1100
1101static void
971de7fb 1102unexpect_property_change (struct prop_location *location)
ede4db72
RS
1103{
1104 struct prop_location *prev = 0, *rest = property_change_wait_list;
1105 while (rest)
1106 {
d1f21a66 1107 if (rest == location)
ede4db72
RS
1108 {
1109 if (prev)
1110 prev->next = rest->next;
1111 else
1112 property_change_wait_list = rest->next;
4feb31b2 1113 xfree (rest);
ede4db72
RS
1114 return;
1115 }
1116 prev = rest;
1117 rest = rest->next;
1118 }
1119}
1120
2f65feb6
RS
1121/* Remove the property change expectation element for IDENTIFIER. */
1122
1123static Lisp_Object
971de7fb 1124wait_for_property_change_unwind (Lisp_Object loc)
2f65feb6 1125{
dd0fe424
KS
1126 struct prop_location *location = XSAVE_VALUE (loc)->pointer;
1127
1128 unexpect_property_change (location);
1129 if (location == property_change_reply_object)
1130 property_change_reply_object = 0;
ab552306 1131 return Qnil;
2f65feb6
RS
1132}
1133
ede4db72 1134/* Actually wait for a property change.
2f65feb6 1135 IDENTIFIER should be the value that expect_property_change returned. */
ede4db72
RS
1136
1137static void
971de7fb 1138wait_for_property_change (struct prop_location *location)
ede4db72 1139{
2f65feb6 1140 int secs, usecs;
aed13378 1141 int count = SPECPDL_INDEX ();
d1f21a66 1142
dd0fe424
KS
1143 if (property_change_reply_object)
1144 abort ();
2f65feb6
RS
1145
1146 /* Make sure to do unexpect_property_change if we quit or err. */
dd0fe424
KS
1147 record_unwind_protect (wait_for_property_change_unwind,
1148 make_save_value (location, 0));
2f65feb6 1149
f3fbd155 1150 XSETCAR (property_change_reply, Qnil);
afe1529d 1151 property_change_reply_object = location;
dd0fe424 1152
afe1529d
RS
1153 /* If the event we are waiting for arrives beyond here, it will set
1154 property_change_reply, because property_change_reply_object says so. */
d1f21a66
RS
1155 if (! location->arrived)
1156 {
d1f21a66
RS
1157 secs = x_selection_timeout / 1000;
1158 usecs = (x_selection_timeout % 1000) * 1000;
d9c0d4a3 1159 TRACE2 (" Waiting %d secs, %d usecs", secs, usecs);
d64b707c
KS
1160 wait_reading_process_output (secs, usecs, 0, 0,
1161 property_change_reply, NULL, 0);
d1f21a66 1162
8e713be6 1163 if (NILP (XCAR (property_change_reply)))
d9c0d4a3
GM
1164 {
1165 TRACE0 (" Timed out");
1166 error ("Timed out waiting for property-notify event");
1167 }
d1f21a66 1168 }
2f65feb6
RS
1169
1170 unbind_to (count, Qnil);
ede4db72
RS
1171}
1172
1173/* Called from XTread_socket in response to a PropertyNotify event. */
1174
1175void
971de7fb 1176x_handle_property_notify (XPropertyEvent *event)
ede4db72 1177{
6abdaa4a 1178 struct prop_location *rest;
d9c0d4a3 1179
6abdaa4a 1180 for (rest = property_change_wait_list; rest; rest = rest->next)
ede4db72 1181 {
dd0fe424
KS
1182 if (!rest->arrived
1183 && rest->property == event->atom
ede4db72
RS
1184 && rest->window == event->window
1185 && rest->display == event->display
1186 && rest->desired_state == event->state)
1187 {
d9c0d4a3
GM
1188 TRACE2 ("Expected %s of property %s",
1189 (event->state == PropertyDelete ? "deletion" : "change"),
1190 XGetAtomName (event->display, event->atom));
ede4db72 1191
d1f21a66
RS
1192 rest->arrived = 1;
1193
ede4db72
RS
1194 /* If this is the one wait_for_property_change is waiting for,
1195 tell it to wake up. */
d1f21a66 1196 if (rest == property_change_reply_object)
f3fbd155 1197 XSETCAR (property_change_reply, Qt);
ede4db72 1198
ede4db72
RS
1199 return;
1200 }
ede4db72 1201 }
ede4db72
RS
1202}
1203
1204
1205\f
ede4db72
RS
1206/* Variables for communication with x_handle_selection_notify. */
1207static Atom reading_which_selection;
1208static Lisp_Object reading_selection_reply;
1209static Window reading_selection_window;
1210
1211/* Do protocol to read selection-data from the server.
a9f737ee
CY
1212 Converts this to Lisp data and returns it.
1213 FRAME is the frame whose X window shall request the selection. */
ede4db72
RS
1214
1215static Lisp_Object
a9f737ee
CY
1216x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
1217 Lisp_Object time_stamp, Lisp_Object frame)
ede4db72 1218{
a9f737ee
CY
1219 struct frame *f = XFRAME (frame);
1220 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
1221 Display *display = dpyinfo->display;
1222 Window requestor_window = FRAME_X_WINDOW (f);
5d0ba25b 1223 Time requestor_time = last_event_timestamp;
a9f737ee
CY
1224 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1225 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_symbol);
1226 Atom type_atom = (CONSP (target_type)
1227 ? symbol_to_x_atom (dpyinfo, XCAR (target_type))
1228 : symbol_to_x_atom (dpyinfo, target_type));
80da0190 1229 int secs, usecs;
ede4db72 1230
a9f737ee 1231 if (!FRAME_LIVE_P (f))
428a555e
KL
1232 return Qnil;
1233
3a42401d 1234 if (! NILP (time_stamp))
be44ca6c 1235 CONS_TO_INTEGER (time_stamp, Time, requestor_time);
3a42401d 1236
ede4db72 1237 BLOCK_INPUT;
d9c0d4a3
GM
1238 TRACE2 ("Get selection %s, type %s",
1239 XGetAtomName (display, type_atom),
1240 XGetAtomName (display, target_property));
1241
de65b42c 1242 x_catch_errors (display);
ede4db72 1243 XConvertSelection (display, selection_atom, type_atom, target_property,
5d0ba25b 1244 requestor_window, requestor_time);
de65b42c
CY
1245 x_check_errors (display, "Can't convert selection: %s");
1246 x_uncatch_errors ();
ede4db72
RS
1247
1248 /* Prepare to block until the reply has been read. */
5d0ba25b 1249 reading_selection_window = requestor_window;
ede4db72 1250 reading_which_selection = selection_atom;
f3fbd155 1251 XSETCAR (reading_selection_reply, Qnil);
55b2d45d 1252
e067f0c1
CY
1253 /* It should not be necessary to stop handling selection requests
1254 during this time. In fact, the SAVE_TARGETS mechanism requires
1255 us to handle a clipboard manager's requests before it returns
1256 SelectionNotify. */
1257#if 0
a9f737ee
CY
1258 x_start_queuing_selection_requests ();
1259 record_unwind_protect (queue_selection_requests_unwind, Qnil);
e067f0c1
CY
1260#endif
1261
ede4db72
RS
1262 UNBLOCK_INPUT;
1263
80da0190
RS
1264 /* This allows quits. Also, don't wait forever. */
1265 secs = x_selection_timeout / 1000;
1266 usecs = (x_selection_timeout % 1000) * 1000;
d9c0d4a3 1267 TRACE1 (" Start waiting %d secs for SelectionNotify", secs);
d64b707c
KS
1268 wait_reading_process_output (secs, usecs, 0, 0,
1269 reading_selection_reply, NULL, 0);
d9c0d4a3 1270 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
ede4db72 1271
8e713be6 1272 if (NILP (XCAR (reading_selection_reply)))
606140dd 1273 error ("Timed out waiting for reply from selection owner");
8e713be6 1274 if (EQ (XCAR (reading_selection_reply), Qlambda))
12061f06 1275 return Qnil;
ede4db72
RS
1276
1277 /* Otherwise, the selection is waiting for us on the requested property. */
1278 return
5d0ba25b 1279 x_get_window_property_as_lisp_data (display, requestor_window,
ede4db72
RS
1280 target_property, target_type,
1281 selection_atom);
1282}
1283\f
1284/* Subroutines of x_get_window_property_as_lisp_data */
1285
4feb31b2 1286/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1287
ede4db72 1288static void
d5a3eaaf 1289x_get_window_property (Display *display, Window window, Atom property,
864d7ce7 1290 unsigned char **data_ret, ptrdiff_t *bytes_ret,
d5a3eaaf
AS
1291 Atom *actual_type_ret, int *actual_format_ret,
1292 unsigned long *actual_size_ret, int delete_p)
ede4db72 1293{
864d7ce7 1294 ptrdiff_t total_size;
ede4db72 1295 unsigned long bytes_remaining;
864d7ce7
PE
1296 ptrdiff_t offset = 0;
1297 unsigned char *data = 0;
ede4db72
RS
1298 unsigned char *tmp_data = 0;
1299 int result;
864d7ce7
PE
1300 int buffer_size = selection_quantum (display);
1301
1302 /* Wide enough to avoid overflow in expressions using it. */
1303 ptrdiff_t x_long_size = X_LONG_SIZE;
1b65481e 1304
864d7ce7
PE
1305 /* Maximum value for TOTAL_SIZE. It cannot exceed PTRDIFF_MAX - 1
1306 and SIZE_MAX - 1, for an extra byte at the end. And it cannot
1307 exceed LONG_MAX * X_LONG_SIZE, for XGetWindowProperty. */
1308 ptrdiff_t total_size_max =
1309 ((min (PTRDIFF_MAX, SIZE_MAX) - 1) / x_long_size < LONG_MAX
1310 ? min (PTRDIFF_MAX, SIZE_MAX) - 1
1311 : LONG_MAX * x_long_size);
1b65481e 1312
ede4db72 1313 BLOCK_INPUT;
1b65481e 1314
ede4db72
RS
1315 /* First probe the thing to find out how big it is. */
1316 result = XGetWindowProperty (display, window, property,
137edb72 1317 0L, 0L, False, AnyPropertyType,
ede4db72
RS
1318 actual_type_ret, actual_format_ret,
1319 actual_size_ret,
1320 &bytes_remaining, &tmp_data);
ede4db72 1321 if (result != Success)
864d7ce7 1322 goto done;
1b65481e 1323
0158abbc
RS
1324 /* This was allocated by Xlib, so use XFree. */
1325 XFree ((char *) tmp_data);
1b65481e 1326
ede4db72 1327 if (*actual_type_ret == None || *actual_format_ret == 0)
864d7ce7 1328 goto done;
ede4db72 1329
864d7ce7
PE
1330 if (total_size_max < bytes_remaining)
1331 goto size_overflow;
1332 total_size = bytes_remaining;
1333 data = malloc (total_size + 1);
1334 if (! data)
1335 goto memory_exhausted;
1b65481e 1336
2a1a4c9d 1337 /* Now read, until we've gotten it all. */
ede4db72
RS
1338 while (bytes_remaining)
1339 {
864d7ce7
PE
1340 ptrdiff_t bytes_gotten;
1341 int bytes_per_item;
ede4db72
RS
1342 result
1343 = XGetWindowProperty (display, window, property,
864d7ce7
PE
1344 offset / X_LONG_SIZE,
1345 buffer_size / X_LONG_SIZE,
2f65feb6 1346 False,
ede4db72
RS
1347 AnyPropertyType,
1348 actual_type_ret, actual_format_ret,
1349 actual_size_ret, &bytes_remaining, &tmp_data);
d9c0d4a3 1350
ede4db72
RS
1351 /* If this doesn't return Success at this point, it means that
1352 some clod deleted the selection while we were in the midst of
d9c0d4a3
GM
1353 reading it. Deal with that, I guess.... */
1354 if (result != Success)
1355 break;
e22cf39c 1356
864d7ce7
PE
1357 bytes_per_item = *actual_format_ret >> 3;
1358 xassert (*actual_size_ret <= buffer_size / bytes_per_item);
1359
e22cf39c
JD
1360 /* The man page for XGetWindowProperty says:
1361 "If the returned format is 32, the returned data is represented
1362 as a long array and should be cast to that type to obtain the
1363 elements."
1364 This applies even if long is more than 32 bits, the X library
1365 converts from 32 bit elements received from the X server to long
72af86bd 1366 and passes the long array to us. Thus, for that case memcpy can not
e22cf39c
JD
1367 be used. We convert to a 32 bit type here, because so much code
1368 assume on that.
1369
1370 The bytes and offsets passed to XGetWindowProperty refers to the
1371 property and those are indeed in 32 bit quantities if format is 32. */
1372
864d7ce7
PE
1373 bytes_gotten = *actual_size_ret;
1374 bytes_gotten *= bytes_per_item;
1375
1376 TRACE2 ("Read %"pD"d bytes from property %s",
1377 bytes_gotten, XGetAtomName (display, property));
1378
1379 if (total_size - offset < bytes_gotten)
1380 {
1381 unsigned char *data1;
1382 ptrdiff_t remaining_lim = total_size_max - offset - bytes_gotten;
1383 if (remaining_lim < 0 || remaining_lim < bytes_remaining)
1384 goto size_overflow;
1385 total_size = offset + bytes_gotten + bytes_remaining;
1386 data1 = realloc (data, total_size + 1);
1387 if (! data1)
1388 goto memory_exhausted;
1389 data = data1;
1390 }
1391
2172544b 1392 if (32 < BITS_PER_LONG && *actual_format_ret == 32)
e22cf39c
JD
1393 {
1394 unsigned long i;
864d7ce7 1395 int *idata = (int *) (data + offset);
e22cf39c
JD
1396 long *ldata = (long *) tmp_data;
1397
1398 for (i = 0; i < *actual_size_ret; ++i)
864d7ce7 1399 idata[i] = ldata[i];
e22cf39c
JD
1400 }
1401 else
864d7ce7
PE
1402 memcpy (data + offset, tmp_data, bytes_gotten);
1403
1404 offset += bytes_gotten;
1b65481e 1405
0158abbc
RS
1406 /* This was allocated by Xlib, so use XFree. */
1407 XFree ((char *) tmp_data);
ede4db72 1408 }
2f65feb6 1409
5c3a351a 1410 XFlush (display);
864d7ce7
PE
1411 data[offset] = '\0';
1412
1413 done:
ede4db72 1414 UNBLOCK_INPUT;
864d7ce7 1415 *data_ret = data;
ede4db72 1416 *bytes_ret = offset;
864d7ce7
PE
1417 return;
1418
1419 size_overflow:
1420 free (data);
1421 UNBLOCK_INPUT;
1422 memory_full (SIZE_MAX);
1423
1424 memory_exhausted:
1425 free (data);
1426 UNBLOCK_INPUT;
1427 memory_full (total_size + 1);
ede4db72
RS
1428}
1429\f
4feb31b2 1430/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1431
ede4db72 1432static void
d5a3eaaf
AS
1433receive_incremental_selection (Display *display, Window window, Atom property,
1434 Lisp_Object target_type,
1435 unsigned int min_size_bytes,
864d7ce7
PE
1436 unsigned char **data_ret,
1437 ptrdiff_t *size_bytes_ret,
d5a3eaaf
AS
1438 Atom *type_ret, int *format_ret,
1439 unsigned long *size_ret)
ede4db72 1440{
864d7ce7 1441 ptrdiff_t offset = 0;
d1f21a66 1442 struct prop_location *wait_object;
864d7ce7
PE
1443 if (min (PTRDIFF_MAX, SIZE_MAX) < min_size_bytes)
1444 memory_full (SIZE_MAX);
1445 *data_ret = (unsigned char *) xmalloc (min_size_bytes);
ede4db72 1446 *size_bytes_ret = min_size_bytes;
d9c0d4a3 1447
864d7ce7 1448 TRACE1 ("Read %u bytes incrementally", min_size_bytes);
2f65feb6
RS
1449
1450 /* At this point, we have read an INCR property.
1451 Delete the property to ack it.
1452 (But first, prepare to receive the next event in this handshake.)
ede4db72
RS
1453
1454 Now, we must loop, waiting for the sending window to put a value on
1455 that property, then reading the property, then deleting it to ack.
1456 We are done when the sender places a property of length 0.
1457 */
2f65feb6
RS
1458 BLOCK_INPUT;
1459 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
d9c0d4a3 1460 TRACE1 (" Delete property %s",
dd0fe424 1461 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
2f65feb6 1462 XDeleteProperty (display, window, property);
d9c0d4a3 1463 TRACE1 (" Expect new value of property %s",
dd0fe424 1464 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
d1f21a66
RS
1465 wait_object = expect_property_change (display, window, property,
1466 PropertyNewValue);
5c3a351a 1467 XFlush (display);
2f65feb6
RS
1468 UNBLOCK_INPUT;
1469
ede4db72
RS
1470 while (1)
1471 {
1472 unsigned char *tmp_data;
864d7ce7 1473 ptrdiff_t tmp_size_bytes;
d9c0d4a3
GM
1474
1475 TRACE0 (" Wait for property change");
d1f21a66 1476 wait_for_property_change (wait_object);
1b65481e 1477
ede4db72 1478 /* expect it again immediately, because x_get_window_property may
2a1a4c9d 1479 .. no it won't, I don't get it.
d9c0d4a3
GM
1480 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1481 TRACE0 (" Get property value");
ede4db72
RS
1482 x_get_window_property (display, window, property,
1483 &tmp_data, &tmp_size_bytes,
1484 type_ret, format_ret, size_ret, 1);
1485
864d7ce7 1486 TRACE1 (" Read increment of %"pD"d bytes", tmp_size_bytes);
d9c0d4a3 1487
ede4db72
RS
1488 if (tmp_size_bytes == 0) /* we're done */
1489 {
d9c0d4a3
GM
1490 TRACE0 ("Done reading incrementally");
1491
2f65feb6
RS
1492 if (! waiting_for_other_props_on_window (display, window))
1493 XSelectInput (display, window, STANDARD_EVENT_SET);
4feb31b2 1494 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1495 calls xmalloc itself. */
70fdbb46 1496 xfree (tmp_data);
ede4db72
RS
1497 break;
1498 }
2f65feb6
RS
1499
1500 BLOCK_INPUT;
d9c0d4a3
GM
1501 TRACE1 (" ACK by deleting property %s",
1502 XGetAtomName (display, property));
2f65feb6 1503 XDeleteProperty (display, window, property);
d1f21a66
RS
1504 wait_object = expect_property_change (display, window, property,
1505 PropertyNewValue);
5c3a351a 1506 XFlush (display);
2f65feb6
RS
1507 UNBLOCK_INPUT;
1508
864d7ce7 1509 if (*size_bytes_ret - offset < tmp_size_bytes)
0065d054
PE
1510 *data_ret = xpalloc (*data_ret, size_bytes_ret,
1511 tmp_size_bytes - (*size_bytes_ret - offset),
1512 -1, 1);
1b65481e 1513
72af86bd 1514 memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
ede4db72 1515 offset += tmp_size_bytes;
1b65481e 1516
4feb31b2 1517 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1518 calls xmalloc itself. */
4feb31b2 1519 xfree (tmp_data);
ede4db72
RS
1520 }
1521}
d9c0d4a3 1522
ede4db72 1523\f
e067f0c1
CY
1524/* Fetch a value from property PROPERTY of X window WINDOW on display
1525 DISPLAY. TARGET_TYPE and SELECTION_ATOM are used in error message
1526 if this fails. */
ede4db72
RS
1527
1528static Lisp_Object
d5a3eaaf
AS
1529x_get_window_property_as_lisp_data (Display *display, Window window,
1530 Atom property,
1531 Lisp_Object target_type,
1532 Atom selection_atom)
ede4db72
RS
1533{
1534 Atom actual_type;
1535 int actual_format;
1536 unsigned long actual_size;
1537 unsigned char *data = 0;
864d7ce7 1538 ptrdiff_t bytes = 0;
ede4db72 1539 Lisp_Object val;
5c3a351a 1540 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1541
d9c0d4a3
GM
1542 TRACE0 ("Reading selection data");
1543
ede4db72
RS
1544 x_get_window_property (display, window, property, &data, &bytes,
1545 &actual_type, &actual_format, &actual_size, 1);
1546 if (! data)
1547 {
1548 int there_is_a_selection_owner;
1549 BLOCK_INPUT;
1550 there_is_a_selection_owner
1551 = XGetSelectionOwner (display, selection_atom);
1552 UNBLOCK_INPUT;
4d30ce50
KS
1553 if (there_is_a_selection_owner)
1554 signal_error ("Selection owner couldn't convert",
1555 actual_type
1556 ? list2 (target_type,
1557 x_atom_to_symbol (display, actual_type))
1558 : target_type);
1559 else
1560 signal_error ("No selection",
1561 x_atom_to_symbol (display, selection_atom));
ede4db72 1562 }
1b65481e 1563
5c3a351a 1564 if (actual_type == dpyinfo->Xatom_INCR)
ede4db72
RS
1565 {
1566 /* That wasn't really the data, just the beginning. */
1567
1568 unsigned int min_size_bytes = * ((unsigned int *) data);
1569 BLOCK_INPUT;
4feb31b2 1570 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1571 calls xmalloc itself. */
4feb31b2 1572 xfree ((char *) data);
ede4db72
RS
1573 UNBLOCK_INPUT;
1574 receive_incremental_selection (display, window, property, target_type,
1575 min_size_bytes, &data, &bytes,
1576 &actual_type, &actual_format,
1577 &actual_size);
1578 }
1579
2f65feb6 1580 BLOCK_INPUT;
d9c0d4a3 1581 TRACE1 (" Delete property %s", XGetAtomName (display, property));
2f65feb6 1582 XDeleteProperty (display, window, property);
5c3a351a 1583 XFlush (display);
2f65feb6
RS
1584 UNBLOCK_INPUT;
1585
ede4db72
RS
1586 /* It's been read. Now convert it to a lisp object in some semi-rational
1587 manner. */
1588 val = selection_data_to_lisp_data (display, data, bytes,
1589 actual_type, actual_format);
1b65481e 1590
4feb31b2 1591 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1592 calls xmalloc itself. */
4feb31b2 1593 xfree ((char *) data);
ede4db72
RS
1594 return val;
1595}
1596\f
1597/* These functions convert from the selection data read from the server into
1598 something that we can use from Lisp, and vice versa.
1599
1600 Type: Format: Size: Lisp Type:
1601 ----- ------- ----- -----------
1602 * 8 * String
1603 ATOM 32 1 Symbol
1604 ATOM 32 > 1 Vector of Symbols
1605 * 16 1 Integer
1606 * 16 > 1 Vector of Integers
1607 * 32 1 if <=16 bits: Integer
1608 if > 16 bits: Cons of top16, bot16
1609 * 32 > 1 Vector of the above
1610
1611 When converting a Lisp number to C, it is assumed to be of format 16 if
1612 it is an integer, and of format 32 if it is a cons of two integers.
1613
1614 When converting a vector of numbers from Lisp to C, it is assumed to be
1615 of format 16 if every element in the vector is an integer, and is assumed
1616 to be of format 32 if any element is a cons of two integers.
1617
1618 When converting an object to C, it may be of the form (SYMBOL . <data>)
1619 where SYMBOL is what we should claim that the type is. Format and
b8d6f4af
JD
1620 representation are as above.
1621
1622 Important: When format is 32, data should contain an array of int,
1623 not an array of long as the X library returns. This makes a difference
1624 when sizeof(long) != sizeof(int). */
ede4db72
RS
1625
1626
1627
1628static Lisp_Object
eec47d6b 1629selection_data_to_lisp_data (Display *display, const unsigned char *data,
864d7ce7 1630 ptrdiff_t size, Atom type, int format)
ede4db72 1631{
5c3a351a 1632 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1633
5c3a351a 1634 if (type == dpyinfo->Xatom_NULL)
ede4db72
RS
1635 return QNULL;
1636
1637 /* Convert any 8-bit data to a string, for compactness. */
1638 else if (format == 8)
e6c7c988 1639 {
e57ad4d8
KH
1640 Lisp_Object str, lispy_type;
1641
1642 str = make_unibyte_string ((char *) data, size);
1643 /* Indicate that this string is from foreign selection by a text
1644 property `foreign-selection' so that the caller of
1645 x-get-selection-internal (usually x-get-selection) can know
1646 that the string must be decode. */
1647 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1648 lispy_type = QCOMPOUND_TEXT;
1649 else if (type == dpyinfo->Xatom_UTF8_STRING)
1650 lispy_type = QUTF8_STRING;
e6c7c988 1651 else
e57ad4d8
KH
1652 lispy_type = QSTRING;
1653 Fput_text_property (make_number (0), make_number (size),
1654 Qforeign_selection, lispy_type, str);
e6c7c988
KH
1655 return str;
1656 }
ede4db72 1657 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
e067f0c1
CY
1658 a vector of symbols. */
1659 else if (type == XA_ATOM
1660 /* Treat ATOM_PAIR type similar to list of atoms. */
1661 || type == dpyinfo->Xatom_ATOM_PAIR)
ede4db72 1662 {
864d7ce7 1663 ptrdiff_t i;
b8d6f4af
JD
1664 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1665 But the callers of these function has made sure the data for
1666 format == 32 is an array of int. Thus, use int instead
1667 of Atom. */
1668 int *idata = (int *) data;
1669
1670 if (size == sizeof (int))
1671 return x_atom_to_symbol (display, (Atom) idata[0]);
ede4db72
RS
1672 else
1673 {
b8d6f4af 1674 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
e607a484 1675 make_number (0));
b8d6f4af 1676 for (i = 0; i < size / sizeof (int); i++)
e607a484 1677 Faset (v, make_number (i),
b8d6f4af 1678 x_atom_to_symbol (display, (Atom) idata[i]));
ede4db72
RS
1679 return v;
1680 }
1681 }
1682
1ad08acd
RS
1683 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1684 If the number is 32 bits and won't fit in a Lisp_Int,
1685 convert it to a cons of integers, 16 bits in each half.
ede4db72 1686 */
2f51feb8 1687 else if (format == 32 && size == sizeof (int))
be44ca6c 1688 return INTEGER_TO_CONS (((unsigned int *) data) [0]);
ede4db72 1689 else if (format == 16 && size == sizeof (short))
864d7ce7 1690 return make_number (((unsigned short *) data) [0]);
ede4db72
RS
1691
1692 /* Convert any other kind of data to a vector of numbers, represented
1693 as above (as an integer, or a cons of two 16 bit integers.)
1694 */
1695 else if (format == 16)
1696 {
864d7ce7 1697 ptrdiff_t i;
937a3875
RS
1698 Lisp_Object v;
1699 v = Fmake_vector (make_number (size / 2), make_number (0));
1700 for (i = 0; i < size / 2; i++)
ede4db72 1701 {
864d7ce7 1702 EMACS_INT j = ((unsigned short *) data) [i];
e607a484 1703 Faset (v, make_number (i), make_number (j));
ede4db72
RS
1704 }
1705 return v;
1706 }
1707 else
1708 {
864d7ce7
PE
1709 ptrdiff_t i;
1710 Lisp_Object v = Fmake_vector (make_number (size / X_LONG_SIZE),
1711 make_number (0));
1712 for (i = 0; i < size / X_LONG_SIZE; i++)
ede4db72 1713 {
2f51feb8 1714 unsigned int j = ((unsigned int *) data) [i];
be44ca6c 1715 Faset (v, make_number (i), INTEGER_TO_CONS (j));
ede4db72
RS
1716 }
1717 return v;
1718 }
1719}
1720
1721
4feb31b2 1722/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1723
ede4db72 1724static void
d5a3eaaf
AS
1725lisp_data_to_selection_data (Display *display, Lisp_Object obj,
1726 unsigned char **data_ret, Atom *type_ret,
864d7ce7 1727 ptrdiff_t *size_ret,
d5a3eaaf 1728 int *format_ret, int *nofree_ret)
ede4db72
RS
1729{
1730 Lisp_Object type = Qnil;
5c3a351a 1731 struct x_display_info *dpyinfo = x_display_info_for_display (display);
aca39f42
RS
1732
1733 *nofree_ret = 0;
1734
8e713be6 1735 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
ede4db72 1736 {
8e713be6
KR
1737 type = XCAR (obj);
1738 obj = XCDR (obj);
1739 if (CONSP (obj) && NILP (XCDR (obj)))
1740 obj = XCAR (obj);
ede4db72
RS
1741 }
1742
1743 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1744 { /* This is not the same as declining */
1745 *format_ret = 32;
1746 *size_ret = 0;
1747 *data_ret = 0;
1748 type = QNULL;
1749 }
1750 else if (STRINGP (obj))
1751 {
1bd70c6e
KH
1752 if (SCHARS (obj) < SBYTES (obj))
1753 /* OBJ is a multibyte string containing a non-ASCII char. */
4d30ce50 1754 signal_error ("Non-ASCII string must be encoded in advance", obj);
7b9ae523 1755 if (NILP (type))
5109c8dd
KH
1756 type = QSTRING;
1757 *format_ret = 8;
1758 *size_ret = SBYTES (obj);
1759 *data_ret = SDATA (obj);
1760 *nofree_ret = 1;
ede4db72
RS
1761 }
1762 else if (SYMBOLP (obj))
1763 {
864d7ce7 1764 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
ede4db72
RS
1765 *format_ret = 32;
1766 *size_ret = 1;
ede4db72 1767 (*data_ret) [sizeof (Atom)] = 0;
a9f737ee 1768 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, obj);
ede4db72
RS
1769 if (NILP (type)) type = QATOM;
1770 }
252c5ee1 1771 else if (RANGED_INTEGERP (X_SHRT_MIN, obj, X_SHRT_MAX))
ede4db72 1772 {
864d7ce7 1773 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
ede4db72
RS
1774 *format_ret = 16;
1775 *size_ret = 1;
ede4db72 1776 (*data_ret) [sizeof (short)] = 0;
252c5ee1 1777 (*(short **) data_ret) [0] = XINT (obj);
ede4db72
RS
1778 if (NILP (type)) type = QINTEGER;
1779 }
a87ed99c 1780 else if (INTEGERP (obj)
8e713be6
KR
1781 || (CONSP (obj) && INTEGERP (XCAR (obj))
1782 && (INTEGERP (XCDR (obj))
1783 || (CONSP (XCDR (obj))
1784 && INTEGERP (XCAR (XCDR (obj)))))))
ede4db72 1785 {
864d7ce7 1786 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
ede4db72
RS
1787 *format_ret = 32;
1788 *size_ret = 1;
ede4db72 1789 (*data_ret) [sizeof (long)] = 0;
252c5ee1 1790 (*(long **) data_ret) [0] = cons_to_signed (obj, X_LONG_MIN, X_LONG_MAX);
ede4db72
RS
1791 if (NILP (type)) type = QINTEGER;
1792 }
1793 else if (VECTORP (obj))
1794 {
1795 /* Lisp_Vectors may represent a set of ATOMs;
1796 a set of 16 or 32 bit INTEGERs;
1797 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1798 */
864d7ce7
PE
1799 ptrdiff_t i;
1800 ptrdiff_t size = ASIZE (obj);
ede4db72
RS
1801
1802 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1803 /* This vector is an ATOM set */
1804 {
1805 if (NILP (type)) type = QATOM;
864d7ce7 1806 for (i = 0; i < size; i++)
e067f0c1 1807 if (!SYMBOLP (XVECTOR (obj)->contents [i]))
4d30ce50 1808 signal_error ("All elements of selection vector must have same type", obj);
1b65481e 1809
0065d054 1810 *data_ret = xnmalloc (size, sizeof (Atom));
864d7ce7
PE
1811 *format_ret = 32;
1812 *size_ret = size;
1813 for (i = 0; i < size; i++)
e067f0c1 1814 (*(Atom **) data_ret) [i]
a9f737ee 1815 = symbol_to_x_atom (dpyinfo, XVECTOR (obj)->contents [i]);
ede4db72 1816 }
ede4db72
RS
1817 else
1818 /* This vector is an INTEGER set, or something like it */
1819 {
864d7ce7 1820 int format = 16;
0065d054 1821 int data_size = sizeof (short);
ede4db72 1822 if (NILP (type)) type = QINTEGER;
864d7ce7 1823 for (i = 0; i < size; i++)
252c5ee1
PE
1824 {
1825 intmax_t v = cons_to_signed (XVECTOR (obj)->contents[i],
1826 X_LONG_MIN, X_LONG_MAX);
1827 if (X_SHRT_MIN <= v && v <= X_SHRT_MAX)
1828 {
1829 /* Use sizeof (long) even if it is more than 32 bits.
1830 See comment in x_get_window_property and
1831 x_fill_property_data. */
1832 data_size = sizeof (long);
1833 format = 32;
1834 }
1835 }
0065d054 1836 *data_ret = xnmalloc (size, data_size);
864d7ce7
PE
1837 *format_ret = format;
1838 *size_ret = size;
1839 for (i = 0; i < size; i++)
252c5ee1
PE
1840 {
1841 long v = cons_to_signed (XVECTOR (obj)->contents[i],
1842 X_LONG_MIN, X_LONG_MAX);
1843 if (format == 32)
1844 (*((long **) data_ret)) [i] = v;
1845 else
1846 (*((short **) data_ret)) [i] = v;
1847 }
ede4db72
RS
1848 }
1849 }
1850 else
4d30ce50 1851 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
ede4db72 1852
a9f737ee 1853 *type_ret = symbol_to_x_atom (dpyinfo, type);
ede4db72
RS
1854}
1855
1856static Lisp_Object
971de7fb 1857clean_local_selection_data (Lisp_Object obj)
ede4db72
RS
1858{
1859 if (CONSP (obj)
8e713be6
KR
1860 && INTEGERP (XCAR (obj))
1861 && CONSP (XCDR (obj))
1862 && INTEGERP (XCAR (XCDR (obj)))
1863 && NILP (XCDR (XCDR (obj))))
1864 obj = Fcons (XCAR (obj), XCDR (obj));
ede4db72
RS
1865
1866 if (CONSP (obj)
8e713be6
KR
1867 && INTEGERP (XCAR (obj))
1868 && INTEGERP (XCDR (obj)))
ede4db72 1869 {
8e713be6
KR
1870 if (XINT (XCAR (obj)) == 0)
1871 return XCDR (obj);
1872 if (XINT (XCAR (obj)) == -1)
1873 return make_number (- XINT (XCDR (obj)));
ede4db72
RS
1874 }
1875 if (VECTORP (obj))
1876 {
864d7ce7
PE
1877 ptrdiff_t i;
1878 ptrdiff_t size = ASIZE (obj);
ede4db72
RS
1879 Lisp_Object copy;
1880 if (size == 1)
1881 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
e607a484 1882 copy = Fmake_vector (make_number (size), Qnil);
ede4db72
RS
1883 for (i = 0; i < size; i++)
1884 XVECTOR (copy)->contents [i]
1885 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
1886 return copy;
1887 }
1888 return obj;
1889}
1890\f
1891/* Called from XTread_socket to handle SelectionNotify events.
606140dd
KH
1892 If it's the selection we are waiting for, stop waiting
1893 by setting the car of reading_selection_reply to non-nil.
1894 We store t there if the reply is successful, lambda if not. */
ede4db72
RS
1895
1896void
971de7fb 1897x_handle_selection_notify (XSelectionEvent *event)
ede4db72 1898{
5d0ba25b 1899 if (event->requestor != reading_selection_window)
ede4db72
RS
1900 return;
1901 if (event->selection != reading_which_selection)
1902 return;
1903
d9c0d4a3 1904 TRACE0 ("Received SelectionNotify");
f3fbd155
KR
1905 XSETCAR (reading_selection_reply,
1906 (event->property != 0 ? Qt : Qlambda));
ede4db72
RS
1907}
1908
1909\f
a9f737ee
CY
1910/* From a Lisp_Object, return a suitable frame for selection
1911 operations. OBJECT may be a frame, a terminal object, or nil
1912 (which stands for the selected frame--or, if that is not an X
1913 frame, the first X display on the list). If no suitable frame can
1914 be found, return NULL. */
1915
1916static struct frame *
1917frame_for_x_selection (Lisp_Object object)
1918{
fb1ac845 1919 Lisp_Object tail;
a9f737ee
CY
1920 struct frame *f;
1921
1922 if (NILP (object))
1923 {
1924 f = XFRAME (selected_frame);
1925 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1926 return f;
1927
1928 for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
1929 {
1930 f = XFRAME (XCAR (tail));
1931 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1932 return f;
1933 }
1934 }
1935 else if (TERMINALP (object))
1936 {
1937 struct terminal *t = get_terminal (object, 1);
1938 if (t->type == output_x_window)
1939 {
1940 for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
1941 {
1942 f = XFRAME (XCAR (tail));
1943 if (FRAME_LIVE_P (f) && f->terminal == t)
1944 return f;
1945 }
1946 }
1947 }
1948 else if (FRAMEP (object))
1949 {
1950 f = XFRAME (object);
1951 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1952 return f;
1953 }
1954
1955 return NULL;
1956}
1957
1958
a0d76c27 1959DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
a9f737ee 1960 Sx_own_selection_internal, 2, 3, 0,
abb71cf4
CY
1961 doc: /* Assert an X selection of type SELECTION and value VALUE.
1962SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
8c1a1077
PJ
1963\(Those are literal upper-case symbol names, since that's what X expects.)
1964VALUE is typically a string, or a cons of two markers, but may be
a9f737ee
CY
1965anything that the functions on `selection-converter-alist' know about.
1966
1967FRAME should be a frame that should own the selection. If omitted or
1968nil, it defaults to the selected frame. */)
1969 (Lisp_Object selection, Lisp_Object value, Lisp_Object frame)
ede4db72 1970{
a9f737ee
CY
1971 if (NILP (frame)) frame = selected_frame;
1972 if (!FRAME_LIVE_P (XFRAME (frame)) || !FRAME_X_P (XFRAME (frame)))
1973 error ("X selection unavailable for this frame");
1974
abb71cf4
CY
1975 CHECK_SYMBOL (selection);
1976 if (NILP (value)) error ("VALUE may not be nil");
a9f737ee 1977 x_own_selection (selection, value, frame);
abb71cf4 1978 return value;
ede4db72
RS
1979}
1980
1981
1982/* Request the selection value from the owner. If we are the owner,
1983 simply return our selection value. If we are not the owner, this
1984 will block until all of the data has arrived. */
1985
a0d76c27 1986DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
a9f737ee 1987 Sx_get_selection_internal, 2, 4, 0,
8c1a1077
PJ
1988 doc: /* Return text selected from some X window.
1989SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1990\(Those are literal upper-case symbol names, since that's what X expects.)
3a42401d
JD
1991TYPE is the type of data desired, typically `STRING'.
1992TIME_STAMP is the time to use in the XConvertSelection call for foreign
a9f737ee
CY
1993selections. If omitted, defaults to the time for the last event.
1994
1995TERMINAL should be a terminal object or a frame specifying the X
1996server to query. If omitted or nil, that stands for the selected
1997frame's display, or the first available X display. */)
1998 (Lisp_Object selection_symbol, Lisp_Object target_type,
1999 Lisp_Object time_stamp, Lisp_Object terminal)
ede4db72
RS
2000{
2001 Lisp_Object val = Qnil;
2002 struct gcpro gcpro1, gcpro2;
a9f737ee 2003 struct frame *f = frame_for_x_selection (terminal);
ede4db72 2004 GCPRO2 (target_type, val); /* we store newly consed data into these */
a9f737ee 2005
b7826503 2006 CHECK_SYMBOL (selection_symbol);
a9f737ee
CY
2007 CHECK_SYMBOL (target_type);
2008 if (EQ (target_type, QMULTIPLE))
2009 error ("Retrieving MULTIPLE selections is currently unimplemented");
2010 if (!f)
2011 error ("X selection unavailable for this frame");
2012
2013 val = x_get_local_selection (selection_symbol, target_type, 1,
2014 FRAME_X_DISPLAY_INFO (f));
ede4db72 2015
a9f737ee 2016 if (NILP (val) && FRAME_LIVE_P (f))
ede4db72 2017 {
a9f737ee
CY
2018 Lisp_Object frame;
2019 XSETFRAME (frame, f);
2020 RETURN_UNGCPRO (x_get_foreign_selection (selection_symbol, target_type,
2021 time_stamp, frame));
ede4db72 2022 }
ede4db72 2023
abb71cf4 2024 if (CONSP (val) && SYMBOLP (XCAR (val)))
ede4db72 2025 {
8e713be6
KR
2026 val = XCDR (val);
2027 if (CONSP (val) && NILP (XCDR (val)))
2028 val = XCAR (val);
ede4db72 2029 }
abb71cf4 2030 RETURN_UNGCPRO (clean_local_selection_data (val));
ede4db72
RS
2031}
2032
a0d76c27 2033DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
a9f737ee 2034 Sx_disown_selection_internal, 1, 3, 0,
8c1a1077 2035 doc: /* If we own the selection SELECTION, disown it.
a9f737ee
CY
2036Disowning it means there is no such selection.
2037
2038TERMINAL should be a terminal object or a frame specifying the X
2039server to query. If omitted or nil, that stands for the selected
2040frame's display, or the first available X display. */)
2041 (Lisp_Object selection, Lisp_Object time_object, Lisp_Object terminal)
ede4db72 2042{
ede4db72
RS
2043 Time timestamp;
2044 Atom selection_atom;
31df61d6
AS
2045 union {
2046 struct selection_input_event sie;
2047 struct input_event ie;
2048 } event;
a9f737ee 2049 struct frame *f = frame_for_x_selection (terminal);
5c3a351a 2050 struct x_display_info *dpyinfo;
ede4db72 2051
a9f737ee 2052 if (!f)
428a555e
KL
2053 return Qnil;
2054
a9f737ee 2055 dpyinfo = FRAME_X_DISPLAY_INFO (f);
b7826503 2056 CHECK_SYMBOL (selection);
ede4db72 2057
a9f737ee
CY
2058 /* Don't disown the selection when we're not the owner. */
2059 if (NILP (LOCAL_SELECTION (selection, dpyinfo)))
2060 return Qnil;
ede4db72 2061
a9f737ee 2062 selection_atom = symbol_to_x_atom (dpyinfo, selection);
ede4db72
RS
2063
2064 BLOCK_INPUT;
be44ca6c
PE
2065 if (NILP (time_object))
2066 timestamp = last_event_timestamp;
2067 else
2068 CONS_TO_INTEGER (time_object, Time, timestamp);
a9f737ee 2069 XSetSelectionOwner (dpyinfo->display, selection_atom, None, timestamp);
ede4db72
RS
2070 UNBLOCK_INPUT;
2071
eb8c3be9 2072 /* It doesn't seem to be guaranteed that a SelectionClear event will be
ede4db72
RS
2073 generated for a window which owns the selection when that window sets
2074 the selection owner to None. The NCD server does, the MIT Sun4 server
2075 doesn't. So we synthesize one; this means we might get two, but
2076 that's ok, because the second one won't have any effect. */
a9f737ee 2077 SELECTION_EVENT_DISPLAY (&event.sie) = dpyinfo->display;
31df61d6
AS
2078 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2079 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2080 x_handle_selection_clear (&event.ie);
ede4db72
RS
2081
2082 return Qt;
2083}
2084
ede4db72 2085DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
a9f737ee 2086 0, 2, 0,
8c1a1077
PJ
2087 doc: /* Whether the current Emacs process owns the given X Selection.
2088The arg should be the name of the selection in question, typically one of
2089the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2090\(Those are literal upper-case symbol names, since that's what X expects.)
2091For convenience, the symbol nil is the same as `PRIMARY',
a9f737ee
CY
2092and t is the same as `SECONDARY'.
2093
2094TERMINAL should be a terminal object or a frame specifying the X
2095server to query. If omitted or nil, that stands for the selected
2096frame's display, or the first available X display. */)
2097 (Lisp_Object selection, Lisp_Object terminal)
ede4db72 2098{
a9f737ee
CY
2099 struct frame *f = frame_for_x_selection (terminal);
2100
b7826503 2101 CHECK_SYMBOL (selection);
ede4db72
RS
2102 if (EQ (selection, Qnil)) selection = QPRIMARY;
2103 if (EQ (selection, Qt)) selection = QSECONDARY;
1b65481e 2104
a9f737ee
CY
2105 if (f && !NILP (LOCAL_SELECTION (selection, FRAME_X_DISPLAY_INFO (f))))
2106 return Qt;
2107 else
ede4db72 2108 return Qnil;
ede4db72
RS
2109}
2110
2111DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
a9f737ee
CY
2112 0, 2, 0,
2113 doc: /* Whether there is an owner for the given X selection.
2114SELECTION should be the name of the selection in question, typically
2115one of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. (X expects
2116these literal upper-case names.) The symbol nil is the same as
2117`PRIMARY', and t is the same as `SECONDARY'.
2118
2119TERMINAL should be a terminal object or a frame specifying the X
2120server to query. If omitted or nil, that stands for the selected
2121frame's display, or the first available X display. */)
2122 (Lisp_Object selection, Lisp_Object terminal)
ede4db72
RS
2123{
2124 Window owner;
356ba514 2125 Atom atom;
a9f737ee
CY
2126 struct frame *f = frame_for_x_selection (terminal);
2127 struct x_display_info *dpyinfo;
b8c70430 2128
b7826503 2129 CHECK_SYMBOL (selection);
356ba514
RS
2130 if (EQ (selection, Qnil)) selection = QPRIMARY;
2131 if (EQ (selection, Qt)) selection = QSECONDARY;
a9f737ee
CY
2132
2133 if (!f)
356ba514 2134 return Qnil;
a9f737ee
CY
2135
2136 dpyinfo = FRAME_X_DISPLAY_INFO (f);
2137
2138 if (!NILP (LOCAL_SELECTION (selection, dpyinfo)))
2139 return Qt;
2140
2141 atom = symbol_to_x_atom (dpyinfo, selection);
2142 if (atom == 0) return Qnil;
ede4db72 2143 BLOCK_INPUT;
a9f737ee 2144 owner = XGetSelectionOwner (dpyinfo->display, atom);
ede4db72
RS
2145 UNBLOCK_INPUT;
2146 return (owner ? Qt : Qnil);
2147}
2148
1dd3c2d9 2149\f
4b80f674
CY
2150/* Send clipboard manager a SAVE_TARGETS request with a UTF8_STRING
2151 property (http://www.freedesktop.org/wiki/ClipboardManager). */
a9f737ee 2152
4b80f674
CY
2153static Lisp_Object
2154x_clipboard_manager_save (Lisp_Object frame)
a9f737ee
CY
2155{
2156 struct frame *f = XFRAME (frame);
4b80f674 2157 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
a9f737ee
CY
2158 Atom data = dpyinfo->Xatom_UTF8_STRING;
2159
2160 XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
2161 dpyinfo->Xatom_EMACS_TMP,
2162 dpyinfo->Xatom_ATOM, 32, PropModeReplace,
2163 (unsigned char *) &data, 1);
2164 x_get_foreign_selection (QCLIPBOARD_MANAGER, QSAVE_TARGETS,
2165 Qnil, frame);
4b80f674
CY
2166 return Qt;
2167}
2168
2169/* Error handler for x_clipboard_manager_save_frame. */
2170
2171static Lisp_Object
2172x_clipboard_manager_error_1 (Lisp_Object err)
2173{
2174 Lisp_Object args[2];
2175 args[0] = build_string ("X clipboard manager error: %s\n\
2176If the problem persists, set `x-select-enable-clipboard-manager' to nil.");
2177 args[1] = CAR (CDR (err));
2178 Fmessage (2, args);
2179 return Qnil;
2180}
2181
2182/* Error handler for x_clipboard_manager_save_all. */
2183
2184static Lisp_Object
2185x_clipboard_manager_error_2 (Lisp_Object err)
2186{
2187 fprintf (stderr, "Error saving to X clipboard manager.\n\
2188If the problem persists, set `x-select-enable-clipboard-manager' \
2189to nil.\n");
2190 return Qnil;
a9f737ee
CY
2191}
2192
1dd3c2d9
CY
2193/* Called from delete_frame: save any clipboard owned by FRAME to the
2194 clipboard manager. Do nothing if FRAME does not own the clipboard,
2195 or if no clipboard manager is present. */
2196
2197void
2198x_clipboard_manager_save_frame (Lisp_Object frame)
a9f737ee 2199{
1dd3c2d9
CY
2200 struct frame *f;
2201
4b80f674
CY
2202 if (!NILP (Vx_select_enable_clipboard_manager)
2203 && FRAMEP (frame)
1dd3c2d9
CY
2204 && (f = XFRAME (frame), FRAME_X_P (f))
2205 && FRAME_LIVE_P (f))
a9f737ee 2206 {
1dd3c2d9
CY
2207 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2208 Lisp_Object local_selection
2209 = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2210
2211 if (!NILP (local_selection)
2212 && EQ (frame, XCAR (XCDR (XCDR (XCDR (local_selection)))))
2213 && XGetSelectionOwner (dpyinfo->display,
2214 dpyinfo->Xatom_CLIPBOARD_MANAGER))
4b80f674
CY
2215 internal_condition_case_1 (x_clipboard_manager_save, frame, Qt,
2216 x_clipboard_manager_error_1);
a9f737ee 2217 }
1dd3c2d9
CY
2218}
2219
2220/* Called from Fkill_emacs: save any clipboard owned by FRAME to the
2221 clipboard manager. Do nothing if FRAME does not own the clipboard,
2222 or if no clipboard manager is present. */
2223
2224void
2225x_clipboard_manager_save_all (void)
2226{
2227 /* Loop through all X displays, saving owned clipboards. */
2228 struct x_display_info *dpyinfo;
2229 Lisp_Object local_selection, local_frame;
4b80f674
CY
2230
2231 if (NILP (Vx_select_enable_clipboard_manager))
2232 return;
2233
1dd3c2d9 2234 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
a9f737ee 2235 {
1dd3c2d9
CY
2236 local_selection = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2237 if (NILP (local_selection)
2238 || !XGetSelectionOwner (dpyinfo->display,
2239 dpyinfo->Xatom_CLIPBOARD_MANAGER))
2240 continue;
a9f737ee 2241
1dd3c2d9
CY
2242 local_frame = XCAR (XCDR (XCDR (XCDR (local_selection))));
2243 if (FRAME_LIVE_P (XFRAME (local_frame)))
4b80f674
CY
2244 internal_condition_case_1 (x_clipboard_manager_save, local_frame,
2245 Qt, x_clipboard_manager_error_2);
1dd3c2d9 2246 }
a9f737ee
CY
2247}
2248
ede4db72 2249\f
1fb3821b
JD
2250/***********************************************************************
2251 Drag and drop support
2252***********************************************************************/
2253/* Check that lisp values are of correct type for x_fill_property_data.
2254 That is, number, string or a cons with two numbers (low and high 16
44f730c8
PE
2255 bit parts of a 32 bit number). Return the number of items in DATA,
2256 or -1 if there is an error. */
1fb3821b
JD
2257
2258int
971de7fb 2259x_check_property_data (Lisp_Object data)
1fb3821b
JD
2260{
2261 Lisp_Object iter;
2262 int size = 0;
2263
44f730c8 2264 for (iter = data; CONSP (iter); iter = XCDR (iter))
1fb3821b
JD
2265 {
2266 Lisp_Object o = XCAR (iter);
2267
2268 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
44f730c8 2269 return -1;
1fb3821b
JD
2270 else if (CONSP (o) &&
2271 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
44f730c8 2272 return -1;
864d7ce7
PE
2273 if (size == INT_MAX)
2274 return -1;
44f730c8 2275 size++;
1fb3821b
JD
2276 }
2277
2278 return size;
2279}
2280
2281/* Convert lisp values to a C array. Values may be a number, a string
2282 which is taken as an X atom name and converted to the atom value, or
2283 a cons containing the two 16 bit parts of a 32 bit number.
2284
2285 DPY is the display use to look up X atoms.
2286 DATA is a Lisp list of values to be converted.
2287 RET is the C array that contains the converted values. It is assumed
ff59904a 2288 it is big enough to hold all values.
e22cf39c
JD
2289 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2290 be stored in RET. Note that long is used for 32 even if long is more
2291 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2292 XClientMessageEvent). */
1fb3821b
JD
2293
2294void
971de7fb 2295x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format)
1fb3821b 2296{
e22cf39c
JD
2297 long val;
2298 long *d32 = (long *) ret;
2299 short *d16 = (short *) ret;
2300 char *d08 = (char *) ret;
1fb3821b
JD
2301 Lisp_Object iter;
2302
2303 for (iter = data; CONSP (iter); iter = XCDR (iter))
2304 {
2305 Lisp_Object o = XCAR (iter);
2306
be44ca6c
PE
2307 if (INTEGERP (o) || FLOATP (o) || CONSP (o))
2308 val = cons_to_signed (o, LONG_MIN, LONG_MAX);
1fb3821b
JD
2309 else if (STRINGP (o))
2310 {
2311 BLOCK_INPUT;
51b59d79 2312 val = (long) XInternAtom (dpy, SSDATA (o), False);
1fb3821b
JD
2313 UNBLOCK_INPUT;
2314 }
2315 else
2316 error ("Wrong type, must be string, number or cons");
2317
2318 if (format == 8)
be44ca6c
PE
2319 {
2320 if (CHAR_MIN <= val && val <= CHAR_MAX)
2321 *d08++ = val;
2322 else
2323 error ("Out of 'char' range");
2324 }
1fb3821b 2325 else if (format == 16)
be44ca6c
PE
2326 {
2327 if (SHRT_MIN <= val && val <= SHRT_MAX)
2328 *d16++ = val;
2329 else
2330 error ("Out of 'short' range");
2331 }
1fb3821b
JD
2332 else
2333 *d32++ = val;
2334 }
2335}
2336
2337/* Convert an array of C values to a Lisp list.
2338 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2339 DATA is a C array of values to be converted.
2340 TYPE is the type of the data. Only XA_ATOM is special, it converts
2341 each number in DATA to its corresponfing X atom as a symbol.
2342 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2343 be stored in RET.
2344 SIZE is the number of elements in DATA.
2345
b8d6f4af
JD
2346 Important: When format is 32, data should contain an array of int,
2347 not an array of long as the X library returns. This makes a difference
2348 when sizeof(long) != sizeof(int).
2349
1fb3821b
JD
2350 Also see comment for selection_data_to_lisp_data above. */
2351
2352Lisp_Object
eec47d6b
DN
2353x_property_data_to_lisp (struct frame *f, const unsigned char *data,
2354 Atom type, int format, long unsigned int size)
1fb3821b 2355{
864d7ce7
PE
2356 ptrdiff_t format_bytes = format >> 3;
2357 if (PTRDIFF_MAX / format_bytes < size)
2358 memory_full (SIZE_MAX);
1fb3821b 2359 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
864d7ce7 2360 data, size * format_bytes, type, format);
1fb3821b
JD
2361}
2362
31f16913 2363/* Get the mouse position in frame relative coordinates. */
1fb3821b
JD
2364
2365static void
971de7fb 2366mouse_position_for_drop (FRAME_PTR f, int *x, int *y)
1fb3821b
JD
2367{
2368 Window root, dummy_window;
2369 int dummy;
2370
2371 BLOCK_INPUT;
2372
2373 XQueryPointer (FRAME_X_DISPLAY (f),
2374 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2375
2376 /* The root window which contains the pointer. */
2377 &root,
2378
2379 /* Window pointer is on, not used */
2380 &dummy_window,
2381
2382 /* The position on that root window. */
2383 x, y,
2384
2385 /* x/y in dummy_window coordinates, not used. */
2386 &dummy, &dummy,
2387
2388 /* Modifier keys and pointer buttons, about which
2389 we don't care. */
2390 (unsigned int *) &dummy);
2391
2392
2393 /* Absolute to relative. */
2394 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2395 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2396
2397 UNBLOCK_INPUT;
2398}
2399
2400DEFUN ("x-get-atom-name", Fx_get_atom_name,
2401 Sx_get_atom_name, 1, 2, 0,
2402 doc: /* Return the X atom name for VALUE as a string.
2403VALUE may be a number or a cons where the car is the upper 16 bits and
2404the cdr is the lower 16 bits of a 32 bit value.
2405Use the display for FRAME or the current frame if FRAME is not given or nil.
2406
2407If the value is 0 or the atom is not known, return the empty string. */)
5842a27b 2408 (Lisp_Object value, Lisp_Object frame)
1fb3821b
JD
2409{
2410 struct frame *f = check_x_frame (frame);
2411 char *name = 0;
42ca4633 2412 char empty[] = "";
1fb3821b 2413 Lisp_Object ret = Qnil;
1fb3821b
JD
2414 Display *dpy = FRAME_X_DISPLAY (f);
2415 Atom atom;
c525d842 2416 int had_errors;
1fb3821b 2417
be44ca6c 2418 CONS_TO_INTEGER (value, Atom, atom);
1fb3821b
JD
2419
2420 BLOCK_INPUT;
9ba8e10d 2421 x_catch_errors (dpy);
42ca4633 2422 name = atom ? XGetAtomName (dpy, atom) : empty;
c525d842
CY
2423 had_errors = x_had_errors_p (dpy);
2424 x_uncatch_errors ();
1fb3821b 2425
c525d842 2426 if (!had_errors)
3a5077c5 2427 ret = build_string (name);
1fb3821b 2428
1fb3821b 2429 if (atom && name) XFree (name);
8b3ad112 2430 if (NILP (ret)) ret = empty_unibyte_string;
1fb3821b
JD
2431
2432 UNBLOCK_INPUT;
2433
2434 return ret;
2435}
2436
9fc68699
JD
2437DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2438 Sx_register_dnd_atom, 1, 2, 0,
2439 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2440ATOM can be a symbol or a string. The ATOM is interned on the display that
2441FRAME is on. If FRAME is nil, the selected frame is used. */)
5842a27b 2442 (Lisp_Object atom, Lisp_Object frame)
9fc68699
JD
2443{
2444 Atom x_atom;
2445 struct frame *f = check_x_frame (frame);
ac82cc6a 2446 ptrdiff_t i;
9fc68699
JD
2447 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2448
2449
2450 if (SYMBOLP (atom))
a9f737ee 2451 x_atom = symbol_to_x_atom (dpyinfo, atom);
9fc68699
JD
2452 else if (STRINGP (atom))
2453 {
2454 BLOCK_INPUT;
51b59d79 2455 x_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (atom), False);
9fc68699
JD
2456 UNBLOCK_INPUT;
2457 }
2458 else
2459 error ("ATOM must be a symbol or a string");
2460
db9cd97a 2461 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
9fc68699
JD
2462 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2463 return Qnil;
2464
db9cd97a 2465 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
a69fbedb
PE
2466 dpyinfo->x_dnd_atoms =
2467 xpalloc (dpyinfo->x_dnd_atoms, &dpyinfo->x_dnd_atoms_size,
2468 1, -1, sizeof *dpyinfo->x_dnd_atoms);
9fc68699
JD
2469
2470 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2471 return Qnil;
2472}
2473
2474/* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
1fb3821b
JD
2475
2476int
5e617bc2
JB
2477x_handle_dnd_message (struct frame *f, XClientMessageEvent *event,
2478 struct x_display_info *dpyinfo, struct input_event *bufp)
1fb3821b
JD
2479{
2480 Lisp_Object vec;
2481 Lisp_Object frame;
e22cf39c
JD
2482 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2483 unsigned long size = 160/event->format;
1fb3821b 2484 int x, y;
31f16913 2485 unsigned char *data = (unsigned char *) event->data.b;
252c5ee1 2486 int idata[5];
ac82cc6a 2487 ptrdiff_t i;
9fc68699 2488
db9cd97a 2489 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
9fc68699
JD
2490 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2491
2492 if (i == dpyinfo->x_dnd_atoms_length) return 0;
1fb3821b
JD
2493
2494 XSETFRAME (frame, f);
2495
31f16913
JD
2496 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2497 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2498 function expects them to be of size int (i.e. 32). So to be able to
2499 use that function, put the data in the form it expects if format is 32. */
2500
2172544b 2501 if (32 < BITS_PER_LONG && event->format == 32)
31f16913 2502 {
31f16913 2503 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
864d7ce7 2504 idata[i] = event->data.l[i];
31f16913
JD
2505 data = (unsigned char *) idata;
2506 }
2507
d2f14999 2508 vec = Fmake_vector (make_number (4), Qnil);
3ae565b3
SM
2509 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2510 event->message_type)));
2511 ASET (vec, 1, frame);
2512 ASET (vec, 2, make_number (event->format));
2513 ASET (vec, 3, x_property_data_to_lisp (f,
2514 data,
2515 event->message_type,
2516 event->format,
2517 size));
1fb3821b
JD
2518
2519 mouse_position_for_drop (f, &x, &y);
2520 bufp->kind = DRAG_N_DROP_EVENT;
862c94ca 2521 bufp->frame_or_window = frame;
1fb3821b
JD
2522 bufp->timestamp = CurrentTime;
2523 bufp->x = make_number (x);
2524 bufp->y = make_number (y);
862c94ca 2525 bufp->arg = vec;
1fb3821b
JD
2526 bufp->modifiers = 0;
2527
2528 return 1;
2529}
2530
2531DEFUN ("x-send-client-message", Fx_send_client_event,
2532 Sx_send_client_message, 6, 6, 0,
2533 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2534
2535For DISPLAY, specify either a frame or a display name (a string).
2536If DISPLAY is nil, that stands for the selected frame's display.
2537DEST may be a number, in which case it is a Window id. The value 0 may
2538be used to send to the root window of the DISPLAY.
2539If DEST is a cons, it is converted to a 32 bit number
2540with the high 16 bits from the car and the lower 16 bit from the cdr. That
2541number is then used as a window id.
2542If DEST is a frame the event is sent to the outer window of that frame.
69785ad0 2543A value of nil means the currently selected frame.
1fb3821b
JD
2544If DEST is the string "PointerWindow" the event is sent to the window that
2545contains the pointer. If DEST is the string "InputFocus" the event is
2546sent to the window that has the input focus.
2547FROM is the frame sending the event. Use nil for currently selected frame.
2548MESSAGE-TYPE is the name of an Atom as a string.
2549FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2550bits. VALUES is a list of numbers, cons and/or strings containing the values
2551to send. If a value is a string, it is converted to an Atom and the value of
2552the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2553with the high 16 bits from the car and the lower 16 bit from the cdr.
2554If more values than fits into the event is given, the excessive values
2555are ignored. */)
5e617bc2
JB
2556 (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2557 Lisp_Object message_type, Lisp_Object format, Lisp_Object values)
2d9074ba
JD
2558{
2559 struct x_display_info *dpyinfo = check_x_display_info (display);
2560
933e29ff 2561 CHECK_STRING (message_type);
5e617bc2
JB
2562 x_send_client_event (display, dest, from,
2563 XInternAtom (dpyinfo->display,
2564 SSDATA (message_type),
2565 False),
2566 format, values);
2d9074ba
JD
2567
2568 return Qnil;
2569}
2570
2571void
5e617bc2
JB
2572x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2573 Atom message_type, Lisp_Object format, Lisp_Object values)
1fb3821b
JD
2574{
2575 struct x_display_info *dpyinfo = check_x_display_info (display);
2576 Window wdest;
2577 XEvent event;
1fb3821b 2578 struct frame *f = check_x_frame (from);
1fb3821b
JD
2579 int to_root;
2580
1fb3821b
JD
2581 CHECK_NUMBER (format);
2582 CHECK_CONS (values);
2583
2584 if (x_check_property_data (values) == -1)
2585 error ("Bad data in VALUES, must be number, cons or string");
2586
2587 event.xclient.type = ClientMessage;
2588 event.xclient.format = XFASTINT (format);
2589
2590 if (event.xclient.format != 8 && event.xclient.format != 16
2591 && event.xclient.format != 32)
2592 error ("FORMAT must be one of 8, 16 or 32");
a0ecb2ac 2593
1fb3821b
JD
2594 if (FRAMEP (dest) || NILP (dest))
2595 {
2596 struct frame *fdest = check_x_frame (dest);
2597 wdest = FRAME_OUTER_WINDOW (fdest);
2598 }
2599 else if (STRINGP (dest))
2600 {
42a5b22f 2601 if (strcmp (SSDATA (dest), "PointerWindow") == 0)
1fb3821b 2602 wdest = PointerWindow;
42a5b22f 2603 else if (strcmp (SSDATA (dest), "InputFocus") == 0)
1fb3821b
JD
2604 wdest = InputFocus;
2605 else
2606 error ("DEST as a string must be one of PointerWindow or InputFocus");
2607 }
be44ca6c
PE
2608 else if (INTEGERP (dest) || FLOATP (dest) || CONSP (dest))
2609 CONS_TO_INTEGER (dest, Window, wdest);
1fb3821b
JD
2610 else
2611 error ("DEST must be a frame, nil, string, number or cons");
2612
2613 if (wdest == 0) wdest = dpyinfo->root_window;
2614 to_root = wdest == dpyinfo->root_window;
2615
1fb3821b
JD
2616 BLOCK_INPUT;
2617
2d9074ba 2618 event.xclient.message_type = message_type;
1fb3821b
JD
2619 event.xclient.display = dpyinfo->display;
2620
2621 /* Some clients (metacity for example) expects sending window to be here
2622 when sending to the root window. */
2623 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2624
6e816df5 2625
1fb3821b
JD
2626 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2627 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2628 event.xclient.format);
2629
2630 /* If event mask is 0 the event is sent to the client that created
2631 the destination window. But if we are sending to the root window,
2632 there is no such client. Then we set the event mask to 0xffff. The
2633 event then goes to clients selecting for events on the root window. */
9ba8e10d 2634 x_catch_errors (dpyinfo->display);
1fb3821b
JD
2635 {
2636 int propagate = to_root ? False : True;
2637 unsigned mask = to_root ? 0xffff : 0;
2638 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2639 XFlush (dpyinfo->display);
2640 }
4545fa20 2641 x_uncatch_errors ();
1fb3821b 2642 UNBLOCK_INPUT;
1fb3821b
JD
2643}
2644
2645\f
ede4db72 2646void
971de7fb 2647syms_of_xselect (void)
ede4db72 2648{
ede4db72
RS
2649 defsubr (&Sx_get_selection_internal);
2650 defsubr (&Sx_own_selection_internal);
2651 defsubr (&Sx_disown_selection_internal);
2652 defsubr (&Sx_selection_owner_p);
2653 defsubr (&Sx_selection_exists_p);
2654
1fb3821b
JD
2655 defsubr (&Sx_get_atom_name);
2656 defsubr (&Sx_send_client_message);
9fc68699 2657 defsubr (&Sx_register_dnd_atom);
1fb3821b 2658
ede4db72
RS
2659 reading_selection_reply = Fcons (Qnil, Qnil);
2660 staticpro (&reading_selection_reply);
2661 reading_selection_window = 0;
2662 reading_which_selection = 0;
2663
2664 property_change_wait_list = 0;
2f65feb6 2665 prop_location_identifier = 0;
ede4db72
RS
2666 property_change_reply = Fcons (Qnil, Qnil);
2667 staticpro (&property_change_reply);
2668
e067f0c1
CY
2669 converted_selections = NULL;
2670 conversion_fail_tag = None;
2671
29208e82 2672 DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist,
8c1a1077
PJ
2673 doc: /* An alist associating X Windows selection-types with functions.
2674These functions are called to convert the selection, with three args:
2675the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2676a desired type to which the selection should be converted;
2677and the local selection value (whatever was given to `x-own-selection').
2678
2679The function should return the value to send to the X server
2680\(typically a string). A return value of nil
2681means that the conversion could not be done.
2682A return value which is the symbol `NULL'
2683means that a side-effect was executed,
2684and there is no meaningful selection value. */);
ede4db72
RS
2685 Vselection_converter_alist = Qnil;
2686
29208e82 2687 DEFVAR_LISP ("x-lost-selection-functions", Vx_lost_selection_functions,
8c1a1077
PJ
2688 doc: /* A list of functions to be called when Emacs loses an X selection.
2689\(This happens when some other X client makes its own selection
2690or when a Lisp program explicitly clears the selection.)
2691The functions are called with one argument, the selection type
2692\(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
c917a8de 2693 Vx_lost_selection_functions = Qnil;
ede4db72 2694
29208e82 2695 DEFVAR_LISP ("x-sent-selection-functions", Vx_sent_selection_functions,
8c1a1077 2696 doc: /* A list of functions to be called when Emacs answers a selection request.
e067f0c1 2697The functions are called with three arguments:
8c1a1077
PJ
2698 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2699 - the selection-type which Emacs was asked to convert the
2700 selection into before sending (for example, `STRING' or `LENGTH');
2701 - a flag indicating success or failure for responding to the request.
2702We might have failed (and declined the request) for any number of reasons,
2703including being asked for a selection that we no longer own, or being asked
2704to convert into a type that we don't know about or that is inappropriate.
2705This hook doesn't let you change the behavior of Emacs's selection replies,
2706it merely informs you that they have happened. */);
c917a8de 2707 Vx_sent_selection_functions = Qnil;
ede4db72 2708
4b80f674
CY
2709 DEFVAR_LISP ("x-select-enable-clipboard-manager",
2710 Vx_select_enable_clipboard_manager,
2711 doc: /* Whether to enable X clipboard manager support.
2712If non-nil, then whenever Emacs is killed or an Emacs frame is deleted
2713while owning the X clipboard, the clipboard contents are saved to the
2714clipboard manager if one is present. */);
2715 Vx_select_enable_clipboard_manager = Qt;
2716
29208e82 2717 DEFVAR_INT ("x-selection-timeout", x_selection_timeout,
8c1a1077
PJ
2718 doc: /* Number of milliseconds to wait for a selection reply.
2719If the selection owner doesn't reply in this time, we give up.
2720A value of 0 means wait as long as necessary. This is initialized from the
2721\"*selectionTimeout\" resource. */);
ede4db72
RS
2722 x_selection_timeout = 0;
2723
9852377f 2724 /* QPRIMARY is defined in keyboard.c. */
f3d4e0a4
CY
2725 DEFSYM (QSECONDARY, "SECONDARY");
2726 DEFSYM (QSTRING, "STRING");
2727 DEFSYM (QINTEGER, "INTEGER");
2728 DEFSYM (QCLIPBOARD, "CLIPBOARD");
2729 DEFSYM (QTIMESTAMP, "TIMESTAMP");
2730 DEFSYM (QTEXT, "TEXT");
2731 DEFSYM (QCOMPOUND_TEXT, "COMPOUND_TEXT");
2732 DEFSYM (QUTF8_STRING, "UTF8_STRING");
2733 DEFSYM (QDELETE, "DELETE");
2734 DEFSYM (QMULTIPLE, "MULTIPLE");
2735 DEFSYM (QINCR, "INCR");
2736 DEFSYM (QEMACS_TMP, "_EMACS_TMP_");
2737 DEFSYM (QTARGETS, "TARGETS");
2738 DEFSYM (QATOM, "ATOM");
2739 DEFSYM (QATOM_PAIR, "ATOM_PAIR");
a9f737ee
CY
2740 DEFSYM (QCLIPBOARD_MANAGER, "CLIPBOARD_MANAGER");
2741 DEFSYM (QSAVE_TARGETS, "SAVE_TARGETS");
f3d4e0a4
CY
2742 DEFSYM (QNULL, "NULL");
2743 DEFSYM (Qcompound_text_with_extensions, "compound-text-with-extensions");
2744 DEFSYM (Qforeign_selection, "foreign-selection");
cd18e7e3
JB
2745 DEFSYM (Qx_lost_selection_functions, "x-lost-selection-functions");
2746 DEFSYM (Qx_sent_selection_functions, "x-sent-selection-functions");
ede4db72 2747}