(eww): Don't interpret "org/foo" as an URL.
[emacs.git] / src / xselect.c
blob33ff366b89cd068a593413b99ae2e3298cbdd8b3
1 /* X Selection processing for Emacs.
2 Copyright (C) 1993-1997, 2000-2015 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 /* Rewritten by jwz */
22 #include <config.h>
23 #include <limits.h>
24 #include <stdio.h> /* termhooks.h needs this */
26 #ifdef HAVE_SYS_TYPES_H
27 #include <sys/types.h>
28 #endif
30 #include <unistd.h>
32 #include "lisp.h"
33 #include "xterm.h" /* for all of the X includes */
34 #include "dispextern.h" /* frame.h seems to want this */
35 #include "frame.h" /* Need this to get the X window of selected_frame */
36 #include "blockinput.h"
37 #include "character.h"
38 #include "buffer.h"
39 #include "process.h"
40 #include "termhooks.h"
41 #include "keyboard.h"
43 #include <X11/Xproto.h>
45 struct prop_location;
46 struct selection_data;
48 static void x_decline_selection_request (struct input_event *);
49 static bool x_convert_selection (struct input_event *, Lisp_Object,
50 Lisp_Object, Atom, bool,
51 struct x_display_info *);
52 static bool waiting_for_other_props_on_window (Display *, Window);
53 static struct prop_location *expect_property_change (Display *, Window,
54 Atom, int);
55 static void unexpect_property_change (struct prop_location *);
56 static void wait_for_property_change (struct prop_location *);
57 static Lisp_Object x_get_window_property_as_lisp_data (struct x_display_info *,
58 Window, Atom,
59 Lisp_Object, Atom);
60 static Lisp_Object selection_data_to_lisp_data (struct x_display_info *,
61 const unsigned char *,
62 ptrdiff_t, Atom, int);
63 static void lisp_data_to_selection_data (struct x_display_info *, Lisp_Object,
64 struct selection_data *);
66 /* Printing traces to stderr. */
68 #ifdef TRACE_SELECTION
69 #define TRACE0(fmt) \
70 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid ())
71 #define TRACE1(fmt, a0) \
72 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0)
73 #define TRACE2(fmt, a0, a1) \
74 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0, a1)
75 #define TRACE3(fmt, a0, a1, a2) \
76 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0, a1, a2)
77 #else
78 #define TRACE0(fmt) (void) 0
79 #define TRACE1(fmt, a0) (void) 0
80 #define TRACE2(fmt, a0, a1) (void) 0
81 #endif
83 /* Bytes needed to represent 'long' data. This is as per libX11; it
84 is not necessarily sizeof (long). */
85 #define X_LONG_SIZE 4
87 /* If this is a smaller number than the max-request-size of the display,
88 emacs will use INCR selection transfer when the selection is larger
89 than this. The max-request-size is usually around 64k, so if you want
90 emacs to use incremental selection transfers when the selection is
91 smaller than that, set this. I added this mostly for debugging the
92 incremental transfer stuff, but it might improve server performance.
94 This value cannot exceed INT_MAX / max (X_LONG_SIZE, sizeof (long))
95 because it is multiplied by X_LONG_SIZE and by sizeof (long) in
96 subscript calculations. Similarly for PTRDIFF_MAX - 1 or SIZE_MAX
97 - 1 in place of INT_MAX. */
98 #define MAX_SELECTION_QUANTUM \
99 ((int) min (0xFFFFFF, (min (INT_MAX, min (PTRDIFF_MAX, SIZE_MAX) - 1) \
100 / max (X_LONG_SIZE, sizeof (long)))))
102 static int
103 selection_quantum (Display *display)
105 long mrs = XMaxRequestSize (display);
106 return (mrs < MAX_SELECTION_QUANTUM / X_LONG_SIZE + 25
107 ? (mrs - 25) * X_LONG_SIZE
108 : MAX_SELECTION_QUANTUM);
111 #define LOCAL_SELECTION(selection_symbol,dpyinfo) \
112 assq_no_quit (selection_symbol, dpyinfo->terminal->Vselection_alist)
115 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later
116 handling. */
118 struct selection_event_queue
120 struct input_event event;
121 struct selection_event_queue *next;
124 static struct selection_event_queue *selection_queue;
126 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
128 static int x_queue_selection_requests;
130 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
132 static void
133 x_queue_event (struct input_event *event)
135 struct selection_event_queue *queue_tmp;
137 /* Don't queue repeated requests.
138 This only happens for large requests which uses the incremental protocol. */
139 for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next)
141 if (!memcmp (&queue_tmp->event, event, sizeof (*event)))
143 TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp);
144 x_decline_selection_request (event);
145 return;
149 queue_tmp = xmalloc (sizeof *queue_tmp);
150 TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp);
151 queue_tmp->event = *event;
152 queue_tmp->next = selection_queue;
153 selection_queue = queue_tmp;
156 /* Start queuing SELECTION_REQUEST_EVENT events. */
158 static void
159 x_start_queuing_selection_requests (void)
161 if (x_queue_selection_requests)
162 emacs_abort ();
164 x_queue_selection_requests++;
165 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
168 /* Stop queuing SELECTION_REQUEST_EVENT events. */
170 static void
171 x_stop_queuing_selection_requests (void)
173 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
174 --x_queue_selection_requests;
176 /* Take all the queued events and put them back
177 so that they get processed afresh. */
179 while (selection_queue != NULL)
181 struct selection_event_queue *queue_tmp = selection_queue;
182 TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp);
183 kbd_buffer_unget_event (&queue_tmp->event);
184 selection_queue = queue_tmp->next;
185 xfree (queue_tmp);
190 /* This converts a Lisp symbol to a server Atom, avoiding a server
191 roundtrip whenever possible. */
193 static Atom
194 symbol_to_x_atom (struct x_display_info *dpyinfo, Lisp_Object sym)
196 Atom val;
197 if (NILP (sym)) return 0;
198 if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
199 if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
200 if (EQ (sym, QSTRING)) return XA_STRING;
201 if (EQ (sym, QINTEGER)) return XA_INTEGER;
202 if (EQ (sym, QATOM)) return XA_ATOM;
203 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
204 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
205 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
206 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
207 if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING;
208 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
209 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
210 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
211 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP;
212 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS;
213 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL;
214 if (!SYMBOLP (sym)) emacs_abort ();
216 TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym)));
217 block_input ();
218 val = XInternAtom (dpyinfo->display, SSDATA (SYMBOL_NAME (sym)), False);
219 unblock_input ();
220 return val;
224 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
225 and calls to intern whenever possible. */
227 static Lisp_Object
228 x_atom_to_symbol (struct x_display_info *dpyinfo, Atom atom)
230 char *str;
231 Lisp_Object val;
233 if (! atom)
234 return Qnil;
236 switch (atom)
238 case XA_PRIMARY:
239 return QPRIMARY;
240 case XA_SECONDARY:
241 return QSECONDARY;
242 case XA_STRING:
243 return QSTRING;
244 case XA_INTEGER:
245 return QINTEGER;
246 case XA_ATOM:
247 return QATOM;
250 if (dpyinfo == NULL)
251 return Qnil;
252 if (atom == dpyinfo->Xatom_CLIPBOARD)
253 return QCLIPBOARD;
254 if (atom == dpyinfo->Xatom_TIMESTAMP)
255 return QTIMESTAMP;
256 if (atom == dpyinfo->Xatom_TEXT)
257 return QTEXT;
258 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
259 return QCOMPOUND_TEXT;
260 if (atom == dpyinfo->Xatom_UTF8_STRING)
261 return QUTF8_STRING;
262 if (atom == dpyinfo->Xatom_DELETE)
263 return QDELETE;
264 if (atom == dpyinfo->Xatom_MULTIPLE)
265 return QMULTIPLE;
266 if (atom == dpyinfo->Xatom_INCR)
267 return QINCR;
268 if (atom == dpyinfo->Xatom_EMACS_TMP)
269 return QEMACS_TMP;
270 if (atom == dpyinfo->Xatom_TARGETS)
271 return QTARGETS;
272 if (atom == dpyinfo->Xatom_NULL)
273 return QNULL;
275 block_input ();
276 str = XGetAtomName (dpyinfo->display, atom);
277 unblock_input ();
278 TRACE1 ("XGetAtomName --> %s", str);
279 if (! str) return Qnil;
280 val = intern (str);
281 block_input ();
282 /* This was allocated by Xlib, so use XFree. */
283 XFree (str);
284 unblock_input ();
285 return val;
288 /* Do protocol to assert ourself as a selection owner.
289 FRAME shall be the owner; it must be a valid X frame.
290 Update the Vselection_alist so that we can reply to later requests for
291 our selection. */
293 static void
294 x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value,
295 Lisp_Object frame)
297 struct frame *f = XFRAME (frame);
298 Window selecting_window = FRAME_X_WINDOW (f);
299 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
300 Display *display = dpyinfo->display;
301 Time timestamp = dpyinfo->last_user_time;
302 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_name);
304 block_input ();
305 x_catch_errors (display);
306 XSetSelectionOwner (display, selection_atom, selecting_window, timestamp);
307 x_check_errors (display, "Can't set selection: %s");
308 x_uncatch_errors ();
309 unblock_input ();
311 /* Now update the local cache */
313 Lisp_Object selection_data;
314 Lisp_Object prev_value;
316 selection_data = list4 (selection_name, selection_value,
317 INTEGER_TO_CONS (timestamp), frame);
318 prev_value = LOCAL_SELECTION (selection_name, dpyinfo);
320 tset_selection_alist
321 (dpyinfo->terminal,
322 Fcons (selection_data, dpyinfo->terminal->Vselection_alist));
324 /* If we already owned the selection, remove the old selection
325 data. Don't use Fdelq as that may QUIT. */
326 if (!NILP (prev_value))
328 /* We know it's not the CAR, so it's easy. */
329 Lisp_Object rest = dpyinfo->terminal->Vselection_alist;
330 for (; CONSP (rest); rest = XCDR (rest))
331 if (EQ (prev_value, Fcar (XCDR (rest))))
333 XSETCDR (rest, XCDR (XCDR (rest)));
334 break;
340 /* Given a selection-name and desired type, look up our local copy of
341 the selection value and convert it to the type.
342 Return nil, a string, a vector, a symbol, an integer, or a cons
343 that CONS_TO_INTEGER could plausibly handle.
344 This function is used both for remote requests (LOCAL_REQUEST is zero)
345 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
347 This calls random Lisp code, and may signal or gc. */
349 static Lisp_Object
350 x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
351 bool local_request, struct x_display_info *dpyinfo)
353 Lisp_Object local_value;
354 Lisp_Object handler_fn, value, check;
356 local_value = LOCAL_SELECTION (selection_symbol, dpyinfo);
358 if (NILP (local_value)) return Qnil;
360 /* TIMESTAMP is a special case. */
361 if (EQ (target_type, QTIMESTAMP))
363 handler_fn = Qnil;
364 value = XCAR (XCDR (XCDR (local_value)));
366 else
368 /* Don't allow a quit within the converter.
369 When the user types C-g, he would be surprised
370 if by luck it came during a converter. */
371 ptrdiff_t count = SPECPDL_INDEX ();
372 specbind (Qinhibit_quit, Qt);
374 CHECK_SYMBOL (target_type);
375 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
376 /* gcpro is not needed here since nothing but HANDLER_FN
377 is live, and that ought to be a symbol. */
379 if (!NILP (handler_fn))
380 value = call3 (handler_fn,
381 selection_symbol, (local_request ? Qnil : target_type),
382 XCAR (XCDR (local_value)));
383 else
384 value = Qnil;
385 unbind_to (count, Qnil);
388 /* Make sure this value is of a type that we could transmit
389 to another X client. */
391 check = value;
392 if (CONSP (value)
393 && SYMBOLP (XCAR (value)))
394 check = XCDR (value);
396 if (STRINGP (check)
397 || VECTORP (check)
398 || SYMBOLP (check)
399 || INTEGERP (check)
400 || NILP (value))
401 return value;
402 /* Check for a value that CONS_TO_INTEGER could handle. */
403 else if (CONSP (check)
404 && INTEGERP (XCAR (check))
405 && (INTEGERP (XCDR (check))
407 (CONSP (XCDR (check))
408 && INTEGERP (XCAR (XCDR (check)))
409 && NILP (XCDR (XCDR (check))))))
410 return value;
412 signal_error ("Invalid data returned by selection-conversion function",
413 list2 (handler_fn, value));
416 /* Subroutines of x_reply_selection_request. */
418 /* Send a SelectionNotify event to the requestor with property=None,
419 meaning we were unable to do what they wanted. */
421 static void
422 x_decline_selection_request (struct input_event *event)
424 XEvent reply_base;
425 XSelectionEvent *reply = &(reply_base.xselection);
427 reply->type = SelectionNotify;
428 reply->display = SELECTION_EVENT_DISPLAY (event);
429 reply->requestor = SELECTION_EVENT_REQUESTOR (event);
430 reply->selection = SELECTION_EVENT_SELECTION (event);
431 reply->time = SELECTION_EVENT_TIME (event);
432 reply->target = SELECTION_EVENT_TARGET (event);
433 reply->property = None;
435 /* The reason for the error may be that the receiver has
436 died in the meantime. Handle that case. */
437 block_input ();
438 x_catch_errors (reply->display);
439 XSendEvent (reply->display, reply->requestor, False, 0, &reply_base);
440 XFlush (reply->display);
441 x_uncatch_errors ();
442 unblock_input ();
445 /* This is the selection request currently being processed.
446 It is set to zero when the request is fully processed. */
447 static struct input_event *x_selection_current_request;
449 /* Display info in x_selection_request. */
451 static struct x_display_info *selection_request_dpyinfo;
453 /* Raw selection data, for sending to a requestor window. */
455 struct selection_data
457 unsigned char *data;
458 ptrdiff_t size;
459 int format;
460 Atom type;
461 bool nofree;
462 Atom property;
463 /* This can be set to non-NULL during x_reply_selection_request, if
464 the selection is waiting for an INCR transfer to complete. Don't
465 free these; that's done by unexpect_property_change. */
466 struct prop_location *wait_object;
467 struct selection_data *next;
470 /* Linked list of the above (in support of MULTIPLE targets). */
472 static struct selection_data *converted_selections;
474 /* "Data" to send a requestor for a failed MULTIPLE subtarget. */
475 static Atom conversion_fail_tag;
477 /* Used as an unwind-protect clause so that, if a selection-converter signals
478 an error, we tell the requestor that we were unable to do what they wanted
479 before we throw to top-level or go into the debugger or whatever. */
481 static void
482 x_selection_request_lisp_error (void)
484 struct selection_data *cs, *next;
486 for (cs = converted_selections; cs; cs = next)
488 next = cs->next;
489 if (! cs->nofree && cs->data)
490 xfree (cs->data);
491 xfree (cs);
493 converted_selections = NULL;
495 if (x_selection_current_request != 0
496 && selection_request_dpyinfo->display)
497 x_decline_selection_request (x_selection_current_request);
500 static void
501 x_catch_errors_unwind (void)
503 block_input ();
504 x_uncatch_errors ();
505 unblock_input ();
509 /* This stuff is so that INCR selections are reentrant (that is, so we can
510 be servicing multiple INCR selection requests simultaneously.) I haven't
511 actually tested that yet. */
513 /* Keep a list of the property changes that are awaited. */
515 struct prop_location
517 int identifier;
518 Display *display;
519 Window window;
520 Atom property;
521 int desired_state;
522 bool arrived;
523 struct prop_location *next;
526 static int prop_location_identifier;
528 static Lisp_Object property_change_reply;
530 static struct prop_location *property_change_reply_object;
532 static struct prop_location *property_change_wait_list;
535 /* Send the reply to a selection request event EVENT. */
537 #ifdef TRACE_SELECTION
538 static int x_reply_selection_request_cnt;
539 #endif /* TRACE_SELECTION */
541 static void
542 x_reply_selection_request (struct input_event *event,
543 struct x_display_info *dpyinfo)
545 XEvent reply_base;
546 XSelectionEvent *reply = &(reply_base.xselection);
547 Display *display = SELECTION_EVENT_DISPLAY (event);
548 Window window = SELECTION_EVENT_REQUESTOR (event);
549 ptrdiff_t bytes_remaining;
550 int max_bytes = selection_quantum (display);
551 ptrdiff_t count = SPECPDL_INDEX ();
552 struct selection_data *cs;
554 reply->type = SelectionNotify;
555 reply->display = display;
556 reply->requestor = window;
557 reply->selection = SELECTION_EVENT_SELECTION (event);
558 reply->time = SELECTION_EVENT_TIME (event);
559 reply->target = SELECTION_EVENT_TARGET (event);
560 reply->property = SELECTION_EVENT_PROPERTY (event);
561 if (reply->property == None)
562 reply->property = reply->target;
564 block_input ();
565 /* The protected block contains wait_for_property_change, which can
566 run random lisp code (process handlers) or signal. Therefore, we
567 put the x_uncatch_errors call in an unwind. */
568 record_unwind_protect_void (x_catch_errors_unwind);
569 x_catch_errors (display);
571 /* Loop over converted selections, storing them in the requested
572 properties. If data is large, only store the first N bytes
573 (section 2.7.2 of ICCCM). Note that we store the data for a
574 MULTIPLE request in the opposite order; the ICCM says only that
575 the conversion itself must be done in the same order. */
576 for (cs = converted_selections; cs; cs = cs->next)
578 if (cs->property == None)
579 continue;
581 bytes_remaining = cs->size;
582 bytes_remaining *= cs->format >> 3;
583 if (bytes_remaining <= max_bytes)
585 /* Send all the data at once, with minimal handshaking. */
586 TRACE1 ("Sending all %"pD"d bytes", bytes_remaining);
587 XChangeProperty (display, window, cs->property,
588 cs->type, cs->format, PropModeReplace,
589 cs->data, cs->size);
591 else
593 /* Send an INCR tag to initiate incremental transfer. */
594 long value[1];
596 TRACE2 ("Start sending %"pD"d bytes incrementally (%s)",
597 bytes_remaining, XGetAtomName (display, cs->property));
598 cs->wait_object
599 = expect_property_change (display, window, cs->property,
600 PropertyDelete);
602 /* XChangeProperty expects an array of long even if long is
603 more than 32 bits. */
604 value[0] = min (bytes_remaining, X_LONG_MAX);
605 XChangeProperty (display, window, cs->property,
606 dpyinfo->Xatom_INCR, 32, PropModeReplace,
607 (unsigned char *) value, 1);
608 XSelectInput (display, window, PropertyChangeMask);
612 /* Now issue the SelectionNotify event. */
613 XSendEvent (display, window, False, 0, &reply_base);
614 XFlush (display);
616 #ifdef TRACE_SELECTION
618 char *sel = XGetAtomName (display, reply->selection);
619 char *tgt = XGetAtomName (display, reply->target);
620 TRACE3 ("Sent SelectionNotify: %s, target %s (%d)",
621 sel, tgt, ++x_reply_selection_request_cnt);
622 if (sel) XFree (sel);
623 if (tgt) XFree (tgt);
625 #endif /* TRACE_SELECTION */
627 /* Finish sending the rest of each of the INCR values. This should
628 be improved; there's a chance of deadlock if more than one
629 subtarget in a MULTIPLE selection requires an INCR transfer, and
630 the requestor and Emacs loop waiting on different transfers. */
631 for (cs = converted_selections; cs; cs = cs->next)
632 if (cs->wait_object)
634 int format_bytes = cs->format / 8;
635 bool had_errors_p = x_had_errors_p (display);
636 unblock_input ();
638 bytes_remaining = cs->size;
639 bytes_remaining *= format_bytes;
641 /* Wait for the requestor to ack by deleting the property.
642 This can run Lisp code (process handlers) or signal. */
643 if (! had_errors_p)
645 TRACE1 ("Waiting for ACK (deletion of %s)",
646 XGetAtomName (display, cs->property));
647 wait_for_property_change (cs->wait_object);
649 else
650 unexpect_property_change (cs->wait_object);
652 while (bytes_remaining)
654 int i = ((bytes_remaining < max_bytes)
655 ? bytes_remaining
656 : max_bytes) / format_bytes;
657 block_input ();
659 cs->wait_object
660 = expect_property_change (display, window, cs->property,
661 PropertyDelete);
663 TRACE1 ("Sending increment of %d elements", i);
664 TRACE1 ("Set %s to increment data",
665 XGetAtomName (display, cs->property));
667 /* Append the next chunk of data to the property. */
668 XChangeProperty (display, window, cs->property,
669 cs->type, cs->format, PropModeAppend,
670 cs->data, i);
671 bytes_remaining -= i * format_bytes;
672 cs->data += i * ((cs->format == 32) ? sizeof (long)
673 : format_bytes);
674 XFlush (display);
675 had_errors_p = x_had_errors_p (display);
676 unblock_input ();
678 if (had_errors_p) break;
680 /* Wait for the requestor to ack this chunk by deleting
681 the property. This can run Lisp code or signal. */
682 TRACE1 ("Waiting for increment ACK (deletion of %s)",
683 XGetAtomName (display, cs->property));
684 wait_for_property_change (cs->wait_object);
687 /* Now write a zero-length chunk to the property to tell the
688 requestor that we're done. */
689 block_input ();
690 if (! waiting_for_other_props_on_window (display, window))
691 XSelectInput (display, window, 0);
693 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
694 XGetAtomName (display, cs->property));
695 XChangeProperty (display, window, cs->property,
696 cs->type, cs->format, PropModeReplace,
697 cs->data, 0);
698 TRACE0 ("Done sending incrementally");
701 /* rms, 2003-01-03: I think I have fixed this bug. */
702 /* The window we're communicating with may have been deleted
703 in the meantime (that's a real situation from a bug report).
704 In this case, there may be events in the event queue still
705 referring to the deleted window, and we'll get a BadWindow error
706 in XTread_socket when processing the events. I don't have
707 an idea how to fix that. gerd, 2001-01-98. */
708 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
709 delivered before uncatch errors. */
710 XSync (display, False);
711 unblock_input ();
713 /* GTK queues events in addition to the queue in Xlib. So we
714 UNBLOCK to enter the event loop and get possible errors delivered,
715 and then BLOCK again because x_uncatch_errors requires it. */
716 block_input ();
717 /* This calls x_uncatch_errors. */
718 unbind_to (count, Qnil);
719 unblock_input ();
722 /* Handle a SelectionRequest event EVENT.
723 This is called from keyboard.c when such an event is found in the queue. */
725 static void
726 x_handle_selection_request (struct input_event *event)
728 struct gcpro gcpro1, gcpro2;
729 Time local_selection_time;
731 struct x_display_info *dpyinfo = SELECTION_EVENT_DPYINFO (event);
732 Atom selection = SELECTION_EVENT_SELECTION (event);
733 Lisp_Object selection_symbol = x_atom_to_symbol (dpyinfo, selection);
734 Atom target = SELECTION_EVENT_TARGET (event);
735 Lisp_Object target_symbol = x_atom_to_symbol (dpyinfo, target);
736 Atom property = SELECTION_EVENT_PROPERTY (event);
737 Lisp_Object local_selection_data;
738 bool success = false;
739 ptrdiff_t count = SPECPDL_INDEX ();
740 GCPRO2 (local_selection_data, target_symbol);
742 if (!dpyinfo) goto DONE;
744 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
746 /* Decline if we don't own any selections. */
747 if (NILP (local_selection_data)) goto DONE;
749 /* Decline requests issued prior to our acquiring the selection. */
750 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
751 Time, local_selection_time);
752 if (SELECTION_EVENT_TIME (event) != CurrentTime
753 && local_selection_time > SELECTION_EVENT_TIME (event))
754 goto DONE;
756 x_selection_current_request = event;
757 selection_request_dpyinfo = dpyinfo;
758 record_unwind_protect_void (x_selection_request_lisp_error);
760 /* We might be able to handle nested x_handle_selection_requests,
761 but this is difficult to test, and seems unimportant. */
762 x_start_queuing_selection_requests ();
763 record_unwind_protect_void (x_stop_queuing_selection_requests);
765 TRACE2 ("x_handle_selection_request: selection=%s, target=%s",
766 SDATA (SYMBOL_NAME (selection_symbol)),
767 SDATA (SYMBOL_NAME (target_symbol)));
769 if (EQ (target_symbol, QMULTIPLE))
771 /* For MULTIPLE targets, the event property names a list of atom
772 pairs; the first atom names a target and the second names a
773 non-None property. */
774 Window requestor = SELECTION_EVENT_REQUESTOR (event);
775 Lisp_Object multprop;
776 ptrdiff_t j, nselections;
778 if (property == None) goto DONE;
779 multprop
780 = x_get_window_property_as_lisp_data (dpyinfo, requestor, property,
781 QMULTIPLE, selection);
783 if (!VECTORP (multprop) || ASIZE (multprop) % 2)
784 goto DONE;
786 nselections = ASIZE (multprop) / 2;
787 /* Perform conversions. This can signal. */
788 for (j = 0; j < nselections; j++)
790 Lisp_Object subtarget = AREF (multprop, 2*j);
791 Atom subproperty = symbol_to_x_atom (dpyinfo,
792 AREF (multprop, 2*j+1));
794 if (subproperty != None)
795 x_convert_selection (event, selection_symbol, subtarget,
796 subproperty, true, dpyinfo);
798 success = true;
800 else
802 if (property == None)
803 property = SELECTION_EVENT_TARGET (event);
804 success = x_convert_selection (event, selection_symbol,
805 target_symbol, property,
806 false, dpyinfo);
809 DONE:
811 if (success)
812 x_reply_selection_request (event, dpyinfo);
813 else
814 x_decline_selection_request (event);
815 x_selection_current_request = 0;
817 /* Run the `x-sent-selection-functions' abnormal hook. */
818 if (!NILP (Vx_sent_selection_functions)
819 && !EQ (Vx_sent_selection_functions, Qunbound))
821 Lisp_Object args[4];
822 args[0] = Qx_sent_selection_functions;
823 args[1] = selection_symbol;
824 args[2] = target_symbol;
825 args[3] = success ? Qt : Qnil;
826 Frun_hook_with_args (4, args);
829 unbind_to (count, Qnil);
830 UNGCPRO;
833 /* Perform the requested selection conversion, and write the data to
834 the converted_selections linked list, where it can be accessed by
835 x_reply_selection_request. If FOR_MULTIPLE, write out
836 the data even if conversion fails, using conversion_fail_tag.
838 Return true iff successful. */
840 static bool
841 x_convert_selection (struct input_event *event, Lisp_Object selection_symbol,
842 Lisp_Object target_symbol, Atom property,
843 bool for_multiple, struct x_display_info *dpyinfo)
845 struct gcpro gcpro1;
846 Lisp_Object lisp_selection;
847 struct selection_data *cs;
848 GCPRO1 (lisp_selection);
850 lisp_selection
851 = x_get_local_selection (selection_symbol, target_symbol,
852 false, dpyinfo);
854 /* A nil return value means we can't perform the conversion. */
855 if (NILP (lisp_selection)
856 || (CONSP (lisp_selection) && NILP (XCDR (lisp_selection))))
858 if (for_multiple)
860 cs = xmalloc (sizeof *cs);
861 cs->data = (unsigned char *) &conversion_fail_tag;
862 cs->size = 1;
863 cs->format = 32;
864 cs->type = XA_ATOM;
865 cs->nofree = true;
866 cs->property = property;
867 cs->wait_object = NULL;
868 cs->next = converted_selections;
869 converted_selections = cs;
872 UNGCPRO;
873 return false;
876 /* Otherwise, record the converted selection to binary. */
877 cs = xmalloc (sizeof *cs);
878 cs->data = NULL;
879 cs->nofree = true;
880 cs->property = property;
881 cs->wait_object = NULL;
882 cs->next = converted_selections;
883 converted_selections = cs;
884 lisp_data_to_selection_data (dpyinfo, lisp_selection, cs);
885 UNGCPRO;
886 return true;
889 /* Handle a SelectionClear event EVENT, which indicates that some
890 client cleared out our previously asserted selection.
891 This is called from keyboard.c when such an event is found in the queue. */
893 static void
894 x_handle_selection_clear (struct input_event *event)
896 Atom selection = SELECTION_EVENT_SELECTION (event);
897 Time changed_owner_time = SELECTION_EVENT_TIME (event);
899 Lisp_Object selection_symbol, local_selection_data;
900 Time local_selection_time;
901 struct x_display_info *dpyinfo = SELECTION_EVENT_DPYINFO (event);
902 Lisp_Object Vselection_alist;
904 TRACE0 ("x_handle_selection_clear");
906 if (!dpyinfo) return;
908 selection_symbol = x_atom_to_symbol (dpyinfo, selection);
909 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
911 /* Well, we already believe that we don't own it, so that's just fine. */
912 if (NILP (local_selection_data)) return;
914 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
915 Time, local_selection_time);
917 /* We have reasserted the selection since this SelectionClear was
918 generated, so we can disregard it. */
919 if (changed_owner_time != CurrentTime
920 && local_selection_time > changed_owner_time)
921 return;
923 /* Otherwise, really clear. Don't use Fdelq as that may QUIT;. */
924 Vselection_alist = dpyinfo->terminal->Vselection_alist;
925 if (EQ (local_selection_data, CAR (Vselection_alist)))
926 Vselection_alist = XCDR (Vselection_alist);
927 else
929 Lisp_Object rest;
930 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
931 if (EQ (local_selection_data, CAR (XCDR (rest))))
933 XSETCDR (rest, XCDR (XCDR (rest)));
934 break;
937 tset_selection_alist (dpyinfo->terminal, Vselection_alist);
939 /* Run the `x-lost-selection-functions' abnormal hook. */
941 Lisp_Object args[2];
942 args[0] = Qx_lost_selection_functions;
943 args[1] = selection_symbol;
944 Frun_hook_with_args (2, args);
947 redisplay_preserve_echo_area (20);
950 void
951 x_handle_selection_event (struct input_event *event)
953 TRACE0 ("x_handle_selection_event");
954 if (event->kind != SELECTION_REQUEST_EVENT)
955 x_handle_selection_clear (event);
956 else if (x_queue_selection_requests)
957 x_queue_event (event);
958 else
959 x_handle_selection_request (event);
963 /* Clear all selections that were made from frame F.
964 We do this when about to delete a frame. */
966 void
967 x_clear_frame_selections (struct frame *f)
969 Lisp_Object frame;
970 Lisp_Object rest;
971 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
972 struct terminal *t = dpyinfo->terminal;
974 XSETFRAME (frame, f);
976 /* Delete elements from the beginning of Vselection_alist. */
977 while (CONSP (t->Vselection_alist)
978 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (t->Vselection_alist)))))))
980 /* Run the `x-lost-selection-functions' abnormal hook. */
981 Lisp_Object args[2];
982 args[0] = Qx_lost_selection_functions;
983 args[1] = Fcar (Fcar (t->Vselection_alist));
984 Frun_hook_with_args (2, args);
986 tset_selection_alist (t, XCDR (t->Vselection_alist));
989 /* Delete elements after the beginning of Vselection_alist. */
990 for (rest = t->Vselection_alist; CONSP (rest); rest = XCDR (rest))
991 if (CONSP (XCDR (rest))
992 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (XCDR (rest))))))))
994 Lisp_Object args[2];
995 args[0] = Qx_lost_selection_functions;
996 args[1] = XCAR (XCAR (XCDR (rest)));
997 Frun_hook_with_args (2, args);
998 XSETCDR (rest, XCDR (XCDR (rest)));
999 break;
1003 /* True if any properties for DISPLAY and WINDOW
1004 are on the list of what we are waiting for. */
1006 static bool
1007 waiting_for_other_props_on_window (Display *display, Window window)
1009 for (struct prop_location *p = property_change_wait_list; p; p = p->next)
1010 if (p->display == display && p->window == window)
1011 return true;
1012 return false;
1015 /* Add an entry to the list of property changes we are waiting for.
1016 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1017 The return value is a number that uniquely identifies
1018 this awaited property change. */
1020 static struct prop_location *
1021 expect_property_change (Display *display, Window window,
1022 Atom property, int state)
1024 struct prop_location *pl = xmalloc (sizeof *pl);
1025 pl->identifier = ++prop_location_identifier;
1026 pl->display = display;
1027 pl->window = window;
1028 pl->property = property;
1029 pl->desired_state = state;
1030 pl->next = property_change_wait_list;
1031 pl->arrived = false;
1032 property_change_wait_list = pl;
1033 return pl;
1036 /* Delete an entry from the list of property changes we are waiting for.
1037 IDENTIFIER is the number that uniquely identifies the entry. */
1039 static void
1040 unexpect_property_change (struct prop_location *location)
1042 struct prop_location *prop, **pprev = &property_change_wait_list;
1044 for (prop = property_change_wait_list; prop; prop = *pprev)
1046 if (prop == location)
1048 *pprev = prop->next;
1049 xfree (prop);
1050 break;
1052 else
1053 pprev = &prop->next;
1057 /* Remove the property change expectation element for IDENTIFIER. */
1059 static void
1060 wait_for_property_change_unwind (void *loc)
1062 struct prop_location *location = loc;
1064 unexpect_property_change (location);
1065 if (location == property_change_reply_object)
1066 property_change_reply_object = 0;
1069 /* Actually wait for a property change.
1070 IDENTIFIER should be the value that expect_property_change returned. */
1072 static void
1073 wait_for_property_change (struct prop_location *location)
1075 ptrdiff_t count = SPECPDL_INDEX ();
1077 if (property_change_reply_object)
1078 emacs_abort ();
1080 /* Make sure to do unexpect_property_change if we quit or err. */
1081 record_unwind_protect_ptr (wait_for_property_change_unwind, location);
1083 XSETCAR (property_change_reply, Qnil);
1084 property_change_reply_object = location;
1086 /* If the event we are waiting for arrives beyond here, it will set
1087 property_change_reply, because property_change_reply_object says so. */
1088 if (! location->arrived)
1090 EMACS_INT timeout = max (0, x_selection_timeout);
1091 EMACS_INT secs = timeout / 1000;
1092 int nsecs = (timeout % 1000) * 1000000;
1093 TRACE2 (" Waiting %"pI"d secs, %d nsecs", secs, nsecs);
1094 wait_reading_process_output (secs, nsecs, 0, false,
1095 property_change_reply, NULL, 0);
1097 if (NILP (XCAR (property_change_reply)))
1099 TRACE0 (" Timed out");
1100 error ("Timed out waiting for property-notify event");
1104 unbind_to (count, Qnil);
1107 /* Called from XTread_socket in response to a PropertyNotify event. */
1109 void
1110 x_handle_property_notify (const XPropertyEvent *event)
1112 struct prop_location *rest;
1114 for (rest = property_change_wait_list; rest; rest = rest->next)
1116 if (!rest->arrived
1117 && rest->property == event->atom
1118 && rest->window == event->window
1119 && rest->display == event->display
1120 && rest->desired_state == event->state)
1122 TRACE2 ("Expected %s of property %s",
1123 (event->state == PropertyDelete ? "deletion" : "change"),
1124 XGetAtomName (event->display, event->atom));
1126 rest->arrived = true;
1128 /* If this is the one wait_for_property_change is waiting for,
1129 tell it to wake up. */
1130 if (rest == property_change_reply_object)
1131 XSETCAR (property_change_reply, Qt);
1133 return;
1140 /* Variables for communication with x_handle_selection_notify. */
1141 static Atom reading_which_selection;
1142 static Lisp_Object reading_selection_reply;
1143 static Window reading_selection_window;
1145 /* Do protocol to read selection-data from the server.
1146 Converts this to Lisp data and returns it.
1147 FRAME is the frame whose X window shall request the selection. */
1149 static Lisp_Object
1150 x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
1151 Lisp_Object time_stamp, Lisp_Object frame)
1153 struct frame *f = XFRAME (frame);
1154 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
1155 Display *display = dpyinfo->display;
1156 Window requestor_window = FRAME_X_WINDOW (f);
1157 Time requestor_time = dpyinfo->last_user_time;
1158 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1159 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_symbol);
1160 Atom type_atom = (CONSP (target_type)
1161 ? symbol_to_x_atom (dpyinfo, XCAR (target_type))
1162 : symbol_to_x_atom (dpyinfo, target_type));
1163 EMACS_INT timeout, secs;
1164 int nsecs;
1166 if (!FRAME_LIVE_P (f))
1167 return Qnil;
1169 if (! NILP (time_stamp))
1170 CONS_TO_INTEGER (time_stamp, Time, requestor_time);
1172 block_input ();
1173 TRACE2 ("Get selection %s, type %s",
1174 XGetAtomName (display, type_atom),
1175 XGetAtomName (display, target_property));
1177 x_catch_errors (display);
1178 XConvertSelection (display, selection_atom, type_atom, target_property,
1179 requestor_window, requestor_time);
1180 x_check_errors (display, "Can't convert selection: %s");
1181 x_uncatch_errors ();
1183 /* Prepare to block until the reply has been read. */
1184 reading_selection_window = requestor_window;
1185 reading_which_selection = selection_atom;
1186 XSETCAR (reading_selection_reply, Qnil);
1188 /* It should not be necessary to stop handling selection requests
1189 during this time. In fact, the SAVE_TARGETS mechanism requires
1190 us to handle a clipboard manager's requests before it returns
1191 SelectionNotify. */
1192 #if false
1193 x_start_queuing_selection_requests ();
1194 record_unwind_protect_void (x_stop_queuing_selection_requests);
1195 #endif
1197 unblock_input ();
1199 /* This allows quits. Also, don't wait forever. */
1200 timeout = max (0, x_selection_timeout);
1201 secs = timeout / 1000;
1202 nsecs = (timeout % 1000) * 1000000;
1203 TRACE1 (" Start waiting %"pI"d secs for SelectionNotify", secs);
1204 wait_reading_process_output (secs, nsecs, 0, false,
1205 reading_selection_reply, NULL, 0);
1206 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
1208 if (NILP (XCAR (reading_selection_reply)))
1209 error ("Timed out waiting for reply from selection owner");
1210 if (EQ (XCAR (reading_selection_reply), Qlambda))
1211 return Qnil;
1213 /* Otherwise, the selection is waiting for us on the requested property. */
1214 return
1215 x_get_window_property_as_lisp_data (dpyinfo, requestor_window,
1216 target_property, target_type,
1217 selection_atom);
1220 /* Subroutines of x_get_window_property_as_lisp_data */
1222 /* Use xfree, not XFree, to free the data obtained with this function. */
1224 static void
1225 x_get_window_property (Display *display, Window window, Atom property,
1226 unsigned char **data_ret, ptrdiff_t *bytes_ret,
1227 Atom *actual_type_ret, int *actual_format_ret,
1228 unsigned long *actual_size_ret)
1230 ptrdiff_t total_size;
1231 unsigned long bytes_remaining;
1232 ptrdiff_t offset = 0;
1233 unsigned char *data = 0;
1234 unsigned char *tmp_data = 0;
1235 int result;
1236 int buffer_size = selection_quantum (display);
1238 /* Wide enough to avoid overflow in expressions using it. */
1239 ptrdiff_t x_long_size = X_LONG_SIZE;
1241 /* Maximum value for TOTAL_SIZE. It cannot exceed PTRDIFF_MAX - 1
1242 and SIZE_MAX - 1, for an extra byte at the end. And it cannot
1243 exceed LONG_MAX * X_LONG_SIZE, for XGetWindowProperty. */
1244 ptrdiff_t total_size_max =
1245 ((min (PTRDIFF_MAX, SIZE_MAX) - 1) / x_long_size < LONG_MAX
1246 ? min (PTRDIFF_MAX, SIZE_MAX) - 1
1247 : LONG_MAX * x_long_size);
1249 block_input ();
1251 /* First probe the thing to find out how big it is. */
1252 result = XGetWindowProperty (display, window, property,
1253 0, 0, False, AnyPropertyType,
1254 actual_type_ret, actual_format_ret,
1255 actual_size_ret,
1256 &bytes_remaining, &tmp_data);
1257 if (result != Success)
1258 goto done;
1260 /* This was allocated by Xlib, so use XFree. */
1261 XFree (tmp_data);
1263 if (*actual_type_ret == None || *actual_format_ret == 0)
1264 goto done;
1266 if (total_size_max < bytes_remaining)
1267 goto size_overflow;
1268 total_size = bytes_remaining;
1269 data = xmalloc (total_size + 1);
1271 /* Now read, until we've gotten it all. */
1272 while (bytes_remaining)
1274 ptrdiff_t bytes_gotten;
1275 int bytes_per_item;
1276 result
1277 = XGetWindowProperty (display, window, property,
1278 offset / X_LONG_SIZE,
1279 buffer_size / X_LONG_SIZE,
1280 False,
1281 AnyPropertyType,
1282 actual_type_ret, actual_format_ret,
1283 actual_size_ret, &bytes_remaining, &tmp_data);
1285 /* If this doesn't return Success at this point, it means that
1286 some clod deleted the selection while we were in the midst of
1287 reading it. Deal with that, I guess.... */
1288 if (result != Success)
1289 break;
1291 bytes_per_item = *actual_format_ret >> 3;
1292 eassert (*actual_size_ret <= buffer_size / bytes_per_item);
1294 /* The man page for XGetWindowProperty says:
1295 "If the returned format is 32, the returned data is represented
1296 as a long array and should be cast to that type to obtain the
1297 elements."
1298 This applies even if long is more than 32 bits, the X library
1299 converts from 32 bit elements received from the X server to long
1300 and passes the long array to us. Thus, for that case memcpy can not
1301 be used. We convert to a 32 bit type here, because so much code
1302 assume on that.
1304 The bytes and offsets passed to XGetWindowProperty refers to the
1305 property and those are indeed in 32 bit quantities if format is 32. */
1307 bytes_gotten = *actual_size_ret;
1308 bytes_gotten *= bytes_per_item;
1310 TRACE2 ("Read %"pD"d bytes from property %s",
1311 bytes_gotten, XGetAtomName (display, property));
1313 if (total_size - offset < bytes_gotten)
1315 unsigned char *data1;
1316 ptrdiff_t remaining_lim = total_size_max - offset - bytes_gotten;
1317 if (remaining_lim < 0 || remaining_lim < bytes_remaining)
1318 goto size_overflow;
1319 total_size = offset + bytes_gotten + bytes_remaining;
1320 data1 = xrealloc (data, total_size + 1);
1321 data = data1;
1324 if (BITS_PER_LONG > 32 && *actual_format_ret == 32)
1326 unsigned long i;
1327 int *idata = (int *) (data + offset);
1328 long *ldata = (long *) tmp_data;
1330 for (i = 0; i < *actual_size_ret; ++i)
1331 idata[i] = ldata[i];
1333 else
1334 memcpy (data + offset, tmp_data, bytes_gotten);
1336 offset += bytes_gotten;
1338 /* This was allocated by Xlib, so use XFree. */
1339 XFree (tmp_data);
1342 XFlush (display);
1343 data[offset] = '\0';
1345 done:
1346 unblock_input ();
1347 *data_ret = data;
1348 *bytes_ret = offset;
1349 return;
1351 size_overflow:
1352 if (data)
1353 xfree (data);
1354 unblock_input ();
1355 memory_full (SIZE_MAX);
1358 /* Use xfree, not XFree, to free the data obtained with this function. */
1360 static void
1361 receive_incremental_selection (struct x_display_info *dpyinfo,
1362 Window window, Atom property,
1363 Lisp_Object target_type,
1364 unsigned int min_size_bytes,
1365 unsigned char **data_ret,
1366 ptrdiff_t *size_bytes_ret,
1367 Atom *type_ret, int *format_ret,
1368 unsigned long *size_ret)
1370 ptrdiff_t offset = 0;
1371 struct prop_location *wait_object;
1372 Display *display = dpyinfo->display;
1374 if (min (PTRDIFF_MAX, SIZE_MAX) < min_size_bytes)
1375 memory_full (SIZE_MAX);
1376 *data_ret = xmalloc (min_size_bytes);
1377 *size_bytes_ret = min_size_bytes;
1379 TRACE1 ("Read %u bytes incrementally", min_size_bytes);
1381 /* At this point, we have read an INCR property.
1382 Delete the property to ack it.
1383 (But first, prepare to receive the next event in this handshake.)
1385 Now, we must loop, waiting for the sending window to put a value on
1386 that property, then reading the property, then deleting it to ack.
1387 We are done when the sender places a property of length 0.
1389 block_input ();
1390 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
1391 TRACE1 (" Delete property %s",
1392 SDATA (SYMBOL_NAME (x_atom_to_symbol (dpyinfo, property))));
1393 XDeleteProperty (display, window, property);
1394 TRACE1 (" Expect new value of property %s",
1395 SDATA (SYMBOL_NAME (x_atom_to_symbol (dpyinfo, property))));
1396 wait_object = expect_property_change (display, window, property,
1397 PropertyNewValue);
1398 XFlush (display);
1399 unblock_input ();
1401 while (true)
1403 unsigned char *tmp_data;
1404 ptrdiff_t tmp_size_bytes;
1406 TRACE0 (" Wait for property change");
1407 wait_for_property_change (wait_object);
1409 /* expect it again immediately, because x_get_window_property may
1410 .. no it won't, I don't get it.
1411 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1412 TRACE0 (" Get property value");
1413 x_get_window_property (display, window, property,
1414 &tmp_data, &tmp_size_bytes,
1415 type_ret, format_ret, size_ret);
1417 TRACE1 (" Read increment of %"pD"d bytes", tmp_size_bytes);
1419 if (tmp_size_bytes == 0) /* we're done */
1421 TRACE0 ("Done reading incrementally");
1423 if (! waiting_for_other_props_on_window (display, window))
1424 XSelectInput (display, window, STANDARD_EVENT_SET);
1425 /* Use xfree, not XFree, because x_get_window_property
1426 calls xmalloc itself. */
1427 xfree (tmp_data);
1428 break;
1431 block_input ();
1432 TRACE1 (" ACK by deleting property %s",
1433 XGetAtomName (display, property));
1434 XDeleteProperty (display, window, property);
1435 wait_object = expect_property_change (display, window, property,
1436 PropertyNewValue);
1437 XFlush (display);
1438 unblock_input ();
1440 if (*size_bytes_ret - offset < tmp_size_bytes)
1441 *data_ret = xpalloc (*data_ret, size_bytes_ret,
1442 tmp_size_bytes - (*size_bytes_ret - offset),
1443 -1, 1);
1445 memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
1446 offset += tmp_size_bytes;
1448 /* Use xfree, not XFree, because x_get_window_property
1449 calls xmalloc itself. */
1450 xfree (tmp_data);
1455 /* Fetch a value from property PROPERTY of X window WINDOW on display
1456 DISPLAY. TARGET_TYPE and SELECTION_ATOM are used in error message
1457 if this fails. */
1459 static Lisp_Object
1460 x_get_window_property_as_lisp_data (struct x_display_info *dpyinfo,
1461 Window window, Atom property,
1462 Lisp_Object target_type,
1463 Atom selection_atom)
1465 Atom actual_type;
1466 int actual_format;
1467 unsigned long actual_size;
1468 unsigned char *data = 0;
1469 ptrdiff_t bytes = 0;
1470 Lisp_Object val;
1471 Display *display = dpyinfo->display;
1473 TRACE0 ("Reading selection data");
1475 x_get_window_property (display, window, property, &data, &bytes,
1476 &actual_type, &actual_format, &actual_size);
1477 if (! data)
1479 block_input ();
1480 bool there_is_a_selection_owner
1481 = XGetSelectionOwner (display, selection_atom) != 0;
1482 unblock_input ();
1483 if (there_is_a_selection_owner)
1484 signal_error ("Selection owner couldn't convert",
1485 actual_type
1486 ? list2 (target_type,
1487 x_atom_to_symbol (dpyinfo, actual_type))
1488 : target_type);
1489 else
1490 signal_error ("No selection",
1491 x_atom_to_symbol (dpyinfo, selection_atom));
1494 if (actual_type == dpyinfo->Xatom_INCR)
1496 /* That wasn't really the data, just the beginning. */
1498 unsigned int min_size_bytes = * ((unsigned int *) data);
1499 block_input ();
1500 /* Use xfree, not XFree, because x_get_window_property
1501 calls xmalloc itself. */
1502 xfree (data);
1503 unblock_input ();
1504 receive_incremental_selection (dpyinfo, window, property, target_type,
1505 min_size_bytes, &data, &bytes,
1506 &actual_type, &actual_format,
1507 &actual_size);
1510 block_input ();
1511 TRACE1 (" Delete property %s", XGetAtomName (display, property));
1512 XDeleteProperty (display, window, property);
1513 XFlush (display);
1514 unblock_input ();
1516 /* It's been read. Now convert it to a lisp object in some semi-rational
1517 manner. */
1518 val = selection_data_to_lisp_data (dpyinfo, data, bytes,
1519 actual_type, actual_format);
1521 /* Use xfree, not XFree, because x_get_window_property
1522 calls xmalloc itself. */
1523 xfree (data);
1524 return val;
1527 /* These functions convert from the selection data read from the server into
1528 something that we can use from Lisp, and vice versa.
1530 Type: Format: Size: Lisp Type:
1531 ----- ------- ----- -----------
1532 * 8 * String
1533 ATOM 32 1 Symbol
1534 ATOM 32 > 1 Vector of Symbols
1535 * 16 1 Integer
1536 * 16 > 1 Vector of Integers
1537 * 32 1 if <=16 bits: Integer
1538 if > 16 bits: Cons of top16, bot16
1539 * 32 > 1 Vector of the above
1541 When converting a Lisp number to C, it is assumed to be of format 16 if
1542 it is an integer, and of format 32 if it is a cons of two integers.
1544 When converting a vector of numbers from Lisp to C, it is assumed to be
1545 of format 16 if every element in the vector is an integer, and is assumed
1546 to be of format 32 if any element is a cons of two integers.
1548 When converting an object to C, it may be of the form (SYMBOL . <data>)
1549 where SYMBOL is what we should claim that the type is. Format and
1550 representation are as above.
1552 Important: When format is 32, data should contain an array of int,
1553 not an array of long as the X library returns. This makes a difference
1554 when sizeof(long) != sizeof(int). */
1558 static Lisp_Object
1559 selection_data_to_lisp_data (struct x_display_info *dpyinfo,
1560 const unsigned char *data,
1561 ptrdiff_t size, Atom type, int format)
1563 if (type == dpyinfo->Xatom_NULL)
1564 return QNULL;
1566 /* Convert any 8-bit data to a string, for compactness. */
1567 else if (format == 8)
1569 Lisp_Object str, lispy_type;
1571 str = make_unibyte_string ((char *) data, size);
1572 /* Indicate that this string is from foreign selection by a text
1573 property `foreign-selection' so that the caller of
1574 x-get-selection-internal (usually x-get-selection) can know
1575 that the string must be decode. */
1576 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1577 lispy_type = QCOMPOUND_TEXT;
1578 else if (type == dpyinfo->Xatom_UTF8_STRING)
1579 lispy_type = QUTF8_STRING;
1580 else
1581 lispy_type = QSTRING;
1582 Fput_text_property (make_number (0), make_number (size),
1583 Qforeign_selection, lispy_type, str);
1584 return str;
1586 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1587 a vector of symbols. */
1588 else if (type == XA_ATOM
1589 /* Treat ATOM_PAIR type similar to list of atoms. */
1590 || type == dpyinfo->Xatom_ATOM_PAIR)
1592 ptrdiff_t i;
1593 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1594 But the callers of these function has made sure the data for
1595 format == 32 is an array of int. Thus, use int instead
1596 of Atom. */
1597 int *idata = (int *) data;
1599 if (size == sizeof (int))
1600 return x_atom_to_symbol (dpyinfo, (Atom) idata[0]);
1601 else
1603 Lisp_Object v = make_uninit_vector (size / sizeof (int));
1605 for (i = 0; i < size / sizeof (int); i++)
1606 ASET (v, i, x_atom_to_symbol (dpyinfo, (Atom) idata[i]));
1607 return v;
1611 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1612 If the number is 32 bits and won't fit in a Lisp_Int,
1613 convert it to a cons of integers, 16 bits in each half.
1615 else if (format == 32 && size == sizeof (int))
1616 return INTEGER_TO_CONS (((int *) data) [0]);
1617 else if (format == 16 && size == sizeof (short))
1618 return make_number (((short *) data) [0]);
1620 /* Convert any other kind of data to a vector of numbers, represented
1621 as above (as an integer, or a cons of two 16 bit integers.)
1623 else if (format == 16)
1625 ptrdiff_t i;
1626 Lisp_Object v = make_uninit_vector (size / 2);
1628 for (i = 0; i < size / 2; i++)
1630 short j = ((short *) data) [i];
1631 ASET (v, i, make_number (j));
1633 return v;
1635 else
1637 ptrdiff_t i;
1638 Lisp_Object v = make_uninit_vector (size / X_LONG_SIZE);
1640 for (i = 0; i < size / X_LONG_SIZE; i++)
1642 int j = ((int *) data) [i];
1643 ASET (v, i, INTEGER_TO_CONS (j));
1645 return v;
1649 /* Convert OBJ to an X long value, and return it as unsigned long.
1650 OBJ should be an integer or a cons representing an integer.
1651 Treat values in the range X_LONG_MAX + 1 .. X_ULONG_MAX as X
1652 unsigned long values: in theory these values are supposed to be
1653 signed but in practice unsigned 32-bit data are communicated via X
1654 selections and we need to support that. */
1655 static unsigned long
1656 cons_to_x_long (Lisp_Object obj)
1658 if (X_ULONG_MAX <= INTMAX_MAX
1659 || XINT (INTEGERP (obj) ? obj : XCAR (obj)) < 0)
1660 return cons_to_signed (obj, X_LONG_MIN, min (X_ULONG_MAX, INTMAX_MAX));
1661 else
1662 return cons_to_unsigned (obj, X_ULONG_MAX);
1665 /* Use xfree, not XFree, to free the data obtained with this function. */
1667 static void
1668 lisp_data_to_selection_data (struct x_display_info *dpyinfo,
1669 Lisp_Object obj, struct selection_data *cs)
1671 Lisp_Object type = Qnil;
1673 eassert (cs != NULL);
1674 cs->nofree = false;
1676 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
1678 type = XCAR (obj);
1679 obj = XCDR (obj);
1680 if (CONSP (obj) && NILP (XCDR (obj)))
1681 obj = XCAR (obj);
1684 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1685 { /* This is not the same as declining */
1686 cs->format = 32;
1687 cs->size = 0;
1688 cs->data = NULL;
1689 type = QNULL;
1691 else if (STRINGP (obj))
1693 if (SCHARS (obj) < SBYTES (obj))
1694 /* OBJ is a multibyte string containing a non-ASCII char. */
1695 signal_error ("Non-ASCII string must be encoded in advance", obj);
1696 if (NILP (type))
1697 type = QSTRING;
1698 cs->format = 8;
1699 cs->size = SBYTES (obj);
1700 cs->data = SDATA (obj);
1701 cs->nofree = true;
1703 else if (SYMBOLP (obj))
1705 void *data = xmalloc (sizeof (Atom) + 1);
1706 Atom *x_atom_ptr = data;
1707 cs->data = data;
1708 cs->format = 32;
1709 cs->size = 1;
1710 cs->data[sizeof (Atom)] = 0;
1711 *x_atom_ptr = symbol_to_x_atom (dpyinfo, obj);
1712 if (NILP (type)) type = QATOM;
1714 else if (RANGED_INTEGERP (X_SHRT_MIN, obj, X_SHRT_MAX))
1716 void *data = xmalloc (sizeof (short) + 1);
1717 short *short_ptr = data;
1718 cs->data = data;
1719 cs->format = 16;
1720 cs->size = 1;
1721 cs->data[sizeof (short)] = 0;
1722 *short_ptr = XINT (obj);
1723 if (NILP (type)) type = QINTEGER;
1725 else if (INTEGERP (obj)
1726 || (CONSP (obj) && INTEGERP (XCAR (obj))
1727 && (INTEGERP (XCDR (obj))
1728 || (CONSP (XCDR (obj))
1729 && INTEGERP (XCAR (XCDR (obj)))))))
1731 void *data = xmalloc (sizeof (unsigned long) + 1);
1732 unsigned long *x_long_ptr = data;
1733 cs->data = data;
1734 cs->format = 32;
1735 cs->size = 1;
1736 cs->data[sizeof (unsigned long)] = 0;
1737 *x_long_ptr = cons_to_x_long (obj);
1738 if (NILP (type)) type = QINTEGER;
1740 else if (VECTORP (obj))
1742 /* Lisp_Vectors may represent a set of ATOMs;
1743 a set of 16 or 32 bit INTEGERs;
1744 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1746 ptrdiff_t i;
1747 ptrdiff_t size = ASIZE (obj);
1749 if (SYMBOLP (AREF (obj, 0)))
1750 /* This vector is an ATOM set */
1752 void *data;
1753 Atom *x_atoms;
1754 if (NILP (type)) type = QATOM;
1755 for (i = 0; i < size; i++)
1756 if (!SYMBOLP (AREF (obj, i)))
1757 signal_error ("All elements of selection vector must have same type", obj);
1759 cs->data = data = xnmalloc (size, sizeof *x_atoms);
1760 x_atoms = data;
1761 cs->format = 32;
1762 cs->size = size;
1763 for (i = 0; i < size; i++)
1764 x_atoms[i] = symbol_to_x_atom (dpyinfo, AREF (obj, i));
1766 else
1767 /* This vector is an INTEGER set, or something like it */
1769 int format = 16;
1770 int data_size = sizeof (short);
1771 void *data;
1772 unsigned long *x_atoms;
1773 short *shorts;
1774 if (NILP (type)) type = QINTEGER;
1775 for (i = 0; i < size; i++)
1777 if (! RANGED_INTEGERP (X_SHRT_MIN, AREF (obj, i),
1778 X_SHRT_MAX))
1780 /* Use sizeof (long) even if it is more than 32 bits.
1781 See comment in x_get_window_property and
1782 x_fill_property_data. */
1783 data_size = sizeof (long);
1784 format = 32;
1785 break;
1788 cs->data = data = xnmalloc (size, data_size);
1789 x_atoms = data;
1790 shorts = data;
1791 cs->format = format;
1792 cs->size = size;
1793 for (i = 0; i < size; i++)
1795 if (format == 32)
1796 x_atoms[i] = cons_to_x_long (AREF (obj, i));
1797 else
1798 shorts[i] = XINT (AREF (obj, i));
1802 else
1803 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
1805 cs->type = symbol_to_x_atom (dpyinfo, type);
1808 static Lisp_Object
1809 clean_local_selection_data (Lisp_Object obj)
1811 if (CONSP (obj)
1812 && INTEGERP (XCAR (obj))
1813 && CONSP (XCDR (obj))
1814 && INTEGERP (XCAR (XCDR (obj)))
1815 && NILP (XCDR (XCDR (obj))))
1816 obj = Fcons (XCAR (obj), XCDR (obj));
1818 if (CONSP (obj)
1819 && INTEGERP (XCAR (obj))
1820 && INTEGERP (XCDR (obj)))
1822 if (XINT (XCAR (obj)) == 0)
1823 return XCDR (obj);
1824 if (XINT (XCAR (obj)) == -1)
1825 return make_number (- XINT (XCDR (obj)));
1827 if (VECTORP (obj))
1829 ptrdiff_t i;
1830 ptrdiff_t size = ASIZE (obj);
1831 Lisp_Object copy;
1832 if (size == 1)
1833 return clean_local_selection_data (AREF (obj, 0));
1834 copy = make_uninit_vector (size);
1835 for (i = 0; i < size; i++)
1836 ASET (copy, i, clean_local_selection_data (AREF (obj, i)));
1837 return copy;
1839 return obj;
1842 /* Called from XTread_socket to handle SelectionNotify events.
1843 If it's the selection we are waiting for, stop waiting
1844 by setting the car of reading_selection_reply to non-nil.
1845 We store t there if the reply is successful, lambda if not. */
1847 void
1848 x_handle_selection_notify (const XSelectionEvent *event)
1850 if (event->requestor != reading_selection_window)
1851 return;
1852 if (event->selection != reading_which_selection)
1853 return;
1855 TRACE0 ("Received SelectionNotify");
1856 XSETCAR (reading_selection_reply,
1857 (event->property != 0 ? Qt : Qlambda));
1861 /* From a Lisp_Object, return a suitable frame for selection
1862 operations. OBJECT may be a frame, a terminal object, or nil
1863 (which stands for the selected frame--or, if that is not an X
1864 frame, the first X display on the list). If no suitable frame can
1865 be found, return NULL. */
1867 static struct frame *
1868 frame_for_x_selection (Lisp_Object object)
1870 Lisp_Object tail, frame;
1871 struct frame *f;
1873 if (NILP (object))
1875 f = XFRAME (selected_frame);
1876 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1877 return f;
1879 FOR_EACH_FRAME (tail, frame)
1881 f = XFRAME (frame);
1882 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1883 return f;
1886 else if (TERMINALP (object))
1888 struct terminal *t = decode_live_terminal (object);
1890 if (t->type == output_x_window)
1891 FOR_EACH_FRAME (tail, frame)
1893 f = XFRAME (frame);
1894 if (FRAME_LIVE_P (f) && f->terminal == t)
1895 return f;
1898 else if (FRAMEP (object))
1900 f = XFRAME (object);
1901 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1902 return f;
1905 return NULL;
1909 DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
1910 Sx_own_selection_internal, 2, 3, 0,
1911 doc: /* Assert an X selection of type SELECTION and value VALUE.
1912 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1913 \(Those are literal upper-case symbol names, since that's what X expects.)
1914 VALUE is typically a string, or a cons of two markers, but may be
1915 anything that the functions on `selection-converter-alist' know about.
1917 FRAME should be a frame that should own the selection. If omitted or
1918 nil, it defaults to the selected frame.
1920 On Nextstep, FRAME is unused. */)
1921 (Lisp_Object selection, Lisp_Object value, Lisp_Object frame)
1923 if (NILP (frame)) frame = selected_frame;
1924 if (!FRAME_LIVE_P (XFRAME (frame)) || !FRAME_X_P (XFRAME (frame)))
1925 error ("X selection unavailable for this frame");
1927 CHECK_SYMBOL (selection);
1928 if (NILP (value)) error ("VALUE may not be nil");
1929 x_own_selection (selection, value, frame);
1930 return value;
1934 /* Request the selection value from the owner. If we are the owner,
1935 simply return our selection value. If we are not the owner, this
1936 will block until all of the data has arrived. */
1938 DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
1939 Sx_get_selection_internal, 2, 4, 0,
1940 doc: /* Return text selected from some X window.
1941 SELECTION-SYMBOL is typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1942 \(Those are literal upper-case symbol names, since that's what X expects.)
1943 TARGET-TYPE is the type of data desired, typically `STRING'.
1945 TIME-STAMP is the time to use in the XConvertSelection call for foreign
1946 selections. If omitted, defaults to the time for the last event.
1948 TERMINAL should be a terminal object or a frame specifying the X
1949 server to query. If omitted or nil, that stands for the selected
1950 frame's display, or the first available X display.
1952 On Nextstep, TIME-STAMP and TERMINAL are unused. */)
1953 (Lisp_Object selection_symbol, Lisp_Object target_type,
1954 Lisp_Object time_stamp, Lisp_Object terminal)
1956 Lisp_Object val = Qnil;
1957 struct gcpro gcpro1, gcpro2;
1958 struct frame *f = frame_for_x_selection (terminal);
1959 GCPRO2 (target_type, val); /* we store newly consed data into these */
1961 CHECK_SYMBOL (selection_symbol);
1962 CHECK_SYMBOL (target_type);
1963 if (EQ (target_type, QMULTIPLE))
1964 error ("Retrieving MULTIPLE selections is currently unimplemented");
1965 if (!f)
1966 error ("X selection unavailable for this frame");
1968 val = x_get_local_selection (selection_symbol, target_type, true,
1969 FRAME_DISPLAY_INFO (f));
1971 if (NILP (val) && FRAME_LIVE_P (f))
1973 Lisp_Object frame;
1974 XSETFRAME (frame, f);
1975 RETURN_UNGCPRO (x_get_foreign_selection (selection_symbol, target_type,
1976 time_stamp, frame));
1979 if (CONSP (val) && SYMBOLP (XCAR (val)))
1981 val = XCDR (val);
1982 if (CONSP (val) && NILP (XCDR (val)))
1983 val = XCAR (val);
1985 RETURN_UNGCPRO (clean_local_selection_data (val));
1988 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
1989 Sx_disown_selection_internal, 1, 3, 0,
1990 doc: /* If we own the selection SELECTION, disown it.
1991 Disowning it means there is no such selection.
1993 Sets the last-change time for the selection to TIME-OBJECT (by default
1994 the time of the last event).
1996 TERMINAL should be a terminal object or a frame specifying the X
1997 server to query. If omitted or nil, that stands for the selected
1998 frame's display, or the first available X display.
2000 On Nextstep, the TIME-OBJECT and TERMINAL arguments are unused.
2001 On MS-DOS, all this does is return non-nil if we own the selection. */)
2002 (Lisp_Object selection, Lisp_Object time_object, Lisp_Object terminal)
2004 Time timestamp;
2005 Atom selection_atom;
2006 union {
2007 struct selection_input_event sie;
2008 struct input_event ie;
2009 } event;
2010 struct frame *f = frame_for_x_selection (terminal);
2011 struct x_display_info *dpyinfo;
2013 if (!f)
2014 return Qnil;
2016 dpyinfo = FRAME_DISPLAY_INFO (f);
2017 CHECK_SYMBOL (selection);
2019 /* Don't disown the selection when we're not the owner. */
2020 if (NILP (LOCAL_SELECTION (selection, dpyinfo)))
2021 return Qnil;
2023 selection_atom = symbol_to_x_atom (dpyinfo, selection);
2025 block_input ();
2026 if (NILP (time_object))
2027 timestamp = dpyinfo->last_user_time;
2028 else
2029 CONS_TO_INTEGER (time_object, Time, timestamp);
2030 XSetSelectionOwner (dpyinfo->display, selection_atom, None, timestamp);
2031 unblock_input ();
2033 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2034 generated for a window which owns the selection when that window sets
2035 the selection owner to None. The NCD server does, the MIT Sun4 server
2036 doesn't. So we synthesize one; this means we might get two, but
2037 that's ok, because the second one won't have any effect. */
2038 SELECTION_EVENT_DPYINFO (&event.sie) = dpyinfo;
2039 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2040 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2041 x_handle_selection_clear (&event.ie);
2043 return Qt;
2046 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
2047 0, 2, 0,
2048 doc: /* Whether the current Emacs process owns the given X Selection.
2049 The arg should be the name of the selection in question, typically one of
2050 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2051 \(Those are literal upper-case symbol names, since that's what X expects.)
2052 For convenience, the symbol nil is the same as `PRIMARY',
2053 and t is the same as `SECONDARY'.
2055 TERMINAL should be a terminal object or a frame specifying the X
2056 server to query. If omitted or nil, that stands for the selected
2057 frame's display, or the first available X display.
2059 On Nextstep, TERMINAL is unused. */)
2060 (Lisp_Object selection, Lisp_Object terminal)
2062 struct frame *f = frame_for_x_selection (terminal);
2064 CHECK_SYMBOL (selection);
2065 if (EQ (selection, Qnil)) selection = QPRIMARY;
2066 if (EQ (selection, Qt)) selection = QSECONDARY;
2068 if (f && !NILP (LOCAL_SELECTION (selection, FRAME_DISPLAY_INFO (f))))
2069 return Qt;
2070 else
2071 return Qnil;
2074 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
2075 0, 2, 0,
2076 doc: /* Whether there is an owner for the given X selection.
2077 SELECTION should be the name of the selection in question, typically
2078 one of the symbols `PRIMARY', `SECONDARY', `CLIPBOARD', or
2079 `CLIPBOARD_MANAGER' (X expects these literal upper-case names.) The
2080 symbol nil is the same as `PRIMARY', and t is the same as `SECONDARY'.
2082 TERMINAL should be a terminal object or a frame specifying the X
2083 server to query. If omitted or nil, that stands for the selected
2084 frame's display, or the first available X display.
2086 On Nextstep, TERMINAL is unused. */)
2087 (Lisp_Object selection, Lisp_Object terminal)
2089 Window owner;
2090 Atom atom;
2091 struct frame *f = frame_for_x_selection (terminal);
2092 struct x_display_info *dpyinfo;
2094 CHECK_SYMBOL (selection);
2095 if (EQ (selection, Qnil)) selection = QPRIMARY;
2096 if (EQ (selection, Qt)) selection = QSECONDARY;
2098 if (!f)
2099 return Qnil;
2101 dpyinfo = FRAME_DISPLAY_INFO (f);
2103 if (!NILP (LOCAL_SELECTION (selection, dpyinfo)))
2104 return Qt;
2106 atom = symbol_to_x_atom (dpyinfo, selection);
2107 if (atom == 0) return Qnil;
2108 block_input ();
2109 owner = XGetSelectionOwner (dpyinfo->display, atom);
2110 unblock_input ();
2111 return (owner ? Qt : Qnil);
2115 /* Send clipboard manager a SAVE_TARGETS request with a UTF8_STRING
2116 property (http://www.freedesktop.org/wiki/ClipboardManager). */
2118 static Lisp_Object
2119 x_clipboard_manager_save (Lisp_Object frame)
2121 struct frame *f = XFRAME (frame);
2122 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
2123 Atom data = dpyinfo->Xatom_UTF8_STRING;
2125 XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
2126 dpyinfo->Xatom_EMACS_TMP,
2127 dpyinfo->Xatom_ATOM, 32, PropModeReplace,
2128 (unsigned char *) &data, 1);
2129 x_get_foreign_selection (QCLIPBOARD_MANAGER, QSAVE_TARGETS,
2130 Qnil, frame);
2131 return Qt;
2134 /* Error handler for x_clipboard_manager_save_frame. */
2136 static Lisp_Object
2137 x_clipboard_manager_error_1 (Lisp_Object err)
2139 AUTO_STRING (format, "X clipboard manager error: %s\n\
2140 If the problem persists, set `x-select-enable-clipboard-manager' to nil.");
2141 Fmessage (2, (Lisp_Object []) {format, CAR (CDR (err))});
2142 return Qnil;
2145 /* Error handler for x_clipboard_manager_save_all. */
2147 static Lisp_Object
2148 x_clipboard_manager_error_2 (Lisp_Object err)
2150 fprintf (stderr, "Error saving to X clipboard manager.\n\
2151 If the problem persists, set `x-select-enable-clipboard-manager' \
2152 to nil.\n");
2153 return Qnil;
2156 /* Called from delete_frame: save any clipboard owned by FRAME to the
2157 clipboard manager. Do nothing if FRAME does not own the clipboard,
2158 or if no clipboard manager is present. */
2160 void
2161 x_clipboard_manager_save_frame (Lisp_Object frame)
2163 struct frame *f;
2165 if (!NILP (Vx_select_enable_clipboard_manager)
2166 && FRAMEP (frame)
2167 && (f = XFRAME (frame), FRAME_X_P (f))
2168 && FRAME_LIVE_P (f))
2170 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
2171 Lisp_Object local_selection
2172 = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2174 if (!NILP (local_selection)
2175 && EQ (frame, XCAR (XCDR (XCDR (XCDR (local_selection)))))
2176 && XGetSelectionOwner (dpyinfo->display,
2177 dpyinfo->Xatom_CLIPBOARD_MANAGER))
2178 internal_condition_case_1 (x_clipboard_manager_save, frame, Qt,
2179 x_clipboard_manager_error_1);
2183 /* Called from Fkill_emacs: save any clipboard owned by FRAME to the
2184 clipboard manager. Do nothing if FRAME does not own the clipboard,
2185 or if no clipboard manager is present. */
2187 void
2188 x_clipboard_manager_save_all (void)
2190 /* Loop through all X displays, saving owned clipboards. */
2191 struct x_display_info *dpyinfo;
2192 Lisp_Object local_selection, local_frame;
2194 if (NILP (Vx_select_enable_clipboard_manager))
2195 return;
2197 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
2199 local_selection = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2200 if (NILP (local_selection)
2201 || !XGetSelectionOwner (dpyinfo->display,
2202 dpyinfo->Xatom_CLIPBOARD_MANAGER))
2203 continue;
2205 local_frame = XCAR (XCDR (XCDR (XCDR (local_selection))));
2206 if (FRAME_LIVE_P (XFRAME (local_frame)))
2208 AUTO_STRING (saving, "Saving clipboard to X clipboard manager...");
2209 Fmessage (1, &saving);
2210 internal_condition_case_1 (x_clipboard_manager_save, local_frame,
2211 Qt, x_clipboard_manager_error_2);
2217 /***********************************************************************
2218 Drag and drop support
2219 ***********************************************************************/
2220 /* Check that lisp values are of correct type for x_fill_property_data.
2221 That is, number, string or a cons with two numbers (low and high 16
2222 bit parts of a 32 bit number). Return the number of items in DATA,
2223 or -1 if there is an error. */
2226 x_check_property_data (Lisp_Object data)
2228 Lisp_Object iter;
2229 int size = 0;
2231 for (iter = data; CONSP (iter); iter = XCDR (iter))
2233 Lisp_Object o = XCAR (iter);
2235 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
2236 return -1;
2237 else if (CONSP (o) &&
2238 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
2239 return -1;
2240 if (size == INT_MAX)
2241 return -1;
2242 size++;
2245 return size;
2248 /* Convert lisp values to a C array. Values may be a number, a string
2249 which is taken as an X atom name and converted to the atom value, or
2250 a cons containing the two 16 bit parts of a 32 bit number.
2252 DPY is the display use to look up X atoms.
2253 DATA is a Lisp list of values to be converted.
2254 RET is the C array that contains the converted values. It is assumed
2255 it is big enough to hold all values.
2256 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2257 be stored in RET. Note that long is used for 32 even if long is more
2258 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2259 XClientMessageEvent). */
2261 void
2262 x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format)
2264 unsigned long val;
2265 unsigned long *d32 = (unsigned long *) ret;
2266 unsigned short *d16 = (unsigned short *) ret;
2267 unsigned char *d08 = (unsigned char *) ret;
2268 Lisp_Object iter;
2270 for (iter = data; CONSP (iter); iter = XCDR (iter))
2272 Lisp_Object o = XCAR (iter);
2274 if (INTEGERP (o) || FLOATP (o) || CONSP (o))
2276 if (CONSP (o)
2277 && RANGED_INTEGERP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16)
2278 && RANGED_INTEGERP (- (1 << 15), XCDR (o), -1))
2280 /* cons_to_x_long does not handle negative values for v2.
2281 For XDnd, v2 might be y of a window, and can be negative.
2282 The XDnd spec. is not explicit about negative values,
2283 but let's assume negative v2 is sent modulo 2**16. */
2284 unsigned long v1 = XINT (XCAR (o)) & 0xffff;
2285 unsigned long v2 = XINT (XCDR (o)) & 0xffff;
2286 val = (v1 << 16) | v2;
2288 else
2289 val = cons_to_x_long (o);
2291 else if (STRINGP (o))
2293 block_input ();
2294 val = XInternAtom (dpy, SSDATA (o), False);
2295 unblock_input ();
2297 else
2298 error ("Wrong type, must be string, number or cons");
2300 if (format == 8)
2302 if ((1 << 8) < val && val <= X_ULONG_MAX - (1 << 7))
2303 error ("Out of 'char' range");
2304 *d08++ = val;
2306 else if (format == 16)
2308 if ((1 << 16) < val && val <= X_ULONG_MAX - (1 << 15))
2309 error ("Out of 'short' range");
2310 *d16++ = val;
2312 else
2313 *d32++ = val;
2317 /* Convert an array of C values to a Lisp list.
2318 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2319 DATA is a C array of values to be converted.
2320 TYPE is the type of the data. Only XA_ATOM is special, it converts
2321 each number in DATA to its corresponding X atom as a symbol.
2322 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2323 be stored in RET.
2324 SIZE is the number of elements in DATA.
2326 Important: When format is 32, data should contain an array of int,
2327 not an array of long as the X library returns. This makes a difference
2328 when sizeof(long) != sizeof(int).
2330 Also see comment for selection_data_to_lisp_data above. */
2332 Lisp_Object
2333 x_property_data_to_lisp (struct frame *f, const unsigned char *data,
2334 Atom type, int format, unsigned long size)
2336 ptrdiff_t format_bytes = format >> 3;
2337 if (PTRDIFF_MAX / format_bytes < size)
2338 memory_full (SIZE_MAX);
2339 return selection_data_to_lisp_data (FRAME_DISPLAY_INFO (f), data,
2340 size * format_bytes, type, format);
2343 DEFUN ("x-get-atom-name", Fx_get_atom_name,
2344 Sx_get_atom_name, 1, 2, 0,
2345 doc: /* Return the X atom name for VALUE as a string.
2346 VALUE may be a number or a cons where the car is the upper 16 bits and
2347 the cdr is the lower 16 bits of a 32 bit value.
2348 Use the display for FRAME or the current frame if FRAME is not given or nil.
2350 If the value is 0 or the atom is not known, return the empty string. */)
2351 (Lisp_Object value, Lisp_Object frame)
2353 struct frame *f = decode_window_system_frame (frame);
2354 char *name = 0;
2355 char empty[] = "";
2356 Lisp_Object ret = Qnil;
2357 Display *dpy = FRAME_X_DISPLAY (f);
2358 Atom atom;
2359 bool had_errors_p;
2361 CONS_TO_INTEGER (value, Atom, atom);
2363 block_input ();
2364 x_catch_errors (dpy);
2365 name = atom ? XGetAtomName (dpy, atom) : empty;
2366 had_errors_p = x_had_errors_p (dpy);
2367 x_uncatch_errors ();
2369 if (!had_errors_p)
2370 ret = build_string (name);
2372 if (atom && name) XFree (name);
2373 if (NILP (ret)) ret = empty_unibyte_string;
2375 unblock_input ();
2377 return ret;
2380 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2381 Sx_register_dnd_atom, 1, 2, 0,
2382 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2383 ATOM can be a symbol or a string. The ATOM is interned on the display that
2384 FRAME is on. If FRAME is nil, the selected frame is used. */)
2385 (Lisp_Object atom, Lisp_Object frame)
2387 Atom x_atom;
2388 struct frame *f = decode_window_system_frame (frame);
2389 ptrdiff_t i;
2390 struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
2393 if (SYMBOLP (atom))
2394 x_atom = symbol_to_x_atom (dpyinfo, atom);
2395 else if (STRINGP (atom))
2397 block_input ();
2398 x_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (atom), False);
2399 unblock_input ();
2401 else
2402 error ("ATOM must be a symbol or a string");
2404 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2405 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2406 return Qnil;
2408 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
2409 dpyinfo->x_dnd_atoms =
2410 xpalloc (dpyinfo->x_dnd_atoms, &dpyinfo->x_dnd_atoms_size,
2411 1, -1, sizeof *dpyinfo->x_dnd_atoms);
2413 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2414 return Qnil;
2417 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2419 bool
2420 x_handle_dnd_message (struct frame *f, const XClientMessageEvent *event,
2421 struct x_display_info *dpyinfo, struct input_event *bufp)
2423 Lisp_Object vec;
2424 Lisp_Object frame;
2425 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2426 unsigned long size = 160/event->format;
2427 int x, y;
2428 unsigned char *data = (unsigned char *) event->data.b;
2429 int idata[5];
2430 ptrdiff_t i;
2432 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2433 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2435 if (i == dpyinfo->x_dnd_atoms_length) return false;
2437 XSETFRAME (frame, f);
2439 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2440 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2441 function expects them to be of size int (i.e. 32). So to be able to
2442 use that function, put the data in the form it expects if format is 32. */
2444 if (BITS_PER_LONG > 32 && event->format == 32)
2446 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
2447 idata[i] = event->data.l[i];
2448 data = (unsigned char *) idata;
2451 vec = Fmake_vector (make_number (4), Qnil);
2452 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_DISPLAY_INFO (f),
2453 event->message_type)));
2454 ASET (vec, 1, frame);
2455 ASET (vec, 2, make_number (event->format));
2456 ASET (vec, 3, x_property_data_to_lisp (f,
2457 data,
2458 event->message_type,
2459 event->format,
2460 size));
2462 x_relative_mouse_position (f, &x, &y);
2463 bufp->kind = DRAG_N_DROP_EVENT;
2464 bufp->frame_or_window = frame;
2465 bufp->timestamp = CurrentTime;
2466 bufp->x = make_number (x);
2467 bufp->y = make_number (y);
2468 bufp->arg = vec;
2469 bufp->modifiers = 0;
2471 return true;
2474 DEFUN ("x-send-client-message", Fx_send_client_message,
2475 Sx_send_client_message, 6, 6, 0,
2476 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2478 For DISPLAY, specify either a frame or a display name (a string).
2479 If DISPLAY is nil, that stands for the selected frame's display.
2480 DEST may be a number, in which case it is a Window id. The value 0 may
2481 be used to send to the root window of the DISPLAY.
2482 If DEST is a cons, it is converted to a 32 bit number
2483 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2484 number is then used as a window id.
2485 If DEST is a frame the event is sent to the outer window of that frame.
2486 A value of nil means the currently selected frame.
2487 If DEST is the string "PointerWindow" the event is sent to the window that
2488 contains the pointer. If DEST is the string "InputFocus" the event is
2489 sent to the window that has the input focus.
2490 FROM is the frame sending the event. Use nil for currently selected frame.
2491 MESSAGE-TYPE is the name of an Atom as a string.
2492 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2493 bits. VALUES is a list of numbers, cons and/or strings containing the values
2494 to send. If a value is a string, it is converted to an Atom and the value of
2495 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2496 with the high 16 bits from the car and the lower 16 bit from the cdr.
2497 If more values than fits into the event is given, the excessive values
2498 are ignored. */)
2499 (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2500 Lisp_Object message_type, Lisp_Object format, Lisp_Object values)
2502 struct x_display_info *dpyinfo = check_x_display_info (display);
2504 CHECK_STRING (message_type);
2505 x_send_client_event (display, dest, from,
2506 XInternAtom (dpyinfo->display,
2507 SSDATA (message_type),
2508 False),
2509 format, values);
2511 return Qnil;
2514 void
2515 x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2516 Atom message_type, Lisp_Object format, Lisp_Object values)
2518 struct x_display_info *dpyinfo = check_x_display_info (display);
2519 Window wdest;
2520 XEvent event;
2521 struct frame *f = decode_window_system_frame (from);
2522 bool to_root;
2524 CHECK_NUMBER (format);
2525 CHECK_CONS (values);
2527 if (x_check_property_data (values) == -1)
2528 error ("Bad data in VALUES, must be number, cons or string");
2530 if (XINT (format) != 8 && XINT (format) != 16 && XINT (format) != 32)
2531 error ("FORMAT must be one of 8, 16 or 32");
2533 event.xclient.type = ClientMessage;
2534 event.xclient.format = XINT (format);
2536 if (FRAMEP (dest) || NILP (dest))
2538 struct frame *fdest = decode_window_system_frame (dest);
2539 wdest = FRAME_OUTER_WINDOW (fdest);
2541 else if (STRINGP (dest))
2543 if (strcmp (SSDATA (dest), "PointerWindow") == 0)
2544 wdest = PointerWindow;
2545 else if (strcmp (SSDATA (dest), "InputFocus") == 0)
2546 wdest = InputFocus;
2547 else
2548 error ("DEST as a string must be one of PointerWindow or InputFocus");
2550 else if (INTEGERP (dest) || FLOATP (dest) || CONSP (dest))
2551 CONS_TO_INTEGER (dest, Window, wdest);
2552 else
2553 error ("DEST must be a frame, nil, string, number or cons");
2555 if (wdest == 0) wdest = dpyinfo->root_window;
2556 to_root = wdest == dpyinfo->root_window;
2558 block_input ();
2560 event.xclient.send_event = True;
2561 event.xclient.serial = 0;
2562 event.xclient.message_type = message_type;
2563 event.xclient.display = dpyinfo->display;
2565 /* Some clients (metacity for example) expects sending window to be here
2566 when sending to the root window. */
2567 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2569 memset (event.xclient.data.l, 0, sizeof (event.xclient.data.l));
2570 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2571 event.xclient.format);
2573 /* If event mask is 0 the event is sent to the client that created
2574 the destination window. But if we are sending to the root window,
2575 there is no such client. Then we set the event mask to 0xffffff. The
2576 event then goes to clients selecting for events on the root window. */
2577 x_catch_errors (dpyinfo->display);
2579 bool propagate = !to_root;
2580 long mask = to_root ? 0xffffff : 0;
2582 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2583 XFlush (dpyinfo->display);
2585 x_uncatch_errors ();
2586 unblock_input ();
2590 void
2591 syms_of_xselect (void)
2593 defsubr (&Sx_get_selection_internal);
2594 defsubr (&Sx_own_selection_internal);
2595 defsubr (&Sx_disown_selection_internal);
2596 defsubr (&Sx_selection_owner_p);
2597 defsubr (&Sx_selection_exists_p);
2599 defsubr (&Sx_get_atom_name);
2600 defsubr (&Sx_send_client_message);
2601 defsubr (&Sx_register_dnd_atom);
2603 reading_selection_reply = Fcons (Qnil, Qnil);
2604 staticpro (&reading_selection_reply);
2605 reading_selection_window = 0;
2606 reading_which_selection = 0;
2608 property_change_wait_list = 0;
2609 prop_location_identifier = 0;
2610 property_change_reply = Fcons (Qnil, Qnil);
2611 staticpro (&property_change_reply);
2613 converted_selections = NULL;
2614 conversion_fail_tag = None;
2616 /* FIXME: Duplicate definition in nsselect.c. */
2617 DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist,
2618 doc: /* An alist associating X Windows selection-types with functions.
2619 These functions are called to convert the selection, with three args:
2620 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2621 a desired type to which the selection should be converted;
2622 and the local selection value (whatever was given to
2623 `x-own-selection-internal').
2625 The function should return the value to send to the X server
2626 \(typically a string). A return value of nil
2627 means that the conversion could not be done.
2628 A return value which is the symbol `NULL'
2629 means that a side-effect was executed,
2630 and there is no meaningful selection value. */);
2631 Vselection_converter_alist = Qnil;
2633 DEFVAR_LISP ("x-lost-selection-functions", Vx_lost_selection_functions,
2634 doc: /* A list of functions to be called when Emacs loses an X selection.
2635 \(This happens when some other X client makes its own selection
2636 or when a Lisp program explicitly clears the selection.)
2637 The functions are called with one argument, the selection type
2638 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2639 Vx_lost_selection_functions = Qnil;
2641 DEFVAR_LISP ("x-sent-selection-functions", Vx_sent_selection_functions,
2642 doc: /* A list of functions to be called when Emacs answers a selection request.
2643 The functions are called with three arguments:
2644 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2645 - the selection-type which Emacs was asked to convert the
2646 selection into before sending (for example, `STRING' or `LENGTH');
2647 - a flag indicating success or failure for responding to the request.
2648 We might have failed (and declined the request) for any number of reasons,
2649 including being asked for a selection that we no longer own, or being asked
2650 to convert into a type that we don't know about or that is inappropriate.
2651 This hook doesn't let you change the behavior of Emacs's selection replies,
2652 it merely informs you that they have happened. */);
2653 Vx_sent_selection_functions = Qnil;
2655 DEFVAR_LISP ("x-select-enable-clipboard-manager",
2656 Vx_select_enable_clipboard_manager,
2657 doc: /* Whether to enable X clipboard manager support.
2658 If non-nil, then whenever Emacs is killed or an Emacs frame is deleted
2659 while owning the X clipboard, the clipboard contents are saved to the
2660 clipboard manager if one is present. */);
2661 Vx_select_enable_clipboard_manager = Qt;
2663 DEFVAR_INT ("x-selection-timeout", x_selection_timeout,
2664 doc: /* Number of milliseconds to wait for a selection reply.
2665 If the selection owner doesn't reply in this time, we give up.
2666 A value of 0 means wait as long as necessary. This is initialized from the
2667 \"*selectionTimeout\" resource. */);
2668 x_selection_timeout = 0;
2670 /* QPRIMARY is defined in keyboard.c. */
2671 DEFSYM (QSECONDARY, "SECONDARY");
2672 DEFSYM (QSTRING, "STRING");
2673 DEFSYM (QINTEGER, "INTEGER");
2674 DEFSYM (QCLIPBOARD, "CLIPBOARD");
2675 DEFSYM (QTIMESTAMP, "TIMESTAMP");
2676 DEFSYM (QTEXT, "TEXT");
2678 /* These are types of selection. */
2679 DEFSYM (QCOMPOUND_TEXT, "COMPOUND_TEXT");
2680 DEFSYM (QUTF8_STRING, "UTF8_STRING");
2682 DEFSYM (QDELETE, "DELETE");
2683 DEFSYM (QMULTIPLE, "MULTIPLE");
2684 DEFSYM (QINCR, "INCR");
2685 DEFSYM (QEMACS_TMP, "_EMACS_TMP_");
2686 DEFSYM (QTARGETS, "TARGETS");
2687 DEFSYM (QATOM, "ATOM");
2688 DEFSYM (QATOM_PAIR, "ATOM_PAIR");
2689 DEFSYM (QCLIPBOARD_MANAGER, "CLIPBOARD_MANAGER");
2690 DEFSYM (QSAVE_TARGETS, "SAVE_TARGETS");
2691 DEFSYM (QNULL, "NULL");
2692 DEFSYM (Qcompound_text_with_extensions, "compound-text-with-extensions");
2693 DEFSYM (Qforeign_selection, "foreign-selection");
2694 DEFSYM (Qx_lost_selection_functions, "x-lost-selection-functions");
2695 DEFSYM (Qx_sent_selection_functions, "x-sent-selection-functions");