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