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