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