* termhooks.h (TSET): Remove.
[emacs.git] / src / xselect.c
blob463bd6e37b01b5d9f9d05be3d74f65a81becfa80
1 /* X Selection processing for Emacs.
2 Copyright (C) 1993-1997, 2000-2012 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 */
25 #include <setjmp.h>
27 #ifdef HAVE_SYS_TYPES_H
28 #include <sys/types.h>
29 #endif
31 #include <unistd.h>
33 #include "lisp.h"
34 #include "xterm.h" /* for all of the X includes */
35 #include "dispextern.h" /* frame.h seems to want this */
36 #include "frame.h" /* Need this to get the X window of selected_frame */
37 #include "blockinput.h"
38 #include "character.h"
39 #include "buffer.h"
40 #include "process.h"
41 #include "termhooks.h"
42 #include "keyboard.h"
44 #include <X11/Xproto.h>
46 struct prop_location;
47 struct selection_data;
49 static Lisp_Object x_atom_to_symbol (Display *dpy, Atom atom);
50 static Atom symbol_to_x_atom (struct x_display_info *, Lisp_Object);
51 static void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object);
52 static Lisp_Object x_get_local_selection (Lisp_Object, Lisp_Object, int,
53 struct x_display_info *);
54 static void x_decline_selection_request (struct input_event *);
55 static Lisp_Object x_selection_request_lisp_error (Lisp_Object);
56 static Lisp_Object queue_selection_requests_unwind (Lisp_Object);
57 static Lisp_Object x_catch_errors_unwind (Lisp_Object);
58 static void x_reply_selection_request (struct input_event *, struct x_display_info *);
59 static int x_convert_selection (struct input_event *, Lisp_Object, Lisp_Object,
60 Atom, int, struct x_display_info *);
61 static int waiting_for_other_props_on_window (Display *, Window);
62 static struct prop_location *expect_property_change (Display *, Window,
63 Atom, int);
64 static void unexpect_property_change (struct prop_location *);
65 static Lisp_Object wait_for_property_change_unwind (Lisp_Object);
66 static void wait_for_property_change (struct prop_location *);
67 static Lisp_Object x_get_foreign_selection (Lisp_Object, Lisp_Object,
68 Lisp_Object, Lisp_Object);
69 static Lisp_Object x_get_window_property_as_lisp_data (Display *,
70 Window, Atom,
71 Lisp_Object, Atom);
72 static Lisp_Object selection_data_to_lisp_data (Display *,
73 const unsigned char *,
74 ptrdiff_t, Atom, int);
75 static void lisp_data_to_selection_data (Display *, Lisp_Object,
76 unsigned char **, Atom *,
77 ptrdiff_t *, int *, int *);
78 static Lisp_Object clean_local_selection_data (Lisp_Object);
80 /* Printing traces to stderr. */
82 #ifdef TRACE_SELECTION
83 #define TRACE0(fmt) \
84 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid ())
85 #define TRACE1(fmt, a0) \
86 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0)
87 #define TRACE2(fmt, a0, a1) \
88 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0, a1)
89 #define TRACE3(fmt, a0, a1, a2) \
90 fprintf (stderr, "%"pMd": " fmt "\n", (printmax_t) getpid (), a0, a1, a2)
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
98 static Lisp_Object QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
99 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
100 QATOM_PAIR, QCLIPBOARD_MANAGER, QSAVE_TARGETS;
102 static Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
103 static Lisp_Object QUTF8_STRING; /* This is a type of selection. */
105 static Lisp_Object Qcompound_text_with_extensions;
107 static Lisp_Object Qforeign_selection;
108 static Lisp_Object Qx_lost_selection_functions, Qx_sent_selection_functions;
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
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)
119 #define X_ULONG_MAX 0xffffffffUL
121 /* If this is a smaller number than the max-request-size of the display,
122 emacs will use INCR selection transfer when the selection is larger
123 than this. The max-request-size is usually around 64k, so if you want
124 emacs to use incremental selection transfers when the selection is
125 smaller than that, set this. I added this mostly for debugging the
126 incremental transfer stuff, but it might improve server performance.
128 This value cannot exceed INT_MAX / max (X_LONG_SIZE, sizeof (long))
129 because it is multiplied by X_LONG_SIZE and by sizeof (long) in
130 subscript calculations. Similarly for PTRDIFF_MAX - 1 or SIZE_MAX
131 - 1 in place of INT_MAX. */
132 #define MAX_SELECTION_QUANTUM \
133 ((int) min (0xFFFFFF, (min (INT_MAX, min (PTRDIFF_MAX, SIZE_MAX) - 1) \
134 / max (X_LONG_SIZE, sizeof (long)))))
136 static int
137 selection_quantum (Display *display)
139 long mrs = XMaxRequestSize (display);
140 return (mrs < MAX_SELECTION_QUANTUM / X_LONG_SIZE + 25
141 ? (mrs - 25) * X_LONG_SIZE
142 : MAX_SELECTION_QUANTUM);
145 #define LOCAL_SELECTION(selection_symbol,dpyinfo) \
146 assq_no_quit (selection_symbol, dpyinfo->terminal->Vselection_alist)
149 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later
150 handling. */
152 struct selection_event_queue
154 struct input_event event;
155 struct selection_event_queue *next;
158 static struct selection_event_queue *selection_queue;
160 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
162 static int x_queue_selection_requests;
164 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
166 static void
167 x_queue_event (struct input_event *event)
169 struct selection_event_queue *queue_tmp;
171 /* Don't queue repeated requests.
172 This only happens for large requests which uses the incremental protocol. */
173 for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next)
175 if (!memcmp (&queue_tmp->event, event, sizeof (*event)))
177 TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp);
178 x_decline_selection_request (event);
179 return;
183 queue_tmp = xmalloc (sizeof *queue_tmp);
184 TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp);
185 queue_tmp->event = *event;
186 queue_tmp->next = selection_queue;
187 selection_queue = queue_tmp;
190 /* Start queuing SELECTION_REQUEST_EVENT events. */
192 static void
193 x_start_queuing_selection_requests (void)
195 if (x_queue_selection_requests)
196 abort ();
198 x_queue_selection_requests++;
199 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
202 /* Stop queuing SELECTION_REQUEST_EVENT events. */
204 static void
205 x_stop_queuing_selection_requests (void)
207 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
208 --x_queue_selection_requests;
210 /* Take all the queued events and put them back
211 so that they get processed afresh. */
213 while (selection_queue != NULL)
215 struct selection_event_queue *queue_tmp = selection_queue;
216 TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp);
217 kbd_buffer_unget_event (&queue_tmp->event);
218 selection_queue = queue_tmp->next;
219 xfree (queue_tmp);
224 /* This converts a Lisp symbol to a server Atom, avoiding a server
225 roundtrip whenever possible. */
227 static Atom
228 symbol_to_x_atom (struct x_display_info *dpyinfo, Lisp_Object sym)
230 Atom val;
231 if (NILP (sym)) return 0;
232 if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
233 if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
234 if (EQ (sym, QSTRING)) return XA_STRING;
235 if (EQ (sym, QINTEGER)) return XA_INTEGER;
236 if (EQ (sym, QATOM)) return XA_ATOM;
237 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
238 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
239 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
240 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
241 if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING;
242 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
243 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
244 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
245 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP;
246 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS;
247 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL;
248 if (!SYMBOLP (sym)) abort ();
250 TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym)));
251 BLOCK_INPUT;
252 val = XInternAtom (dpyinfo->display, SSDATA (SYMBOL_NAME (sym)), False);
253 UNBLOCK_INPUT;
254 return val;
258 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
259 and calls to intern whenever possible. */
261 static Lisp_Object
262 x_atom_to_symbol (Display *dpy, Atom atom)
264 struct x_display_info *dpyinfo;
265 char *str;
266 Lisp_Object val;
268 if (! atom)
269 return Qnil;
271 switch (atom)
273 case XA_PRIMARY:
274 return QPRIMARY;
275 case XA_SECONDARY:
276 return QSECONDARY;
277 case XA_STRING:
278 return QSTRING;
279 case XA_INTEGER:
280 return QINTEGER;
281 case XA_ATOM:
282 return QATOM;
285 dpyinfo = x_display_info_for_display (dpy);
286 if (dpyinfo == NULL)
287 return Qnil;
288 if (atom == dpyinfo->Xatom_CLIPBOARD)
289 return QCLIPBOARD;
290 if (atom == dpyinfo->Xatom_TIMESTAMP)
291 return QTIMESTAMP;
292 if (atom == dpyinfo->Xatom_TEXT)
293 return QTEXT;
294 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
295 return QCOMPOUND_TEXT;
296 if (atom == dpyinfo->Xatom_UTF8_STRING)
297 return QUTF8_STRING;
298 if (atom == dpyinfo->Xatom_DELETE)
299 return QDELETE;
300 if (atom == dpyinfo->Xatom_MULTIPLE)
301 return QMULTIPLE;
302 if (atom == dpyinfo->Xatom_INCR)
303 return QINCR;
304 if (atom == dpyinfo->Xatom_EMACS_TMP)
305 return QEMACS_TMP;
306 if (atom == dpyinfo->Xatom_TARGETS)
307 return QTARGETS;
308 if (atom == dpyinfo->Xatom_NULL)
309 return QNULL;
311 BLOCK_INPUT;
312 str = XGetAtomName (dpy, atom);
313 UNBLOCK_INPUT;
314 TRACE1 ("XGetAtomName --> %s", str);
315 if (! str) return Qnil;
316 val = intern (str);
317 BLOCK_INPUT;
318 /* This was allocated by Xlib, so use XFree. */
319 XFree (str);
320 UNBLOCK_INPUT;
321 return val;
324 /* Do protocol to assert ourself as a selection owner.
325 FRAME shall be the owner; it must be a valid X frame.
326 Update the Vselection_alist so that we can reply to later requests for
327 our selection. */
329 static void
330 x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value,
331 Lisp_Object frame)
333 struct frame *f = XFRAME (frame);
334 Window selecting_window = FRAME_X_WINDOW (f);
335 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
336 Display *display = dpyinfo->display;
337 Time timestamp = last_event_timestamp;
338 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_name);
340 BLOCK_INPUT;
341 x_catch_errors (display);
342 XSetSelectionOwner (display, selection_atom, selecting_window, timestamp);
343 x_check_errors (display, "Can't set selection: %s");
344 x_uncatch_errors ();
345 UNBLOCK_INPUT;
347 /* Now update the local cache */
349 Lisp_Object selection_data;
350 Lisp_Object prev_value;
352 selection_data = list4 (selection_name, selection_value,
353 INTEGER_TO_CONS (timestamp), frame);
354 prev_value = LOCAL_SELECTION (selection_name, dpyinfo);
356 tset_selection_alist
357 (dpyinfo->terminal,
358 Fcons (selection_data, dpyinfo->terminal->Vselection_alist));
360 /* If we already owned the selection, remove the old selection
361 data. Don't use Fdelq as that may QUIT. */
362 if (!NILP (prev_value))
364 /* We know it's not the CAR, so it's easy. */
365 Lisp_Object rest = dpyinfo->terminal->Vselection_alist;
366 for (; CONSP (rest); rest = XCDR (rest))
367 if (EQ (prev_value, Fcar (XCDR (rest))))
369 XSETCDR (rest, XCDR (XCDR (rest)));
370 break;
376 /* Given a selection-name and desired type, look up our local copy of
377 the selection value and convert it to the type.
378 Return nil, a string, a vector, a symbol, an integer, or a cons
379 that CONS_TO_INTEGER could plausibly handle.
380 This function is used both for remote requests (LOCAL_REQUEST is zero)
381 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
383 This calls random Lisp code, and may signal or gc. */
385 static Lisp_Object
386 x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
387 int local_request, struct x_display_info *dpyinfo)
389 Lisp_Object local_value;
390 Lisp_Object handler_fn, value, check;
392 local_value = LOCAL_SELECTION (selection_symbol, dpyinfo);
394 if (NILP (local_value)) return Qnil;
396 /* TIMESTAMP is a special case. */
397 if (EQ (target_type, QTIMESTAMP))
399 handler_fn = Qnil;
400 value = XCAR (XCDR (XCDR (local_value)));
402 else
404 /* Don't allow a quit within the converter.
405 When the user types C-g, he would be surprised
406 if by luck it came during a converter. */
407 ptrdiff_t count = SPECPDL_INDEX ();
408 specbind (Qinhibit_quit, Qt);
410 CHECK_SYMBOL (target_type);
411 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
412 /* gcpro is not needed here since nothing but HANDLER_FN
413 is live, and that ought to be a symbol. */
415 if (!NILP (handler_fn))
416 value = call3 (handler_fn,
417 selection_symbol, (local_request ? Qnil : target_type),
418 XCAR (XCDR (local_value)));
419 else
420 value = Qnil;
421 unbind_to (count, Qnil);
424 /* Make sure this value is of a type that we could transmit
425 to another X client. */
427 check = value;
428 if (CONSP (value)
429 && SYMBOLP (XCAR (value)))
430 check = XCDR (value);
432 if (STRINGP (check)
433 || VECTORP (check)
434 || SYMBOLP (check)
435 || INTEGERP (check)
436 || NILP (value))
437 return value;
438 /* Check for a value that CONS_TO_INTEGER could handle. */
439 else if (CONSP (check)
440 && INTEGERP (XCAR (check))
441 && (INTEGERP (XCDR (check))
443 (CONSP (XCDR (check))
444 && INTEGERP (XCAR (XCDR (check)))
445 && NILP (XCDR (XCDR (check))))))
446 return value;
448 signal_error ("Invalid data returned by selection-conversion function",
449 list2 (handler_fn, value));
452 /* Subroutines of x_reply_selection_request. */
454 /* Send a SelectionNotify event to the requestor with property=None,
455 meaning we were unable to do what they wanted. */
457 static void
458 x_decline_selection_request (struct input_event *event)
460 XEvent reply_base;
461 XSelectionEvent *reply = &(reply_base.xselection);
463 reply->type = SelectionNotify;
464 reply->display = SELECTION_EVENT_DISPLAY (event);
465 reply->requestor = SELECTION_EVENT_REQUESTOR (event);
466 reply->selection = SELECTION_EVENT_SELECTION (event);
467 reply->time = SELECTION_EVENT_TIME (event);
468 reply->target = SELECTION_EVENT_TARGET (event);
469 reply->property = None;
471 /* The reason for the error may be that the receiver has
472 died in the meantime. Handle that case. */
473 BLOCK_INPUT;
474 x_catch_errors (reply->display);
475 XSendEvent (reply->display, reply->requestor, False, 0L, &reply_base);
476 XFlush (reply->display);
477 x_uncatch_errors ();
478 UNBLOCK_INPUT;
481 /* This is the selection request currently being processed.
482 It is set to zero when the request is fully processed. */
483 static struct input_event *x_selection_current_request;
485 /* Display info in x_selection_request. */
487 static struct x_display_info *selection_request_dpyinfo;
489 /* Raw selection data, for sending to a requestor window. */
491 struct selection_data
493 unsigned char *data;
494 ptrdiff_t size;
495 int format;
496 Atom type;
497 int nofree;
498 Atom property;
499 /* This can be set to non-NULL during x_reply_selection_request, if
500 the selection is waiting for an INCR transfer to complete. Don't
501 free these; that's done by unexpect_property_change. */
502 struct prop_location *wait_object;
503 struct selection_data *next;
506 /* Linked list of the above (in support of MULTIPLE targets). */
508 static struct selection_data *converted_selections;
510 /* "Data" to send a requestor for a failed MULTIPLE subtarget. */
511 static Atom conversion_fail_tag;
513 /* Used as an unwind-protect clause so that, if a selection-converter signals
514 an error, we tell the requestor that we were unable to do what they wanted
515 before we throw to top-level or go into the debugger or whatever. */
517 static Lisp_Object
518 x_selection_request_lisp_error (Lisp_Object ignore)
520 struct selection_data *cs, *next;
522 for (cs = converted_selections; cs; cs = next)
524 next = cs->next;
525 if (cs->nofree == 0 && cs->data)
526 xfree (cs->data);
527 xfree (cs);
529 converted_selections = NULL;
531 if (x_selection_current_request != 0
532 && selection_request_dpyinfo->display)
533 x_decline_selection_request (x_selection_current_request);
534 return Qnil;
537 static Lisp_Object
538 x_catch_errors_unwind (Lisp_Object dummy)
540 BLOCK_INPUT;
541 x_uncatch_errors ();
542 UNBLOCK_INPUT;
543 return Qnil;
547 /* This stuff is so that INCR selections are reentrant (that is, so we can
548 be servicing multiple INCR selection requests simultaneously.) I haven't
549 actually tested that yet. */
551 /* Keep a list of the property changes that are awaited. */
553 struct prop_location
555 int identifier;
556 Display *display;
557 Window window;
558 Atom property;
559 int desired_state;
560 int arrived;
561 struct prop_location *next;
564 static struct prop_location *expect_property_change (Display *display, Window window, Atom property, int state);
565 static void wait_for_property_change (struct prop_location *location);
566 static void unexpect_property_change (struct prop_location *location);
567 static int waiting_for_other_props_on_window (Display *display, Window window);
569 static int prop_location_identifier;
571 static Lisp_Object property_change_reply;
573 static struct prop_location *property_change_reply_object;
575 static struct prop_location *property_change_wait_list;
577 static Lisp_Object
578 queue_selection_requests_unwind (Lisp_Object tem)
580 x_stop_queuing_selection_requests ();
581 return Qnil;
585 /* Send the reply to a selection request event EVENT. */
587 #ifdef TRACE_SELECTION
588 static int x_reply_selection_request_cnt;
589 #endif /* TRACE_SELECTION */
591 static void
592 x_reply_selection_request (struct input_event *event,
593 struct x_display_info *dpyinfo)
595 XEvent reply_base;
596 XSelectionEvent *reply = &(reply_base.xselection);
597 Display *display = SELECTION_EVENT_DISPLAY (event);
598 Window window = SELECTION_EVENT_REQUESTOR (event);
599 ptrdiff_t bytes_remaining;
600 int max_bytes = selection_quantum (display);
601 ptrdiff_t count = SPECPDL_INDEX ();
602 struct selection_data *cs;
604 reply->type = SelectionNotify;
605 reply->display = display;
606 reply->requestor = window;
607 reply->selection = SELECTION_EVENT_SELECTION (event);
608 reply->time = SELECTION_EVENT_TIME (event);
609 reply->target = SELECTION_EVENT_TARGET (event);
610 reply->property = SELECTION_EVENT_PROPERTY (event);
611 if (reply->property == None)
612 reply->property = reply->target;
614 BLOCK_INPUT;
615 /* The protected block contains wait_for_property_change, which can
616 run random lisp code (process handlers) or signal. Therefore, we
617 put the x_uncatch_errors call in an unwind. */
618 record_unwind_protect (x_catch_errors_unwind, Qnil);
619 x_catch_errors (display);
621 /* Loop over converted selections, storing them in the requested
622 properties. If data is large, only store the first N bytes
623 (section 2.7.2 of ICCCM). Note that we store the data for a
624 MULTIPLE request in the opposite order; the ICCM says only that
625 the conversion itself must be done in the same order. */
626 for (cs = converted_selections; cs; cs = cs->next)
628 if (cs->property == None)
629 continue;
631 bytes_remaining = cs->size;
632 bytes_remaining *= cs->format >> 3;
633 if (bytes_remaining <= max_bytes)
635 /* Send all the data at once, with minimal handshaking. */
636 TRACE1 ("Sending all %"pD"d bytes", bytes_remaining);
637 XChangeProperty (display, window, cs->property,
638 cs->type, cs->format, PropModeReplace,
639 cs->data, cs->size);
641 else
643 /* Send an INCR tag to initiate incremental transfer. */
644 long value[1];
646 TRACE2 ("Start sending %"pD"d bytes incrementally (%s)",
647 bytes_remaining, XGetAtomName (display, cs->property));
648 cs->wait_object
649 = expect_property_change (display, window, cs->property,
650 PropertyDelete);
652 /* XChangeProperty expects an array of long even if long is
653 more than 32 bits. */
654 value[0] = min (bytes_remaining, X_LONG_MAX);
655 XChangeProperty (display, window, cs->property,
656 dpyinfo->Xatom_INCR, 32, PropModeReplace,
657 (unsigned char *) value, 1);
658 XSelectInput (display, window, PropertyChangeMask);
662 /* Now issue the SelectionNotify event. */
663 XSendEvent (display, window, False, 0L, &reply_base);
664 XFlush (display);
666 #ifdef TRACE_SELECTION
668 char *sel = XGetAtomName (display, reply->selection);
669 char *tgt = XGetAtomName (display, reply->target);
670 TRACE3 ("Sent SelectionNotify: %s, target %s (%d)",
671 sel, tgt, ++x_reply_selection_request_cnt);
672 if (sel) XFree (sel);
673 if (tgt) XFree (tgt);
675 #endif /* TRACE_SELECTION */
677 /* Finish sending the rest of each of the INCR values. This should
678 be improved; there's a chance of deadlock if more than one
679 subtarget in a MULTIPLE selection requires an INCR transfer, and
680 the requestor and Emacs loop waiting on different transfers. */
681 for (cs = converted_selections; cs; cs = cs->next)
682 if (cs->wait_object)
684 int format_bytes = cs->format / 8;
685 int had_errors = x_had_errors_p (display);
686 UNBLOCK_INPUT;
688 bytes_remaining = cs->size;
689 bytes_remaining *= format_bytes;
691 /* Wait for the requestor to ack by deleting the property.
692 This can run Lisp code (process handlers) or signal. */
693 if (! had_errors)
695 TRACE1 ("Waiting for ACK (deletion of %s)",
696 XGetAtomName (display, cs->property));
697 wait_for_property_change (cs->wait_object);
699 else
700 unexpect_property_change (cs->wait_object);
702 while (bytes_remaining)
704 int i = ((bytes_remaining < max_bytes)
705 ? bytes_remaining
706 : max_bytes) / format_bytes;
707 BLOCK_INPUT;
709 cs->wait_object
710 = expect_property_change (display, window, cs->property,
711 PropertyDelete);
713 TRACE1 ("Sending increment of %d elements", i);
714 TRACE1 ("Set %s to increment data",
715 XGetAtomName (display, cs->property));
717 /* Append the next chunk of data to the property. */
718 XChangeProperty (display, window, cs->property,
719 cs->type, cs->format, PropModeAppend,
720 cs->data, i);
721 bytes_remaining -= i * format_bytes;
722 cs->data += i * ((cs->format == 32) ? sizeof (long)
723 : format_bytes);
724 XFlush (display);
725 had_errors = x_had_errors_p (display);
726 UNBLOCK_INPUT;
728 if (had_errors) break;
730 /* Wait for the requestor to ack this chunk by deleting
731 the property. This can run Lisp code or signal. */
732 TRACE1 ("Waiting for increment ACK (deletion of %s)",
733 XGetAtomName (display, cs->property));
734 wait_for_property_change (cs->wait_object);
737 /* Now write a zero-length chunk to the property to tell the
738 requestor that we're done. */
739 BLOCK_INPUT;
740 if (! waiting_for_other_props_on_window (display, window))
741 XSelectInput (display, window, 0L);
743 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
744 XGetAtomName (display, cs->property));
745 XChangeProperty (display, window, cs->property,
746 cs->type, cs->format, PropModeReplace,
747 cs->data, 0);
748 TRACE0 ("Done sending incrementally");
751 /* rms, 2003-01-03: I think I have fixed this bug. */
752 /* The window we're communicating with may have been deleted
753 in the meantime (that's a real situation from a bug report).
754 In this case, there may be events in the event queue still
755 referring to the deleted window, and we'll get a BadWindow error
756 in XTread_socket when processing the events. I don't have
757 an idea how to fix that. gerd, 2001-01-98. */
758 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
759 delivered before uncatch errors. */
760 XSync (display, False);
761 UNBLOCK_INPUT;
763 /* GTK queues events in addition to the queue in Xlib. So we
764 UNBLOCK to enter the event loop and get possible errors delivered,
765 and then BLOCK again because x_uncatch_errors requires it. */
766 BLOCK_INPUT;
767 /* This calls x_uncatch_errors. */
768 unbind_to (count, Qnil);
769 UNBLOCK_INPUT;
772 /* Handle a SelectionRequest event EVENT.
773 This is called from keyboard.c when such an event is found in the queue. */
775 static void
776 x_handle_selection_request (struct input_event *event)
778 struct gcpro gcpro1, gcpro2;
779 Time local_selection_time;
781 Display *display = SELECTION_EVENT_DISPLAY (event);
782 struct x_display_info *dpyinfo = x_display_info_for_display (display);
783 Atom selection = SELECTION_EVENT_SELECTION (event);
784 Lisp_Object selection_symbol = x_atom_to_symbol (display, selection);
785 Atom target = SELECTION_EVENT_TARGET (event);
786 Lisp_Object target_symbol = x_atom_to_symbol (display, target);
787 Atom property = SELECTION_EVENT_PROPERTY (event);
788 Lisp_Object local_selection_data;
789 int success = 0;
790 ptrdiff_t count = SPECPDL_INDEX ();
791 GCPRO2 (local_selection_data, target_symbol);
793 if (!dpyinfo) goto DONE;
795 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
797 /* Decline if we don't own any selections. */
798 if (NILP (local_selection_data)) goto DONE;
800 /* Decline requests issued prior to our acquiring the selection. */
801 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
802 Time, local_selection_time);
803 if (SELECTION_EVENT_TIME (event) != CurrentTime
804 && local_selection_time > SELECTION_EVENT_TIME (event))
805 goto DONE;
807 x_selection_current_request = event;
808 selection_request_dpyinfo = dpyinfo;
809 record_unwind_protect (x_selection_request_lisp_error, Qnil);
811 /* We might be able to handle nested x_handle_selection_requests,
812 but this is difficult to test, and seems unimportant. */
813 x_start_queuing_selection_requests ();
814 record_unwind_protect (queue_selection_requests_unwind, Qnil);
816 TRACE2 ("x_handle_selection_request: selection=%s, target=%s",
817 SDATA (SYMBOL_NAME (selection_symbol)),
818 SDATA (SYMBOL_NAME (target_symbol)));
820 if (EQ (target_symbol, QMULTIPLE))
822 /* For MULTIPLE targets, the event property names a list of atom
823 pairs; the first atom names a target and the second names a
824 non-None property. */
825 Window requestor = SELECTION_EVENT_REQUESTOR (event);
826 Lisp_Object multprop;
827 ptrdiff_t j, nselections;
829 if (property == None) goto DONE;
830 multprop
831 = x_get_window_property_as_lisp_data (display, requestor, property,
832 QMULTIPLE, selection);
834 if (!VECTORP (multprop) || ASIZE (multprop) % 2)
835 goto DONE;
837 nselections = ASIZE (multprop) / 2;
838 /* Perform conversions. This can signal. */
839 for (j = 0; j < nselections; j++)
841 Lisp_Object subtarget = AREF (multprop, 2*j);
842 Atom subproperty = symbol_to_x_atom (dpyinfo,
843 AREF (multprop, 2*j+1));
845 if (subproperty != None)
846 x_convert_selection (event, selection_symbol, subtarget,
847 subproperty, 1, dpyinfo);
849 success = 1;
851 else
853 if (property == None)
854 property = SELECTION_EVENT_TARGET (event);
855 success = x_convert_selection (event, selection_symbol,
856 target_symbol, property,
857 0, dpyinfo);
860 DONE:
862 if (success)
863 x_reply_selection_request (event, dpyinfo);
864 else
865 x_decline_selection_request (event);
866 x_selection_current_request = 0;
868 /* Run the `x-sent-selection-functions' abnormal hook. */
869 if (!NILP (Vx_sent_selection_functions)
870 && !EQ (Vx_sent_selection_functions, Qunbound))
872 Lisp_Object args[4];
873 args[0] = Qx_sent_selection_functions;
874 args[1] = selection_symbol;
875 args[2] = target_symbol;
876 args[3] = success ? Qt : Qnil;
877 Frun_hook_with_args (4, args);
880 unbind_to (count, Qnil);
881 UNGCPRO;
884 /* Perform the requested selection conversion, and write the data to
885 the converted_selections linked list, where it can be accessed by
886 x_reply_selection_request. If FOR_MULTIPLE is non-zero, write out
887 the data even if conversion fails, using conversion_fail_tag.
889 Return 0 if the selection failed to convert, 1 otherwise. */
891 static int
892 x_convert_selection (struct input_event *event, Lisp_Object selection_symbol,
893 Lisp_Object target_symbol, Atom property,
894 int for_multiple, struct x_display_info *dpyinfo)
896 struct gcpro gcpro1;
897 Lisp_Object lisp_selection;
898 struct selection_data *cs;
899 GCPRO1 (lisp_selection);
901 lisp_selection
902 = x_get_local_selection (selection_symbol, target_symbol,
903 0, dpyinfo);
905 /* A nil return value means we can't perform the conversion. */
906 if (NILP (lisp_selection)
907 || (CONSP (lisp_selection) && NILP (XCDR (lisp_selection))))
909 if (for_multiple)
911 cs = xmalloc (sizeof *cs);
912 cs->data = (unsigned char *) &conversion_fail_tag;
913 cs->size = 1;
914 cs->format = 32;
915 cs->type = XA_ATOM;
916 cs->nofree = 1;
917 cs->property = property;
918 cs->wait_object = NULL;
919 cs->next = converted_selections;
920 converted_selections = cs;
923 UNGCPRO;
924 return 0;
927 /* Otherwise, record the converted selection to binary. */
928 cs = xmalloc (sizeof *cs);
929 cs->data = NULL;
930 cs->nofree = 1;
931 cs->property = property;
932 cs->wait_object = NULL;
933 cs->next = converted_selections;
934 converted_selections = cs;
935 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event),
936 lisp_selection,
937 &(cs->data), &(cs->type),
938 &(cs->size), &(cs->format),
939 &(cs->nofree));
940 UNGCPRO;
941 return 1;
944 /* Handle a SelectionClear event EVENT, which indicates that some
945 client cleared out our previously asserted selection.
946 This is called from keyboard.c when such an event is found in the queue. */
948 static void
949 x_handle_selection_clear (struct input_event *event)
951 Display *display = SELECTION_EVENT_DISPLAY (event);
952 Atom selection = SELECTION_EVENT_SELECTION (event);
953 Time changed_owner_time = SELECTION_EVENT_TIME (event);
955 Lisp_Object selection_symbol, local_selection_data;
956 Time local_selection_time;
957 struct x_display_info *dpyinfo = x_display_info_for_display (display);
958 Lisp_Object Vselection_alist;
960 TRACE0 ("x_handle_selection_clear");
962 if (!dpyinfo) return;
964 selection_symbol = x_atom_to_symbol (display, selection);
965 local_selection_data = LOCAL_SELECTION (selection_symbol, dpyinfo);
967 /* Well, we already believe that we don't own it, so that's just fine. */
968 if (NILP (local_selection_data)) return;
970 CONS_TO_INTEGER (XCAR (XCDR (XCDR (local_selection_data))),
971 Time, local_selection_time);
973 /* We have reasserted the selection since this SelectionClear was
974 generated, so we can disregard it. */
975 if (changed_owner_time != CurrentTime
976 && local_selection_time > changed_owner_time)
977 return;
979 /* Otherwise, really clear. Don't use Fdelq as that may QUIT;. */
980 Vselection_alist = dpyinfo->terminal->Vselection_alist;
981 if (EQ (local_selection_data, CAR (Vselection_alist)))
982 Vselection_alist = XCDR (Vselection_alist);
983 else
985 Lisp_Object rest;
986 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
987 if (EQ (local_selection_data, CAR (XCDR (rest))))
989 XSETCDR (rest, XCDR (XCDR (rest)));
990 break;
993 tset_selection_alist (dpyinfo->terminal, Vselection_alist);
995 /* Run the `x-lost-selection-functions' abnormal hook. */
997 Lisp_Object args[2];
998 args[0] = Qx_lost_selection_functions;
999 args[1] = selection_symbol;
1000 Frun_hook_with_args (2, args);
1003 prepare_menu_bars ();
1004 redisplay_preserve_echo_area (20);
1007 void
1008 x_handle_selection_event (struct input_event *event)
1010 TRACE0 ("x_handle_selection_event");
1011 if (event->kind != SELECTION_REQUEST_EVENT)
1012 x_handle_selection_clear (event);
1013 else if (x_queue_selection_requests)
1014 x_queue_event (event);
1015 else
1016 x_handle_selection_request (event);
1020 /* Clear all selections that were made from frame F.
1021 We do this when about to delete a frame. */
1023 void
1024 x_clear_frame_selections (FRAME_PTR f)
1026 Lisp_Object frame;
1027 Lisp_Object rest;
1028 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
1029 struct terminal *t = dpyinfo->terminal;
1031 XSETFRAME (frame, f);
1033 /* Delete elements from the beginning of Vselection_alist. */
1034 while (CONSP (t->Vselection_alist)
1035 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (t->Vselection_alist)))))))
1037 /* Run the `x-lost-selection-functions' abnormal hook. */
1038 Lisp_Object args[2];
1039 args[0] = Qx_lost_selection_functions;
1040 args[1] = Fcar (Fcar (t->Vselection_alist));
1041 Frun_hook_with_args (2, args);
1043 tset_selection_alist (t, XCDR (t->Vselection_alist));
1046 /* Delete elements after the beginning of Vselection_alist. */
1047 for (rest = t->Vselection_alist; CONSP (rest); rest = XCDR (rest))
1048 if (CONSP (XCDR (rest))
1049 && EQ (frame, XCAR (XCDR (XCDR (XCDR (XCAR (XCDR (rest))))))))
1051 Lisp_Object args[2];
1052 args[0] = Qx_lost_selection_functions;
1053 args[1] = XCAR (XCAR (XCDR (rest)));
1054 Frun_hook_with_args (2, args);
1055 XSETCDR (rest, XCDR (XCDR (rest)));
1056 break;
1060 /* Nonzero if any properties for DISPLAY and WINDOW
1061 are on the list of what we are waiting for. */
1063 static int
1064 waiting_for_other_props_on_window (Display *display, Window window)
1066 struct prop_location *rest = property_change_wait_list;
1067 while (rest)
1068 if (rest->display == display && rest->window == window)
1069 return 1;
1070 else
1071 rest = rest->next;
1072 return 0;
1075 /* Add an entry to the list of property changes we are waiting for.
1076 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1077 The return value is a number that uniquely identifies
1078 this awaited property change. */
1080 static struct prop_location *
1081 expect_property_change (Display *display, Window window,
1082 Atom property, int state)
1084 struct prop_location *pl = xmalloc (sizeof *pl);
1085 pl->identifier = ++prop_location_identifier;
1086 pl->display = display;
1087 pl->window = window;
1088 pl->property = property;
1089 pl->desired_state = state;
1090 pl->next = property_change_wait_list;
1091 pl->arrived = 0;
1092 property_change_wait_list = pl;
1093 return pl;
1096 /* Delete an entry from the list of property changes we are waiting for.
1097 IDENTIFIER is the number that uniquely identifies the entry. */
1099 static void
1100 unexpect_property_change (struct prop_location *location)
1102 struct prop_location *prev = 0, *rest = property_change_wait_list;
1103 while (rest)
1105 if (rest == location)
1107 if (prev)
1108 prev->next = rest->next;
1109 else
1110 property_change_wait_list = rest->next;
1111 xfree (rest);
1112 return;
1114 prev = rest;
1115 rest = rest->next;
1119 /* Remove the property change expectation element for IDENTIFIER. */
1121 static Lisp_Object
1122 wait_for_property_change_unwind (Lisp_Object loc)
1124 struct prop_location *location = XSAVE_VALUE (loc)->pointer;
1126 unexpect_property_change (location);
1127 if (location == property_change_reply_object)
1128 property_change_reply_object = 0;
1129 return Qnil;
1132 /* Actually wait for a property change.
1133 IDENTIFIER should be the value that expect_property_change returned. */
1135 static void
1136 wait_for_property_change (struct prop_location *location)
1138 ptrdiff_t count = SPECPDL_INDEX ();
1140 if (property_change_reply_object)
1141 abort ();
1143 /* Make sure to do unexpect_property_change if we quit or err. */
1144 record_unwind_protect (wait_for_property_change_unwind,
1145 make_save_value (location, 0));
1147 XSETCAR (property_change_reply, Qnil);
1148 property_change_reply_object = location;
1150 /* If the event we are waiting for arrives beyond here, it will set
1151 property_change_reply, because property_change_reply_object says so. */
1152 if (! location->arrived)
1154 EMACS_INT timeout = max (0, x_selection_timeout);
1155 EMACS_INT secs = timeout / 1000;
1156 int nsecs = (timeout % 1000) * 1000000;
1157 TRACE2 (" Waiting %"pI"d secs, %d nsecs", secs, nsecs);
1158 wait_reading_process_output (secs, nsecs, 0, 0,
1159 property_change_reply, NULL, 0);
1161 if (NILP (XCAR (property_change_reply)))
1163 TRACE0 (" Timed out");
1164 error ("Timed out waiting for property-notify event");
1168 unbind_to (count, Qnil);
1171 /* Called from XTread_socket in response to a PropertyNotify event. */
1173 void
1174 x_handle_property_notify (XPropertyEvent *event)
1176 struct prop_location *rest;
1178 for (rest = property_change_wait_list; rest; rest = rest->next)
1180 if (!rest->arrived
1181 && rest->property == event->atom
1182 && rest->window == event->window
1183 && rest->display == event->display
1184 && rest->desired_state == event->state)
1186 TRACE2 ("Expected %s of property %s",
1187 (event->state == PropertyDelete ? "deletion" : "change"),
1188 XGetAtomName (event->display, event->atom));
1190 rest->arrived = 1;
1192 /* If this is the one wait_for_property_change is waiting for,
1193 tell it to wake up. */
1194 if (rest == property_change_reply_object)
1195 XSETCAR (property_change_reply, Qt);
1197 return;
1204 /* Variables for communication with x_handle_selection_notify. */
1205 static Atom reading_which_selection;
1206 static Lisp_Object reading_selection_reply;
1207 static Window reading_selection_window;
1209 /* Do protocol to read selection-data from the server.
1210 Converts this to Lisp data and returns it.
1211 FRAME is the frame whose X window shall request the selection. */
1213 static Lisp_Object
1214 x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type,
1215 Lisp_Object time_stamp, Lisp_Object frame)
1217 struct frame *f = XFRAME (frame);
1218 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
1219 Display *display = dpyinfo->display;
1220 Window requestor_window = FRAME_X_WINDOW (f);
1221 Time requestor_time = last_event_timestamp;
1222 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1223 Atom selection_atom = symbol_to_x_atom (dpyinfo, selection_symbol);
1224 Atom type_atom = (CONSP (target_type)
1225 ? symbol_to_x_atom (dpyinfo, XCAR (target_type))
1226 : symbol_to_x_atom (dpyinfo, target_type));
1227 EMACS_INT timeout, secs;
1228 int nsecs;
1230 if (!FRAME_LIVE_P (f))
1231 return Qnil;
1233 if (! NILP (time_stamp))
1234 CONS_TO_INTEGER (time_stamp, Time, requestor_time);
1236 BLOCK_INPUT;
1237 TRACE2 ("Get selection %s, type %s",
1238 XGetAtomName (display, type_atom),
1239 XGetAtomName (display, target_property));
1241 x_catch_errors (display);
1242 XConvertSelection (display, selection_atom, type_atom, target_property,
1243 requestor_window, requestor_time);
1244 x_check_errors (display, "Can't convert selection: %s");
1245 x_uncatch_errors ();
1247 /* Prepare to block until the reply has been read. */
1248 reading_selection_window = requestor_window;
1249 reading_which_selection = selection_atom;
1250 XSETCAR (reading_selection_reply, Qnil);
1252 /* It should not be necessary to stop handling selection requests
1253 during this time. In fact, the SAVE_TARGETS mechanism requires
1254 us to handle a clipboard manager's requests before it returns
1255 SelectionNotify. */
1256 #if 0
1257 x_start_queuing_selection_requests ();
1258 record_unwind_protect (queue_selection_requests_unwind, Qnil);
1259 #endif
1261 UNBLOCK_INPUT;
1263 /* This allows quits. Also, don't wait forever. */
1264 timeout = max (0, x_selection_timeout);
1265 secs = timeout / 1000;
1266 nsecs = (timeout % 1000) * 1000000;
1267 TRACE1 (" Start waiting %"pI"d secs for SelectionNotify", secs);
1268 wait_reading_process_output (secs, nsecs, 0, 0,
1269 reading_selection_reply, NULL, 0);
1270 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
1272 if (NILP (XCAR (reading_selection_reply)))
1273 error ("Timed out waiting for reply from selection owner");
1274 if (EQ (XCAR (reading_selection_reply), Qlambda))
1275 return Qnil;
1277 /* Otherwise, the selection is waiting for us on the requested property. */
1278 return
1279 x_get_window_property_as_lisp_data (display, requestor_window,
1280 target_property, target_type,
1281 selection_atom);
1284 /* Subroutines of x_get_window_property_as_lisp_data */
1286 /* Use xfree, not XFree, to free the data obtained with this function. */
1288 static void
1289 x_get_window_property (Display *display, Window window, Atom property,
1290 unsigned char **data_ret, ptrdiff_t *bytes_ret,
1291 Atom *actual_type_ret, int *actual_format_ret,
1292 unsigned long *actual_size_ret, int delete_p)
1294 ptrdiff_t total_size;
1295 unsigned long bytes_remaining;
1296 ptrdiff_t offset = 0;
1297 unsigned char *data = 0;
1298 unsigned char *tmp_data = 0;
1299 int result;
1300 int buffer_size = selection_quantum (display);
1302 /* Wide enough to avoid overflow in expressions using it. */
1303 ptrdiff_t x_long_size = X_LONG_SIZE;
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);
1313 BLOCK_INPUT;
1315 /* First probe the thing to find out how big it is. */
1316 result = XGetWindowProperty (display, window, property,
1317 0L, 0L, False, AnyPropertyType,
1318 actual_type_ret, actual_format_ret,
1319 actual_size_ret,
1320 &bytes_remaining, &tmp_data);
1321 if (result != Success)
1322 goto done;
1324 /* This was allocated by Xlib, so use XFree. */
1325 XFree (tmp_data);
1327 if (*actual_type_ret == None || *actual_format_ret == 0)
1328 goto done;
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;
1337 /* Now read, until we've gotten it all. */
1338 while (bytes_remaining)
1340 ptrdiff_t bytes_gotten;
1341 int bytes_per_item;
1342 result
1343 = XGetWindowProperty (display, window, property,
1344 offset / X_LONG_SIZE,
1345 buffer_size / X_LONG_SIZE,
1346 False,
1347 AnyPropertyType,
1348 actual_type_ret, actual_format_ret,
1349 actual_size_ret, &bytes_remaining, &tmp_data);
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
1353 reading it. Deal with that, I guess.... */
1354 if (result != Success)
1355 break;
1357 bytes_per_item = *actual_format_ret >> 3;
1358 eassert (*actual_size_ret <= buffer_size / bytes_per_item);
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
1366 and passes the long array to us. Thus, for that case memcpy can not
1367 be used. We convert to a 32 bit type here, because so much code
1368 assume on that.
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. */
1373 bytes_gotten = *actual_size_ret;
1374 bytes_gotten *= bytes_per_item;
1376 TRACE2 ("Read %"pD"d bytes from property %s",
1377 bytes_gotten, XGetAtomName (display, property));
1379 if (total_size - offset < bytes_gotten)
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;
1392 if (32 < BITS_PER_LONG && *actual_format_ret == 32)
1394 unsigned long i;
1395 int *idata = (int *) (data + offset);
1396 long *ldata = (long *) tmp_data;
1398 for (i = 0; i < *actual_size_ret; ++i)
1399 idata[i] = ldata[i];
1401 else
1402 memcpy (data + offset, tmp_data, bytes_gotten);
1404 offset += bytes_gotten;
1406 /* This was allocated by Xlib, so use XFree. */
1407 XFree (tmp_data);
1410 XFlush (display);
1411 data[offset] = '\0';
1413 done:
1414 UNBLOCK_INPUT;
1415 *data_ret = data;
1416 *bytes_ret = offset;
1417 return;
1419 size_overflow:
1420 free (data);
1421 UNBLOCK_INPUT;
1422 memory_full (SIZE_MAX);
1424 memory_exhausted:
1425 free (data);
1426 UNBLOCK_INPUT;
1427 memory_full (total_size + 1);
1430 /* Use xfree, not XFree, to free the data obtained with this function. */
1432 static void
1433 receive_incremental_selection (Display *display, Window window, Atom property,
1434 Lisp_Object target_type,
1435 unsigned int min_size_bytes,
1436 unsigned char **data_ret,
1437 ptrdiff_t *size_bytes_ret,
1438 Atom *type_ret, int *format_ret,
1439 unsigned long *size_ret)
1441 ptrdiff_t offset = 0;
1442 struct prop_location *wait_object;
1443 if (min (PTRDIFF_MAX, SIZE_MAX) < min_size_bytes)
1444 memory_full (SIZE_MAX);
1445 *data_ret = xmalloc (min_size_bytes);
1446 *size_bytes_ret = min_size_bytes;
1448 TRACE1 ("Read %u bytes incrementally", min_size_bytes);
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.)
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.
1458 BLOCK_INPUT;
1459 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
1460 TRACE1 (" Delete property %s",
1461 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1462 XDeleteProperty (display, window, property);
1463 TRACE1 (" Expect new value of property %s",
1464 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1465 wait_object = expect_property_change (display, window, property,
1466 PropertyNewValue);
1467 XFlush (display);
1468 UNBLOCK_INPUT;
1470 while (1)
1472 unsigned char *tmp_data;
1473 ptrdiff_t tmp_size_bytes;
1475 TRACE0 (" Wait for property change");
1476 wait_for_property_change (wait_object);
1478 /* expect it again immediately, because x_get_window_property may
1479 .. no it won't, I don't get it.
1480 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1481 TRACE0 (" Get property value");
1482 x_get_window_property (display, window, property,
1483 &tmp_data, &tmp_size_bytes,
1484 type_ret, format_ret, size_ret, 1);
1486 TRACE1 (" Read increment of %"pD"d bytes", tmp_size_bytes);
1488 if (tmp_size_bytes == 0) /* we're done */
1490 TRACE0 ("Done reading incrementally");
1492 if (! waiting_for_other_props_on_window (display, window))
1493 XSelectInput (display, window, STANDARD_EVENT_SET);
1494 /* Use xfree, not XFree, because x_get_window_property
1495 calls xmalloc itself. */
1496 xfree (tmp_data);
1497 break;
1500 BLOCK_INPUT;
1501 TRACE1 (" ACK by deleting property %s",
1502 XGetAtomName (display, property));
1503 XDeleteProperty (display, window, property);
1504 wait_object = expect_property_change (display, window, property,
1505 PropertyNewValue);
1506 XFlush (display);
1507 UNBLOCK_INPUT;
1509 if (*size_bytes_ret - offset < tmp_size_bytes)
1510 *data_ret = xpalloc (*data_ret, size_bytes_ret,
1511 tmp_size_bytes - (*size_bytes_ret - offset),
1512 -1, 1);
1514 memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
1515 offset += tmp_size_bytes;
1517 /* Use xfree, not XFree, because x_get_window_property
1518 calls xmalloc itself. */
1519 xfree (tmp_data);
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. */
1528 static Lisp_Object
1529 x_get_window_property_as_lisp_data (Display *display, Window window,
1530 Atom property,
1531 Lisp_Object target_type,
1532 Atom selection_atom)
1534 Atom actual_type;
1535 int actual_format;
1536 unsigned long actual_size;
1537 unsigned char *data = 0;
1538 ptrdiff_t bytes = 0;
1539 Lisp_Object val;
1540 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1542 TRACE0 ("Reading selection data");
1544 x_get_window_property (display, window, property, &data, &bytes,
1545 &actual_type, &actual_format, &actual_size, 1);
1546 if (! data)
1548 int there_is_a_selection_owner;
1549 BLOCK_INPUT;
1550 there_is_a_selection_owner
1551 = XGetSelectionOwner (display, selection_atom);
1552 UNBLOCK_INPUT;
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));
1564 if (actual_type == dpyinfo->Xatom_INCR)
1566 /* That wasn't really the data, just the beginning. */
1568 unsigned int min_size_bytes = * ((unsigned int *) data);
1569 BLOCK_INPUT;
1570 /* Use xfree, not XFree, because x_get_window_property
1571 calls xmalloc itself. */
1572 xfree (data);
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);
1580 BLOCK_INPUT;
1581 TRACE1 (" Delete property %s", XGetAtomName (display, property));
1582 XDeleteProperty (display, window, property);
1583 XFlush (display);
1584 UNBLOCK_INPUT;
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);
1591 /* Use xfree, not XFree, because x_get_window_property
1592 calls xmalloc itself. */
1593 xfree (data);
1594 return val;
1597 /* These functions convert from the selection data read from the server into
1598 something that we can use from Lisp, and vice versa.
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
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.
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.
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
1620 representation are as above.
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). */
1628 static Lisp_Object
1629 selection_data_to_lisp_data (Display *display, const unsigned char *data,
1630 ptrdiff_t size, Atom type, int format)
1632 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1634 if (type == dpyinfo->Xatom_NULL)
1635 return QNULL;
1637 /* Convert any 8-bit data to a string, for compactness. */
1638 else if (format == 8)
1640 Lisp_Object str, lispy_type;
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;
1651 else
1652 lispy_type = QSTRING;
1653 Fput_text_property (make_number (0), make_number (size),
1654 Qforeign_selection, lispy_type, str);
1655 return str;
1657 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
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)
1663 ptrdiff_t i;
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;
1670 if (size == sizeof (int))
1671 return x_atom_to_symbol (display, (Atom) idata[0]);
1672 else
1674 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
1675 make_number (0));
1676 for (i = 0; i < size / sizeof (int); i++)
1677 Faset (v, make_number (i),
1678 x_atom_to_symbol (display, (Atom) idata[i]));
1679 return v;
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.
1687 else if (format == 32 && size == sizeof (int))
1688 return INTEGER_TO_CONS (((int *) data) [0]);
1689 else if (format == 16 && size == sizeof (short))
1690 return make_number (((short *) data) [0]);
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.)
1695 else if (format == 16)
1697 ptrdiff_t i;
1698 Lisp_Object v;
1699 v = Fmake_vector (make_number (size / 2), make_number (0));
1700 for (i = 0; i < size / 2; i++)
1702 short j = ((short *) data) [i];
1703 Faset (v, make_number (i), make_number (j));
1705 return v;
1707 else
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++)
1714 int j = ((int *) data) [i];
1715 Faset (v, make_number (i), INTEGER_TO_CONS (j));
1717 return v;
1721 /* Convert OBJ to an X long value, and return it as unsigned long.
1722 OBJ should be an integer or a cons representing an integer.
1723 Treat values in the range X_LONG_MAX + 1 .. X_ULONG_MAX as X
1724 unsigned long values: in theory these values are supposed to be
1725 signed but in practice unsigned 32-bit data are communicated via X
1726 selections and we need to support that. */
1727 static unsigned long
1728 cons_to_x_long (Lisp_Object obj)
1730 if (X_ULONG_MAX <= INTMAX_MAX
1731 || XINT (INTEGERP (obj) ? obj : XCAR (obj)) < 0)
1732 return cons_to_signed (obj, X_LONG_MIN, min (X_ULONG_MAX, INTMAX_MAX));
1733 else
1734 return cons_to_unsigned (obj, X_ULONG_MAX);
1737 /* Use xfree, not XFree, to free the data obtained with this function. */
1739 static void
1740 lisp_data_to_selection_data (Display *display, Lisp_Object obj,
1741 unsigned char **data_ret, Atom *type_ret,
1742 ptrdiff_t *size_ret,
1743 int *format_ret, int *nofree_ret)
1745 Lisp_Object type = Qnil;
1746 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1748 *nofree_ret = 0;
1750 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
1752 type = XCAR (obj);
1753 obj = XCDR (obj);
1754 if (CONSP (obj) && NILP (XCDR (obj)))
1755 obj = XCAR (obj);
1758 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1759 { /* This is not the same as declining */
1760 *format_ret = 32;
1761 *size_ret = 0;
1762 *data_ret = 0;
1763 type = QNULL;
1765 else if (STRINGP (obj))
1767 if (SCHARS (obj) < SBYTES (obj))
1768 /* OBJ is a multibyte string containing a non-ASCII char. */
1769 signal_error ("Non-ASCII string must be encoded in advance", obj);
1770 if (NILP (type))
1771 type = QSTRING;
1772 *format_ret = 8;
1773 *size_ret = SBYTES (obj);
1774 *data_ret = SDATA (obj);
1775 *nofree_ret = 1;
1777 else if (SYMBOLP (obj))
1779 void *data = xmalloc (sizeof (Atom) + 1);
1780 Atom *x_atom_ptr = data;
1781 *data_ret = data;
1782 *format_ret = 32;
1783 *size_ret = 1;
1784 (*data_ret) [sizeof (Atom)] = 0;
1785 *x_atom_ptr = symbol_to_x_atom (dpyinfo, obj);
1786 if (NILP (type)) type = QATOM;
1788 else if (RANGED_INTEGERP (X_SHRT_MIN, obj, X_SHRT_MAX))
1790 void *data = xmalloc (sizeof (short) + 1);
1791 short *short_ptr = data;
1792 *data_ret = data;
1793 *format_ret = 16;
1794 *size_ret = 1;
1795 (*data_ret) [sizeof (short)] = 0;
1796 *short_ptr = XINT (obj);
1797 if (NILP (type)) type = QINTEGER;
1799 else if (INTEGERP (obj)
1800 || (CONSP (obj) && INTEGERP (XCAR (obj))
1801 && (INTEGERP (XCDR (obj))
1802 || (CONSP (XCDR (obj))
1803 && INTEGERP (XCAR (XCDR (obj)))))))
1805 void *data = xmalloc (sizeof (unsigned long) + 1);
1806 unsigned long *x_long_ptr = data;
1807 *data_ret = data;
1808 *format_ret = 32;
1809 *size_ret = 1;
1810 (*data_ret) [sizeof (unsigned long)] = 0;
1811 *x_long_ptr = cons_to_x_long (obj);
1812 if (NILP (type)) type = QINTEGER;
1814 else if (VECTORP (obj))
1816 /* Lisp_Vectors may represent a set of ATOMs;
1817 a set of 16 or 32 bit INTEGERs;
1818 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1820 ptrdiff_t i;
1821 ptrdiff_t size = ASIZE (obj);
1823 if (SYMBOLP (AREF (obj, 0)))
1824 /* This vector is an ATOM set */
1826 void *data;
1827 Atom *x_atoms;
1828 if (NILP (type)) type = QATOM;
1829 for (i = 0; i < size; i++)
1830 if (!SYMBOLP (AREF (obj, i)))
1831 signal_error ("All elements of selection vector must have same type", obj);
1833 *data_ret = data = xnmalloc (size, sizeof *x_atoms);
1834 x_atoms = data;
1835 *format_ret = 32;
1836 *size_ret = size;
1837 for (i = 0; i < size; i++)
1838 x_atoms[i] = symbol_to_x_atom (dpyinfo, AREF (obj, i));
1840 else
1841 /* This vector is an INTEGER set, or something like it */
1843 int format = 16;
1844 int data_size = sizeof (short);
1845 void *data;
1846 unsigned long *x_atoms;
1847 short *shorts;
1848 if (NILP (type)) type = QINTEGER;
1849 for (i = 0; i < size; i++)
1851 if (! RANGED_INTEGERP (X_SHRT_MIN, AREF (obj, i),
1852 X_SHRT_MAX))
1854 /* Use sizeof (long) even if it is more than 32 bits.
1855 See comment in x_get_window_property and
1856 x_fill_property_data. */
1857 data_size = sizeof (long);
1858 format = 32;
1859 break;
1862 *data_ret = data = xnmalloc (size, data_size);
1863 x_atoms = data;
1864 shorts = data;
1865 *format_ret = format;
1866 *size_ret = size;
1867 for (i = 0; i < size; i++)
1869 if (format == 32)
1870 x_atoms[i] = cons_to_x_long (AREF (obj, i));
1871 else
1872 shorts[i] = XINT (AREF (obj, i));
1876 else
1877 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
1879 *type_ret = symbol_to_x_atom (dpyinfo, type);
1882 static Lisp_Object
1883 clean_local_selection_data (Lisp_Object obj)
1885 if (CONSP (obj)
1886 && INTEGERP (XCAR (obj))
1887 && CONSP (XCDR (obj))
1888 && INTEGERP (XCAR (XCDR (obj)))
1889 && NILP (XCDR (XCDR (obj))))
1890 obj = Fcons (XCAR (obj), XCDR (obj));
1892 if (CONSP (obj)
1893 && INTEGERP (XCAR (obj))
1894 && INTEGERP (XCDR (obj)))
1896 if (XINT (XCAR (obj)) == 0)
1897 return XCDR (obj);
1898 if (XINT (XCAR (obj)) == -1)
1899 return make_number (- XINT (XCDR (obj)));
1901 if (VECTORP (obj))
1903 ptrdiff_t i;
1904 ptrdiff_t size = ASIZE (obj);
1905 Lisp_Object copy;
1906 if (size == 1)
1907 return clean_local_selection_data (AREF (obj, 0));
1908 copy = Fmake_vector (make_number (size), Qnil);
1909 for (i = 0; i < size; i++)
1910 ASET (copy, i, clean_local_selection_data (AREF (obj, i)));
1911 return copy;
1913 return obj;
1916 /* Called from XTread_socket to handle SelectionNotify events.
1917 If it's the selection we are waiting for, stop waiting
1918 by setting the car of reading_selection_reply to non-nil.
1919 We store t there if the reply is successful, lambda if not. */
1921 void
1922 x_handle_selection_notify (XSelectionEvent *event)
1924 if (event->requestor != reading_selection_window)
1925 return;
1926 if (event->selection != reading_which_selection)
1927 return;
1929 TRACE0 ("Received SelectionNotify");
1930 XSETCAR (reading_selection_reply,
1931 (event->property != 0 ? Qt : Qlambda));
1935 /* From a Lisp_Object, return a suitable frame for selection
1936 operations. OBJECT may be a frame, a terminal object, or nil
1937 (which stands for the selected frame--or, if that is not an X
1938 frame, the first X display on the list). If no suitable frame can
1939 be found, return NULL. */
1941 static struct frame *
1942 frame_for_x_selection (Lisp_Object object)
1944 Lisp_Object tail;
1945 struct frame *f;
1947 if (NILP (object))
1949 f = XFRAME (selected_frame);
1950 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1951 return f;
1953 for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
1955 f = XFRAME (XCAR (tail));
1956 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1957 return f;
1960 else if (TERMINALP (object))
1962 struct terminal *t = get_terminal (object, 1);
1963 if (t->type == output_x_window)
1965 for (tail = Vframe_list; CONSP (tail); tail = XCDR (tail))
1967 f = XFRAME (XCAR (tail));
1968 if (FRAME_LIVE_P (f) && f->terminal == t)
1969 return f;
1973 else if (FRAMEP (object))
1975 f = XFRAME (object);
1976 if (FRAME_X_P (f) && FRAME_LIVE_P (f))
1977 return f;
1980 return NULL;
1984 DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
1985 Sx_own_selection_internal, 2, 3, 0,
1986 doc: /* Assert an X selection of type SELECTION and value VALUE.
1987 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1988 \(Those are literal upper-case symbol names, since that's what X expects.)
1989 VALUE is typically a string, or a cons of two markers, but may be
1990 anything that the functions on `selection-converter-alist' know about.
1992 FRAME should be a frame that should own the selection. If omitted or
1993 nil, it defaults to the selected frame.
1995 On Nextstep, FRAME is unused. */)
1996 (Lisp_Object selection, Lisp_Object value, Lisp_Object frame)
1998 if (NILP (frame)) frame = selected_frame;
1999 if (!FRAME_LIVE_P (XFRAME (frame)) || !FRAME_X_P (XFRAME (frame)))
2000 error ("X selection unavailable for this frame");
2002 CHECK_SYMBOL (selection);
2003 if (NILP (value)) error ("VALUE may not be nil");
2004 x_own_selection (selection, value, frame);
2005 return value;
2009 /* Request the selection value from the owner. If we are the owner,
2010 simply return our selection value. If we are not the owner, this
2011 will block until all of the data has arrived. */
2013 DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
2014 Sx_get_selection_internal, 2, 4, 0,
2015 doc: /* Return text selected from some X window.
2016 SELECTION-SYMBOL is typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2017 \(Those are literal upper-case symbol names, since that's what X expects.)
2018 TARGET-TYPE is the type of data desired, typically `STRING'.
2020 TIME-STAMP is the time to use in the XConvertSelection call for foreign
2021 selections. If omitted, defaults to the time for the last event.
2023 TERMINAL should be a terminal object or a frame specifying the X
2024 server to query. If omitted or nil, that stands for the selected
2025 frame's display, or the first available X display.
2027 On Nextstep, TIME-STAMP and TERMINAL are unused. */)
2028 (Lisp_Object selection_symbol, Lisp_Object target_type,
2029 Lisp_Object time_stamp, Lisp_Object terminal)
2031 Lisp_Object val = Qnil;
2032 struct gcpro gcpro1, gcpro2;
2033 struct frame *f = frame_for_x_selection (terminal);
2034 GCPRO2 (target_type, val); /* we store newly consed data into these */
2036 CHECK_SYMBOL (selection_symbol);
2037 CHECK_SYMBOL (target_type);
2038 if (EQ (target_type, QMULTIPLE))
2039 error ("Retrieving MULTIPLE selections is currently unimplemented");
2040 if (!f)
2041 error ("X selection unavailable for this frame");
2043 val = x_get_local_selection (selection_symbol, target_type, 1,
2044 FRAME_X_DISPLAY_INFO (f));
2046 if (NILP (val) && FRAME_LIVE_P (f))
2048 Lisp_Object frame;
2049 XSETFRAME (frame, f);
2050 RETURN_UNGCPRO (x_get_foreign_selection (selection_symbol, target_type,
2051 time_stamp, frame));
2054 if (CONSP (val) && SYMBOLP (XCAR (val)))
2056 val = XCDR (val);
2057 if (CONSP (val) && NILP (XCDR (val)))
2058 val = XCAR (val);
2060 RETURN_UNGCPRO (clean_local_selection_data (val));
2063 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
2064 Sx_disown_selection_internal, 1, 3, 0,
2065 doc: /* If we own the selection SELECTION, disown it.
2066 Disowning it means there is no such selection.
2068 Sets the last-change time for the selection to TIME-OBJECT (by default
2069 the time of the last event).
2071 TERMINAL should be a terminal object or a frame specifying the X
2072 server to query. If omitted or nil, that stands for the selected
2073 frame's display, or the first available X display.
2075 On Nextstep, the TIME-OBJECT and TERMINAL arguments are unused.
2076 On MS-DOS, all this does is return non-nil if we own the selection. */)
2077 (Lisp_Object selection, Lisp_Object time_object, Lisp_Object terminal)
2079 Time timestamp;
2080 Atom selection_atom;
2081 union {
2082 struct selection_input_event sie;
2083 struct input_event ie;
2084 } event;
2085 struct frame *f = frame_for_x_selection (terminal);
2086 struct x_display_info *dpyinfo;
2088 if (!f)
2089 return Qnil;
2091 dpyinfo = FRAME_X_DISPLAY_INFO (f);
2092 CHECK_SYMBOL (selection);
2094 /* Don't disown the selection when we're not the owner. */
2095 if (NILP (LOCAL_SELECTION (selection, dpyinfo)))
2096 return Qnil;
2098 selection_atom = symbol_to_x_atom (dpyinfo, selection);
2100 BLOCK_INPUT;
2101 if (NILP (time_object))
2102 timestamp = last_event_timestamp;
2103 else
2104 CONS_TO_INTEGER (time_object, Time, timestamp);
2105 XSetSelectionOwner (dpyinfo->display, selection_atom, None, timestamp);
2106 UNBLOCK_INPUT;
2108 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2109 generated for a window which owns the selection when that window sets
2110 the selection owner to None. The NCD server does, the MIT Sun4 server
2111 doesn't. So we synthesize one; this means we might get two, but
2112 that's ok, because the second one won't have any effect. */
2113 SELECTION_EVENT_DISPLAY (&event.sie) = dpyinfo->display;
2114 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2115 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2116 x_handle_selection_clear (&event.ie);
2118 return Qt;
2121 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
2122 0, 2, 0,
2123 doc: /* Whether the current Emacs process owns the given X Selection.
2124 The arg should be the name of the selection in question, typically one of
2125 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2126 \(Those are literal upper-case symbol names, since that's what X expects.)
2127 For convenience, the symbol nil is the same as `PRIMARY',
2128 and t is the same as `SECONDARY'.
2130 TERMINAL should be a terminal object or a frame specifying the X
2131 server to query. If omitted or nil, that stands for the selected
2132 frame's display, or the first available X display.
2134 On Nextstep, TERMINAL is unused. */)
2135 (Lisp_Object selection, Lisp_Object terminal)
2137 struct frame *f = frame_for_x_selection (terminal);
2139 CHECK_SYMBOL (selection);
2140 if (EQ (selection, Qnil)) selection = QPRIMARY;
2141 if (EQ (selection, Qt)) selection = QSECONDARY;
2143 if (f && !NILP (LOCAL_SELECTION (selection, FRAME_X_DISPLAY_INFO (f))))
2144 return Qt;
2145 else
2146 return Qnil;
2149 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
2150 0, 2, 0,
2151 doc: /* Whether there is an owner for the given X selection.
2152 SELECTION should be the name of the selection in question, typically
2153 one of the symbols `PRIMARY', `SECONDARY', `CLIPBOARD', or
2154 `CLIPBOARD_MANAGER' (X expects these literal upper-case names.) The
2155 symbol nil is the same as `PRIMARY', and t is the same as `SECONDARY'.
2157 TERMINAL should be a terminal object or a frame specifying the X
2158 server to query. If omitted or nil, that stands for the selected
2159 frame's display, or the first available X display.
2161 On Nextstep, TERMINAL is unused. */)
2162 (Lisp_Object selection, Lisp_Object terminal)
2164 Window owner;
2165 Atom atom;
2166 struct frame *f = frame_for_x_selection (terminal);
2167 struct x_display_info *dpyinfo;
2169 CHECK_SYMBOL (selection);
2170 if (EQ (selection, Qnil)) selection = QPRIMARY;
2171 if (EQ (selection, Qt)) selection = QSECONDARY;
2173 if (!f)
2174 return Qnil;
2176 dpyinfo = FRAME_X_DISPLAY_INFO (f);
2178 if (!NILP (LOCAL_SELECTION (selection, dpyinfo)))
2179 return Qt;
2181 atom = symbol_to_x_atom (dpyinfo, selection);
2182 if (atom == 0) return Qnil;
2183 BLOCK_INPUT;
2184 owner = XGetSelectionOwner (dpyinfo->display, atom);
2185 UNBLOCK_INPUT;
2186 return (owner ? Qt : Qnil);
2190 /* Send clipboard manager a SAVE_TARGETS request with a UTF8_STRING
2191 property (http://www.freedesktop.org/wiki/ClipboardManager). */
2193 static Lisp_Object
2194 x_clipboard_manager_save (Lisp_Object frame)
2196 struct frame *f = XFRAME (frame);
2197 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2198 Atom data = dpyinfo->Xatom_UTF8_STRING;
2200 XChangeProperty (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
2201 dpyinfo->Xatom_EMACS_TMP,
2202 dpyinfo->Xatom_ATOM, 32, PropModeReplace,
2203 (unsigned char *) &data, 1);
2204 x_get_foreign_selection (QCLIPBOARD_MANAGER, QSAVE_TARGETS,
2205 Qnil, frame);
2206 return Qt;
2209 /* Error handler for x_clipboard_manager_save_frame. */
2211 static Lisp_Object
2212 x_clipboard_manager_error_1 (Lisp_Object err)
2214 Lisp_Object args[2];
2215 args[0] = build_string ("X clipboard manager error: %s\n\
2216 If the problem persists, set `x-select-enable-clipboard-manager' to nil.");
2217 args[1] = CAR (CDR (err));
2218 Fmessage (2, args);
2219 return Qnil;
2222 /* Error handler for x_clipboard_manager_save_all. */
2224 static Lisp_Object
2225 x_clipboard_manager_error_2 (Lisp_Object err)
2227 fprintf (stderr, "Error saving to X clipboard manager.\n\
2228 If the problem persists, set `x-select-enable-clipboard-manager' \
2229 to nil.\n");
2230 return Qnil;
2233 /* Called from delete_frame: save any clipboard owned by FRAME to the
2234 clipboard manager. Do nothing if FRAME does not own the clipboard,
2235 or if no clipboard manager is present. */
2237 void
2238 x_clipboard_manager_save_frame (Lisp_Object frame)
2240 struct frame *f;
2242 if (!NILP (Vx_select_enable_clipboard_manager)
2243 && FRAMEP (frame)
2244 && (f = XFRAME (frame), FRAME_X_P (f))
2245 && FRAME_LIVE_P (f))
2247 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2248 Lisp_Object local_selection
2249 = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2251 if (!NILP (local_selection)
2252 && EQ (frame, XCAR (XCDR (XCDR (XCDR (local_selection)))))
2253 && XGetSelectionOwner (dpyinfo->display,
2254 dpyinfo->Xatom_CLIPBOARD_MANAGER))
2255 internal_condition_case_1 (x_clipboard_manager_save, frame, Qt,
2256 x_clipboard_manager_error_1);
2260 /* Called from Fkill_emacs: save any clipboard owned by FRAME to the
2261 clipboard manager. Do nothing if FRAME does not own the clipboard,
2262 or if no clipboard manager is present. */
2264 void
2265 x_clipboard_manager_save_all (void)
2267 /* Loop through all X displays, saving owned clipboards. */
2268 struct x_display_info *dpyinfo;
2269 Lisp_Object local_selection, local_frame;
2271 if (NILP (Vx_select_enable_clipboard_manager))
2272 return;
2274 for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next)
2276 local_selection = LOCAL_SELECTION (QCLIPBOARD, dpyinfo);
2277 if (NILP (local_selection)
2278 || !XGetSelectionOwner (dpyinfo->display,
2279 dpyinfo->Xatom_CLIPBOARD_MANAGER))
2280 continue;
2282 local_frame = XCAR (XCDR (XCDR (XCDR (local_selection))));
2283 if (FRAME_LIVE_P (XFRAME (local_frame)))
2285 Lisp_Object args[1];
2286 args[0] = build_string ("Saving clipboard to X clipboard manager...");
2287 Fmessage (1, args);
2289 internal_condition_case_1 (x_clipboard_manager_save, local_frame,
2290 Qt, x_clipboard_manager_error_2);
2296 /***********************************************************************
2297 Drag and drop support
2298 ***********************************************************************/
2299 /* Check that lisp values are of correct type for x_fill_property_data.
2300 That is, number, string or a cons with two numbers (low and high 16
2301 bit parts of a 32 bit number). Return the number of items in DATA,
2302 or -1 if there is an error. */
2305 x_check_property_data (Lisp_Object data)
2307 Lisp_Object iter;
2308 int size = 0;
2310 for (iter = data; CONSP (iter); iter = XCDR (iter))
2312 Lisp_Object o = XCAR (iter);
2314 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
2315 return -1;
2316 else if (CONSP (o) &&
2317 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
2318 return -1;
2319 if (size == INT_MAX)
2320 return -1;
2321 size++;
2324 return size;
2327 /* Convert lisp values to a C array. Values may be a number, a string
2328 which is taken as an X atom name and converted to the atom value, or
2329 a cons containing the two 16 bit parts of a 32 bit number.
2331 DPY is the display use to look up X atoms.
2332 DATA is a Lisp list of values to be converted.
2333 RET is the C array that contains the converted values. It is assumed
2334 it is big enough to hold all values.
2335 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2336 be stored in RET. Note that long is used for 32 even if long is more
2337 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2338 XClientMessageEvent). */
2340 void
2341 x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format)
2343 long val;
2344 long *d32 = (long *) ret;
2345 short *d16 = (short *) ret;
2346 char *d08 = (char *) ret;
2347 Lisp_Object iter;
2349 for (iter = data; CONSP (iter); iter = XCDR (iter))
2351 Lisp_Object o = XCAR (iter);
2353 if (INTEGERP (o) || FLOATP (o) || CONSP (o))
2354 val = cons_to_signed (o, LONG_MIN, LONG_MAX);
2355 else if (STRINGP (o))
2357 BLOCK_INPUT;
2358 val = (long) XInternAtom (dpy, SSDATA (o), False);
2359 UNBLOCK_INPUT;
2361 else
2362 error ("Wrong type, must be string, number or cons");
2364 if (format == 8)
2366 if (CHAR_MIN <= val && val <= CHAR_MAX)
2367 *d08++ = val;
2368 else
2369 error ("Out of 'char' range");
2371 else if (format == 16)
2373 if (SHRT_MIN <= val && val <= SHRT_MAX)
2374 *d16++ = val;
2375 else
2376 error ("Out of 'short' range");
2378 else
2379 *d32++ = val;
2383 /* Convert an array of C values to a Lisp list.
2384 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2385 DATA is a C array of values to be converted.
2386 TYPE is the type of the data. Only XA_ATOM is special, it converts
2387 each number in DATA to its corresponding X atom as a symbol.
2388 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2389 be stored in RET.
2390 SIZE is the number of elements in DATA.
2392 Important: When format is 32, data should contain an array of int,
2393 not an array of long as the X library returns. This makes a difference
2394 when sizeof(long) != sizeof(int).
2396 Also see comment for selection_data_to_lisp_data above. */
2398 Lisp_Object
2399 x_property_data_to_lisp (struct frame *f, const unsigned char *data,
2400 Atom type, int format, long unsigned int size)
2402 ptrdiff_t format_bytes = format >> 3;
2403 if (PTRDIFF_MAX / format_bytes < size)
2404 memory_full (SIZE_MAX);
2405 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
2406 data, size * format_bytes, type, format);
2409 /* Get the mouse position in frame relative coordinates. */
2411 static void
2412 mouse_position_for_drop (FRAME_PTR f, int *x, int *y)
2414 Window root, dummy_window;
2415 int dummy;
2417 BLOCK_INPUT;
2419 XQueryPointer (FRAME_X_DISPLAY (f),
2420 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2422 /* The root window which contains the pointer. */
2423 &root,
2425 /* Window pointer is on, not used */
2426 &dummy_window,
2428 /* The position on that root window. */
2429 x, y,
2431 /* x/y in dummy_window coordinates, not used. */
2432 &dummy, &dummy,
2434 /* Modifier keys and pointer buttons, about which
2435 we don't care. */
2436 (unsigned int *) &dummy);
2439 /* Absolute to relative. */
2440 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2441 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2443 UNBLOCK_INPUT;
2446 DEFUN ("x-get-atom-name", Fx_get_atom_name,
2447 Sx_get_atom_name, 1, 2, 0,
2448 doc: /* Return the X atom name for VALUE as a string.
2449 VALUE may be a number or a cons where the car is the upper 16 bits and
2450 the cdr is the lower 16 bits of a 32 bit value.
2451 Use the display for FRAME or the current frame if FRAME is not given or nil.
2453 If the value is 0 or the atom is not known, return the empty string. */)
2454 (Lisp_Object value, Lisp_Object frame)
2456 struct frame *f = check_x_frame (frame);
2457 char *name = 0;
2458 char empty[] = "";
2459 Lisp_Object ret = Qnil;
2460 Display *dpy = FRAME_X_DISPLAY (f);
2461 Atom atom;
2462 int had_errors;
2464 CONS_TO_INTEGER (value, Atom, atom);
2466 BLOCK_INPUT;
2467 x_catch_errors (dpy);
2468 name = atom ? XGetAtomName (dpy, atom) : empty;
2469 had_errors = x_had_errors_p (dpy);
2470 x_uncatch_errors ();
2472 if (!had_errors)
2473 ret = build_string (name);
2475 if (atom && name) XFree (name);
2476 if (NILP (ret)) ret = empty_unibyte_string;
2478 UNBLOCK_INPUT;
2480 return ret;
2483 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2484 Sx_register_dnd_atom, 1, 2, 0,
2485 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2486 ATOM can be a symbol or a string. The ATOM is interned on the display that
2487 FRAME is on. If FRAME is nil, the selected frame is used. */)
2488 (Lisp_Object atom, Lisp_Object frame)
2490 Atom x_atom;
2491 struct frame *f = check_x_frame (frame);
2492 ptrdiff_t i;
2493 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2496 if (SYMBOLP (atom))
2497 x_atom = symbol_to_x_atom (dpyinfo, atom);
2498 else if (STRINGP (atom))
2500 BLOCK_INPUT;
2501 x_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (atom), False);
2502 UNBLOCK_INPUT;
2504 else
2505 error ("ATOM must be a symbol or a string");
2507 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2508 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2509 return Qnil;
2511 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
2512 dpyinfo->x_dnd_atoms =
2513 xpalloc (dpyinfo->x_dnd_atoms, &dpyinfo->x_dnd_atoms_size,
2514 1, -1, sizeof *dpyinfo->x_dnd_atoms);
2516 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2517 return Qnil;
2520 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2523 x_handle_dnd_message (struct frame *f, XClientMessageEvent *event,
2524 struct x_display_info *dpyinfo, struct input_event *bufp)
2526 Lisp_Object vec;
2527 Lisp_Object frame;
2528 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2529 unsigned long size = 160/event->format;
2530 int x, y;
2531 unsigned char *data = (unsigned char *) event->data.b;
2532 int idata[5];
2533 ptrdiff_t i;
2535 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2536 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2538 if (i == dpyinfo->x_dnd_atoms_length) return 0;
2540 XSETFRAME (frame, f);
2542 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2543 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2544 function expects them to be of size int (i.e. 32). So to be able to
2545 use that function, put the data in the form it expects if format is 32. */
2547 if (32 < BITS_PER_LONG && event->format == 32)
2549 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
2550 idata[i] = event->data.l[i];
2551 data = (unsigned char *) idata;
2554 vec = Fmake_vector (make_number (4), Qnil);
2555 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2556 event->message_type)));
2557 ASET (vec, 1, frame);
2558 ASET (vec, 2, make_number (event->format));
2559 ASET (vec, 3, x_property_data_to_lisp (f,
2560 data,
2561 event->message_type,
2562 event->format,
2563 size));
2565 mouse_position_for_drop (f, &x, &y);
2566 bufp->kind = DRAG_N_DROP_EVENT;
2567 bufp->frame_or_window = frame;
2568 bufp->timestamp = CurrentTime;
2569 bufp->x = make_number (x);
2570 bufp->y = make_number (y);
2571 bufp->arg = vec;
2572 bufp->modifiers = 0;
2574 return 1;
2577 DEFUN ("x-send-client-message", Fx_send_client_event,
2578 Sx_send_client_message, 6, 6, 0,
2579 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2581 For DISPLAY, specify either a frame or a display name (a string).
2582 If DISPLAY is nil, that stands for the selected frame's display.
2583 DEST may be a number, in which case it is a Window id. The value 0 may
2584 be used to send to the root window of the DISPLAY.
2585 If DEST is a cons, it is converted to a 32 bit number
2586 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2587 number is then used as a window id.
2588 If DEST is a frame the event is sent to the outer window of that frame.
2589 A value of nil means the currently selected frame.
2590 If DEST is the string "PointerWindow" the event is sent to the window that
2591 contains the pointer. If DEST is the string "InputFocus" the event is
2592 sent to the window that has the input focus.
2593 FROM is the frame sending the event. Use nil for currently selected frame.
2594 MESSAGE-TYPE is the name of an Atom as a string.
2595 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2596 bits. VALUES is a list of numbers, cons and/or strings containing the values
2597 to send. If a value is a string, it is converted to an Atom and the value of
2598 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2599 with the high 16 bits from the car and the lower 16 bit from the cdr.
2600 If more values than fits into the event is given, the excessive values
2601 are ignored. */)
2602 (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2603 Lisp_Object message_type, Lisp_Object format, Lisp_Object values)
2605 struct x_display_info *dpyinfo = check_x_display_info (display);
2607 CHECK_STRING (message_type);
2608 x_send_client_event (display, dest, from,
2609 XInternAtom (dpyinfo->display,
2610 SSDATA (message_type),
2611 False),
2612 format, values);
2614 return Qnil;
2617 void
2618 x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
2619 Atom message_type, Lisp_Object format, Lisp_Object values)
2621 struct x_display_info *dpyinfo = check_x_display_info (display);
2622 Window wdest;
2623 XEvent event;
2624 struct frame *f = check_x_frame (from);
2625 int to_root;
2627 CHECK_NUMBER (format);
2628 CHECK_CONS (values);
2630 if (x_check_property_data (values) == -1)
2631 error ("Bad data in VALUES, must be number, cons or string");
2633 if (XINT (format) != 8 && XINT (format) != 16 && XINT (format) != 32)
2634 error ("FORMAT must be one of 8, 16 or 32");
2636 event.xclient.type = ClientMessage;
2637 event.xclient.format = XINT (format);
2639 if (FRAMEP (dest) || NILP (dest))
2641 struct frame *fdest = check_x_frame (dest);
2642 wdest = FRAME_OUTER_WINDOW (fdest);
2644 else if (STRINGP (dest))
2646 if (strcmp (SSDATA (dest), "PointerWindow") == 0)
2647 wdest = PointerWindow;
2648 else if (strcmp (SSDATA (dest), "InputFocus") == 0)
2649 wdest = InputFocus;
2650 else
2651 error ("DEST as a string must be one of PointerWindow or InputFocus");
2653 else if (INTEGERP (dest) || FLOATP (dest) || CONSP (dest))
2654 CONS_TO_INTEGER (dest, Window, wdest);
2655 else
2656 error ("DEST must be a frame, nil, string, number or cons");
2658 if (wdest == 0) wdest = dpyinfo->root_window;
2659 to_root = wdest == dpyinfo->root_window;
2661 BLOCK_INPUT;
2663 event.xclient.message_type = message_type;
2664 event.xclient.display = dpyinfo->display;
2666 /* Some clients (metacity for example) expects sending window to be here
2667 when sending to the root window. */
2668 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2671 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2672 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2673 event.xclient.format);
2675 /* If event mask is 0 the event is sent to the client that created
2676 the destination window. But if we are sending to the root window,
2677 there is no such client. Then we set the event mask to 0xffff. The
2678 event then goes to clients selecting for events on the root window. */
2679 x_catch_errors (dpyinfo->display);
2681 int propagate = to_root ? False : True;
2682 unsigned mask = to_root ? 0xffff : 0;
2683 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2684 XFlush (dpyinfo->display);
2686 x_uncatch_errors ();
2687 UNBLOCK_INPUT;
2691 void
2692 syms_of_xselect (void)
2694 defsubr (&Sx_get_selection_internal);
2695 defsubr (&Sx_own_selection_internal);
2696 defsubr (&Sx_disown_selection_internal);
2697 defsubr (&Sx_selection_owner_p);
2698 defsubr (&Sx_selection_exists_p);
2700 defsubr (&Sx_get_atom_name);
2701 defsubr (&Sx_send_client_message);
2702 defsubr (&Sx_register_dnd_atom);
2704 reading_selection_reply = Fcons (Qnil, Qnil);
2705 staticpro (&reading_selection_reply);
2706 reading_selection_window = 0;
2707 reading_which_selection = 0;
2709 property_change_wait_list = 0;
2710 prop_location_identifier = 0;
2711 property_change_reply = Fcons (Qnil, Qnil);
2712 staticpro (&property_change_reply);
2714 converted_selections = NULL;
2715 conversion_fail_tag = None;
2717 DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist,
2718 doc: /* An alist associating X Windows selection-types with functions.
2719 These functions are called to convert the selection, with three args:
2720 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2721 a desired type to which the selection should be converted;
2722 and the local selection value (whatever was given to `x-own-selection').
2724 The function should return the value to send to the X server
2725 \(typically a string). A return value of nil
2726 means that the conversion could not be done.
2727 A return value which is the symbol `NULL'
2728 means that a side-effect was executed,
2729 and there is no meaningful selection value. */);
2730 Vselection_converter_alist = Qnil;
2732 DEFVAR_LISP ("x-lost-selection-functions", Vx_lost_selection_functions,
2733 doc: /* A list of functions to be called when Emacs loses an X selection.
2734 \(This happens when some other X client makes its own selection
2735 or when a Lisp program explicitly clears the selection.)
2736 The functions are called with one argument, the selection type
2737 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2738 Vx_lost_selection_functions = Qnil;
2740 DEFVAR_LISP ("x-sent-selection-functions", Vx_sent_selection_functions,
2741 doc: /* A list of functions to be called when Emacs answers a selection request.
2742 The functions are called with three arguments:
2743 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2744 - the selection-type which Emacs was asked to convert the
2745 selection into before sending (for example, `STRING' or `LENGTH');
2746 - a flag indicating success or failure for responding to the request.
2747 We might have failed (and declined the request) for any number of reasons,
2748 including being asked for a selection that we no longer own, or being asked
2749 to convert into a type that we don't know about or that is inappropriate.
2750 This hook doesn't let you change the behavior of Emacs's selection replies,
2751 it merely informs you that they have happened. */);
2752 Vx_sent_selection_functions = Qnil;
2754 DEFVAR_LISP ("x-select-enable-clipboard-manager",
2755 Vx_select_enable_clipboard_manager,
2756 doc: /* Whether to enable X clipboard manager support.
2757 If non-nil, then whenever Emacs is killed or an Emacs frame is deleted
2758 while owning the X clipboard, the clipboard contents are saved to the
2759 clipboard manager if one is present. */);
2760 Vx_select_enable_clipboard_manager = Qt;
2762 DEFVAR_INT ("x-selection-timeout", x_selection_timeout,
2763 doc: /* Number of milliseconds to wait for a selection reply.
2764 If the selection owner doesn't reply in this time, we give up.
2765 A value of 0 means wait as long as necessary. This is initialized from the
2766 \"*selectionTimeout\" resource. */);
2767 x_selection_timeout = 0;
2769 /* QPRIMARY is defined in keyboard.c. */
2770 DEFSYM (QSECONDARY, "SECONDARY");
2771 DEFSYM (QSTRING, "STRING");
2772 DEFSYM (QINTEGER, "INTEGER");
2773 DEFSYM (QCLIPBOARD, "CLIPBOARD");
2774 DEFSYM (QTIMESTAMP, "TIMESTAMP");
2775 DEFSYM (QTEXT, "TEXT");
2776 DEFSYM (QCOMPOUND_TEXT, "COMPOUND_TEXT");
2777 DEFSYM (QUTF8_STRING, "UTF8_STRING");
2778 DEFSYM (QDELETE, "DELETE");
2779 DEFSYM (QMULTIPLE, "MULTIPLE");
2780 DEFSYM (QINCR, "INCR");
2781 DEFSYM (QEMACS_TMP, "_EMACS_TMP_");
2782 DEFSYM (QTARGETS, "TARGETS");
2783 DEFSYM (QATOM, "ATOM");
2784 DEFSYM (QATOM_PAIR, "ATOM_PAIR");
2785 DEFSYM (QCLIPBOARD_MANAGER, "CLIPBOARD_MANAGER");
2786 DEFSYM (QSAVE_TARGETS, "SAVE_TARGETS");
2787 DEFSYM (QNULL, "NULL");
2788 DEFSYM (Qcompound_text_with_extensions, "compound-text-with-extensions");
2789 DEFSYM (Qforeign_selection, "foreign-selection");
2790 DEFSYM (Qx_lost_selection_functions, "x-lost-selection-functions");
2791 DEFSYM (Qx_sent_selection_functions, "x-sent-selection-functions");