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