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