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