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