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