Add 2009 to copyright years.
[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, 2009 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 /* If the new selection owner is also Emacs,
1019 don't clear the new selection. */
1020 BLOCK_INPUT;
1021 /* Check each display on the same terminal,
1022 to see if this Emacs job now owns the selection
1023 through that display. */
1024 for (t_dpyinfo = x_display_list; t_dpyinfo; t_dpyinfo = t_dpyinfo->next)
1025 if (t_dpyinfo->terminal->kboard == dpyinfo->terminal->kboard)
1026 {
1027 Window owner_window
1028 = XGetSelectionOwner (t_dpyinfo->display, selection);
1029 if (x_window_to_frame (t_dpyinfo, owner_window) != 0)
1030 {
1031 UNBLOCK_INPUT;
1032 return;
1033 }
1034 }
1035 UNBLOCK_INPUT;
1036
1037 selection_symbol = x_atom_to_symbol (display, selection);
1038
1039 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
1040
1041 /* Well, we already believe that we don't own it, so that's just fine. */
1042 if (NILP (local_selection_data)) return;
1043
1044 local_selection_time = (Time)
1045 cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
1046
1047 /* This SelectionClear is for a selection that we no longer own, so we can
1048 disregard it. (That is, we have reasserted the selection since this
1049 request was generated.) */
1050
1051 if (changed_owner_time != CurrentTime
1052 && local_selection_time > changed_owner_time)
1053 return;
1054
1055 /* Otherwise, we're really honest and truly being told to drop it.
1056 Don't use Fdelq as that may QUIT;. */
1057
1058 if (EQ (local_selection_data, Fcar (Vselection_alist)))
1059 Vselection_alist = Fcdr (Vselection_alist);
1060 else
1061 {
1062 Lisp_Object rest;
1063 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
1064 if (EQ (local_selection_data, Fcar (XCDR (rest))))
1065 {
1066 XSETCDR (rest, Fcdr (XCDR (rest)));
1067 break;
1068 }
1069 }
1070
1071 /* Let random lisp code notice that the selection has been stolen. */
1072
1073 {
1074 Lisp_Object rest;
1075 rest = Vx_lost_selection_functions;
1076 if (!EQ (rest, Qunbound))
1077 {
1078 for (; CONSP (rest); rest = Fcdr (rest))
1079 call1 (Fcar (rest), selection_symbol);
1080 prepare_menu_bars ();
1081 redisplay_preserve_echo_area (20);
1082 }
1083 }
1084 }
1085
1086 void
1087 x_handle_selection_event (event)
1088 struct input_event *event;
1089 {
1090 TRACE0 ("x_handle_selection_event");
1091
1092 if (event->kind == SELECTION_REQUEST_EVENT)
1093 {
1094 if (x_queue_selection_requests)
1095 x_queue_event (event);
1096 else
1097 x_handle_selection_request (event);
1098 }
1099 else
1100 x_handle_selection_clear (event);
1101 }
1102
1103
1104 /* Clear all selections that were made from frame F.
1105 We do this when about to delete a frame. */
1106
1107 void
1108 x_clear_frame_selections (f)
1109 FRAME_PTR f;
1110 {
1111 Lisp_Object frame;
1112 Lisp_Object rest;
1113
1114 XSETFRAME (frame, f);
1115
1116 /* Otherwise, we're really honest and truly being told to drop it.
1117 Don't use Fdelq as that may QUIT;. */
1118
1119 /* Delete elements from the beginning of Vselection_alist. */
1120 while (!NILP (Vselection_alist)
1121 && EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist)))))))
1122 {
1123 /* Let random Lisp code notice that the selection has been stolen. */
1124 Lisp_Object hooks, selection_symbol;
1125
1126 hooks = Vx_lost_selection_functions;
1127 selection_symbol = Fcar (Fcar (Vselection_alist));
1128
1129 if (!EQ (hooks, Qunbound))
1130 {
1131 for (; CONSP (hooks); hooks = Fcdr (hooks))
1132 call1 (Fcar (hooks), selection_symbol);
1133 #if 0 /* This can crash when deleting a frame
1134 from x_connection_closed. Anyway, it seems unnecessary;
1135 something else should cause a redisplay. */
1136 redisplay_preserve_echo_area (21);
1137 #endif
1138 }
1139
1140 Vselection_alist = Fcdr (Vselection_alist);
1141 }
1142
1143 /* Delete elements after the beginning of Vselection_alist. */
1144 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
1145 if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest))))))))
1146 {
1147 /* Let random Lisp code notice that the selection has been stolen. */
1148 Lisp_Object hooks, selection_symbol;
1149
1150 hooks = Vx_lost_selection_functions;
1151 selection_symbol = Fcar (Fcar (XCDR (rest)));
1152
1153 if (!EQ (hooks, Qunbound))
1154 {
1155 for (; CONSP (hooks); hooks = Fcdr (hooks))
1156 call1 (Fcar (hooks), selection_symbol);
1157 #if 0 /* See above */
1158 redisplay_preserve_echo_area (22);
1159 #endif
1160 }
1161 XSETCDR (rest, Fcdr (XCDR (rest)));
1162 break;
1163 }
1164 }
1165 \f
1166 /* Nonzero if any properties for DISPLAY and WINDOW
1167 are on the list of what we are waiting for. */
1168
1169 static int
1170 waiting_for_other_props_on_window (display, window)
1171 Display *display;
1172 Window window;
1173 {
1174 struct prop_location *rest = property_change_wait_list;
1175 while (rest)
1176 if (rest->display == display && rest->window == window)
1177 return 1;
1178 else
1179 rest = rest->next;
1180 return 0;
1181 }
1182
1183 /* Add an entry to the list of property changes we are waiting for.
1184 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1185 The return value is a number that uniquely identifies
1186 this awaited property change. */
1187
1188 static struct prop_location *
1189 expect_property_change (display, window, property, state)
1190 Display *display;
1191 Window window;
1192 Atom property;
1193 int state;
1194 {
1195 struct prop_location *pl = (struct prop_location *) xmalloc (sizeof *pl);
1196 pl->identifier = ++prop_location_identifier;
1197 pl->display = display;
1198 pl->window = window;
1199 pl->property = property;
1200 pl->desired_state = state;
1201 pl->next = property_change_wait_list;
1202 pl->arrived = 0;
1203 property_change_wait_list = pl;
1204 return pl;
1205 }
1206
1207 /* Delete an entry from the list of property changes we are waiting for.
1208 IDENTIFIER is the number that uniquely identifies the entry. */
1209
1210 static void
1211 unexpect_property_change (location)
1212 struct prop_location *location;
1213 {
1214 struct prop_location *prev = 0, *rest = property_change_wait_list;
1215 while (rest)
1216 {
1217 if (rest == location)
1218 {
1219 if (prev)
1220 prev->next = rest->next;
1221 else
1222 property_change_wait_list = rest->next;
1223 xfree (rest);
1224 return;
1225 }
1226 prev = rest;
1227 rest = rest->next;
1228 }
1229 }
1230
1231 /* Remove the property change expectation element for IDENTIFIER. */
1232
1233 static Lisp_Object
1234 wait_for_property_change_unwind (loc)
1235 Lisp_Object loc;
1236 {
1237 struct prop_location *location = XSAVE_VALUE (loc)->pointer;
1238
1239 unexpect_property_change (location);
1240 if (location == property_change_reply_object)
1241 property_change_reply_object = 0;
1242 return Qnil;
1243 }
1244
1245 /* Actually wait for a property change.
1246 IDENTIFIER should be the value that expect_property_change returned. */
1247
1248 static void
1249 wait_for_property_change (location)
1250 struct prop_location *location;
1251 {
1252 int secs, usecs;
1253 int count = SPECPDL_INDEX ();
1254
1255 if (property_change_reply_object)
1256 abort ();
1257
1258 /* Make sure to do unexpect_property_change if we quit or err. */
1259 record_unwind_protect (wait_for_property_change_unwind,
1260 make_save_value (location, 0));
1261
1262 XSETCAR (property_change_reply, Qnil);
1263 property_change_reply_object = location;
1264
1265 /* If the event we are waiting for arrives beyond here, it will set
1266 property_change_reply, because property_change_reply_object says so. */
1267 if (! location->arrived)
1268 {
1269 secs = x_selection_timeout / 1000;
1270 usecs = (x_selection_timeout % 1000) * 1000;
1271 TRACE2 (" Waiting %d secs, %d usecs", secs, usecs);
1272 wait_reading_process_output (secs, usecs, 0, 0,
1273 property_change_reply, NULL, 0);
1274
1275 if (NILP (XCAR (property_change_reply)))
1276 {
1277 TRACE0 (" Timed out");
1278 error ("Timed out waiting for property-notify event");
1279 }
1280 }
1281
1282 unbind_to (count, Qnil);
1283 }
1284
1285 /* Called from XTread_socket in response to a PropertyNotify event. */
1286
1287 void
1288 x_handle_property_notify (event)
1289 XPropertyEvent *event;
1290 {
1291 struct prop_location *prev = 0, *rest = property_change_wait_list;
1292
1293 while (rest)
1294 {
1295 if (!rest->arrived
1296 && rest->property == event->atom
1297 && rest->window == event->window
1298 && rest->display == event->display
1299 && rest->desired_state == event->state)
1300 {
1301 TRACE2 ("Expected %s of property %s",
1302 (event->state == PropertyDelete ? "deletion" : "change"),
1303 XGetAtomName (event->display, event->atom));
1304
1305 rest->arrived = 1;
1306
1307 /* If this is the one wait_for_property_change is waiting for,
1308 tell it to wake up. */
1309 if (rest == property_change_reply_object)
1310 XSETCAR (property_change_reply, Qt);
1311
1312 return;
1313 }
1314
1315 prev = rest;
1316 rest = rest->next;
1317 }
1318 }
1319
1320
1321 \f
1322 #if 0 /* #### MULTIPLE doesn't work yet */
1323
1324 static Lisp_Object
1325 fetch_multiple_target (event)
1326 XSelectionRequestEvent *event;
1327 {
1328 Display *display = event->display;
1329 Window window = event->requestor;
1330 Atom target = event->target;
1331 Atom selection_atom = event->selection;
1332 int result;
1333
1334 return
1335 Fcons (QMULTIPLE,
1336 x_get_window_property_as_lisp_data (display, window, target,
1337 QMULTIPLE, selection_atom));
1338 }
1339
1340 static Lisp_Object
1341 copy_multiple_data (obj)
1342 Lisp_Object obj;
1343 {
1344 Lisp_Object vec;
1345 int i;
1346 int size;
1347 if (CONSP (obj))
1348 return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
1349
1350 CHECK_VECTOR (obj);
1351 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil);
1352 for (i = 0; i < size; i++)
1353 {
1354 Lisp_Object vec2 = XVECTOR (obj)->contents [i];
1355 CHECK_VECTOR (vec2);
1356 if (XVECTOR (vec2)->size != 2)
1357 /* ??? Confusing error message */
1358 signal_error ("Vectors must be of length 2", vec2);
1359 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil);
1360 XVECTOR (XVECTOR (vec)->contents [i])->contents [0]
1361 = XVECTOR (vec2)->contents [0];
1362 XVECTOR (XVECTOR (vec)->contents [i])->contents [1]
1363 = XVECTOR (vec2)->contents [1];
1364 }
1365 return vec;
1366 }
1367
1368 #endif
1369
1370 \f
1371 /* Variables for communication with x_handle_selection_notify. */
1372 static Atom reading_which_selection;
1373 static Lisp_Object reading_selection_reply;
1374 static Window reading_selection_window;
1375
1376 /* Do protocol to read selection-data from the server.
1377 Converts this to Lisp data and returns it. */
1378
1379 static Lisp_Object
1380 x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1381 Lisp_Object selection_symbol, target_type, time_stamp;
1382 {
1383 struct frame *sf = SELECTED_FRAME ();
1384 Window requestor_window;
1385 Display *display;
1386 struct x_display_info *dpyinfo;
1387 Time requestor_time = last_event_timestamp;
1388 Atom target_property;
1389 Atom selection_atom;
1390 Atom type_atom;
1391 int secs, usecs;
1392 int count = SPECPDL_INDEX ();
1393 Lisp_Object frame;
1394
1395 if (! FRAME_X_P (sf))
1396 return Qnil;
1397
1398 requestor_window = FRAME_X_WINDOW (sf);
1399 display = FRAME_X_DISPLAY (sf);
1400 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
1401 target_property = dpyinfo->Xatom_EMACS_TMP;
1402 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
1403
1404 if (CONSP (target_type))
1405 type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type));
1406 else
1407 type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
1408
1409 if (! NILP (time_stamp))
1410 {
1411 if (CONSP (time_stamp))
1412 requestor_time = (Time) cons_to_long (time_stamp);
1413 else if (INTEGERP (time_stamp))
1414 requestor_time = (Time) XUINT (time_stamp);
1415 else if (FLOATP (time_stamp))
1416 requestor_time = (Time) XFLOAT_DATA (time_stamp);
1417 else
1418 error ("TIME_STAMP must be cons or number");
1419 }
1420
1421 BLOCK_INPUT;
1422
1423 /* The protected block contains wait_reading_process_output, which
1424 can run random lisp code (process handlers) or signal.
1425 Therefore, we put the x_uncatch_errors call in an unwind. */
1426 record_unwind_protect (x_catch_errors_unwind, Qnil);
1427 x_catch_errors (display);
1428
1429 TRACE2 ("Get selection %s, type %s",
1430 XGetAtomName (display, type_atom),
1431 XGetAtomName (display, target_property));
1432
1433 XConvertSelection (display, selection_atom, type_atom, target_property,
1434 requestor_window, requestor_time);
1435 XFlush (display);
1436
1437 /* Prepare to block until the reply has been read. */
1438 reading_selection_window = requestor_window;
1439 reading_which_selection = selection_atom;
1440 XSETCAR (reading_selection_reply, Qnil);
1441
1442 frame = some_frame_on_display (dpyinfo);
1443
1444 /* If the display no longer has frames, we can't expect
1445 to get many more selection requests from it, so don't
1446 bother trying to queue them. */
1447 if (!NILP (frame))
1448 {
1449 x_start_queuing_selection_requests ();
1450
1451 record_unwind_protect (queue_selection_requests_unwind,
1452 Qnil);
1453 }
1454 UNBLOCK_INPUT;
1455
1456 /* This allows quits. Also, don't wait forever. */
1457 secs = x_selection_timeout / 1000;
1458 usecs = (x_selection_timeout % 1000) * 1000;
1459 TRACE1 (" Start waiting %d secs for SelectionNotify", secs);
1460 wait_reading_process_output (secs, usecs, 0, 0,
1461 reading_selection_reply, NULL, 0);
1462 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
1463
1464 BLOCK_INPUT;
1465 if (x_had_errors_p (display))
1466 error ("Cannot get selection");
1467 /* This calls x_uncatch_errors. */
1468 unbind_to (count, Qnil);
1469 UNBLOCK_INPUT;
1470
1471 if (NILP (XCAR (reading_selection_reply)))
1472 error ("Timed out waiting for reply from selection owner");
1473 if (EQ (XCAR (reading_selection_reply), Qlambda))
1474 return Qnil;
1475
1476 /* Otherwise, the selection is waiting for us on the requested property. */
1477 return
1478 x_get_window_property_as_lisp_data (display, requestor_window,
1479 target_property, target_type,
1480 selection_atom);
1481 }
1482 \f
1483 /* Subroutines of x_get_window_property_as_lisp_data */
1484
1485 /* Use xfree, not XFree, to free the data obtained with this function. */
1486
1487 static void
1488 x_get_window_property (display, window, property, data_ret, bytes_ret,
1489 actual_type_ret, actual_format_ret, actual_size_ret,
1490 delete_p)
1491 Display *display;
1492 Window window;
1493 Atom property;
1494 unsigned char **data_ret;
1495 int *bytes_ret;
1496 Atom *actual_type_ret;
1497 int *actual_format_ret;
1498 unsigned long *actual_size_ret;
1499 int delete_p;
1500 {
1501 int total_size;
1502 unsigned long bytes_remaining;
1503 int offset = 0;
1504 unsigned char *tmp_data = 0;
1505 int result;
1506 int buffer_size = SELECTION_QUANTUM (display);
1507
1508 if (buffer_size > MAX_SELECTION_QUANTUM)
1509 buffer_size = MAX_SELECTION_QUANTUM;
1510
1511 BLOCK_INPUT;
1512
1513 /* First probe the thing to find out how big it is. */
1514 result = XGetWindowProperty (display, window, property,
1515 0L, 0L, False, AnyPropertyType,
1516 actual_type_ret, actual_format_ret,
1517 actual_size_ret,
1518 &bytes_remaining, &tmp_data);
1519 if (result != Success)
1520 {
1521 UNBLOCK_INPUT;
1522 *data_ret = 0;
1523 *bytes_ret = 0;
1524 return;
1525 }
1526
1527 /* This was allocated by Xlib, so use XFree. */
1528 XFree ((char *) tmp_data);
1529
1530 if (*actual_type_ret == None || *actual_format_ret == 0)
1531 {
1532 UNBLOCK_INPUT;
1533 return;
1534 }
1535
1536 total_size = bytes_remaining + 1;
1537 *data_ret = (unsigned char *) xmalloc (total_size);
1538
1539 /* Now read, until we've gotten it all. */
1540 while (bytes_remaining)
1541 {
1542 #ifdef TRACE_SELECTION
1543 int last = bytes_remaining;
1544 #endif
1545 result
1546 = XGetWindowProperty (display, window, property,
1547 (long)offset/4, (long)buffer_size/4,
1548 False,
1549 AnyPropertyType,
1550 actual_type_ret, actual_format_ret,
1551 actual_size_ret, &bytes_remaining, &tmp_data);
1552
1553 TRACE2 ("Read %ld bytes from property %s",
1554 last - bytes_remaining,
1555 XGetAtomName (display, property));
1556
1557 /* If this doesn't return Success at this point, it means that
1558 some clod deleted the selection while we were in the midst of
1559 reading it. Deal with that, I guess.... */
1560 if (result != Success)
1561 break;
1562
1563 /* The man page for XGetWindowProperty says:
1564 "If the returned format is 32, the returned data is represented
1565 as a long array and should be cast to that type to obtain the
1566 elements."
1567 This applies even if long is more than 32 bits, the X library
1568 converts from 32 bit elements received from the X server to long
1569 and passes the long array to us. Thus, for that case bcopy can not
1570 be used. We convert to a 32 bit type here, because so much code
1571 assume on that.
1572
1573 The bytes and offsets passed to XGetWindowProperty refers to the
1574 property and those are indeed in 32 bit quantities if format is 32. */
1575
1576 if (*actual_format_ret == 32 && *actual_format_ret < BITS_PER_LONG)
1577 {
1578 unsigned long i;
1579 int *idata = (int *) ((*data_ret) + offset);
1580 long *ldata = (long *) tmp_data;
1581
1582 for (i = 0; i < *actual_size_ret; ++i)
1583 {
1584 idata[i]= (int) ldata[i];
1585 offset += 4;
1586 }
1587 }
1588 else
1589 {
1590 *actual_size_ret *= *actual_format_ret / 8;
1591 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
1592 offset += *actual_size_ret;
1593 }
1594
1595 /* This was allocated by Xlib, so use XFree. */
1596 XFree ((char *) tmp_data);
1597 }
1598
1599 XFlush (display);
1600 UNBLOCK_INPUT;
1601 *bytes_ret = offset;
1602 }
1603 \f
1604 /* Use xfree, not XFree, to free the data obtained with this function. */
1605
1606 static void
1607 receive_incremental_selection (display, window, property, target_type,
1608 min_size_bytes, data_ret, size_bytes_ret,
1609 type_ret, format_ret, size_ret)
1610 Display *display;
1611 Window window;
1612 Atom property;
1613 Lisp_Object target_type; /* for error messages only */
1614 unsigned int min_size_bytes;
1615 unsigned char **data_ret;
1616 int *size_bytes_ret;
1617 Atom *type_ret;
1618 unsigned long *size_ret;
1619 int *format_ret;
1620 {
1621 int offset = 0;
1622 struct prop_location *wait_object;
1623 *size_bytes_ret = min_size_bytes;
1624 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
1625
1626 TRACE1 ("Read %d bytes incrementally", min_size_bytes);
1627
1628 /* At this point, we have read an INCR property.
1629 Delete the property to ack it.
1630 (But first, prepare to receive the next event in this handshake.)
1631
1632 Now, we must loop, waiting for the sending window to put a value on
1633 that property, then reading the property, then deleting it to ack.
1634 We are done when the sender places a property of length 0.
1635 */
1636 BLOCK_INPUT;
1637 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
1638 TRACE1 (" Delete property %s",
1639 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1640 XDeleteProperty (display, window, property);
1641 TRACE1 (" Expect new value of property %s",
1642 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1643 wait_object = expect_property_change (display, window, property,
1644 PropertyNewValue);
1645 XFlush (display);
1646 UNBLOCK_INPUT;
1647
1648 while (1)
1649 {
1650 unsigned char *tmp_data;
1651 int tmp_size_bytes;
1652
1653 TRACE0 (" Wait for property change");
1654 wait_for_property_change (wait_object);
1655
1656 /* expect it again immediately, because x_get_window_property may
1657 .. no it won't, I don't get it.
1658 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1659 TRACE0 (" Get property value");
1660 x_get_window_property (display, window, property,
1661 &tmp_data, &tmp_size_bytes,
1662 type_ret, format_ret, size_ret, 1);
1663
1664 TRACE1 (" Read increment of %d bytes", tmp_size_bytes);
1665
1666 if (tmp_size_bytes == 0) /* we're done */
1667 {
1668 TRACE0 ("Done reading incrementally");
1669
1670 if (! waiting_for_other_props_on_window (display, window))
1671 XSelectInput (display, window, STANDARD_EVENT_SET);
1672 /* Use xfree, not XFree, because x_get_window_property
1673 calls xmalloc itself. */
1674 xfree (tmp_data);
1675 break;
1676 }
1677
1678 BLOCK_INPUT;
1679 TRACE1 (" ACK by deleting property %s",
1680 XGetAtomName (display, property));
1681 XDeleteProperty (display, window, property);
1682 wait_object = expect_property_change (display, window, property,
1683 PropertyNewValue);
1684 XFlush (display);
1685 UNBLOCK_INPUT;
1686
1687 if (*size_bytes_ret < offset + tmp_size_bytes)
1688 {
1689 *size_bytes_ret = offset + tmp_size_bytes;
1690 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
1691 }
1692
1693 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
1694 offset += tmp_size_bytes;
1695
1696 /* Use xfree, not XFree, because x_get_window_property
1697 calls xmalloc itself. */
1698 xfree (tmp_data);
1699 }
1700 }
1701
1702 \f
1703 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1704 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1705 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1706
1707 static Lisp_Object
1708 x_get_window_property_as_lisp_data (display, window, property, target_type,
1709 selection_atom)
1710 Display *display;
1711 Window window;
1712 Atom property;
1713 Lisp_Object target_type; /* for error messages only */
1714 Atom selection_atom; /* for error messages only */
1715 {
1716 Atom actual_type;
1717 int actual_format;
1718 unsigned long actual_size;
1719 unsigned char *data = 0;
1720 int bytes = 0;
1721 Lisp_Object val;
1722 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1723
1724 TRACE0 ("Reading selection data");
1725
1726 x_get_window_property (display, window, property, &data, &bytes,
1727 &actual_type, &actual_format, &actual_size, 1);
1728 if (! data)
1729 {
1730 int there_is_a_selection_owner;
1731 BLOCK_INPUT;
1732 there_is_a_selection_owner
1733 = XGetSelectionOwner (display, selection_atom);
1734 UNBLOCK_INPUT;
1735 if (there_is_a_selection_owner)
1736 signal_error ("Selection owner couldn't convert",
1737 actual_type
1738 ? list2 (target_type,
1739 x_atom_to_symbol (display, actual_type))
1740 : target_type);
1741 else
1742 signal_error ("No selection",
1743 x_atom_to_symbol (display, selection_atom));
1744 }
1745
1746 if (actual_type == dpyinfo->Xatom_INCR)
1747 {
1748 /* That wasn't really the data, just the beginning. */
1749
1750 unsigned int min_size_bytes = * ((unsigned int *) data);
1751 BLOCK_INPUT;
1752 /* Use xfree, not XFree, because x_get_window_property
1753 calls xmalloc itself. */
1754 xfree ((char *) data);
1755 UNBLOCK_INPUT;
1756 receive_incremental_selection (display, window, property, target_type,
1757 min_size_bytes, &data, &bytes,
1758 &actual_type, &actual_format,
1759 &actual_size);
1760 }
1761
1762 BLOCK_INPUT;
1763 TRACE1 (" Delete property %s", XGetAtomName (display, property));
1764 XDeleteProperty (display, window, property);
1765 XFlush (display);
1766 UNBLOCK_INPUT;
1767
1768 /* It's been read. Now convert it to a lisp object in some semi-rational
1769 manner. */
1770 val = selection_data_to_lisp_data (display, data, bytes,
1771 actual_type, actual_format);
1772
1773 /* Use xfree, not XFree, because x_get_window_property
1774 calls xmalloc itself. */
1775 xfree ((char *) data);
1776 return val;
1777 }
1778 \f
1779 /* These functions convert from the selection data read from the server into
1780 something that we can use from Lisp, and vice versa.
1781
1782 Type: Format: Size: Lisp Type:
1783 ----- ------- ----- -----------
1784 * 8 * String
1785 ATOM 32 1 Symbol
1786 ATOM 32 > 1 Vector of Symbols
1787 * 16 1 Integer
1788 * 16 > 1 Vector of Integers
1789 * 32 1 if <=16 bits: Integer
1790 if > 16 bits: Cons of top16, bot16
1791 * 32 > 1 Vector of the above
1792
1793 When converting a Lisp number to C, it is assumed to be of format 16 if
1794 it is an integer, and of format 32 if it is a cons of two integers.
1795
1796 When converting a vector of numbers from Lisp to C, it is assumed to be
1797 of format 16 if every element in the vector is an integer, and is assumed
1798 to be of format 32 if any element is a cons of two integers.
1799
1800 When converting an object to C, it may be of the form (SYMBOL . <data>)
1801 where SYMBOL is what we should claim that the type is. Format and
1802 representation are as above.
1803
1804 Important: When format is 32, data should contain an array of int,
1805 not an array of long as the X library returns. This makes a difference
1806 when sizeof(long) != sizeof(int). */
1807
1808
1809
1810 static Lisp_Object
1811 selection_data_to_lisp_data (display, data, size, type, format)
1812 Display *display;
1813 unsigned char *data;
1814 Atom type;
1815 int size, format;
1816 {
1817 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1818
1819 if (type == dpyinfo->Xatom_NULL)
1820 return QNULL;
1821
1822 /* Convert any 8-bit data to a string, for compactness. */
1823 else if (format == 8)
1824 {
1825 Lisp_Object str, lispy_type;
1826
1827 str = make_unibyte_string ((char *) data, size);
1828 /* Indicate that this string is from foreign selection by a text
1829 property `foreign-selection' so that the caller of
1830 x-get-selection-internal (usually x-get-selection) can know
1831 that the string must be decode. */
1832 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1833 lispy_type = QCOMPOUND_TEXT;
1834 else if (type == dpyinfo->Xatom_UTF8_STRING)
1835 lispy_type = QUTF8_STRING;
1836 else
1837 lispy_type = QSTRING;
1838 Fput_text_property (make_number (0), make_number (size),
1839 Qforeign_selection, lispy_type, str);
1840 return str;
1841 }
1842 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1843 a vector of symbols.
1844 */
1845 else if (type == XA_ATOM)
1846 {
1847 int i;
1848 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1849 But the callers of these function has made sure the data for
1850 format == 32 is an array of int. Thus, use int instead
1851 of Atom. */
1852 int *idata = (int *) data;
1853
1854 if (size == sizeof (int))
1855 return x_atom_to_symbol (display, (Atom) idata[0]);
1856 else
1857 {
1858 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
1859 make_number (0));
1860 for (i = 0; i < size / sizeof (int); i++)
1861 Faset (v, make_number (i),
1862 x_atom_to_symbol (display, (Atom) idata[i]));
1863 return v;
1864 }
1865 }
1866
1867 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1868 If the number is 32 bits and won't fit in a Lisp_Int,
1869 convert it to a cons of integers, 16 bits in each half.
1870 */
1871 else if (format == 32 && size == sizeof (int))
1872 return long_to_cons (((unsigned int *) data) [0]);
1873 else if (format == 16 && size == sizeof (short))
1874 return make_number ((int) (((unsigned short *) data) [0]));
1875
1876 /* Convert any other kind of data to a vector of numbers, represented
1877 as above (as an integer, or a cons of two 16 bit integers.)
1878 */
1879 else if (format == 16)
1880 {
1881 int i;
1882 Lisp_Object v;
1883 v = Fmake_vector (make_number (size / 2), make_number (0));
1884 for (i = 0; i < size / 2; i++)
1885 {
1886 int j = (int) ((unsigned short *) data) [i];
1887 Faset (v, make_number (i), make_number (j));
1888 }
1889 return v;
1890 }
1891 else
1892 {
1893 int i;
1894 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0));
1895 for (i = 0; i < size / 4; i++)
1896 {
1897 unsigned int j = ((unsigned int *) data) [i];
1898 Faset (v, make_number (i), long_to_cons (j));
1899 }
1900 return v;
1901 }
1902 }
1903
1904
1905 /* Use xfree, not XFree, to free the data obtained with this function. */
1906
1907 static void
1908 lisp_data_to_selection_data (display, obj,
1909 data_ret, type_ret, size_ret,
1910 format_ret, nofree_ret)
1911 Display *display;
1912 Lisp_Object obj;
1913 unsigned char **data_ret;
1914 Atom *type_ret;
1915 unsigned int *size_ret;
1916 int *format_ret;
1917 int *nofree_ret;
1918 {
1919 Lisp_Object type = Qnil;
1920 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1921
1922 *nofree_ret = 0;
1923
1924 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
1925 {
1926 type = XCAR (obj);
1927 obj = XCDR (obj);
1928 if (CONSP (obj) && NILP (XCDR (obj)))
1929 obj = XCAR (obj);
1930 }
1931
1932 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1933 { /* This is not the same as declining */
1934 *format_ret = 32;
1935 *size_ret = 0;
1936 *data_ret = 0;
1937 type = QNULL;
1938 }
1939 else if (STRINGP (obj))
1940 {
1941 if (SCHARS (obj) < SBYTES (obj))
1942 /* OBJ is a multibyte string containing a non-ASCII char. */
1943 signal_error ("Non-ASCII string must be encoded in advance", obj);
1944 if (NILP (type))
1945 type = QSTRING;
1946 *format_ret = 8;
1947 *size_ret = SBYTES (obj);
1948 *data_ret = SDATA (obj);
1949 *nofree_ret = 1;
1950 }
1951 else if (SYMBOLP (obj))
1952 {
1953 *format_ret = 32;
1954 *size_ret = 1;
1955 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
1956 (*data_ret) [sizeof (Atom)] = 0;
1957 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj);
1958 if (NILP (type)) type = QATOM;
1959 }
1960 else if (INTEGERP (obj)
1961 && XINT (obj) < 0xFFFF
1962 && XINT (obj) > -0xFFFF)
1963 {
1964 *format_ret = 16;
1965 *size_ret = 1;
1966 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
1967 (*data_ret) [sizeof (short)] = 0;
1968 (*(short **) data_ret) [0] = (short) XINT (obj);
1969 if (NILP (type)) type = QINTEGER;
1970 }
1971 else if (INTEGERP (obj)
1972 || (CONSP (obj) && INTEGERP (XCAR (obj))
1973 && (INTEGERP (XCDR (obj))
1974 || (CONSP (XCDR (obj))
1975 && INTEGERP (XCAR (XCDR (obj)))))))
1976 {
1977 *format_ret = 32;
1978 *size_ret = 1;
1979 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
1980 (*data_ret) [sizeof (long)] = 0;
1981 (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
1982 if (NILP (type)) type = QINTEGER;
1983 }
1984 else if (VECTORP (obj))
1985 {
1986 /* Lisp_Vectors may represent a set of ATOMs;
1987 a set of 16 or 32 bit INTEGERs;
1988 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1989 */
1990 int i;
1991
1992 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1993 /* This vector is an ATOM set */
1994 {
1995 if (NILP (type)) type = QATOM;
1996 *size_ret = XVECTOR (obj)->size;
1997 *format_ret = 32;
1998 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
1999 for (i = 0; i < *size_ret; i++)
2000 if (SYMBOLP (XVECTOR (obj)->contents [i]))
2001 (*(Atom **) data_ret) [i]
2002 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]);
2003 else
2004 signal_error ("All elements of selection vector must have same type", obj);
2005 }
2006 #if 0 /* #### MULTIPLE doesn't work yet */
2007 else if (VECTORP (XVECTOR (obj)->contents [0]))
2008 /* This vector is an ATOM_PAIR set */
2009 {
2010 if (NILP (type)) type = QATOM_PAIR;
2011 *size_ret = XVECTOR (obj)->size;
2012 *format_ret = 32;
2013 *data_ret = (unsigned char *)
2014 xmalloc ((*size_ret) * sizeof (Atom) * 2);
2015 for (i = 0; i < *size_ret; i++)
2016 if (VECTORP (XVECTOR (obj)->contents [i]))
2017 {
2018 Lisp_Object pair = XVECTOR (obj)->contents [i];
2019 if (XVECTOR (pair)->size != 2)
2020 signal_error (
2021 "Elements of the vector must be vectors of exactly two elements",
2022 pair);
2023
2024 (*(Atom **) data_ret) [i * 2]
2025 = symbol_to_x_atom (dpyinfo, display,
2026 XVECTOR (pair)->contents [0]);
2027 (*(Atom **) data_ret) [(i * 2) + 1]
2028 = symbol_to_x_atom (dpyinfo, display,
2029 XVECTOR (pair)->contents [1]);
2030 }
2031 else
2032 signal_error ("All elements of the vector must be of the same type",
2033 obj);
2034
2035 }
2036 #endif
2037 else
2038 /* This vector is an INTEGER set, or something like it */
2039 {
2040 int data_size = 2;
2041 *size_ret = XVECTOR (obj)->size;
2042 if (NILP (type)) type = QINTEGER;
2043 *format_ret = 16;
2044 for (i = 0; i < *size_ret; i++)
2045 if (CONSP (XVECTOR (obj)->contents [i]))
2046 *format_ret = 32;
2047 else if (!INTEGERP (XVECTOR (obj)->contents [i]))
2048 signal_error (/* Qselection_error */
2049 "Elements of selection vector must be integers or conses of integers",
2050 obj);
2051
2052 /* Use sizeof(long) even if it is more than 32 bits. See comment
2053 in x_get_window_property and x_fill_property_data. */
2054
2055 if (*format_ret == 32) data_size = sizeof(long);
2056 *data_ret = (unsigned char *) xmalloc (*size_ret * data_size);
2057 for (i = 0; i < *size_ret; i++)
2058 if (*format_ret == 32)
2059 (*((unsigned long **) data_ret)) [i]
2060 = cons_to_long (XVECTOR (obj)->contents [i]);
2061 else
2062 (*((unsigned short **) data_ret)) [i]
2063 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
2064 }
2065 }
2066 else
2067 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
2068
2069 *type_ret = symbol_to_x_atom (dpyinfo, display, type);
2070 }
2071
2072 static Lisp_Object
2073 clean_local_selection_data (obj)
2074 Lisp_Object obj;
2075 {
2076 if (CONSP (obj)
2077 && INTEGERP (XCAR (obj))
2078 && CONSP (XCDR (obj))
2079 && INTEGERP (XCAR (XCDR (obj)))
2080 && NILP (XCDR (XCDR (obj))))
2081 obj = Fcons (XCAR (obj), XCDR (obj));
2082
2083 if (CONSP (obj)
2084 && INTEGERP (XCAR (obj))
2085 && INTEGERP (XCDR (obj)))
2086 {
2087 if (XINT (XCAR (obj)) == 0)
2088 return XCDR (obj);
2089 if (XINT (XCAR (obj)) == -1)
2090 return make_number (- XINT (XCDR (obj)));
2091 }
2092 if (VECTORP (obj))
2093 {
2094 int i;
2095 int size = XVECTOR (obj)->size;
2096 Lisp_Object copy;
2097 if (size == 1)
2098 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
2099 copy = Fmake_vector (make_number (size), Qnil);
2100 for (i = 0; i < size; i++)
2101 XVECTOR (copy)->contents [i]
2102 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
2103 return copy;
2104 }
2105 return obj;
2106 }
2107 \f
2108 /* Called from XTread_socket to handle SelectionNotify events.
2109 If it's the selection we are waiting for, stop waiting
2110 by setting the car of reading_selection_reply to non-nil.
2111 We store t there if the reply is successful, lambda if not. */
2112
2113 void
2114 x_handle_selection_notify (event)
2115 XSelectionEvent *event;
2116 {
2117 if (event->requestor != reading_selection_window)
2118 return;
2119 if (event->selection != reading_which_selection)
2120 return;
2121
2122 TRACE0 ("Received SelectionNotify");
2123 XSETCAR (reading_selection_reply,
2124 (event->property != 0 ? Qt : Qlambda));
2125 }
2126
2127 \f
2128 DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
2129 Sx_own_selection_internal, 2, 2, 0,
2130 doc: /* Assert an X selection of the given TYPE with the given VALUE.
2131 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2132 \(Those are literal upper-case symbol names, since that's what X expects.)
2133 VALUE is typically a string, or a cons of two markers, but may be
2134 anything that the functions on `selection-converter-alist' know about. */)
2135 (selection_name, selection_value)
2136 Lisp_Object selection_name, selection_value;
2137 {
2138 check_x ();
2139 CHECK_SYMBOL (selection_name);
2140 if (NILP (selection_value)) error ("SELECTION-VALUE may not be nil");
2141 x_own_selection (selection_name, selection_value);
2142 return selection_value;
2143 }
2144
2145
2146 /* Request the selection value from the owner. If we are the owner,
2147 simply return our selection value. If we are not the owner, this
2148 will block until all of the data has arrived. */
2149
2150 DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
2151 Sx_get_selection_internal, 2, 3, 0,
2152 doc: /* Return text selected from some X window.
2153 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2154 \(Those are literal upper-case symbol names, since that's what X expects.)
2155 TYPE is the type of data desired, typically `STRING'.
2156 TIME_STAMP is the time to use in the XConvertSelection call for foreign
2157 selections. If omitted, defaults to the time for the last event. */)
2158 (selection_symbol, target_type, time_stamp)
2159 Lisp_Object selection_symbol, target_type, time_stamp;
2160 {
2161 Lisp_Object val = Qnil;
2162 struct gcpro gcpro1, gcpro2;
2163 GCPRO2 (target_type, val); /* we store newly consed data into these */
2164 check_x ();
2165 CHECK_SYMBOL (selection_symbol);
2166
2167 #if 0 /* #### MULTIPLE doesn't work yet */
2168 if (CONSP (target_type)
2169 && XCAR (target_type) == QMULTIPLE)
2170 {
2171 CHECK_VECTOR (XCDR (target_type));
2172 /* So we don't destructively modify this... */
2173 target_type = copy_multiple_data (target_type);
2174 }
2175 else
2176 #endif
2177 CHECK_SYMBOL (target_type);
2178
2179 val = x_get_local_selection (selection_symbol, target_type, 1);
2180
2181 if (NILP (val))
2182 {
2183 val = x_get_foreign_selection (selection_symbol, target_type, time_stamp);
2184 goto DONE;
2185 }
2186
2187 if (CONSP (val)
2188 && SYMBOLP (XCAR (val)))
2189 {
2190 val = XCDR (val);
2191 if (CONSP (val) && NILP (XCDR (val)))
2192 val = XCAR (val);
2193 }
2194 val = clean_local_selection_data (val);
2195 DONE:
2196 UNGCPRO;
2197 return val;
2198 }
2199
2200 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
2201 Sx_disown_selection_internal, 1, 2, 0,
2202 doc: /* If we own the selection SELECTION, disown it.
2203 Disowning it means there is no such selection. */)
2204 (selection, time)
2205 Lisp_Object selection;
2206 Lisp_Object time;
2207 {
2208 Time timestamp;
2209 Atom selection_atom;
2210 union {
2211 struct selection_input_event sie;
2212 struct input_event ie;
2213 } event;
2214 Display *display;
2215 struct x_display_info *dpyinfo;
2216 struct frame *sf = SELECTED_FRAME ();
2217
2218 check_x ();
2219 if (! FRAME_X_P (sf))
2220 return Qnil;
2221
2222 display = FRAME_X_DISPLAY (sf);
2223 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
2224 CHECK_SYMBOL (selection);
2225 if (NILP (time))
2226 timestamp = last_event_timestamp;
2227 else
2228 timestamp = cons_to_long (time);
2229
2230 if (NILP (assq_no_quit (selection, Vselection_alist)))
2231 return Qnil; /* Don't disown the selection when we're not the owner. */
2232
2233 selection_atom = symbol_to_x_atom (dpyinfo, display, selection);
2234
2235 BLOCK_INPUT;
2236 XSetSelectionOwner (display, selection_atom, None, timestamp);
2237 UNBLOCK_INPUT;
2238
2239 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2240 generated for a window which owns the selection when that window sets
2241 the selection owner to None. The NCD server does, the MIT Sun4 server
2242 doesn't. So we synthesize one; this means we might get two, but
2243 that's ok, because the second one won't have any effect. */
2244 SELECTION_EVENT_DISPLAY (&event.sie) = display;
2245 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2246 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2247 x_handle_selection_clear (&event.ie);
2248
2249 return Qt;
2250 }
2251
2252 /* Get rid of all the selections in buffer BUFFER.
2253 This is used when we kill a buffer. */
2254
2255 void
2256 x_disown_buffer_selections (buffer)
2257 Lisp_Object buffer;
2258 {
2259 Lisp_Object tail;
2260 struct buffer *buf = XBUFFER (buffer);
2261
2262 for (tail = Vselection_alist; CONSP (tail); tail = XCDR (tail))
2263 {
2264 Lisp_Object elt, value;
2265 elt = XCAR (tail);
2266 value = XCDR (elt);
2267 if (CONSP (value) && MARKERP (XCAR (value))
2268 && XMARKER (XCAR (value))->buffer == buf)
2269 Fx_disown_selection_internal (XCAR (elt), Qnil);
2270 }
2271 }
2272
2273 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
2274 0, 1, 0,
2275 doc: /* Whether the current Emacs process owns the given X Selection.
2276 The arg should be the name of the selection in question, typically one of
2277 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2278 \(Those are literal upper-case symbol names, since that's what X expects.)
2279 For convenience, the symbol nil is the same as `PRIMARY',
2280 and t is the same as `SECONDARY'. */)
2281 (selection)
2282 Lisp_Object selection;
2283 {
2284 check_x ();
2285 CHECK_SYMBOL (selection);
2286 if (EQ (selection, Qnil)) selection = QPRIMARY;
2287 if (EQ (selection, Qt)) selection = QSECONDARY;
2288
2289 if (NILP (Fassq (selection, Vselection_alist)))
2290 return Qnil;
2291 return Qt;
2292 }
2293
2294 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
2295 0, 1, 0,
2296 doc: /* Whether there is an owner for the given X Selection.
2297 The arg should be the name of the selection in question, typically one of
2298 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2299 \(Those are literal upper-case symbol names, since that's what X expects.)
2300 For convenience, the symbol nil is the same as `PRIMARY',
2301 and t is the same as `SECONDARY'. */)
2302 (selection)
2303 Lisp_Object selection;
2304 {
2305 Window owner;
2306 Atom atom;
2307 Display *dpy;
2308 struct frame *sf = SELECTED_FRAME ();
2309
2310 /* It should be safe to call this before we have an X frame. */
2311 if (! FRAME_X_P (sf))
2312 return Qnil;
2313
2314 dpy = FRAME_X_DISPLAY (sf);
2315 CHECK_SYMBOL (selection);
2316 if (!NILP (Fx_selection_owner_p (selection)))
2317 return Qt;
2318 if (EQ (selection, Qnil)) selection = QPRIMARY;
2319 if (EQ (selection, Qt)) selection = QSECONDARY;
2320 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection);
2321 if (atom == 0)
2322 return Qnil;
2323 BLOCK_INPUT;
2324 owner = XGetSelectionOwner (dpy, atom);
2325 UNBLOCK_INPUT;
2326 return (owner ? Qt : Qnil);
2327 }
2328
2329 \f
2330 #ifdef CUT_BUFFER_SUPPORT
2331
2332 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2333 static void
2334 initialize_cut_buffers (display, window)
2335 Display *display;
2336 Window window;
2337 {
2338 unsigned char *data = (unsigned char *) "";
2339 BLOCK_INPUT;
2340 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2341 PropModeAppend, data, 0)
2342 FROB (XA_CUT_BUFFER0);
2343 FROB (XA_CUT_BUFFER1);
2344 FROB (XA_CUT_BUFFER2);
2345 FROB (XA_CUT_BUFFER3);
2346 FROB (XA_CUT_BUFFER4);
2347 FROB (XA_CUT_BUFFER5);
2348 FROB (XA_CUT_BUFFER6);
2349 FROB (XA_CUT_BUFFER7);
2350 #undef FROB
2351 UNBLOCK_INPUT;
2352 }
2353
2354
2355 #define CHECK_CUT_BUFFER(symbol) \
2356 do { CHECK_SYMBOL ((symbol)); \
2357 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2358 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2359 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2360 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2361 signal_error ("Doesn't name a cut buffer", (symbol)); \
2362 } while (0)
2363
2364 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
2365 Sx_get_cut_buffer_internal, 1, 1, 0,
2366 doc: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */)
2367 (buffer)
2368 Lisp_Object buffer;
2369 {
2370 Window window;
2371 Atom buffer_atom;
2372 unsigned char *data = NULL;
2373 int bytes;
2374 Atom type;
2375 int format;
2376 unsigned long size;
2377 Lisp_Object ret;
2378 Display *display;
2379 struct x_display_info *dpyinfo;
2380 struct frame *sf = SELECTED_FRAME ();
2381
2382 check_x ();
2383
2384 if (! FRAME_X_P (sf))
2385 return Qnil;
2386
2387 display = FRAME_X_DISPLAY (sf);
2388 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
2389 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2390 CHECK_CUT_BUFFER (buffer);
2391 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer);
2392
2393 x_get_window_property (display, window, buffer_atom, &data, &bytes,
2394 &type, &format, &size, 0);
2395
2396 if (!data || !format)
2397 {
2398 if (data)
2399 xfree (data);
2400 return Qnil;
2401 }
2402
2403 if (format != 8 || type != XA_STRING)
2404 signal_error ("Cut buffer doesn't contain 8-bit data",
2405 list2 (x_atom_to_symbol (display, type),
2406 make_number (format)));
2407
2408 ret = (bytes ? make_unibyte_string ((char *) data, bytes) : Qnil);
2409 /* Use xfree, not XFree, because x_get_window_property
2410 calls xmalloc itself. */
2411 xfree (data);
2412 return ret;
2413 }
2414
2415
2416 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal,
2417 Sx_store_cut_buffer_internal, 2, 2, 0,
2418 doc: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
2419 (buffer, string)
2420 Lisp_Object buffer, string;
2421 {
2422 Window window;
2423 Atom buffer_atom;
2424 unsigned char *data;
2425 int bytes;
2426 int bytes_remaining;
2427 int max_bytes;
2428 Display *display;
2429 struct frame *sf = SELECTED_FRAME ();
2430
2431 check_x ();
2432
2433 if (! FRAME_X_P (sf))
2434 return Qnil;
2435
2436 display = FRAME_X_DISPLAY (sf);
2437 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2438
2439 max_bytes = SELECTION_QUANTUM (display);
2440 if (max_bytes > MAX_SELECTION_QUANTUM)
2441 max_bytes = MAX_SELECTION_QUANTUM;
2442
2443 CHECK_CUT_BUFFER (buffer);
2444 CHECK_STRING (string);
2445 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf),
2446 display, buffer);
2447 data = (unsigned char *) SDATA (string);
2448 bytes = SBYTES (string);
2449 bytes_remaining = bytes;
2450
2451 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
2452 {
2453 initialize_cut_buffers (display, window);
2454 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
2455 }
2456
2457 BLOCK_INPUT;
2458
2459 /* Don't mess up with an empty value. */
2460 if (!bytes_remaining)
2461 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2462 PropModeReplace, data, 0);
2463
2464 while (bytes_remaining)
2465 {
2466 int chunk = (bytes_remaining < max_bytes
2467 ? bytes_remaining : max_bytes);
2468 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2469 (bytes_remaining == bytes
2470 ? PropModeReplace
2471 : PropModeAppend),
2472 data, chunk);
2473 data += chunk;
2474 bytes_remaining -= chunk;
2475 }
2476 UNBLOCK_INPUT;
2477 return string;
2478 }
2479
2480
2481 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal,
2482 Sx_rotate_cut_buffers_internal, 1, 1, 0,
2483 doc: /* Rotate the values of the cut buffers by N steps.
2484 Positive N means shift the values forward, negative means backward. */)
2485 (n)
2486 Lisp_Object n;
2487 {
2488 Window window;
2489 Atom props[8];
2490 Display *display;
2491 struct frame *sf = SELECTED_FRAME ();
2492
2493 check_x ();
2494
2495 if (! FRAME_X_P (sf))
2496 return Qnil;
2497
2498 display = FRAME_X_DISPLAY (sf);
2499 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2500 CHECK_NUMBER (n);
2501 if (XINT (n) == 0)
2502 return n;
2503 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
2504 {
2505 initialize_cut_buffers (display, window);
2506 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
2507 }
2508
2509 props[0] = XA_CUT_BUFFER0;
2510 props[1] = XA_CUT_BUFFER1;
2511 props[2] = XA_CUT_BUFFER2;
2512 props[3] = XA_CUT_BUFFER3;
2513 props[4] = XA_CUT_BUFFER4;
2514 props[5] = XA_CUT_BUFFER5;
2515 props[6] = XA_CUT_BUFFER6;
2516 props[7] = XA_CUT_BUFFER7;
2517 BLOCK_INPUT;
2518 XRotateWindowProperties (display, window, props, 8, XINT (n));
2519 UNBLOCK_INPUT;
2520 return n;
2521 }
2522
2523 #endif
2524 \f
2525 /***********************************************************************
2526 Drag and drop support
2527 ***********************************************************************/
2528 /* Check that lisp values are of correct type for x_fill_property_data.
2529 That is, number, string or a cons with two numbers (low and high 16
2530 bit parts of a 32 bit number). */
2531
2532 int
2533 x_check_property_data (data)
2534 Lisp_Object data;
2535 {
2536 Lisp_Object iter;
2537 int size = 0;
2538
2539 for (iter = data; CONSP (iter) && size != -1; iter = XCDR (iter), ++size)
2540 {
2541 Lisp_Object o = XCAR (iter);
2542
2543 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
2544 size = -1;
2545 else if (CONSP (o) &&
2546 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
2547 size = -1;
2548 }
2549
2550 return size;
2551 }
2552
2553 /* Convert lisp values to a C array. Values may be a number, a string
2554 which is taken as an X atom name and converted to the atom value, or
2555 a cons containing the two 16 bit parts of a 32 bit number.
2556
2557 DPY is the display use to look up X atoms.
2558 DATA is a Lisp list of values to be converted.
2559 RET is the C array that contains the converted values. It is assumed
2560 it is big enough to hold all values.
2561 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2562 be stored in RET. Note that long is used for 32 even if long is more
2563 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2564 XClientMessageEvent). */
2565
2566 void
2567 x_fill_property_data (dpy, data, ret, format)
2568 Display *dpy;
2569 Lisp_Object data;
2570 void *ret;
2571 int format;
2572 {
2573 long val;
2574 long *d32 = (long *) ret;
2575 short *d16 = (short *) ret;
2576 char *d08 = (char *) ret;
2577 Lisp_Object iter;
2578
2579 for (iter = data; CONSP (iter); iter = XCDR (iter))
2580 {
2581 Lisp_Object o = XCAR (iter);
2582
2583 if (INTEGERP (o))
2584 val = (long) XFASTINT (o);
2585 else if (FLOATP (o))
2586 val = (long) XFLOAT_DATA (o);
2587 else if (CONSP (o))
2588 val = (long) cons_to_long (o);
2589 else if (STRINGP (o))
2590 {
2591 BLOCK_INPUT;
2592 val = (long) XInternAtom (dpy, (char *) SDATA (o), False);
2593 UNBLOCK_INPUT;
2594 }
2595 else
2596 error ("Wrong type, must be string, number or cons");
2597
2598 if (format == 8)
2599 *d08++ = (char) val;
2600 else if (format == 16)
2601 *d16++ = (short) val;
2602 else
2603 *d32++ = val;
2604 }
2605 }
2606
2607 /* Convert an array of C values to a Lisp list.
2608 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2609 DATA is a C array of values to be converted.
2610 TYPE is the type of the data. Only XA_ATOM is special, it converts
2611 each number in DATA to its corresponfing X atom as a symbol.
2612 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2613 be stored in RET.
2614 SIZE is the number of elements in DATA.
2615
2616 Important: When format is 32, data should contain an array of int,
2617 not an array of long as the X library returns. This makes a difference
2618 when sizeof(long) != sizeof(int).
2619
2620 Also see comment for selection_data_to_lisp_data above. */
2621
2622 Lisp_Object
2623 x_property_data_to_lisp (f, data, type, format, size)
2624 struct frame *f;
2625 unsigned char *data;
2626 Atom type;
2627 int format;
2628 unsigned long size;
2629 {
2630 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
2631 data, size*format/8, type, format);
2632 }
2633
2634 /* Get the mouse position in frame relative coordinates. */
2635
2636 static void
2637 mouse_position_for_drop (f, x, y)
2638 FRAME_PTR f;
2639 int *x;
2640 int *y;
2641 {
2642 Window root, dummy_window;
2643 int dummy;
2644
2645 BLOCK_INPUT;
2646
2647 XQueryPointer (FRAME_X_DISPLAY (f),
2648 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2649
2650 /* The root window which contains the pointer. */
2651 &root,
2652
2653 /* Window pointer is on, not used */
2654 &dummy_window,
2655
2656 /* The position on that root window. */
2657 x, y,
2658
2659 /* x/y in dummy_window coordinates, not used. */
2660 &dummy, &dummy,
2661
2662 /* Modifier keys and pointer buttons, about which
2663 we don't care. */
2664 (unsigned int *) &dummy);
2665
2666
2667 /* Absolute to relative. */
2668 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2669 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2670
2671 UNBLOCK_INPUT;
2672 }
2673
2674 DEFUN ("x-get-atom-name", Fx_get_atom_name,
2675 Sx_get_atom_name, 1, 2, 0,
2676 doc: /* Return the X atom name for VALUE as a string.
2677 VALUE may be a number or a cons where the car is the upper 16 bits and
2678 the cdr is the lower 16 bits of a 32 bit value.
2679 Use the display for FRAME or the current frame if FRAME is not given or nil.
2680
2681 If the value is 0 or the atom is not known, return the empty string. */)
2682 (value, frame)
2683 Lisp_Object value, frame;
2684 {
2685 struct frame *f = check_x_frame (frame);
2686 char *name = 0;
2687 Lisp_Object ret = Qnil;
2688 Display *dpy = FRAME_X_DISPLAY (f);
2689 Atom atom;
2690 int had_errors;
2691
2692 if (INTEGERP (value))
2693 atom = (Atom) XUINT (value);
2694 else if (FLOATP (value))
2695 atom = (Atom) XFLOAT_DATA (value);
2696 else if (CONSP (value))
2697 atom = (Atom) cons_to_long (value);
2698 else
2699 error ("Wrong type, value must be number or cons");
2700
2701 BLOCK_INPUT;
2702 x_catch_errors (dpy);
2703 name = atom ? XGetAtomName (dpy, atom) : "";
2704 had_errors = x_had_errors_p (dpy);
2705 x_uncatch_errors ();
2706
2707 if (!had_errors)
2708 ret = make_string (name, strlen (name));
2709
2710 if (atom && name) XFree (name);
2711 if (NILP (ret)) ret = empty_unibyte_string;
2712
2713 UNBLOCK_INPUT;
2714
2715 return ret;
2716 }
2717
2718 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2719 Sx_register_dnd_atom, 1, 2, 0,
2720 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2721 ATOM can be a symbol or a string. The ATOM is interned on the display that
2722 FRAME is on. If FRAME is nil, the selected frame is used. */)
2723 (atom, frame)
2724 Lisp_Object atom, frame;
2725 {
2726 Atom x_atom;
2727 struct frame *f = check_x_frame (frame);
2728 size_t i;
2729 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2730
2731
2732 if (SYMBOLP (atom))
2733 x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom);
2734 else if (STRINGP (atom))
2735 {
2736 BLOCK_INPUT;
2737 x_atom = XInternAtom (FRAME_X_DISPLAY (f), (char *) SDATA (atom), False);
2738 UNBLOCK_INPUT;
2739 }
2740 else
2741 error ("ATOM must be a symbol or a string");
2742
2743 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2744 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2745 return Qnil;
2746
2747 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
2748 {
2749 dpyinfo->x_dnd_atoms_size *= 2;
2750 dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms,
2751 sizeof (*dpyinfo->x_dnd_atoms)
2752 * dpyinfo->x_dnd_atoms_size);
2753 }
2754
2755 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2756 return Qnil;
2757 }
2758
2759 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2760
2761 int
2762 x_handle_dnd_message (f, event, dpyinfo, bufp)
2763 struct frame *f;
2764 XClientMessageEvent *event;
2765 struct x_display_info *dpyinfo;
2766 struct input_event *bufp;
2767 {
2768 Lisp_Object vec;
2769 Lisp_Object frame;
2770 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2771 unsigned long size = 160/event->format;
2772 int x, y;
2773 unsigned char *data = (unsigned char *) event->data.b;
2774 int idata[5];
2775 size_t i;
2776
2777 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2778 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2779
2780 if (i == dpyinfo->x_dnd_atoms_length) return 0;
2781
2782 XSETFRAME (frame, f);
2783
2784 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2785 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2786 function expects them to be of size int (i.e. 32). So to be able to
2787 use that function, put the data in the form it expects if format is 32. */
2788
2789 if (event->format == 32 && event->format < BITS_PER_LONG)
2790 {
2791 int i;
2792 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
2793 idata[i] = (int) event->data.l[i];
2794 data = (unsigned char *) idata;
2795 }
2796
2797 vec = Fmake_vector (make_number (4), Qnil);
2798 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2799 event->message_type)));
2800 ASET (vec, 1, frame);
2801 ASET (vec, 2, make_number (event->format));
2802 ASET (vec, 3, x_property_data_to_lisp (f,
2803 data,
2804 event->message_type,
2805 event->format,
2806 size));
2807
2808 mouse_position_for_drop (f, &x, &y);
2809 bufp->kind = DRAG_N_DROP_EVENT;
2810 bufp->frame_or_window = frame;
2811 bufp->timestamp = CurrentTime;
2812 bufp->x = make_number (x);
2813 bufp->y = make_number (y);
2814 bufp->arg = vec;
2815 bufp->modifiers = 0;
2816
2817 return 1;
2818 }
2819
2820 DEFUN ("x-send-client-message", Fx_send_client_event,
2821 Sx_send_client_message, 6, 6, 0,
2822 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2823
2824 For DISPLAY, specify either a frame or a display name (a string).
2825 If DISPLAY is nil, that stands for the selected frame's display.
2826 DEST may be a number, in which case it is a Window id. The value 0 may
2827 be used to send to the root window of the DISPLAY.
2828 If DEST is a cons, it is converted to a 32 bit number
2829 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2830 number is then used as a window id.
2831 If DEST is a frame the event is sent to the outer window of that frame.
2832 A value of nil means the currently selected frame.
2833 If DEST is the string "PointerWindow" the event is sent to the window that
2834 contains the pointer. If DEST is the string "InputFocus" the event is
2835 sent to the window that has the input focus.
2836 FROM is the frame sending the event. Use nil for currently selected frame.
2837 MESSAGE-TYPE is the name of an Atom as a string.
2838 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2839 bits. VALUES is a list of numbers, cons and/or strings containing the values
2840 to send. If a value is a string, it is converted to an Atom and the value of
2841 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2842 with the high 16 bits from the car and the lower 16 bit from the cdr.
2843 If more values than fits into the event is given, the excessive values
2844 are ignored. */)
2845 (display, dest, from, message_type, format, values)
2846 Lisp_Object display, dest, from, message_type, format, values;
2847 {
2848 struct x_display_info *dpyinfo = check_x_display_info (display);
2849 Window wdest;
2850 XEvent event;
2851 Lisp_Object cons;
2852 int size;
2853 struct frame *f = check_x_frame (from);
2854 int to_root;
2855
2856 CHECK_STRING (message_type);
2857 CHECK_NUMBER (format);
2858 CHECK_CONS (values);
2859
2860 if (x_check_property_data (values) == -1)
2861 error ("Bad data in VALUES, must be number, cons or string");
2862
2863 event.xclient.type = ClientMessage;
2864 event.xclient.format = XFASTINT (format);
2865
2866 if (event.xclient.format != 8 && event.xclient.format != 16
2867 && event.xclient.format != 32)
2868 error ("FORMAT must be one of 8, 16 or 32");
2869
2870 if (FRAMEP (dest) || NILP (dest))
2871 {
2872 struct frame *fdest = check_x_frame (dest);
2873 wdest = FRAME_OUTER_WINDOW (fdest);
2874 }
2875 else if (STRINGP (dest))
2876 {
2877 if (strcmp (SDATA (dest), "PointerWindow") == 0)
2878 wdest = PointerWindow;
2879 else if (strcmp (SDATA (dest), "InputFocus") == 0)
2880 wdest = InputFocus;
2881 else
2882 error ("DEST as a string must be one of PointerWindow or InputFocus");
2883 }
2884 else if (INTEGERP (dest))
2885 wdest = (Window) XFASTINT (dest);
2886 else if (FLOATP (dest))
2887 wdest = (Window) XFLOAT_DATA (dest);
2888 else if (CONSP (dest))
2889 {
2890 if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest)))
2891 error ("Both car and cdr for DEST must be numbers");
2892 else
2893 wdest = (Window) cons_to_long (dest);
2894 }
2895 else
2896 error ("DEST must be a frame, nil, string, number or cons");
2897
2898 if (wdest == 0) wdest = dpyinfo->root_window;
2899 to_root = wdest == dpyinfo->root_window;
2900
2901 for (cons = values, size = 0; CONSP (cons); cons = XCDR (cons), ++size)
2902 ;
2903
2904 BLOCK_INPUT;
2905
2906 event.xclient.message_type
2907 = XInternAtom (dpyinfo->display, SDATA (message_type), False);
2908 event.xclient.display = dpyinfo->display;
2909
2910 /* Some clients (metacity for example) expects sending window to be here
2911 when sending to the root window. */
2912 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2913
2914
2915 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2916 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2917 event.xclient.format);
2918
2919 /* If event mask is 0 the event is sent to the client that created
2920 the destination window. But if we are sending to the root window,
2921 there is no such client. Then we set the event mask to 0xffff. The
2922 event then goes to clients selecting for events on the root window. */
2923 x_catch_errors (dpyinfo->display);
2924 {
2925 int propagate = to_root ? False : True;
2926 unsigned mask = to_root ? 0xffff : 0;
2927 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2928 XFlush (dpyinfo->display);
2929 }
2930 x_uncatch_errors ();
2931 UNBLOCK_INPUT;
2932
2933 return Qnil;
2934 }
2935
2936 \f
2937 void
2938 syms_of_xselect ()
2939 {
2940 defsubr (&Sx_get_selection_internal);
2941 defsubr (&Sx_own_selection_internal);
2942 defsubr (&Sx_disown_selection_internal);
2943 defsubr (&Sx_selection_owner_p);
2944 defsubr (&Sx_selection_exists_p);
2945
2946 #ifdef CUT_BUFFER_SUPPORT
2947 defsubr (&Sx_get_cut_buffer_internal);
2948 defsubr (&Sx_store_cut_buffer_internal);
2949 defsubr (&Sx_rotate_cut_buffers_internal);
2950 #endif
2951
2952 defsubr (&Sx_get_atom_name);
2953 defsubr (&Sx_send_client_message);
2954 defsubr (&Sx_register_dnd_atom);
2955
2956 reading_selection_reply = Fcons (Qnil, Qnil);
2957 staticpro (&reading_selection_reply);
2958 reading_selection_window = 0;
2959 reading_which_selection = 0;
2960
2961 property_change_wait_list = 0;
2962 prop_location_identifier = 0;
2963 property_change_reply = Fcons (Qnil, Qnil);
2964 staticpro (&property_change_reply);
2965
2966 Vselection_alist = Qnil;
2967 staticpro (&Vselection_alist);
2968
2969 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
2970 doc: /* An alist associating X Windows selection-types with functions.
2971 These functions are called to convert the selection, with three args:
2972 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2973 a desired type to which the selection should be converted;
2974 and the local selection value (whatever was given to `x-own-selection').
2975
2976 The function should return the value to send to the X server
2977 \(typically a string). A return value of nil
2978 means that the conversion could not be done.
2979 A return value which is the symbol `NULL'
2980 means that a side-effect was executed,
2981 and there is no meaningful selection value. */);
2982 Vselection_converter_alist = Qnil;
2983
2984 DEFVAR_LISP ("x-lost-selection-functions", &Vx_lost_selection_functions,
2985 doc: /* A list of functions to be called when Emacs loses an X selection.
2986 \(This happens when some other X client makes its own selection
2987 or when a Lisp program explicitly clears the selection.)
2988 The functions are called with one argument, the selection type
2989 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2990 Vx_lost_selection_functions = Qnil;
2991
2992 DEFVAR_LISP ("x-sent-selection-functions", &Vx_sent_selection_functions,
2993 doc: /* A list of functions to be called when Emacs answers a selection request.
2994 The functions are called with four arguments:
2995 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2996 - the selection-type which Emacs was asked to convert the
2997 selection into before sending (for example, `STRING' or `LENGTH');
2998 - a flag indicating success or failure for responding to the request.
2999 We might have failed (and declined the request) for any number of reasons,
3000 including being asked for a selection that we no longer own, or being asked
3001 to convert into a type that we don't know about or that is inappropriate.
3002 This hook doesn't let you change the behavior of Emacs's selection replies,
3003 it merely informs you that they have happened. */);
3004 Vx_sent_selection_functions = Qnil;
3005
3006 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
3007 doc: /* Number of milliseconds to wait for a selection reply.
3008 If the selection owner doesn't reply in this time, we give up.
3009 A value of 0 means wait as long as necessary. This is initialized from the
3010 \"*selectionTimeout\" resource. */);
3011 x_selection_timeout = 0;
3012
3013 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY);
3014 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY);
3015 QSTRING = intern ("STRING"); staticpro (&QSTRING);
3016 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER);
3017 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
3018 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
3019 QTEXT = intern ("TEXT"); staticpro (&QTEXT);
3020 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
3021 QUTF8_STRING = intern ("UTF8_STRING"); staticpro (&QUTF8_STRING);
3022 QDELETE = intern ("DELETE"); staticpro (&QDELETE);
3023 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE);
3024 QINCR = intern ("INCR"); staticpro (&QINCR);
3025 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP);
3026 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS);
3027 QATOM = intern ("ATOM"); staticpro (&QATOM);
3028 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR);
3029 QNULL = intern ("NULL"); staticpro (&QNULL);
3030 Qcompound_text_with_extensions = intern ("compound-text-with-extensions");
3031 staticpro (&Qcompound_text_with_extensions);
3032
3033 #ifdef CUT_BUFFER_SUPPORT
3034 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
3035 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
3036 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
3037 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
3038 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
3039 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
3040 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
3041 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
3042 #endif
3043
3044 Qforeign_selection = intern ("foreign-selection");
3045 staticpro (&Qforeign_selection);
3046 }
3047
3048 /* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236
3049 (do not change this comment) */