(python-end-of-block): Revert last change.
[emacs.git] / src / xselect.c
blob3fe109a5b85f7f14635ce552768fb81cf380eb5a
1 /* X Selection processing for Emacs.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
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.
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.
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. */
23 /* Rewritten by jwz */
25 #include <config.h>
26 #include <stdio.h> /* termhooks.h needs this */
28 #ifdef HAVE_SYS_TYPES_H
29 #include <sys/types.h>
30 #endif
31 #ifdef HAVE_UNISTD_H
32 #include <unistd.h>
33 #endif
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"
45 #include <X11/Xproto.h>
47 struct prop_location;
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));
89 /* Printing traces to stderr. */
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
108 #define CUT_BUFFER_SUPPORT
110 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
111 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
112 QATOM_PAIR;
114 Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
115 Lisp_Object QUTF8_STRING; /* This is a type of selection. */
117 Lisp_Object Qcompound_text_with_extensions;
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
124 static Lisp_Object Vx_lost_selection_functions;
125 static Lisp_Object Vx_sent_selection_functions;
126 /* Coding system for communicating with other X clients via selection
127 and clipboard. */
128 static Lisp_Object Vselection_coding_system;
130 /* Coding system for the next communicating with other X clients. */
131 static Lisp_Object Vnext_selection_coding_system;
133 static Lisp_Object Qforeign_selection;
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
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
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;
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;
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;
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;
180 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later
181 handling. */
183 struct selection_event_queue
185 struct input_event event;
186 struct selection_event_queue *next;
189 static struct selection_event_queue *selection_queue;
191 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
193 static int x_queue_selection_requests;
195 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
197 static void
198 x_queue_event (event)
199 struct input_event *event;
201 struct selection_event_queue *queue_tmp;
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)
207 if (!bcmp (&queue_tmp->event, event, sizeof (*event)))
209 TRACE1 ("DECLINE DUP SELECTION EVENT %08lx", (unsigned long)queue_tmp);
210 x_decline_selection_request (event);
211 return;
215 queue_tmp
216 = (struct selection_event_queue *) xmalloc (sizeof (struct selection_event_queue));
218 if (queue_tmp != NULL)
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;
227 /* Start queuing SELECTION_REQUEST_EVENT events. */
229 static void
230 x_start_queuing_selection_requests ()
232 if (x_queue_selection_requests)
233 abort ();
235 x_queue_selection_requests++;
236 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
239 /* Stop queuing SELECTION_REQUEST_EVENT events. */
241 static void
242 x_stop_queuing_selection_requests ()
244 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
245 --x_queue_selection_requests;
247 /* Take all the queued events and put them back
248 so that they get processed afresh. */
250 while (selection_queue != NULL)
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);
261 /* This converts a Lisp symbol to a server Atom, avoiding a server
262 roundtrip whenever possible. */
264 static Atom
265 symbol_to_x_atom (dpyinfo, display, sym)
266 struct x_display_info *dpyinfo;
267 Display *display;
268 Lisp_Object sym;
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 ();
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;
308 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
309 and calls to intern whenever possible. */
311 static Lisp_Object
312 x_atom_to_symbol (dpy, atom)
313 Display *dpy;
314 Atom atom;
316 struct x_display_info *dpyinfo;
317 char *str;
318 Lisp_Object val;
320 if (! atom)
321 return Qnil;
323 switch (atom)
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
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;
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;
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. */
396 static void
397 x_own_selection (selection_name, selection_value)
398 Lisp_Object selection_name, selection_value;
400 struct frame *sf = SELECTED_FRAME ();
401 Window selecting_window = FRAME_X_WINDOW (sf);
402 Display *display = FRAME_X_DISPLAY (sf);
403 Time time = last_event_timestamp;
404 Atom selection_atom;
405 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (sf);
407 CHECK_SYMBOL (selection_name);
408 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_name);
410 BLOCK_INPUT;
411 x_catch_errors (display);
412 XSetSelectionOwner (display, selection_atom, selecting_window, time);
413 x_check_errors (display, "Can't set selection: %s");
414 x_uncatch_errors ();
415 UNBLOCK_INPUT;
417 /* Now update the local cache */
419 Lisp_Object selection_time;
420 Lisp_Object selection_data;
421 Lisp_Object prev_value;
423 selection_time = long_to_cons ((unsigned long) time);
424 selection_data = Fcons (selection_name,
425 Fcons (selection_value,
426 Fcons (selection_time,
427 Fcons (selected_frame, Qnil))));
428 prev_value = assq_no_quit (selection_name, Vselection_alist);
430 Vselection_alist = Fcons (selection_data, Vselection_alist);
432 /* If we already owned the selection, remove the old selection data.
433 Perhaps we should destructively modify it instead.
434 Don't use Fdelq as that may QUIT. */
435 if (!NILP (prev_value))
437 Lisp_Object rest; /* we know it's not the CAR, so it's easy. */
438 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
439 if (EQ (prev_value, Fcar (XCDR (rest))))
441 XSETCDR (rest, Fcdr (XCDR (rest)));
442 break;
448 /* Given a selection-name and desired type, look up our local copy of
449 the selection value and convert it to the type.
450 The value is nil or a string.
451 This function is used both for remote requests (LOCAL_REQUEST is zero)
452 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
454 This calls random Lisp code, and may signal or gc. */
456 static Lisp_Object
457 x_get_local_selection (selection_symbol, target_type, local_request)
458 Lisp_Object selection_symbol, target_type;
459 int local_request;
461 Lisp_Object local_value;
462 Lisp_Object handler_fn, value, type, check;
463 int count;
465 local_value = assq_no_quit (selection_symbol, Vselection_alist);
467 if (NILP (local_value)) return Qnil;
469 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
470 if (EQ (target_type, QTIMESTAMP))
472 handler_fn = Qnil;
473 value = XCAR (XCDR (XCDR (local_value)));
475 #if 0
476 else if (EQ (target_type, QDELETE))
478 handler_fn = Qnil;
479 Fx_disown_selection_internal
480 (selection_symbol,
481 XCAR (XCDR (XCDR (local_value))));
482 value = QNULL;
484 #endif
486 #if 0 /* #### MULTIPLE doesn't work yet */
487 else if (CONSP (target_type)
488 && XCAR (target_type) == QMULTIPLE)
490 Lisp_Object pairs;
491 int size;
492 int i;
493 pairs = XCDR (target_type);
494 size = XVECTOR (pairs)->size;
495 /* If the target is MULTIPLE, then target_type looks like
496 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
497 We modify the second element of each pair in the vector and
498 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
500 for (i = 0; i < size; i++)
502 Lisp_Object pair;
503 pair = XVECTOR (pairs)->contents [i];
504 XVECTOR (pair)->contents [1]
505 = x_get_local_selection (XVECTOR (pair)->contents [0],
506 XVECTOR (pair)->contents [1],
507 local_request);
509 return pairs;
511 #endif
512 else
514 /* Don't allow a quit within the converter.
515 When the user types C-g, he would be surprised
516 if by luck it came during a converter. */
517 count = SPECPDL_INDEX ();
518 specbind (Qinhibit_quit, Qt);
520 CHECK_SYMBOL (target_type);
521 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
522 /* gcpro is not needed here since nothing but HANDLER_FN
523 is live, and that ought to be a symbol. */
525 if (!NILP (handler_fn))
526 value = call3 (handler_fn,
527 selection_symbol, (local_request ? Qnil : target_type),
528 XCAR (XCDR (local_value)));
529 else
530 value = Qnil;
531 unbind_to (count, Qnil);
534 /* Make sure this value is of a type that we could transmit
535 to another X client. */
537 check = value;
538 if (CONSP (value)
539 && SYMBOLP (XCAR (value)))
540 type = XCAR (value),
541 check = XCDR (value);
543 if (STRINGP (check)
544 || VECTORP (check)
545 || SYMBOLP (check)
546 || INTEGERP (check)
547 || NILP (value))
548 return value;
549 /* Check for a value that cons_to_long could handle. */
550 else if (CONSP (check)
551 && INTEGERP (XCAR (check))
552 && (INTEGERP (XCDR (check))
554 (CONSP (XCDR (check))
555 && INTEGERP (XCAR (XCDR (check)))
556 && NILP (XCDR (XCDR (check))))))
557 return value;
559 signal_error ("Invalid data returned by selection-conversion function",
560 list2 (handler_fn, value));
563 /* Subroutines of x_reply_selection_request. */
565 /* Send a SelectionNotify event to the requestor with property=None,
566 meaning we were unable to do what they wanted. */
568 static void
569 x_decline_selection_request (event)
570 struct input_event *event;
572 XSelectionEvent reply;
574 reply.type = SelectionNotify;
575 reply.display = SELECTION_EVENT_DISPLAY (event);
576 reply.requestor = SELECTION_EVENT_REQUESTOR (event);
577 reply.selection = SELECTION_EVENT_SELECTION (event);
578 reply.time = SELECTION_EVENT_TIME (event);
579 reply.target = SELECTION_EVENT_TARGET (event);
580 reply.property = None;
582 /* The reason for the error may be that the receiver has
583 died in the meantime. Handle that case. */
584 BLOCK_INPUT;
585 x_catch_errors (reply.display);
586 XSendEvent (reply.display, reply.requestor, False, 0L, (XEvent *) &reply);
587 XFlush (reply.display);
588 x_uncatch_errors ();
589 UNBLOCK_INPUT;
592 /* This is the selection request currently being processed.
593 It is set to zero when the request is fully processed. */
594 static struct input_event *x_selection_current_request;
596 /* Display info in x_selection_request. */
598 static struct x_display_info *selection_request_dpyinfo;
600 /* Used as an unwind-protect clause so that, if a selection-converter signals
601 an error, we tell the requester that we were unable to do what they wanted
602 before we throw to top-level or go into the debugger or whatever. */
604 static Lisp_Object
605 x_selection_request_lisp_error (ignore)
606 Lisp_Object ignore;
608 if (x_selection_current_request != 0
609 && selection_request_dpyinfo->display)
610 x_decline_selection_request (x_selection_current_request);
611 return Qnil;
614 static Lisp_Object
615 x_catch_errors_unwind (dummy)
616 Lisp_Object dummy;
618 BLOCK_INPUT;
619 x_uncatch_errors ();
620 UNBLOCK_INPUT;
621 return Qnil;
625 /* This stuff is so that INCR selections are reentrant (that is, so we can
626 be servicing multiple INCR selection requests simultaneously.) I haven't
627 actually tested that yet. */
629 /* Keep a list of the property changes that are awaited. */
631 struct prop_location
633 int identifier;
634 Display *display;
635 Window window;
636 Atom property;
637 int desired_state;
638 int arrived;
639 struct prop_location *next;
642 static struct prop_location *expect_property_change ();
643 static void wait_for_property_change ();
644 static void unexpect_property_change ();
645 static int waiting_for_other_props_on_window ();
647 static int prop_location_identifier;
649 static Lisp_Object property_change_reply;
651 static struct prop_location *property_change_reply_object;
653 static struct prop_location *property_change_wait_list;
655 static Lisp_Object
656 queue_selection_requests_unwind (tem)
657 Lisp_Object tem;
659 x_stop_queuing_selection_requests ();
660 return Qnil;
663 /* Return some frame whose display info is DPYINFO.
664 Return nil if there is none. */
666 static Lisp_Object
667 some_frame_on_display (dpyinfo)
668 struct x_display_info *dpyinfo;
670 Lisp_Object list, frame;
672 FOR_EACH_FRAME (list, frame)
674 if (FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
675 return frame;
678 return Qnil;
681 /* Send the reply to a selection request event EVENT.
682 TYPE is the type of selection data requested.
683 DATA and SIZE describe the data to send, already converted.
684 FORMAT is the unit-size (in bits) of the data to be transmitted. */
686 static void
687 x_reply_selection_request (event, format, data, size, type)
688 struct input_event *event;
689 int format, size;
690 unsigned char *data;
691 Atom type;
693 XSelectionEvent reply;
694 Display *display = SELECTION_EVENT_DISPLAY (event);
695 Window window = SELECTION_EVENT_REQUESTOR (event);
696 int bytes_remaining;
697 int format_bytes = format/8;
698 int max_bytes = SELECTION_QUANTUM (display);
699 struct x_display_info *dpyinfo = x_display_info_for_display (display);
700 int count = SPECPDL_INDEX ();
702 if (max_bytes > MAX_SELECTION_QUANTUM)
703 max_bytes = MAX_SELECTION_QUANTUM;
705 reply.type = SelectionNotify;
706 reply.display = display;
707 reply.requestor = window;
708 reply.selection = SELECTION_EVENT_SELECTION (event);
709 reply.time = SELECTION_EVENT_TIME (event);
710 reply.target = SELECTION_EVENT_TARGET (event);
711 reply.property = SELECTION_EVENT_PROPERTY (event);
712 if (reply.property == None)
713 reply.property = reply.target;
715 BLOCK_INPUT;
716 /* The protected block contains wait_for_property_change, which can
717 run random lisp code (process handlers) or signal. Therefore, we
718 put the x_uncatch_errors call in an unwind. */
719 record_unwind_protect (x_catch_errors_unwind, Qnil);
720 x_catch_errors (display);
722 #ifdef TRACE_SELECTION
724 static int cnt;
725 char *sel = XGetAtomName (display, reply.selection);
726 char *tgt = XGetAtomName (display, reply.target);
727 TRACE3 ("%s, target %s (%d)", sel, tgt, ++cnt);
728 if (sel) XFree (sel);
729 if (tgt) XFree (tgt);
731 #endif /* TRACE_SELECTION */
733 /* Store the data on the requested property.
734 If the selection is large, only store the first N bytes of it.
736 bytes_remaining = size * format_bytes;
737 if (bytes_remaining <= max_bytes)
739 /* Send all the data at once, with minimal handshaking. */
740 TRACE1 ("Sending all %d bytes", bytes_remaining);
741 XChangeProperty (display, window, reply.property, type, format,
742 PropModeReplace, data, size);
743 /* At this point, the selection was successfully stored; ack it. */
744 XSendEvent (display, window, False, 0L, (XEvent *) &reply);
746 else
748 /* Send an INCR selection. */
749 struct prop_location *wait_object;
750 int had_errors;
751 Lisp_Object frame;
753 frame = some_frame_on_display (dpyinfo);
755 /* If the display no longer has frames, we can't expect
756 to get many more selection requests from it, so don't
757 bother trying to queue them. */
758 if (!NILP (frame))
760 x_start_queuing_selection_requests ();
762 record_unwind_protect (queue_selection_requests_unwind,
763 Qnil);
766 if (x_window_to_frame (dpyinfo, window)) /* #### debug */
767 error ("Attempt to transfer an INCR to ourself!");
769 TRACE2 ("Start sending %d bytes incrementally (%s)",
770 bytes_remaining, XGetAtomName (display, reply.property));
771 wait_object = expect_property_change (display, window, reply.property,
772 PropertyDelete);
774 TRACE1 ("Set %s to number of bytes to send",
775 XGetAtomName (display, reply.property));
777 /* XChangeProperty expects an array of long even if long is more than
778 32 bits. */
779 long value[1];
781 value[0] = bytes_remaining;
782 XChangeProperty (display, window, reply.property, dpyinfo->Xatom_INCR,
783 32, PropModeReplace,
784 (unsigned char *) value, 1);
787 XSelectInput (display, window, PropertyChangeMask);
789 /* Tell 'em the INCR data is there... */
790 TRACE0 ("Send SelectionNotify event");
791 XSendEvent (display, window, False, 0L, (XEvent *) &reply);
792 XFlush (display);
794 had_errors = x_had_errors_p (display);
795 UNBLOCK_INPUT;
797 /* First, wait for the requester to ack by deleting the property.
798 This can run random lisp code (process handlers) or signal. */
799 if (! had_errors)
801 TRACE1 ("Waiting for ACK (deletion of %s)",
802 XGetAtomName (display, reply.property));
803 wait_for_property_change (wait_object);
805 else
806 unexpect_property_change (wait_object);
808 TRACE0 ("Got ACK");
809 while (bytes_remaining)
811 int i = ((bytes_remaining < max_bytes)
812 ? bytes_remaining
813 : max_bytes);
815 BLOCK_INPUT;
817 wait_object
818 = expect_property_change (display, window, reply.property,
819 PropertyDelete);
821 TRACE1 ("Sending increment of %d bytes", i);
822 TRACE1 ("Set %s to increment data",
823 XGetAtomName (display, reply.property));
825 /* Append the next chunk of data to the property. */
826 XChangeProperty (display, window, reply.property, type, format,
827 PropModeAppend, data, i / format_bytes);
828 bytes_remaining -= i;
829 data += i;
830 XFlush (display);
831 had_errors = x_had_errors_p (display);
832 UNBLOCK_INPUT;
834 if (had_errors)
835 break;
837 /* Now wait for the requester to ack this chunk by deleting the
838 property. This can run random lisp code or signal. */
839 TRACE1 ("Waiting for increment ACK (deletion of %s)",
840 XGetAtomName (display, reply.property));
841 wait_for_property_change (wait_object);
844 /* Now write a zero-length chunk to the property to tell the
845 requester that we're done. */
846 BLOCK_INPUT;
847 if (! waiting_for_other_props_on_window (display, window))
848 XSelectInput (display, window, 0L);
850 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
851 XGetAtomName (display, reply.property));
852 XChangeProperty (display, window, reply.property, type, format,
853 PropModeReplace, data, 0);
854 TRACE0 ("Done sending incrementally");
857 /* rms, 2003-01-03: I think I have fixed this bug. */
858 /* The window we're communicating with may have been deleted
859 in the meantime (that's a real situation from a bug report).
860 In this case, there may be events in the event queue still
861 refering to the deleted window, and we'll get a BadWindow error
862 in XTread_socket when processing the events. I don't have
863 an idea how to fix that. gerd, 2001-01-98. */
864 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
865 delivered before uncatch errors. */
866 XSync (display, False);
867 UNBLOCK_INPUT;
869 /* GTK queues events in addition to the queue in Xlib. So we
870 UNBLOCK to enter the event loop and get possible errors delivered,
871 and then BLOCK again because x_uncatch_errors requires it. */
872 BLOCK_INPUT;
873 /* This calls x_uncatch_errors. */
874 unbind_to (count, Qnil);
875 UNBLOCK_INPUT;
878 /* Handle a SelectionRequest event EVENT.
879 This is called from keyboard.c when such an event is found in the queue. */
881 static void
882 x_handle_selection_request (event)
883 struct input_event *event;
885 struct gcpro gcpro1, gcpro2, gcpro3;
886 Lisp_Object local_selection_data;
887 Lisp_Object selection_symbol;
888 Lisp_Object target_symbol;
889 Lisp_Object converted_selection;
890 Time local_selection_time;
891 Lisp_Object successful_p;
892 int count;
893 struct x_display_info *dpyinfo
894 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event));
896 TRACE2 ("x_handle_selection_request, from=0x%08lx time=%lu",
897 (unsigned long) SELECTION_EVENT_REQUESTOR (event),
898 (unsigned long) SELECTION_EVENT_TIME (event));
900 local_selection_data = Qnil;
901 target_symbol = Qnil;
902 converted_selection = Qnil;
903 successful_p = Qnil;
905 GCPRO3 (local_selection_data, converted_selection, target_symbol);
907 selection_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event),
908 SELECTION_EVENT_SELECTION (event));
910 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
912 if (NILP (local_selection_data))
914 /* Someone asked for the selection, but we don't have it any more.
916 x_decline_selection_request (event);
917 goto DONE;
920 local_selection_time = (Time)
921 cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
923 if (SELECTION_EVENT_TIME (event) != CurrentTime
924 && local_selection_time > SELECTION_EVENT_TIME (event))
926 /* Someone asked for the selection, and we have one, but not the one
927 they're looking for.
929 x_decline_selection_request (event);
930 goto DONE;
933 x_selection_current_request = event;
934 count = SPECPDL_INDEX ();
935 selection_request_dpyinfo = dpyinfo;
936 record_unwind_protect (x_selection_request_lisp_error, Qnil);
938 target_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event),
939 SELECTION_EVENT_TARGET (event));
941 #if 0 /* #### MULTIPLE doesn't work yet */
942 if (EQ (target_symbol, QMULTIPLE))
943 target_symbol = fetch_multiple_target (event);
944 #endif
946 /* Convert lisp objects back into binary data */
948 converted_selection
949 = x_get_local_selection (selection_symbol, target_symbol, 0);
951 if (! NILP (converted_selection))
953 unsigned char *data;
954 unsigned int size;
955 int format;
956 Atom type;
957 int nofree;
959 if (CONSP (converted_selection) && NILP (XCDR (converted_selection)))
961 x_decline_selection_request (event);
962 goto DONE2;
965 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event),
966 converted_selection,
967 &data, &type, &size, &format, &nofree);
969 x_reply_selection_request (event, format, data, size, type);
970 successful_p = Qt;
972 /* Indicate we have successfully processed this event. */
973 x_selection_current_request = 0;
975 /* Use xfree, not XFree, because lisp_data_to_selection_data
976 calls xmalloc itself. */
977 if (!nofree)
978 xfree (data);
981 DONE2:
982 unbind_to (count, Qnil);
984 DONE:
986 /* Let random lisp code notice that the selection has been asked for. */
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);
995 UNGCPRO;
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. */
1002 static void
1003 x_handle_selection_clear (event)
1004 struct input_event *event;
1006 Display *display = SELECTION_EVENT_DISPLAY (event);
1007 Atom selection = SELECTION_EVENT_SELECTION (event);
1008 Time changed_owner_time = SELECTION_EVENT_TIME (event);
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;
1015 TRACE0 ("x_handle_selection_clear");
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->kboard == dpyinfo->kboard)
1026 Window owner_window
1027 = XGetSelectionOwner (t_dpyinfo->display, selection);
1028 if (x_window_to_frame (t_dpyinfo, owner_window) != 0)
1030 UNBLOCK_INPUT;
1031 return;
1034 UNBLOCK_INPUT;
1036 selection_symbol = x_atom_to_symbol (display, selection);
1038 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
1040 /* Well, we already believe that we don't own it, so that's just fine. */
1041 if (NILP (local_selection_data)) return;
1043 local_selection_time = (Time)
1044 cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
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.) */
1050 if (changed_owner_time != CurrentTime
1051 && local_selection_time > changed_owner_time)
1052 return;
1054 /* Otherwise, we're really honest and truly being told to drop it.
1055 Don't use Fdelq as that may QUIT;. */
1057 if (EQ (local_selection_data, Fcar (Vselection_alist)))
1058 Vselection_alist = Fcdr (Vselection_alist);
1059 else
1061 Lisp_Object rest;
1062 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
1063 if (EQ (local_selection_data, Fcar (XCDR (rest))))
1065 XSETCDR (rest, Fcdr (XCDR (rest)));
1066 break;
1070 /* Let random lisp code notice that the selection has been stolen. */
1073 Lisp_Object rest;
1074 rest = Vx_lost_selection_functions;
1075 if (!EQ (rest, Qunbound))
1077 for (; CONSP (rest); rest = Fcdr (rest))
1078 call1 (Fcar (rest), selection_symbol);
1079 prepare_menu_bars ();
1080 redisplay_preserve_echo_area (20);
1085 void
1086 x_handle_selection_event (event)
1087 struct input_event *event;
1089 TRACE0 ("x_handle_selection_event");
1091 if (event->kind == SELECTION_REQUEST_EVENT)
1093 if (x_queue_selection_requests)
1094 x_queue_event (event);
1095 else
1096 x_handle_selection_request (event);
1098 else
1099 x_handle_selection_clear (event);
1103 /* Clear all selections that were made from frame F.
1104 We do this when about to delete a frame. */
1106 void
1107 x_clear_frame_selections (f)
1108 FRAME_PTR f;
1110 Lisp_Object frame;
1111 Lisp_Object rest;
1113 XSETFRAME (frame, f);
1115 /* Otherwise, we're really honest and truly being told to drop it.
1116 Don't use Fdelq as that may QUIT;. */
1118 /* Delete elements from the beginning of Vselection_alist. */
1119 while (!NILP (Vselection_alist)
1120 && EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist)))))))
1122 /* Let random Lisp code notice that the selection has been stolen. */
1123 Lisp_Object hooks, selection_symbol;
1125 hooks = Vx_lost_selection_functions;
1126 selection_symbol = Fcar (Fcar (Vselection_alist));
1128 if (!EQ (hooks, Qunbound))
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
1139 Vselection_alist = Fcdr (Vselection_alist);
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))))))))
1146 /* Let random Lisp code notice that the selection has been stolen. */
1147 Lisp_Object hooks, selection_symbol;
1149 hooks = Vx_lost_selection_functions;
1150 selection_symbol = Fcar (Fcar (XCDR (rest)));
1152 if (!EQ (hooks, Qunbound))
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
1160 XSETCDR (rest, Fcdr (XCDR (rest)));
1161 break;
1165 /* Nonzero if any properties for DISPLAY and WINDOW
1166 are on the list of what we are waiting for. */
1168 static int
1169 waiting_for_other_props_on_window (display, window)
1170 Display *display;
1171 Window window;
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;
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. */
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;
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;
1206 /* Delete an entry from the list of property changes we are waiting for.
1207 IDENTIFIER is the number that uniquely identifies the entry. */
1209 static void
1210 unexpect_property_change (location)
1211 struct prop_location *location;
1213 struct prop_location *prev = 0, *rest = property_change_wait_list;
1214 while (rest)
1216 if (rest == location)
1218 if (prev)
1219 prev->next = rest->next;
1220 else
1221 property_change_wait_list = rest->next;
1222 xfree (rest);
1223 return;
1225 prev = rest;
1226 rest = rest->next;
1230 /* Remove the property change expectation element for IDENTIFIER. */
1232 static Lisp_Object
1233 wait_for_property_change_unwind (loc)
1234 Lisp_Object loc;
1236 struct prop_location *location = XSAVE_VALUE (loc)->pointer;
1238 unexpect_property_change (location);
1239 if (location == property_change_reply_object)
1240 property_change_reply_object = 0;
1241 return Qnil;
1244 /* Actually wait for a property change.
1245 IDENTIFIER should be the value that expect_property_change returned. */
1247 static void
1248 wait_for_property_change (location)
1249 struct prop_location *location;
1251 int secs, usecs;
1252 int count = SPECPDL_INDEX ();
1254 if (property_change_reply_object)
1255 abort ();
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));
1261 XSETCAR (property_change_reply, Qnil);
1262 property_change_reply_object = location;
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)
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);
1274 if (NILP (XCAR (property_change_reply)))
1276 TRACE0 (" Timed out");
1277 error ("Timed out waiting for property-notify event");
1281 unbind_to (count, Qnil);
1284 /* Called from XTread_socket in response to a PropertyNotify event. */
1286 void
1287 x_handle_property_notify (event)
1288 XPropertyEvent *event;
1290 struct prop_location *prev = 0, *rest = property_change_wait_list;
1292 while (rest)
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)
1300 TRACE2 ("Expected %s of property %s",
1301 (event->state == PropertyDelete ? "deletion" : "change"),
1302 XGetAtomName (event->display, event->atom));
1304 rest->arrived = 1;
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);
1311 return;
1314 prev = rest;
1315 rest = rest->next;
1321 #if 0 /* #### MULTIPLE doesn't work yet */
1323 static Lisp_Object
1324 fetch_multiple_target (event)
1325 XSelectionRequestEvent *event;
1327 Display *display = event->display;
1328 Window window = event->requestor;
1329 Atom target = event->target;
1330 Atom selection_atom = event->selection;
1331 int result;
1333 return
1334 Fcons (QMULTIPLE,
1335 x_get_window_property_as_lisp_data (display, window, target,
1336 QMULTIPLE, selection_atom));
1339 static Lisp_Object
1340 copy_multiple_data (obj)
1341 Lisp_Object obj;
1343 Lisp_Object vec;
1344 int i;
1345 int size;
1346 if (CONSP (obj))
1347 return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
1349 CHECK_VECTOR (obj);
1350 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil);
1351 for (i = 0; i < size; i++)
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];
1364 return vec;
1367 #endif
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;
1375 /* Do protocol to read selection-data from the server.
1376 Converts this to Lisp data and returns it. */
1378 static Lisp_Object
1379 x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1380 Lisp_Object selection_symbol, target_type, time_stamp;
1382 struct frame *sf = SELECTED_FRAME ();
1383 Window requestor_window = FRAME_X_WINDOW (sf);
1384 Display *display = FRAME_X_DISPLAY (sf);
1385 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (sf);
1386 Time requestor_time = last_event_timestamp;
1387 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1388 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
1389 Atom type_atom;
1390 int secs, usecs;
1391 int count = SPECPDL_INDEX ();
1392 Lisp_Object frame;
1394 if (CONSP (target_type))
1395 type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type));
1396 else
1397 type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
1399 if (! NILP (time_stamp))
1401 if (CONSP (time_stamp))
1402 requestor_time = (Time) cons_to_long (time_stamp);
1403 else if (INTEGERP (time_stamp))
1404 requestor_time = (Time) XUINT (time_stamp);
1405 else if (FLOATP (time_stamp))
1406 requestor_time = (Time) XFLOAT_DATA (time_stamp);
1407 else
1408 error ("TIME_STAMP must be cons or number");
1411 BLOCK_INPUT;
1413 /* The protected block contains wait_reading_process_output, which
1414 can run random lisp code (process handlers) or signal.
1415 Therefore, we put the x_uncatch_errors call in an unwind. */
1416 record_unwind_protect (x_catch_errors_unwind, Qnil);
1417 x_catch_errors (display);
1419 TRACE2 ("Get selection %s, type %s",
1420 XGetAtomName (display, type_atom),
1421 XGetAtomName (display, target_property));
1423 XConvertSelection (display, selection_atom, type_atom, target_property,
1424 requestor_window, requestor_time);
1425 XFlush (display);
1427 /* Prepare to block until the reply has been read. */
1428 reading_selection_window = requestor_window;
1429 reading_which_selection = selection_atom;
1430 XSETCAR (reading_selection_reply, Qnil);
1432 frame = some_frame_on_display (dpyinfo);
1434 /* If the display no longer has frames, we can't expect
1435 to get many more selection requests from it, so don't
1436 bother trying to queue them. */
1437 if (!NILP (frame))
1439 x_start_queuing_selection_requests ();
1441 record_unwind_protect (queue_selection_requests_unwind,
1442 Qnil);
1444 UNBLOCK_INPUT;
1446 /* This allows quits. Also, don't wait forever. */
1447 secs = x_selection_timeout / 1000;
1448 usecs = (x_selection_timeout % 1000) * 1000;
1449 TRACE1 (" Start waiting %d secs for SelectionNotify", secs);
1450 wait_reading_process_output (secs, usecs, 0, 0,
1451 reading_selection_reply, NULL, 0);
1452 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
1454 BLOCK_INPUT;
1455 if (x_had_errors_p (display))
1456 error ("Cannot get selection");
1457 /* This calls x_uncatch_errors. */
1458 unbind_to (count, Qnil);
1459 UNBLOCK_INPUT;
1461 if (NILP (XCAR (reading_selection_reply)))
1462 error ("Timed out waiting for reply from selection owner");
1463 if (EQ (XCAR (reading_selection_reply), Qlambda))
1464 error ("No `%s' selection", SDATA (SYMBOL_NAME (selection_symbol)));
1466 /* Otherwise, the selection is waiting for us on the requested property. */
1467 return
1468 x_get_window_property_as_lisp_data (display, requestor_window,
1469 target_property, target_type,
1470 selection_atom);
1473 /* Subroutines of x_get_window_property_as_lisp_data */
1475 /* Use xfree, not XFree, to free the data obtained with this function. */
1477 static void
1478 x_get_window_property (display, window, property, data_ret, bytes_ret,
1479 actual_type_ret, actual_format_ret, actual_size_ret,
1480 delete_p)
1481 Display *display;
1482 Window window;
1483 Atom property;
1484 unsigned char **data_ret;
1485 int *bytes_ret;
1486 Atom *actual_type_ret;
1487 int *actual_format_ret;
1488 unsigned long *actual_size_ret;
1489 int delete_p;
1491 int total_size;
1492 unsigned long bytes_remaining;
1493 int offset = 0;
1494 unsigned char *tmp_data = 0;
1495 int result;
1496 int buffer_size = SELECTION_QUANTUM (display);
1498 if (buffer_size > MAX_SELECTION_QUANTUM)
1499 buffer_size = MAX_SELECTION_QUANTUM;
1501 BLOCK_INPUT;
1503 /* First probe the thing to find out how big it is. */
1504 result = XGetWindowProperty (display, window, property,
1505 0L, 0L, False, AnyPropertyType,
1506 actual_type_ret, actual_format_ret,
1507 actual_size_ret,
1508 &bytes_remaining, &tmp_data);
1509 if (result != Success)
1511 UNBLOCK_INPUT;
1512 *data_ret = 0;
1513 *bytes_ret = 0;
1514 return;
1517 /* This was allocated by Xlib, so use XFree. */
1518 XFree ((char *) tmp_data);
1520 if (*actual_type_ret == None || *actual_format_ret == 0)
1522 UNBLOCK_INPUT;
1523 return;
1526 total_size = bytes_remaining + 1;
1527 *data_ret = (unsigned char *) xmalloc (total_size);
1529 /* Now read, until we've gotten it all. */
1530 while (bytes_remaining)
1532 #ifdef TRACE_SELECTION
1533 int last = bytes_remaining;
1534 #endif
1535 result
1536 = XGetWindowProperty (display, window, property,
1537 (long)offset/4, (long)buffer_size/4,
1538 False,
1539 AnyPropertyType,
1540 actual_type_ret, actual_format_ret,
1541 actual_size_ret, &bytes_remaining, &tmp_data);
1543 TRACE2 ("Read %ld bytes from property %s",
1544 last - bytes_remaining,
1545 XGetAtomName (display, property));
1547 /* If this doesn't return Success at this point, it means that
1548 some clod deleted the selection while we were in the midst of
1549 reading it. Deal with that, I guess.... */
1550 if (result != Success)
1551 break;
1553 /* The man page for XGetWindowProperty says:
1554 "If the returned format is 32, the returned data is represented
1555 as a long array and should be cast to that type to obtain the
1556 elements."
1557 This applies even if long is more than 32 bits, the X library
1558 converts from 32 bit elements received from the X server to long
1559 and passes the long array to us. Thus, for that case bcopy can not
1560 be used. We convert to a 32 bit type here, because so much code
1561 assume on that.
1563 The bytes and offsets passed to XGetWindowProperty refers to the
1564 property and those are indeed in 32 bit quantities if format is 32. */
1566 if (*actual_format_ret == 32 && *actual_format_ret < BITS_PER_LONG)
1568 unsigned long i;
1569 int *idata = (int *) ((*data_ret) + offset);
1570 long *ldata = (long *) tmp_data;
1572 for (i = 0; i < *actual_size_ret; ++i)
1574 idata[i]= (int) ldata[i];
1575 offset += 4;
1578 else
1580 *actual_size_ret *= *actual_format_ret / 8;
1581 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
1582 offset += *actual_size_ret;
1585 /* This was allocated by Xlib, so use XFree. */
1586 XFree ((char *) tmp_data);
1589 XFlush (display);
1590 UNBLOCK_INPUT;
1591 *bytes_ret = offset;
1594 /* Use xfree, not XFree, to free the data obtained with this function. */
1596 static void
1597 receive_incremental_selection (display, window, property, target_type,
1598 min_size_bytes, data_ret, size_bytes_ret,
1599 type_ret, format_ret, size_ret)
1600 Display *display;
1601 Window window;
1602 Atom property;
1603 Lisp_Object target_type; /* for error messages only */
1604 unsigned int min_size_bytes;
1605 unsigned char **data_ret;
1606 int *size_bytes_ret;
1607 Atom *type_ret;
1608 unsigned long *size_ret;
1609 int *format_ret;
1611 int offset = 0;
1612 struct prop_location *wait_object;
1613 *size_bytes_ret = min_size_bytes;
1614 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
1616 TRACE1 ("Read %d bytes incrementally", min_size_bytes);
1618 /* At this point, we have read an INCR property.
1619 Delete the property to ack it.
1620 (But first, prepare to receive the next event in this handshake.)
1622 Now, we must loop, waiting for the sending window to put a value on
1623 that property, then reading the property, then deleting it to ack.
1624 We are done when the sender places a property of length 0.
1626 BLOCK_INPUT;
1627 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
1628 TRACE1 (" Delete property %s",
1629 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1630 XDeleteProperty (display, window, property);
1631 TRACE1 (" Expect new value of property %s",
1632 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
1633 wait_object = expect_property_change (display, window, property,
1634 PropertyNewValue);
1635 XFlush (display);
1636 UNBLOCK_INPUT;
1638 while (1)
1640 unsigned char *tmp_data;
1641 int tmp_size_bytes;
1643 TRACE0 (" Wait for property change");
1644 wait_for_property_change (wait_object);
1646 /* expect it again immediately, because x_get_window_property may
1647 .. no it won't, I don't get it.
1648 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1649 TRACE0 (" Get property value");
1650 x_get_window_property (display, window, property,
1651 &tmp_data, &tmp_size_bytes,
1652 type_ret, format_ret, size_ret, 1);
1654 TRACE1 (" Read increment of %d bytes", tmp_size_bytes);
1656 if (tmp_size_bytes == 0) /* we're done */
1658 TRACE0 ("Done reading incrementally");
1660 if (! waiting_for_other_props_on_window (display, window))
1661 XSelectInput (display, window, STANDARD_EVENT_SET);
1662 /* Use xfree, not XFree, because x_get_window_property
1663 calls xmalloc itself. */
1664 if (tmp_data) xfree (tmp_data);
1665 break;
1668 BLOCK_INPUT;
1669 TRACE1 (" ACK by deleting property %s",
1670 XGetAtomName (display, property));
1671 XDeleteProperty (display, window, property);
1672 wait_object = expect_property_change (display, window, property,
1673 PropertyNewValue);
1674 XFlush (display);
1675 UNBLOCK_INPUT;
1677 if (*size_bytes_ret < offset + tmp_size_bytes)
1679 *size_bytes_ret = offset + tmp_size_bytes;
1680 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
1683 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
1684 offset += tmp_size_bytes;
1686 /* Use xfree, not XFree, because x_get_window_property
1687 calls xmalloc itself. */
1688 xfree (tmp_data);
1693 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1694 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1695 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1697 static Lisp_Object
1698 x_get_window_property_as_lisp_data (display, window, property, target_type,
1699 selection_atom)
1700 Display *display;
1701 Window window;
1702 Atom property;
1703 Lisp_Object target_type; /* for error messages only */
1704 Atom selection_atom; /* for error messages only */
1706 Atom actual_type;
1707 int actual_format;
1708 unsigned long actual_size;
1709 unsigned char *data = 0;
1710 int bytes = 0;
1711 Lisp_Object val;
1712 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1714 TRACE0 ("Reading selection data");
1716 x_get_window_property (display, window, property, &data, &bytes,
1717 &actual_type, &actual_format, &actual_size, 1);
1718 if (! data)
1720 int there_is_a_selection_owner;
1721 BLOCK_INPUT;
1722 there_is_a_selection_owner
1723 = XGetSelectionOwner (display, selection_atom);
1724 UNBLOCK_INPUT;
1725 if (there_is_a_selection_owner)
1726 signal_error ("Selection owner couldn't convert",
1727 actual_type
1728 ? list2 (target_type,
1729 x_atom_to_symbol (display, actual_type))
1730 : target_type);
1731 else
1732 signal_error ("No selection",
1733 x_atom_to_symbol (display, selection_atom));
1736 if (actual_type == dpyinfo->Xatom_INCR)
1738 /* That wasn't really the data, just the beginning. */
1740 unsigned int min_size_bytes = * ((unsigned int *) data);
1741 BLOCK_INPUT;
1742 /* Use xfree, not XFree, because x_get_window_property
1743 calls xmalloc itself. */
1744 xfree ((char *) data);
1745 UNBLOCK_INPUT;
1746 receive_incremental_selection (display, window, property, target_type,
1747 min_size_bytes, &data, &bytes,
1748 &actual_type, &actual_format,
1749 &actual_size);
1752 BLOCK_INPUT;
1753 TRACE1 (" Delete property %s", XGetAtomName (display, property));
1754 XDeleteProperty (display, window, property);
1755 XFlush (display);
1756 UNBLOCK_INPUT;
1758 /* It's been read. Now convert it to a lisp object in some semi-rational
1759 manner. */
1760 val = selection_data_to_lisp_data (display, data, bytes,
1761 actual_type, actual_format);
1763 /* Use xfree, not XFree, because x_get_window_property
1764 calls xmalloc itself. */
1765 xfree ((char *) data);
1766 return val;
1769 /* These functions convert from the selection data read from the server into
1770 something that we can use from Lisp, and vice versa.
1772 Type: Format: Size: Lisp Type:
1773 ----- ------- ----- -----------
1774 * 8 * String
1775 ATOM 32 1 Symbol
1776 ATOM 32 > 1 Vector of Symbols
1777 * 16 1 Integer
1778 * 16 > 1 Vector of Integers
1779 * 32 1 if <=16 bits: Integer
1780 if > 16 bits: Cons of top16, bot16
1781 * 32 > 1 Vector of the above
1783 When converting a Lisp number to C, it is assumed to be of format 16 if
1784 it is an integer, and of format 32 if it is a cons of two integers.
1786 When converting a vector of numbers from Lisp to C, it is assumed to be
1787 of format 16 if every element in the vector is an integer, and is assumed
1788 to be of format 32 if any element is a cons of two integers.
1790 When converting an object to C, it may be of the form (SYMBOL . <data>)
1791 where SYMBOL is what we should claim that the type is. Format and
1792 representation are as above.
1794 Important: When format is 32, data should contain an array of int,
1795 not an array of long as the X library returns. This makes a difference
1796 when sizeof(long) != sizeof(int). */
1800 static Lisp_Object
1801 selection_data_to_lisp_data (display, data, size, type, format)
1802 Display *display;
1803 unsigned char *data;
1804 Atom type;
1805 int size, format;
1807 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1809 if (type == dpyinfo->Xatom_NULL)
1810 return QNULL;
1812 /* Convert any 8-bit data to a string, for compactness. */
1813 else if (format == 8)
1815 Lisp_Object str, lispy_type;
1817 str = make_unibyte_string ((char *) data, size);
1818 /* Indicate that this string is from foreign selection by a text
1819 property `foreign-selection' so that the caller of
1820 x-get-selection-internal (usually x-get-selection) can know
1821 that the string must be decode. */
1822 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1823 lispy_type = QCOMPOUND_TEXT;
1824 else if (type == dpyinfo->Xatom_UTF8_STRING)
1825 lispy_type = QUTF8_STRING;
1826 else
1827 lispy_type = QSTRING;
1828 Fput_text_property (make_number (0), make_number (size),
1829 Qforeign_selection, lispy_type, str);
1830 return str;
1832 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1833 a vector of symbols.
1835 else if (type == XA_ATOM)
1837 int i;
1838 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1839 But the callers of these function has made sure the data for
1840 format == 32 is an array of int. Thus, use int instead
1841 of Atom. */
1842 int *idata = (int *) data;
1844 if (size == sizeof (int))
1845 return x_atom_to_symbol (display, (Atom) idata[0]);
1846 else
1848 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
1849 make_number (0));
1850 for (i = 0; i < size / sizeof (int); i++)
1851 Faset (v, make_number (i),
1852 x_atom_to_symbol (display, (Atom) idata[i]));
1853 return v;
1857 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1858 If the number is > 16 bits, convert it to a cons of integers,
1859 16 bits in each half.
1861 else if (format == 32 && size == sizeof (int))
1862 return long_to_cons (((unsigned int *) data) [0]);
1863 else if (format == 16 && size == sizeof (short))
1864 return make_number ((int) (((unsigned short *) data) [0]));
1866 /* Convert any other kind of data to a vector of numbers, represented
1867 as above (as an integer, or a cons of two 16 bit integers.)
1869 else if (format == 16)
1871 int i;
1872 Lisp_Object v;
1873 v = Fmake_vector (make_number (size / 2), make_number (0));
1874 for (i = 0; i < size / 2; i++)
1876 int j = (int) ((unsigned short *) data) [i];
1877 Faset (v, make_number (i), make_number (j));
1879 return v;
1881 else
1883 int i;
1884 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0));
1885 for (i = 0; i < size / 4; i++)
1887 unsigned int j = ((unsigned int *) data) [i];
1888 Faset (v, make_number (i), long_to_cons (j));
1890 return v;
1895 /* Use xfree, not XFree, to free the data obtained with this function. */
1897 static void
1898 lisp_data_to_selection_data (display, obj,
1899 data_ret, type_ret, size_ret,
1900 format_ret, nofree_ret)
1901 Display *display;
1902 Lisp_Object obj;
1903 unsigned char **data_ret;
1904 Atom *type_ret;
1905 unsigned int *size_ret;
1906 int *format_ret;
1907 int *nofree_ret;
1909 Lisp_Object type = Qnil;
1910 struct x_display_info *dpyinfo = x_display_info_for_display (display);
1912 *nofree_ret = 0;
1914 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
1916 type = XCAR (obj);
1917 obj = XCDR (obj);
1918 if (CONSP (obj) && NILP (XCDR (obj)))
1919 obj = XCAR (obj);
1922 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1923 { /* This is not the same as declining */
1924 *format_ret = 32;
1925 *size_ret = 0;
1926 *data_ret = 0;
1927 type = QNULL;
1929 else if (STRINGP (obj))
1931 if (SCHARS (obj) < SBYTES (obj))
1932 /* OBJ is a multibyte string containing a non-ASCII char. */
1933 signal_error ("Non-ASCII string must be encoded in advance", obj);
1934 if (NILP (type))
1935 type = QSTRING;
1936 *format_ret = 8;
1937 *size_ret = SBYTES (obj);
1938 *data_ret = SDATA (obj);
1939 *nofree_ret = 1;
1941 else if (SYMBOLP (obj))
1943 *format_ret = 32;
1944 *size_ret = 1;
1945 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
1946 (*data_ret) [sizeof (Atom)] = 0;
1947 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj);
1948 if (NILP (type)) type = QATOM;
1950 else if (INTEGERP (obj)
1951 && XINT (obj) < 0xFFFF
1952 && XINT (obj) > -0xFFFF)
1954 *format_ret = 16;
1955 *size_ret = 1;
1956 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
1957 (*data_ret) [sizeof (short)] = 0;
1958 (*(short **) data_ret) [0] = (short) XINT (obj);
1959 if (NILP (type)) type = QINTEGER;
1961 else if (INTEGERP (obj)
1962 || (CONSP (obj) && INTEGERP (XCAR (obj))
1963 && (INTEGERP (XCDR (obj))
1964 || (CONSP (XCDR (obj))
1965 && INTEGERP (XCAR (XCDR (obj)))))))
1967 *format_ret = 32;
1968 *size_ret = 1;
1969 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
1970 (*data_ret) [sizeof (long)] = 0;
1971 (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
1972 if (NILP (type)) type = QINTEGER;
1974 else if (VECTORP (obj))
1976 /* Lisp_Vectors may represent a set of ATOMs;
1977 a set of 16 or 32 bit INTEGERs;
1978 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1980 int i;
1982 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1983 /* This vector is an ATOM set */
1985 if (NILP (type)) type = QATOM;
1986 *size_ret = XVECTOR (obj)->size;
1987 *format_ret = 32;
1988 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
1989 for (i = 0; i < *size_ret; i++)
1990 if (SYMBOLP (XVECTOR (obj)->contents [i]))
1991 (*(Atom **) data_ret) [i]
1992 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]);
1993 else
1994 signal_error ("All elements of selection vector must have same type", obj);
1996 #if 0 /* #### MULTIPLE doesn't work yet */
1997 else if (VECTORP (XVECTOR (obj)->contents [0]))
1998 /* This vector is an ATOM_PAIR set */
2000 if (NILP (type)) type = QATOM_PAIR;
2001 *size_ret = XVECTOR (obj)->size;
2002 *format_ret = 32;
2003 *data_ret = (unsigned char *)
2004 xmalloc ((*size_ret) * sizeof (Atom) * 2);
2005 for (i = 0; i < *size_ret; i++)
2006 if (VECTORP (XVECTOR (obj)->contents [i]))
2008 Lisp_Object pair = XVECTOR (obj)->contents [i];
2009 if (XVECTOR (pair)->size != 2)
2010 signal_error (
2011 "Elements of the vector must be vectors of exactly two elements",
2012 pair);
2014 (*(Atom **) data_ret) [i * 2]
2015 = symbol_to_x_atom (dpyinfo, display,
2016 XVECTOR (pair)->contents [0]);
2017 (*(Atom **) data_ret) [(i * 2) + 1]
2018 = symbol_to_x_atom (dpyinfo, display,
2019 XVECTOR (pair)->contents [1]);
2021 else
2022 signal_error ("All elements of the vector must be of the same type",
2023 obj);
2026 #endif
2027 else
2028 /* This vector is an INTEGER set, or something like it */
2030 int data_size = 2;
2031 *size_ret = XVECTOR (obj)->size;
2032 if (NILP (type)) type = QINTEGER;
2033 *format_ret = 16;
2034 for (i = 0; i < *size_ret; i++)
2035 if (CONSP (XVECTOR (obj)->contents [i]))
2036 *format_ret = 32;
2037 else if (!INTEGERP (XVECTOR (obj)->contents [i]))
2038 signal_error (/* Qselection_error */
2039 "Elements of selection vector must be integers or conses of integers",
2040 obj);
2042 /* Use sizeof(long) even if it is more than 32 bits. See comment
2043 in x_get_window_property and x_fill_property_data. */
2045 if (*format_ret == 32) data_size = sizeof(long);
2046 *data_ret = (unsigned char *) xmalloc (*size_ret * data_size);
2047 for (i = 0; i < *size_ret; i++)
2048 if (*format_ret == 32)
2049 (*((unsigned long **) data_ret)) [i]
2050 = cons_to_long (XVECTOR (obj)->contents [i]);
2051 else
2052 (*((unsigned short **) data_ret)) [i]
2053 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
2056 else
2057 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
2059 *type_ret = symbol_to_x_atom (dpyinfo, display, type);
2062 static Lisp_Object
2063 clean_local_selection_data (obj)
2064 Lisp_Object obj;
2066 if (CONSP (obj)
2067 && INTEGERP (XCAR (obj))
2068 && CONSP (XCDR (obj))
2069 && INTEGERP (XCAR (XCDR (obj)))
2070 && NILP (XCDR (XCDR (obj))))
2071 obj = Fcons (XCAR (obj), XCDR (obj));
2073 if (CONSP (obj)
2074 && INTEGERP (XCAR (obj))
2075 && INTEGERP (XCDR (obj)))
2077 if (XINT (XCAR (obj)) == 0)
2078 return XCDR (obj);
2079 if (XINT (XCAR (obj)) == -1)
2080 return make_number (- XINT (XCDR (obj)));
2082 if (VECTORP (obj))
2084 int i;
2085 int size = XVECTOR (obj)->size;
2086 Lisp_Object copy;
2087 if (size == 1)
2088 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
2089 copy = Fmake_vector (make_number (size), Qnil);
2090 for (i = 0; i < size; i++)
2091 XVECTOR (copy)->contents [i]
2092 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
2093 return copy;
2095 return obj;
2098 /* Called from XTread_socket to handle SelectionNotify events.
2099 If it's the selection we are waiting for, stop waiting
2100 by setting the car of reading_selection_reply to non-nil.
2101 We store t there if the reply is successful, lambda if not. */
2103 void
2104 x_handle_selection_notify (event)
2105 XSelectionEvent *event;
2107 if (event->requestor != reading_selection_window)
2108 return;
2109 if (event->selection != reading_which_selection)
2110 return;
2112 TRACE0 ("Received SelectionNotify");
2113 XSETCAR (reading_selection_reply,
2114 (event->property != 0 ? Qt : Qlambda));
2118 DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
2119 Sx_own_selection_internal, 2, 2, 0,
2120 doc: /* Assert an X selection of the given TYPE with the given VALUE.
2121 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2122 \(Those are literal upper-case symbol names, since that's what X expects.)
2123 VALUE is typically a string, or a cons of two markers, but may be
2124 anything that the functions on `selection-converter-alist' know about. */)
2125 (selection_name, selection_value)
2126 Lisp_Object selection_name, selection_value;
2128 check_x ();
2129 CHECK_SYMBOL (selection_name);
2130 if (NILP (selection_value)) error ("SELECTION-VALUE may not be nil");
2131 x_own_selection (selection_name, selection_value);
2132 return selection_value;
2136 /* Request the selection value from the owner. If we are the owner,
2137 simply return our selection value. If we are not the owner, this
2138 will block until all of the data has arrived. */
2140 DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
2141 Sx_get_selection_internal, 2, 3, 0,
2142 doc: /* Return text selected from some X window.
2143 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2144 \(Those are literal upper-case symbol names, since that's what X expects.)
2145 TYPE is the type of data desired, typically `STRING'.
2146 TIME_STAMP is the time to use in the XConvertSelection call for foreign
2147 selections. If omitted, defaults to the time for the last event. */)
2148 (selection_symbol, target_type, time_stamp)
2149 Lisp_Object selection_symbol, target_type, time_stamp;
2151 Lisp_Object val = Qnil;
2152 struct gcpro gcpro1, gcpro2;
2153 GCPRO2 (target_type, val); /* we store newly consed data into these */
2154 check_x ();
2155 CHECK_SYMBOL (selection_symbol);
2157 #if 0 /* #### MULTIPLE doesn't work yet */
2158 if (CONSP (target_type)
2159 && XCAR (target_type) == QMULTIPLE)
2161 CHECK_VECTOR (XCDR (target_type));
2162 /* So we don't destructively modify this... */
2163 target_type = copy_multiple_data (target_type);
2165 else
2166 #endif
2167 CHECK_SYMBOL (target_type);
2169 val = x_get_local_selection (selection_symbol, target_type, 1);
2171 if (NILP (val))
2173 val = x_get_foreign_selection (selection_symbol, target_type, time_stamp);
2174 goto DONE;
2177 if (CONSP (val)
2178 && SYMBOLP (XCAR (val)))
2180 val = XCDR (val);
2181 if (CONSP (val) && NILP (XCDR (val)))
2182 val = XCAR (val);
2184 val = clean_local_selection_data (val);
2185 DONE:
2186 UNGCPRO;
2187 return val;
2190 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
2191 Sx_disown_selection_internal, 1, 2, 0,
2192 doc: /* If we own the selection SELECTION, disown it.
2193 Disowning it means there is no such selection. */)
2194 (selection, time)
2195 Lisp_Object selection;
2196 Lisp_Object time;
2198 Time timestamp;
2199 Atom selection_atom;
2200 union {
2201 struct selection_input_event sie;
2202 struct input_event ie;
2203 } event;
2204 Display *display;
2205 struct x_display_info *dpyinfo;
2206 struct frame *sf = SELECTED_FRAME ();
2208 check_x ();
2209 display = FRAME_X_DISPLAY (sf);
2210 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
2211 CHECK_SYMBOL (selection);
2212 if (NILP (time))
2213 timestamp = last_event_timestamp;
2214 else
2215 timestamp = cons_to_long (time);
2217 if (NILP (assq_no_quit (selection, Vselection_alist)))
2218 return Qnil; /* Don't disown the selection when we're not the owner. */
2220 selection_atom = symbol_to_x_atom (dpyinfo, display, selection);
2222 BLOCK_INPUT;
2223 XSetSelectionOwner (display, selection_atom, None, timestamp);
2224 UNBLOCK_INPUT;
2226 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2227 generated for a window which owns the selection when that window sets
2228 the selection owner to None. The NCD server does, the MIT Sun4 server
2229 doesn't. So we synthesize one; this means we might get two, but
2230 that's ok, because the second one won't have any effect. */
2231 SELECTION_EVENT_DISPLAY (&event.sie) = display;
2232 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2233 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2234 x_handle_selection_clear (&event.ie);
2236 return Qt;
2239 /* Get rid of all the selections in buffer BUFFER.
2240 This is used when we kill a buffer. */
2242 void
2243 x_disown_buffer_selections (buffer)
2244 Lisp_Object buffer;
2246 Lisp_Object tail;
2247 struct buffer *buf = XBUFFER (buffer);
2249 for (tail = Vselection_alist; CONSP (tail); tail = XCDR (tail))
2251 Lisp_Object elt, value;
2252 elt = XCAR (tail);
2253 value = XCDR (elt);
2254 if (CONSP (value) && MARKERP (XCAR (value))
2255 && XMARKER (XCAR (value))->buffer == buf)
2256 Fx_disown_selection_internal (XCAR (elt), Qnil);
2260 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
2261 0, 1, 0,
2262 doc: /* Whether the current Emacs process owns the given X Selection.
2263 The arg should be the name of the selection in question, typically one of
2264 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2265 \(Those are literal upper-case symbol names, since that's what X expects.)
2266 For convenience, the symbol nil is the same as `PRIMARY',
2267 and t is the same as `SECONDARY'. */)
2268 (selection)
2269 Lisp_Object selection;
2271 check_x ();
2272 CHECK_SYMBOL (selection);
2273 if (EQ (selection, Qnil)) selection = QPRIMARY;
2274 if (EQ (selection, Qt)) selection = QSECONDARY;
2276 if (NILP (Fassq (selection, Vselection_alist)))
2277 return Qnil;
2278 return Qt;
2281 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
2282 0, 1, 0,
2283 doc: /* Whether there is an owner for the given X Selection.
2284 The arg should be the name of the selection in question, typically one of
2285 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2286 \(Those are literal upper-case symbol names, since that's what X expects.)
2287 For convenience, the symbol nil is the same as `PRIMARY',
2288 and t is the same as `SECONDARY'. */)
2289 (selection)
2290 Lisp_Object selection;
2292 Window owner;
2293 Atom atom;
2294 Display *dpy;
2295 struct frame *sf = SELECTED_FRAME ();
2297 /* It should be safe to call this before we have an X frame. */
2298 if (! FRAME_X_P (sf))
2299 return Qnil;
2301 dpy = FRAME_X_DISPLAY (sf);
2302 CHECK_SYMBOL (selection);
2303 if (!NILP (Fx_selection_owner_p (selection)))
2304 return Qt;
2305 if (EQ (selection, Qnil)) selection = QPRIMARY;
2306 if (EQ (selection, Qt)) selection = QSECONDARY;
2307 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection);
2308 if (atom == 0)
2309 return Qnil;
2310 BLOCK_INPUT;
2311 owner = XGetSelectionOwner (dpy, atom);
2312 UNBLOCK_INPUT;
2313 return (owner ? Qt : Qnil);
2317 #ifdef CUT_BUFFER_SUPPORT
2319 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2320 static void
2321 initialize_cut_buffers (display, window)
2322 Display *display;
2323 Window window;
2325 unsigned char *data = (unsigned char *) "";
2326 BLOCK_INPUT;
2327 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2328 PropModeAppend, data, 0)
2329 FROB (XA_CUT_BUFFER0);
2330 FROB (XA_CUT_BUFFER1);
2331 FROB (XA_CUT_BUFFER2);
2332 FROB (XA_CUT_BUFFER3);
2333 FROB (XA_CUT_BUFFER4);
2334 FROB (XA_CUT_BUFFER5);
2335 FROB (XA_CUT_BUFFER6);
2336 FROB (XA_CUT_BUFFER7);
2337 #undef FROB
2338 UNBLOCK_INPUT;
2342 #define CHECK_CUT_BUFFER(symbol) \
2343 do { CHECK_SYMBOL ((symbol)); \
2344 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2345 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2346 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2347 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2348 signal_error ("Doesn't name a cut buffer", (symbol)); \
2349 } while (0)
2351 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
2352 Sx_get_cut_buffer_internal, 1, 1, 0,
2353 doc: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */)
2354 (buffer)
2355 Lisp_Object buffer;
2357 Window window;
2358 Atom buffer_atom;
2359 unsigned char *data;
2360 int bytes;
2361 Atom type;
2362 int format;
2363 unsigned long size;
2364 Lisp_Object ret;
2365 Display *display;
2366 struct x_display_info *dpyinfo;
2367 struct frame *sf = SELECTED_FRAME ();
2369 check_x ();
2370 display = FRAME_X_DISPLAY (sf);
2371 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
2372 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2373 CHECK_CUT_BUFFER (buffer);
2374 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer);
2376 x_get_window_property (display, window, buffer_atom, &data, &bytes,
2377 &type, &format, &size, 0);
2378 if (!data || !format)
2379 return Qnil;
2381 if (format != 8 || type != XA_STRING)
2382 signal_error ("Cut buffer doesn't contain 8-bit data",
2383 list2 (x_atom_to_symbol (display, type),
2384 make_number (format)));
2386 ret = (bytes ? make_unibyte_string ((char *) data, bytes) : Qnil);
2387 /* Use xfree, not XFree, because x_get_window_property
2388 calls xmalloc itself. */
2389 xfree (data);
2390 return ret;
2394 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal,
2395 Sx_store_cut_buffer_internal, 2, 2, 0,
2396 doc: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
2397 (buffer, string)
2398 Lisp_Object buffer, string;
2400 Window window;
2401 Atom buffer_atom;
2402 unsigned char *data;
2403 int bytes;
2404 int bytes_remaining;
2405 int max_bytes;
2406 Display *display;
2407 struct frame *sf = SELECTED_FRAME ();
2409 check_x ();
2410 display = FRAME_X_DISPLAY (sf);
2411 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2413 max_bytes = SELECTION_QUANTUM (display);
2414 if (max_bytes > MAX_SELECTION_QUANTUM)
2415 max_bytes = MAX_SELECTION_QUANTUM;
2417 CHECK_CUT_BUFFER (buffer);
2418 CHECK_STRING (string);
2419 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf),
2420 display, buffer);
2421 data = (unsigned char *) SDATA (string);
2422 bytes = SBYTES (string);
2423 bytes_remaining = bytes;
2425 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
2427 initialize_cut_buffers (display, window);
2428 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
2431 BLOCK_INPUT;
2433 /* Don't mess up with an empty value. */
2434 if (!bytes_remaining)
2435 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2436 PropModeReplace, data, 0);
2438 while (bytes_remaining)
2440 int chunk = (bytes_remaining < max_bytes
2441 ? bytes_remaining : max_bytes);
2442 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2443 (bytes_remaining == bytes
2444 ? PropModeReplace
2445 : PropModeAppend),
2446 data, chunk);
2447 data += chunk;
2448 bytes_remaining -= chunk;
2450 UNBLOCK_INPUT;
2451 return string;
2455 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal,
2456 Sx_rotate_cut_buffers_internal, 1, 1, 0,
2457 doc: /* Rotate the values of the cut buffers by the given number of step.
2458 Positive means shift the values forward, negative means backward. */)
2460 Lisp_Object n;
2462 Window window;
2463 Atom props[8];
2464 Display *display;
2465 struct frame *sf = SELECTED_FRAME ();
2467 check_x ();
2468 display = FRAME_X_DISPLAY (sf);
2469 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2470 CHECK_NUMBER (n);
2471 if (XINT (n) == 0)
2472 return n;
2473 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
2475 initialize_cut_buffers (display, window);
2476 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
2479 props[0] = XA_CUT_BUFFER0;
2480 props[1] = XA_CUT_BUFFER1;
2481 props[2] = XA_CUT_BUFFER2;
2482 props[3] = XA_CUT_BUFFER3;
2483 props[4] = XA_CUT_BUFFER4;
2484 props[5] = XA_CUT_BUFFER5;
2485 props[6] = XA_CUT_BUFFER6;
2486 props[7] = XA_CUT_BUFFER7;
2487 BLOCK_INPUT;
2488 XRotateWindowProperties (display, window, props, 8, XINT (n));
2489 UNBLOCK_INPUT;
2490 return n;
2493 #endif
2495 /***********************************************************************
2496 Drag and drop support
2497 ***********************************************************************/
2498 /* Check that lisp values are of correct type for x_fill_property_data.
2499 That is, number, string or a cons with two numbers (low and high 16
2500 bit parts of a 32 bit number). */
2503 x_check_property_data (data)
2504 Lisp_Object data;
2506 Lisp_Object iter;
2507 int size = 0;
2509 for (iter = data; CONSP (iter) && size != -1; iter = XCDR (iter), ++size)
2511 Lisp_Object o = XCAR (iter);
2513 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
2514 size = -1;
2515 else if (CONSP (o) &&
2516 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
2517 size = -1;
2520 return size;
2523 /* Convert lisp values to a C array. Values may be a number, a string
2524 which is taken as an X atom name and converted to the atom value, or
2525 a cons containing the two 16 bit parts of a 32 bit number.
2527 DPY is the display use to look up X atoms.
2528 DATA is a Lisp list of values to be converted.
2529 RET is the C array that contains the converted values. It is assumed
2530 it is big enough to hold all values.
2531 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2532 be stored in RET. Note that long is used for 32 even if long is more
2533 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2534 XClientMessageEvent). */
2536 void
2537 x_fill_property_data (dpy, data, ret, format)
2538 Display *dpy;
2539 Lisp_Object data;
2540 void *ret;
2541 int format;
2543 long val;
2544 long *d32 = (long *) ret;
2545 short *d16 = (short *) ret;
2546 char *d08 = (char *) ret;
2547 Lisp_Object iter;
2549 for (iter = data; CONSP (iter); iter = XCDR (iter))
2551 Lisp_Object o = XCAR (iter);
2553 if (INTEGERP (o))
2554 val = (long) XFASTINT (o);
2555 else if (FLOATP (o))
2556 val = (long) XFLOAT_DATA (o);
2557 else if (CONSP (o))
2558 val = (long) cons_to_long (o);
2559 else if (STRINGP (o))
2561 BLOCK_INPUT;
2562 val = (long) XInternAtom (dpy, (char *) SDATA (o), False);
2563 UNBLOCK_INPUT;
2565 else
2566 error ("Wrong type, must be string, number or cons");
2568 if (format == 8)
2569 *d08++ = (char) val;
2570 else if (format == 16)
2571 *d16++ = (short) val;
2572 else
2573 *d32++ = val;
2577 /* Convert an array of C values to a Lisp list.
2578 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2579 DATA is a C array of values to be converted.
2580 TYPE is the type of the data. Only XA_ATOM is special, it converts
2581 each number in DATA to its corresponfing X atom as a symbol.
2582 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2583 be stored in RET.
2584 SIZE is the number of elements in DATA.
2586 Important: When format is 32, data should contain an array of int,
2587 not an array of long as the X library returns. This makes a difference
2588 when sizeof(long) != sizeof(int).
2590 Also see comment for selection_data_to_lisp_data above. */
2592 Lisp_Object
2593 x_property_data_to_lisp (f, data, type, format, size)
2594 struct frame *f;
2595 unsigned char *data;
2596 Atom type;
2597 int format;
2598 unsigned long size;
2600 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
2601 data, size*format/8, type, format);
2604 /* Get the mouse position in frame relative coordinates. */
2606 static void
2607 mouse_position_for_drop (f, x, y)
2608 FRAME_PTR f;
2609 int *x;
2610 int *y;
2612 Window root, dummy_window;
2613 int dummy;
2615 BLOCK_INPUT;
2617 XQueryPointer (FRAME_X_DISPLAY (f),
2618 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2620 /* The root window which contains the pointer. */
2621 &root,
2623 /* Window pointer is on, not used */
2624 &dummy_window,
2626 /* The position on that root window. */
2627 x, y,
2629 /* x/y in dummy_window coordinates, not used. */
2630 &dummy, &dummy,
2632 /* Modifier keys and pointer buttons, about which
2633 we don't care. */
2634 (unsigned int *) &dummy);
2637 /* Absolute to relative. */
2638 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2639 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2641 UNBLOCK_INPUT;
2644 DEFUN ("x-get-atom-name", Fx_get_atom_name,
2645 Sx_get_atom_name, 1, 2, 0,
2646 doc: /* Return the X atom name for VALUE as a string.
2647 VALUE may be a number or a cons where the car is the upper 16 bits and
2648 the cdr is the lower 16 bits of a 32 bit value.
2649 Use the display for FRAME or the current frame if FRAME is not given or nil.
2651 If the value is 0 or the atom is not known, return the empty string. */)
2652 (value, frame)
2653 Lisp_Object value, frame;
2655 struct frame *f = check_x_frame (frame);
2656 char *name = 0;
2657 Lisp_Object ret = Qnil;
2658 Display *dpy = FRAME_X_DISPLAY (f);
2659 Atom atom;
2660 int had_errors;
2662 if (INTEGERP (value))
2663 atom = (Atom) XUINT (value);
2664 else if (FLOATP (value))
2665 atom = (Atom) XFLOAT_DATA (value);
2666 else if (CONSP (value))
2667 atom = (Atom) cons_to_long (value);
2668 else
2669 error ("Wrong type, value must be number or cons");
2671 BLOCK_INPUT;
2672 x_catch_errors (dpy);
2673 name = atom ? XGetAtomName (dpy, atom) : "";
2674 had_errors = x_had_errors_p (dpy);
2675 x_uncatch_errors ();
2677 if (!had_errors)
2678 ret = make_string (name, strlen (name));
2680 if (atom && name) XFree (name);
2681 if (NILP (ret)) ret = make_string ("", 0);
2683 UNBLOCK_INPUT;
2685 return ret;
2688 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2689 Sx_register_dnd_atom, 1, 2, 0,
2690 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2691 ATOM can be a symbol or a string. The ATOM is interned on the display that
2692 FRAME is on. If FRAME is nil, the selected frame is used. */)
2693 (atom, frame)
2694 Lisp_Object atom, frame;
2696 Atom x_atom;
2697 struct frame *f = check_x_frame (frame);
2698 size_t i;
2699 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2702 if (SYMBOLP (atom))
2703 x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom);
2704 else if (STRINGP (atom))
2706 BLOCK_INPUT;
2707 x_atom = XInternAtom (FRAME_X_DISPLAY (f), (char *) SDATA (atom), False);
2708 UNBLOCK_INPUT;
2710 else
2711 error ("ATOM must be a symbol or a string");
2713 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2714 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2715 return Qnil;
2717 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
2719 dpyinfo->x_dnd_atoms_size *= 2;
2720 dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms,
2721 sizeof (*dpyinfo->x_dnd_atoms)
2722 * dpyinfo->x_dnd_atoms_size);
2725 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2726 return Qnil;
2729 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2732 x_handle_dnd_message (f, event, dpyinfo, bufp)
2733 struct frame *f;
2734 XClientMessageEvent *event;
2735 struct x_display_info *dpyinfo;
2736 struct input_event *bufp;
2738 Lisp_Object vec;
2739 Lisp_Object frame;
2740 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2741 unsigned long size = 160/event->format;
2742 int x, y;
2743 unsigned char *data = (unsigned char *) event->data.b;
2744 int idata[5];
2745 size_t i;
2747 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
2748 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2750 if (i == dpyinfo->x_dnd_atoms_length) return 0;
2752 XSETFRAME (frame, f);
2754 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2755 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2756 function expects them to be of size int (i.e. 32). So to be able to
2757 use that function, put the data in the form it expects if format is 32. */
2759 if (event->format == 32 && event->format < BITS_PER_LONG)
2761 int i;
2762 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
2763 idata[i] = (int) event->data.l[i];
2764 data = (unsigned char *) idata;
2767 vec = Fmake_vector (make_number (4), Qnil);
2768 AREF (vec, 0) = SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2769 event->message_type));
2770 AREF (vec, 1) = frame;
2771 AREF (vec, 2) = make_number (event->format);
2772 AREF (vec, 3) = x_property_data_to_lisp (f,
2773 data,
2774 event->message_type,
2775 event->format,
2776 size);
2778 mouse_position_for_drop (f, &x, &y);
2779 bufp->kind = DRAG_N_DROP_EVENT;
2780 bufp->frame_or_window = frame;
2781 bufp->timestamp = CurrentTime;
2782 bufp->x = make_number (x);
2783 bufp->y = make_number (y);
2784 bufp->arg = vec;
2785 bufp->modifiers = 0;
2787 return 1;
2790 DEFUN ("x-send-client-message", Fx_send_client_event,
2791 Sx_send_client_message, 6, 6, 0,
2792 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2794 For DISPLAY, specify either a frame or a display name (a string).
2795 If DISPLAY is nil, that stands for the selected frame's display.
2796 DEST may be a number, in which case it is a Window id. The value 0 may
2797 be used to send to the root window of the DISPLAY.
2798 If DEST is a cons, it is converted to a 32 bit number
2799 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2800 number is then used as a window id.
2801 If DEST is a frame the event is sent to the outer window of that frame.
2802 Nil means the currently selected frame.
2803 If DEST is the string "PointerWindow" the event is sent to the window that
2804 contains the pointer. If DEST is the string "InputFocus" the event is
2805 sent to the window that has the input focus.
2806 FROM is the frame sending the event. Use nil for currently selected frame.
2807 MESSAGE-TYPE is the name of an Atom as a string.
2808 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2809 bits. VALUES is a list of numbers, cons and/or strings containing the values
2810 to send. If a value is a string, it is converted to an Atom and the value of
2811 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2812 with the high 16 bits from the car and the lower 16 bit from the cdr.
2813 If more values than fits into the event is given, the excessive values
2814 are ignored. */)
2815 (display, dest, from, message_type, format, values)
2816 Lisp_Object display, dest, from, message_type, format, values;
2818 struct x_display_info *dpyinfo = check_x_display_info (display);
2819 Window wdest;
2820 XEvent event;
2821 Lisp_Object cons;
2822 int size;
2823 struct frame *f = check_x_frame (from);
2824 int to_root;
2826 CHECK_STRING (message_type);
2827 CHECK_NUMBER (format);
2828 CHECK_CONS (values);
2830 if (x_check_property_data (values) == -1)
2831 error ("Bad data in VALUES, must be number, cons or string");
2833 event.xclient.type = ClientMessage;
2834 event.xclient.format = XFASTINT (format);
2836 if (event.xclient.format != 8 && event.xclient.format != 16
2837 && event.xclient.format != 32)
2838 error ("FORMAT must be one of 8, 16 or 32");
2840 if (FRAMEP (dest) || NILP (dest))
2842 struct frame *fdest = check_x_frame (dest);
2843 wdest = FRAME_OUTER_WINDOW (fdest);
2845 else if (STRINGP (dest))
2847 if (strcmp (SDATA (dest), "PointerWindow") == 0)
2848 wdest = PointerWindow;
2849 else if (strcmp (SDATA (dest), "InputFocus") == 0)
2850 wdest = InputFocus;
2851 else
2852 error ("DEST as a string must be one of PointerWindow or InputFocus");
2854 else if (INTEGERP (dest))
2855 wdest = (Window) XFASTINT (dest);
2856 else if (FLOATP (dest))
2857 wdest = (Window) XFLOAT_DATA (dest);
2858 else if (CONSP (dest))
2860 if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest)))
2861 error ("Both car and cdr for DEST must be numbers");
2862 else
2863 wdest = (Window) cons_to_long (dest);
2865 else
2866 error ("DEST must be a frame, nil, string, number or cons");
2868 if (wdest == 0) wdest = dpyinfo->root_window;
2869 to_root = wdest == dpyinfo->root_window;
2871 for (cons = values, size = 0; CONSP (cons); cons = XCDR (cons), ++size)
2874 BLOCK_INPUT;
2876 event.xclient.message_type
2877 = XInternAtom (dpyinfo->display, SDATA (message_type), False);
2878 event.xclient.display = dpyinfo->display;
2880 /* Some clients (metacity for example) expects sending window to be here
2881 when sending to the root window. */
2882 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2885 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2886 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2887 event.xclient.format);
2889 /* If event mask is 0 the event is sent to the client that created
2890 the destination window. But if we are sending to the root window,
2891 there is no such client. Then we set the event mask to 0xffff. The
2892 event then goes to clients selecting for events on the root window. */
2893 x_catch_errors (dpyinfo->display);
2895 int propagate = to_root ? False : True;
2896 unsigned mask = to_root ? 0xffff : 0;
2897 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2898 XFlush (dpyinfo->display);
2900 x_uncatch_errors ();
2901 UNBLOCK_INPUT;
2903 return Qnil;
2907 void
2908 syms_of_xselect ()
2910 defsubr (&Sx_get_selection_internal);
2911 defsubr (&Sx_own_selection_internal);
2912 defsubr (&Sx_disown_selection_internal);
2913 defsubr (&Sx_selection_owner_p);
2914 defsubr (&Sx_selection_exists_p);
2916 #ifdef CUT_BUFFER_SUPPORT
2917 defsubr (&Sx_get_cut_buffer_internal);
2918 defsubr (&Sx_store_cut_buffer_internal);
2919 defsubr (&Sx_rotate_cut_buffers_internal);
2920 #endif
2922 defsubr (&Sx_get_atom_name);
2923 defsubr (&Sx_send_client_message);
2924 defsubr (&Sx_register_dnd_atom);
2926 reading_selection_reply = Fcons (Qnil, Qnil);
2927 staticpro (&reading_selection_reply);
2928 reading_selection_window = 0;
2929 reading_which_selection = 0;
2931 property_change_wait_list = 0;
2932 prop_location_identifier = 0;
2933 property_change_reply = Fcons (Qnil, Qnil);
2934 staticpro (&property_change_reply);
2936 Vselection_alist = Qnil;
2937 staticpro (&Vselection_alist);
2939 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
2940 doc: /* An alist associating X Windows selection-types with functions.
2941 These functions are called to convert the selection, with three args:
2942 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2943 a desired type to which the selection should be converted;
2944 and the local selection value (whatever was given to `x-own-selection').
2946 The function should return the value to send to the X server
2947 \(typically a string). A return value of nil
2948 means that the conversion could not be done.
2949 A return value which is the symbol `NULL'
2950 means that a side-effect was executed,
2951 and there is no meaningful selection value. */);
2952 Vselection_converter_alist = Qnil;
2954 DEFVAR_LISP ("x-lost-selection-functions", &Vx_lost_selection_functions,
2955 doc: /* A list of functions to be called when Emacs loses an X selection.
2956 \(This happens when some other X client makes its own selection
2957 or when a Lisp program explicitly clears the selection.)
2958 The functions are called with one argument, the selection type
2959 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2960 Vx_lost_selection_functions = Qnil;
2962 DEFVAR_LISP ("x-sent-selection-functions", &Vx_sent_selection_functions,
2963 doc: /* A list of functions to be called when Emacs answers a selection request.
2964 The functions are called with four arguments:
2965 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2966 - the selection-type which Emacs was asked to convert the
2967 selection into before sending (for example, `STRING' or `LENGTH');
2968 - a flag indicating success or failure for responding to the request.
2969 We might have failed (and declined the request) for any number of reasons,
2970 including being asked for a selection that we no longer own, or being asked
2971 to convert into a type that we don't know about or that is inappropriate.
2972 This hook doesn't let you change the behavior of Emacs's selection replies,
2973 it merely informs you that they have happened. */);
2974 Vx_sent_selection_functions = Qnil;
2976 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system,
2977 doc: /* Coding system for communicating with other X clients.
2979 When sending text via selection and clipboard, if the requested
2980 data-type is not "UTF8_STRING", the text is encoded by this coding
2981 system.
2983 When receiving text, if the data-type of the received text is not
2984 "UTF8_STRING", it is decoded by this coding system.
2986 See also the documentation of the variable `x-select-request-type' how
2987 to control which data-type to request for receiving text.
2989 The default value is `compound-text-with-extensions'. */);
2990 Vselection_coding_system = intern ("compound-text-with-extensions");
2992 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system,
2993 doc: /* Coding system for the next communication with other X clients.
2994 Usually, `selection-coding-system' is used for communicating with
2995 other X clients. But, if this variable is set, it is used for the
2996 next communication only. After the communication, this variable is
2997 set to nil. */);
2998 Vnext_selection_coding_system = Qnil;
3000 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
3001 doc: /* Number of milliseconds to wait for a selection reply.
3002 If the selection owner doesn't reply in this time, we give up.
3003 A value of 0 means wait as long as necessary. This is initialized from the
3004 \"*selectionTimeout\" resource. */);
3005 x_selection_timeout = 0;
3007 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY);
3008 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY);
3009 QSTRING = intern ("STRING"); staticpro (&QSTRING);
3010 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER);
3011 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
3012 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
3013 QTEXT = intern ("TEXT"); staticpro (&QTEXT);
3014 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
3015 QUTF8_STRING = intern ("UTF8_STRING"); staticpro (&QUTF8_STRING);
3016 QDELETE = intern ("DELETE"); staticpro (&QDELETE);
3017 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE);
3018 QINCR = intern ("INCR"); staticpro (&QINCR);
3019 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP);
3020 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS);
3021 QATOM = intern ("ATOM"); staticpro (&QATOM);
3022 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR);
3023 QNULL = intern ("NULL"); staticpro (&QNULL);
3024 Qcompound_text_with_extensions = intern ("compound-text-with-extensions");
3025 staticpro (&Qcompound_text_with_extensions);
3027 #ifdef CUT_BUFFER_SUPPORT
3028 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
3029 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
3030 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
3031 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
3032 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
3033 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
3034 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
3035 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
3036 #endif
3038 Qforeign_selection = intern ("foreign-selection");
3039 staticpro (&Qforeign_selection);
3042 /* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236
3043 (do not change this comment) */