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