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