* xselect.c (QSAVE_TARGETS): New static var, to fix build failure.
[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"
f3d4e0a4 41#include "character.h"
1fb3821b
JD
42
43#include <X11/Xproto.h>
7da64e5c 44
d9c0d4a3
GM
45struct prop_location;
46
f57e2426
J
47static Lisp_Object x_atom_to_symbol (Display *dpy, Atom atom);
48static Atom symbol_to_x_atom (struct x_display_info *, Display *,
49 Lisp_Object);
50static void x_own_selection (Lisp_Object, Lisp_Object);
51static Lisp_Object x_get_local_selection (Lisp_Object, Lisp_Object, int);
52static void x_decline_selection_request (struct input_event *);
53static Lisp_Object x_selection_request_lisp_error (Lisp_Object);
54static Lisp_Object queue_selection_requests_unwind (Lisp_Object);
55static Lisp_Object some_frame_on_display (struct x_display_info *);
56static Lisp_Object x_catch_errors_unwind (Lisp_Object);
57static void x_reply_selection_request (struct input_event *, int,
58 unsigned char *, int, Atom);
59static int waiting_for_other_props_on_window (Display *, Window);
60static struct prop_location *expect_property_change (Display *, Window,
61 Atom, int);
62static void unexpect_property_change (struct prop_location *);
63static Lisp_Object wait_for_property_change_unwind (Lisp_Object);
64static void wait_for_property_change (struct prop_location *);
65static Lisp_Object x_get_foreign_selection (Lisp_Object,
66 Lisp_Object,
67 Lisp_Object);
68static void x_get_window_property (Display *, Window, Atom,
69 unsigned char **, int *,
70 Atom *, int *, unsigned long *, int);
71static void receive_incremental_selection (Display *, Window, Atom,
72 Lisp_Object, unsigned,
73 unsigned char **, int *,
74 Atom *, int *, unsigned long *);
75static Lisp_Object x_get_window_property_as_lisp_data (Display *,
76 Window, Atom,
77 Lisp_Object, Atom);
eec47d6b
DN
78static Lisp_Object selection_data_to_lisp_data (Display *,
79 const unsigned char *,
f57e2426
J
80 int, Atom, int);
81static void lisp_data_to_selection_data (Display *, Lisp_Object,
82 unsigned char **, Atom *,
83 unsigned *, int *, int *);
84static Lisp_Object clean_local_selection_data (Lisp_Object);
d9c0d4a3
GM
85
86/* Printing traces to stderr. */
87
88#ifdef TRACE_SELECTION
89#define TRACE0(fmt) \
90 fprintf (stderr, "%d: " fmt "\n", getpid ())
91#define TRACE1(fmt, a0) \
92 fprintf (stderr, "%d: " fmt "\n", getpid (), a0)
93#define TRACE2(fmt, a0, a1) \
94 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1)
9c3ad9e1
JD
95#define TRACE3(fmt, a0, a1, a2) \
96 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1, a2)
d9c0d4a3
GM
97#else
98#define TRACE0(fmt) (void) 0
99#define TRACE1(fmt, a0) (void) 0
100#define TRACE2(fmt, a0, a1) (void) 0
101#endif
102
103
955cbe7b 104static Lisp_Object QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
ede4db72 105 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
6307db39 106 QATOM_PAIR, QSAVE_TARGETS;
ede4db72 107
955cbe7b
PE
108static Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
109static Lisp_Object QUTF8_STRING; /* This is a type of selection. */
e6c7c988 110
955cbe7b 111static Lisp_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
00b3c7ac
TT
125/* This is an association list whose elements are of the form
126 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
127 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
128 SELECTION-VALUE is the value that emacs owns for that selection.
129 It may be any kind of Lisp object.
130 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
131 as a cons of two 16-bit numbers (making a 32 bit time.)
132 FRAME is the frame for which we made the selection.
133 If there is an entry in this alist, then it can be assumed that Emacs owns
134 that selection.
135 The only (eq) parts of this list that are visible from Lisp are the
136 selection-values. */
137static Lisp_Object Vselection_alist;
138
dd0fe424
KS
139
140\f
678b3958
KS
141/* Define a queue to save up SELECTION_REQUEST_EVENT events for later
142 handling. */
dd0fe424
KS
143
144struct selection_event_queue
145 {
146 struct input_event event;
147 struct selection_event_queue *next;
148 };
149
150static struct selection_event_queue *selection_queue;
151
678b3958 152/* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
153
154static int x_queue_selection_requests;
155
678b3958 156/* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
dd0fe424
KS
157
158static void
971de7fb 159x_queue_event (struct input_event *event)
dd0fe424
KS
160{
161 struct selection_event_queue *queue_tmp;
162
678b3958
KS
163 /* Don't queue repeated requests.
164 This only happens for large requests which uses the incremental protocol. */
dd0fe424
KS
165 for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next)
166 {
72af86bd 167 if (!memcmp (&queue_tmp->event, event, sizeof (*event)))
dd0fe424 168 {
6f04d126 169 TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp);
678b3958 170 x_decline_selection_request (event);
dd0fe424
KS
171 return;
172 }
173 }
174
175 queue_tmp
176 = (struct selection_event_queue *) xmalloc (sizeof (struct selection_event_queue));
177
178 if (queue_tmp != NULL)
179 {
6f04d126 180 TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp);
dd0fe424
KS
181 queue_tmp->event = *event;
182 queue_tmp->next = selection_queue;
183 selection_queue = queue_tmp;
184 }
185}
186
678b3958 187/* Start queuing SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
188
189static void
971de7fb 190x_start_queuing_selection_requests (void)
dd0fe424
KS
191{
192 if (x_queue_selection_requests)
193 abort ();
194
195 x_queue_selection_requests++;
196 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests);
197}
198
678b3958 199/* Stop queuing SELECTION_REQUEST_EVENT events. */
dd0fe424
KS
200
201static void
971de7fb 202x_stop_queuing_selection_requests (void)
dd0fe424
KS
203{
204 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests);
205 --x_queue_selection_requests;
206
207 /* Take all the queued events and put them back
208 so that they get processed afresh. */
209
210 while (selection_queue != NULL)
211 {
212 struct selection_event_queue *queue_tmp = selection_queue;
6f04d126 213 TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp);
dd0fe424
KS
214 kbd_buffer_unget_event (&queue_tmp->event);
215 selection_queue = queue_tmp->next;
216 xfree ((char *)queue_tmp);
217 }
218}
219\f
220
1b65481e 221/* This converts a Lisp symbol to a server Atom, avoiding a server
ede4db72
RS
222 roundtrip whenever possible. */
223
224static Atom
971de7fb 225symbol_to_x_atom (struct x_display_info *dpyinfo, Display *display, Lisp_Object sym)
ede4db72
RS
226{
227 Atom val;
228 if (NILP (sym)) return 0;
229 if (EQ (sym, QPRIMARY)) return XA_PRIMARY;
230 if (EQ (sym, QSECONDARY)) return XA_SECONDARY;
231 if (EQ (sym, QSTRING)) return XA_STRING;
232 if (EQ (sym, QINTEGER)) return XA_INTEGER;
233 if (EQ (sym, QATOM)) return XA_ATOM;
5c3a351a
RS
234 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
235 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
236 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
e6c7c988 237 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
5109c8dd 238 if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING;
5c3a351a
RS
239 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
240 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
241 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
242 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP;
243 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS;
244 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL;
ede4db72
RS
245 if (!SYMBOLP (sym)) abort ();
246
51b59d79 247 TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym)));
ede4db72 248 BLOCK_INPUT;
51b59d79 249 val = XInternAtom (display, SSDATA (SYMBOL_NAME (sym)), False);
ede4db72
RS
250 UNBLOCK_INPUT;
251 return val;
252}
253
254
255/* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
256 and calls to intern whenever possible. */
257
258static Lisp_Object
971de7fb 259x_atom_to_symbol (Display *dpy, Atom atom)
ede4db72 260{
d9c0d4a3 261 struct x_display_info *dpyinfo;
ede4db72
RS
262 char *str;
263 Lisp_Object val;
1b65481e 264
d9c0d4a3
GM
265 if (! atom)
266 return Qnil;
1b65481e 267
7da64e5c
RS
268 switch (atom)
269 {
270 case XA_PRIMARY:
271 return QPRIMARY;
272 case XA_SECONDARY:
273 return QSECONDARY;
274 case XA_STRING:
275 return QSTRING;
276 case XA_INTEGER:
277 return QINTEGER;
278 case XA_ATOM:
279 return QATOM;
7da64e5c
RS
280 }
281
d9c0d4a3 282 dpyinfo = x_display_info_for_display (dpy);
5c3a351a 283 if (atom == dpyinfo->Xatom_CLIPBOARD)
7da64e5c 284 return QCLIPBOARD;
5c3a351a 285 if (atom == dpyinfo->Xatom_TIMESTAMP)
7da64e5c 286 return QTIMESTAMP;
5c3a351a 287 if (atom == dpyinfo->Xatom_TEXT)
7da64e5c 288 return QTEXT;
e6c7c988
KH
289 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
290 return QCOMPOUND_TEXT;
5109c8dd
KH
291 if (atom == dpyinfo->Xatom_UTF8_STRING)
292 return QUTF8_STRING;
5c3a351a 293 if (atom == dpyinfo->Xatom_DELETE)
7da64e5c 294 return QDELETE;
5c3a351a 295 if (atom == dpyinfo->Xatom_MULTIPLE)
7da64e5c 296 return QMULTIPLE;
5c3a351a 297 if (atom == dpyinfo->Xatom_INCR)
7da64e5c 298 return QINCR;
5c3a351a 299 if (atom == dpyinfo->Xatom_EMACS_TMP)
7da64e5c 300 return QEMACS_TMP;
5c3a351a 301 if (atom == dpyinfo->Xatom_TARGETS)
7da64e5c 302 return QTARGETS;
5c3a351a 303 if (atom == dpyinfo->Xatom_NULL)
7da64e5c 304 return QNULL;
ede4db72
RS
305
306 BLOCK_INPUT;
d9c0d4a3 307 str = XGetAtomName (dpy, atom);
ede4db72 308 UNBLOCK_INPUT;
d9c0d4a3 309 TRACE1 ("XGetAtomName --> %s", str);
ede4db72
RS
310 if (! str) return Qnil;
311 val = intern (str);
312 BLOCK_INPUT;
0158abbc 313 /* This was allocated by Xlib, so use XFree. */
ede4db72
RS
314 XFree (str);
315 UNBLOCK_INPUT;
316 return val;
317}
8a89415e 318\f
ede4db72 319/* Do protocol to assert ourself as a selection owner.
1b65481e 320 Update the Vselection_alist so that we can reply to later requests for
ede4db72
RS
321 our selection. */
322
323static void
971de7fb 324x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value)
ede4db72 325{
378c33ca 326 struct frame *sf = SELECTED_FRAME ();
428a555e
KL
327 Window selecting_window;
328 Display *display;
aa0daa9f 329 Time timestamp = last_event_timestamp;
ede4db72 330 Atom selection_atom;
428a555e 331 struct x_display_info *dpyinfo;
ede4db72 332
428a555e
KL
333 if (! FRAME_X_P (sf))
334 return;
335
336 selecting_window = FRAME_X_WINDOW (sf);
337 display = FRAME_X_DISPLAY (sf);
338 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
16041401 339
b7826503 340 CHECK_SYMBOL (selection_name);
5c3a351a 341 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_name);
ede4db72
RS
342
343 BLOCK_INPUT;
9ba8e10d 344 x_catch_errors (display);
aa0daa9f 345 XSetSelectionOwner (display, selection_atom, selecting_window, timestamp);
a7b24d46 346 x_check_errors (display, "Can't set selection: %s");
4545fa20 347 x_uncatch_errors ();
ede4db72
RS
348 UNBLOCK_INPUT;
349
350 /* Now update the local cache */
351 {
352 Lisp_Object selection_time;
353 Lisp_Object selection_data;
354 Lisp_Object prev_value;
355
6434756c 356 selection_time = long_to_cons (timestamp);
16041401
CY
357 selection_data = list4 (selection_name, selection_value,
358 selection_time, selected_frame);
ede4db72
RS
359 prev_value = assq_no_quit (selection_name, Vselection_alist);
360
361 Vselection_alist = Fcons (selection_data, Vselection_alist);
362
363 /* If we already owned the selection, remove the old selection data.
364 Perhaps we should destructively modify it instead.
365 Don't use Fdelq as that may QUIT. */
366 if (!NILP (prev_value))
367 {
368 Lisp_Object rest; /* we know it's not the CAR, so it's easy. */
99784d63 369 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest))
8e713be6 370 if (EQ (prev_value, Fcar (XCDR (rest))))
ede4db72 371 {
f3fbd155 372 XSETCDR (rest, Fcdr (XCDR (rest)));
ede4db72
RS
373 break;
374 }
375 }
376 }
377}
378\f
379/* Given a selection-name and desired type, look up our local copy of
380 the selection value and convert it to the type.
381 The value is nil or a string.
5109c8dd
KH
382 This function is used both for remote requests (LOCAL_REQUEST is zero)
383 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
ede4db72
RS
384
385 This calls random Lisp code, and may signal or gc. */
386
387static Lisp_Object
971de7fb 388x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type, int local_request)
ede4db72
RS
389{
390 Lisp_Object local_value;
6abdaa4a 391 Lisp_Object handler_fn, value, check;
ede4db72
RS
392 int count;
393
394 local_value = assq_no_quit (selection_symbol, Vselection_alist);
395
396 if (NILP (local_value)) return Qnil;
397
398 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
399 if (EQ (target_type, QTIMESTAMP))
400 {
401 handler_fn = Qnil;
8e713be6 402 value = XCAR (XCDR (XCDR (local_value)));
ede4db72 403 }
ede4db72
RS
404#if 0 /* #### MULTIPLE doesn't work yet */
405 else if (CONSP (target_type)
8e713be6 406 && XCAR (target_type) == QMULTIPLE)
ede4db72 407 {
9d2d1dd8
KH
408 Lisp_Object pairs;
409 int size;
ede4db72 410 int i;
8e713be6 411 pairs = XCDR (target_type);
77b37c05 412 size = ASIZE (pairs);
ede4db72
RS
413 /* If the target is MULTIPLE, then target_type looks like
414 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
415 We modify the second element of each pair in the vector and
416 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
417 */
418 for (i = 0; i < size; i++)
419 {
9d2d1dd8
KH
420 Lisp_Object pair;
421 pair = XVECTOR (pairs)->contents [i];
ede4db72
RS
422 XVECTOR (pair)->contents [1]
423 = x_get_local_selection (XVECTOR (pair)->contents [0],
5109c8dd
KH
424 XVECTOR (pair)->contents [1],
425 local_request);
ede4db72
RS
426 }
427 return pairs;
428 }
429#endif
430 else
431 {
432 /* Don't allow a quit within the converter.
433 When the user types C-g, he would be surprised
434 if by luck it came during a converter. */
aed13378 435 count = SPECPDL_INDEX ();
ede4db72
RS
436 specbind (Qinhibit_quit, Qt);
437
b7826503 438 CHECK_SYMBOL (target_type);
ede4db72 439 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist));
4f06187f
RS
440 /* gcpro is not needed here since nothing but HANDLER_FN
441 is live, and that ought to be a symbol. */
442
1eb4d468
RS
443 if (!NILP (handler_fn))
444 value = call3 (handler_fn,
5109c8dd 445 selection_symbol, (local_request ? Qnil : target_type),
8e713be6 446 XCAR (XCDR (local_value)));
1eb4d468
RS
447 else
448 value = Qnil;
ede4db72
RS
449 unbind_to (count, Qnil);
450 }
451
452 /* Make sure this value is of a type that we could transmit
453 to another X client. */
a87ed99c 454
ede4db72
RS
455 check = value;
456 if (CONSP (value)
8e713be6 457 && SYMBOLP (XCAR (value)))
8e713be6 458 check = XCDR (value);
1b65481e 459
ede4db72
RS
460 if (STRINGP (check)
461 || VECTORP (check)
462 || SYMBOLP (check)
7da64e5c 463 || INTEGERP (check)
ede4db72
RS
464 || NILP (value))
465 return value;
a87ed99c 466 /* Check for a value that cons_to_long could handle. */
ede4db72 467 else if (CONSP (check)
8e713be6
KR
468 && INTEGERP (XCAR (check))
469 && (INTEGERP (XCDR (check))
ede4db72 470 ||
8e713be6
KR
471 (CONSP (XCDR (check))
472 && INTEGERP (XCAR (XCDR (check)))
473 && NILP (XCDR (XCDR (check))))))
ede4db72 474 return value;
4d30ce50
KS
475
476 signal_error ("Invalid data returned by selection-conversion function",
477 list2 (handler_fn, value));
ede4db72
RS
478}
479\f
480/* Subroutines of x_reply_selection_request. */
481
5d0ba25b 482/* Send a SelectionNotify event to the requestor with property=None,
ede4db72
RS
483 meaning we were unable to do what they wanted. */
484
485static void
971de7fb 486x_decline_selection_request (struct input_event *event)
ede4db72 487{
65969f63
CY
488 XEvent reply_base;
489 XSelectionEvent *reply = &(reply_base.xselection);
1b65481e 490
65969f63
CY
491 reply->type = SelectionNotify;
492 reply->display = SELECTION_EVENT_DISPLAY (event);
493 reply->requestor = SELECTION_EVENT_REQUESTOR (event);
494 reply->selection = SELECTION_EVENT_SELECTION (event);
495 reply->time = SELECTION_EVENT_TIME (event);
496 reply->target = SELECTION_EVENT_TARGET (event);
497 reply->property = None;
ede4db72 498
d9c0d4a3
GM
499 /* The reason for the error may be that the receiver has
500 died in the meantime. Handle that case. */
ede4db72 501 BLOCK_INPUT;
65969f63
CY
502 x_catch_errors (reply->display);
503 XSendEvent (reply->display, reply->requestor, False, 0L, &reply_base);
504 XFlush (reply->display);
4545fa20 505 x_uncatch_errors ();
ede4db72
RS
506 UNBLOCK_INPUT;
507}
508
509/* This is the selection request currently being processed.
510 It is set to zero when the request is fully processed. */
511static struct input_event *x_selection_current_request;
512
ca29f2b8
GM
513/* Display info in x_selection_request. */
514
515static struct x_display_info *selection_request_dpyinfo;
516
ede4db72 517/* Used as an unwind-protect clause so that, if a selection-converter signals
2a1a4c9d 518 an error, we tell the requester that we were unable to do what they wanted
ede4db72
RS
519 before we throw to top-level or go into the debugger or whatever. */
520
521static Lisp_Object
971de7fb 522x_selection_request_lisp_error (Lisp_Object ignore)
ede4db72 523{
ca29f2b8
GM
524 if (x_selection_current_request != 0
525 && selection_request_dpyinfo->display)
ede4db72
RS
526 x_decline_selection_request (x_selection_current_request);
527 return Qnil;
528}
c525d842
CY
529
530static Lisp_Object
971de7fb 531x_catch_errors_unwind (Lisp_Object dummy)
c525d842
CY
532{
533 BLOCK_INPUT;
534 x_uncatch_errors ();
535 UNBLOCK_INPUT;
6f10509c 536 return Qnil;
c525d842 537}
ede4db72 538\f
d1f21a66
RS
539
540/* This stuff is so that INCR selections are reentrant (that is, so we can
541 be servicing multiple INCR selection requests simultaneously.) I haven't
542 actually tested that yet. */
543
544/* Keep a list of the property changes that are awaited. */
545
546struct prop_location
547{
548 int identifier;
549 Display *display;
550 Window window;
551 Atom property;
552 int desired_state;
553 int arrived;
554 struct prop_location *next;
555};
556
971de7fb
DN
557static struct prop_location *expect_property_change (Display *display, Window window, Atom property, int state);
558static void wait_for_property_change (struct prop_location *location);
559static void unexpect_property_change (struct prop_location *location);
560static int waiting_for_other_props_on_window (Display *display, Window window);
d1f21a66
RS
561
562static int prop_location_identifier;
563
564static Lisp_Object property_change_reply;
565
566static struct prop_location *property_change_reply_object;
567
568static struct prop_location *property_change_wait_list;
55b2d45d
RS
569
570static Lisp_Object
971de7fb 571queue_selection_requests_unwind (Lisp_Object tem)
55b2d45d 572{
dd0fe424 573 x_stop_queuing_selection_requests ();
ab552306 574 return Qnil;
55b2d45d
RS
575}
576
577/* Return some frame whose display info is DPYINFO.
578 Return nil if there is none. */
579
580static Lisp_Object
971de7fb 581some_frame_on_display (struct x_display_info *dpyinfo)
55b2d45d
RS
582{
583 Lisp_Object list, frame;
584
585 FOR_EACH_FRAME (list, frame)
586 {
428a555e
KL
587 if (FRAME_X_P (XFRAME (frame))
588 && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
55b2d45d
RS
589 return frame;
590 }
591
592 return Qnil;
593}
d1f21a66 594\f
ede4db72
RS
595/* Send the reply to a selection request event EVENT.
596 TYPE is the type of selection data requested.
597 DATA and SIZE describe the data to send, already converted.
598 FORMAT is the unit-size (in bits) of the data to be transmitted. */
599
46d47e41 600#ifdef TRACE_SELECTION
ca7af97a 601static int x_reply_selection_request_cnt;
46d47e41
GM
602#endif /* TRACE_SELECTION */
603
ede4db72 604static void
971de7fb 605x_reply_selection_request (struct input_event *event, int format, unsigned char *data, int size, Atom type)
ede4db72 606{
65969f63
CY
607 XEvent reply_base;
608 XSelectionEvent *reply = &(reply_base.xselection);
ede4db72 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
65969f63
CY
620 reply->type = SelectionNotify;
621 reply->display = display;
622 reply->requestor = window;
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;
ede4db72 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 {
65969f63
CY
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);
65969f63 655 XChangeProperty (display, window, reply->property, type, format,
ede4db72
RS
656 PropModeReplace, data, size);
657 /* At this point, the selection was successfully stored; ack it. */
65969f63 658 XSendEvent (display, window, False, 0L, &reply_base);
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 683 TRACE2 ("Start sending %d bytes incrementally (%s)",
65969f63
CY
684 bytes_remaining, XGetAtomName (display, reply->property));
685 wait_object = expect_property_change (display, window, reply->property,
d1f21a66 686 PropertyDelete);
ede4db72 687
d9c0d4a3 688 TRACE1 ("Set %s to number of bytes to send",
65969f63 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;
65969f63 696 XChangeProperty (display, window, reply->property, dpyinfo->Xatom_INCR,
e22cf39c
JD
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");
65969f63 705 XSendEvent (display, window, False, 0L, &reply_base);
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)",
65969f63 716 XGetAtomName (display, reply->property));
d9c0d4a3
GM
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 731 wait_object
65969f63 732 = expect_property_change (display, window, reply->property,
d1f21a66 733 PropertyDelete);
d9c0d4a3 734
5a9c35e5 735 TRACE1 ("Sending increment of %d elements", i);
d9c0d4a3 736 TRACE1 ("Set %s to increment data",
65969f63 737 XGetAtomName (display, reply->property));
1b65481e 738
ede4db72 739 /* Append the next chunk of data to the property. */
65969f63 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 756 TRACE1 ("Waiting for increment ACK (deletion of %s)",
65969f63 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 767 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
65969f63
CY
768 XGetAtomName (display, reply->property));
769 XChangeProperty (display, window, reply->property, type, format,
ede4db72 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 1192{
6abdaa4a 1193 struct prop_location *rest;
d9c0d4a3 1194
6abdaa4a 1195 for (rest = property_change_wait_list; rest; rest = rest->next)
ede4db72 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 }
ede4db72 1216 }
ede4db72
RS
1217}
1218
1219
1220\f
1221#if 0 /* #### MULTIPLE doesn't work yet */
1222
1223static Lisp_Object
1224fetch_multiple_target (event)
1225 XSelectionRequestEvent *event;
1226{
1227 Display *display = event->display;
5d0ba25b 1228 Window window = event->requestor;
ede4db72
RS
1229 Atom target = event->target;
1230 Atom selection_atom = event->selection;
1231 int result;
1232
1233 return
1234 Fcons (QMULTIPLE,
1235 x_get_window_property_as_lisp_data (display, window, target,
1236 QMULTIPLE, selection_atom));
1237}
1238
1239static Lisp_Object
1240copy_multiple_data (obj)
1241 Lisp_Object obj;
1242{
1243 Lisp_Object vec;
1244 int i;
1245 int size;
1246 if (CONSP (obj))
8e713be6 1247 return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
1b65481e 1248
b7826503 1249 CHECK_VECTOR (obj);
77b37c05 1250 vec = Fmake_vector (size = ASIZE (obj), Qnil);
ede4db72
RS
1251 for (i = 0; i < size; i++)
1252 {
1253 Lisp_Object vec2 = XVECTOR (obj)->contents [i];
b7826503 1254 CHECK_VECTOR (vec2);
77b37c05 1255 if (ASIZE (vec2) != 2)
ede4db72 1256 /* ??? Confusing error message */
4d30ce50 1257 signal_error ("Vectors must be of length 2", vec2);
ede4db72
RS
1258 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil);
1259 XVECTOR (XVECTOR (vec)->contents [i])->contents [0]
1260 = XVECTOR (vec2)->contents [0];
1261 XVECTOR (XVECTOR (vec)->contents [i])->contents [1]
1262 = XVECTOR (vec2)->contents [1];
1263 }
1264 return vec;
1265}
1266
1267#endif
1268
1269\f
1270/* Variables for communication with x_handle_selection_notify. */
1271static Atom reading_which_selection;
1272static Lisp_Object reading_selection_reply;
1273static Window reading_selection_window;
1274
1275/* Do protocol to read selection-data from the server.
1276 Converts this to Lisp data and returns it. */
1277
1278static Lisp_Object
971de7fb 1279x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, Lisp_Object time_stamp)
ede4db72 1280{
378c33ca 1281 struct frame *sf = SELECTED_FRAME ();
428a555e
KL
1282 Window requestor_window;
1283 Display *display;
1284 struct x_display_info *dpyinfo;
5d0ba25b 1285 Time requestor_time = last_event_timestamp;
428a555e
KL
1286 Atom target_property;
1287 Atom selection_atom;
ede4db72 1288 Atom type_atom;
80da0190 1289 int secs, usecs;
c525d842 1290 int count = SPECPDL_INDEX ();
55b2d45d 1291 Lisp_Object frame;
ede4db72 1292
428a555e
KL
1293 if (! FRAME_X_P (sf))
1294 return Qnil;
1295
1296 requestor_window = FRAME_X_WINDOW (sf);
1297 display = FRAME_X_DISPLAY (sf);
1298 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
1299 target_property = dpyinfo->Xatom_EMACS_TMP;
1300 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
1301
ede4db72 1302 if (CONSP (target_type))
8e713be6 1303 type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type));
ede4db72 1304 else
5c3a351a 1305 type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
ede4db72 1306
3a42401d
JD
1307 if (! NILP (time_stamp))
1308 {
1309 if (CONSP (time_stamp))
1310 requestor_time = (Time) cons_to_long (time_stamp);
1311 else if (INTEGERP (time_stamp))
1312 requestor_time = (Time) XUINT (time_stamp);
1313 else if (FLOATP (time_stamp))
ff59904a 1314 requestor_time = (Time) XFLOAT_DATA (time_stamp);
3a42401d
JD
1315 else
1316 error ("TIME_STAMP must be cons or number");
1317 }
1318
ede4db72 1319 BLOCK_INPUT;
1b65481e 1320
c525d842
CY
1321 /* The protected block contains wait_reading_process_output, which
1322 can run random lisp code (process handlers) or signal.
1323 Therefore, we put the x_uncatch_errors call in an unwind. */
1324 record_unwind_protect (x_catch_errors_unwind, Qnil);
9ba8e10d 1325 x_catch_errors (display);
1b65481e 1326
d9c0d4a3
GM
1327 TRACE2 ("Get selection %s, type %s",
1328 XGetAtomName (display, type_atom),
1329 XGetAtomName (display, target_property));
1330
ede4db72 1331 XConvertSelection (display, selection_atom, type_atom, target_property,
5d0ba25b 1332 requestor_window, requestor_time);
5c3a351a 1333 XFlush (display);
ede4db72
RS
1334
1335 /* Prepare to block until the reply has been read. */
5d0ba25b 1336 reading_selection_window = requestor_window;
ede4db72 1337 reading_which_selection = selection_atom;
f3fbd155 1338 XSETCAR (reading_selection_reply, Qnil);
55b2d45d
RS
1339
1340 frame = some_frame_on_display (dpyinfo);
1341
1342 /* If the display no longer has frames, we can't expect
1343 to get many more selection requests from it, so don't
1344 bother trying to queue them. */
1345 if (!NILP (frame))
1346 {
dd0fe424 1347 x_start_queuing_selection_requests ();
55b2d45d
RS
1348
1349 record_unwind_protect (queue_selection_requests_unwind,
dd0fe424 1350 Qnil);
55b2d45d 1351 }
ede4db72
RS
1352 UNBLOCK_INPUT;
1353
80da0190
RS
1354 /* This allows quits. Also, don't wait forever. */
1355 secs = x_selection_timeout / 1000;
1356 usecs = (x_selection_timeout % 1000) * 1000;
d9c0d4a3 1357 TRACE1 (" Start waiting %d secs for SelectionNotify", secs);
d64b707c
KS
1358 wait_reading_process_output (secs, usecs, 0, 0,
1359 reading_selection_reply, NULL, 0);
d9c0d4a3 1360 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
ede4db72 1361
7c6b2ea4 1362 BLOCK_INPUT;
c525d842
CY
1363 if (x_had_errors_p (display))
1364 error ("Cannot get selection");
1365 /* This calls x_uncatch_errors. */
9ba8e10d 1366 unbind_to (count, Qnil);
7c6b2ea4
RS
1367 UNBLOCK_INPUT;
1368
8e713be6 1369 if (NILP (XCAR (reading_selection_reply)))
606140dd 1370 error ("Timed out waiting for reply from selection owner");
8e713be6 1371 if (EQ (XCAR (reading_selection_reply), Qlambda))
12061f06 1372 return Qnil;
ede4db72
RS
1373
1374 /* Otherwise, the selection is waiting for us on the requested property. */
1375 return
5d0ba25b 1376 x_get_window_property_as_lisp_data (display, requestor_window,
ede4db72
RS
1377 target_property, target_type,
1378 selection_atom);
1379}
1380\f
1381/* Subroutines of x_get_window_property_as_lisp_data */
1382
4feb31b2 1383/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1384
ede4db72 1385static void
d5a3eaaf
AS
1386x_get_window_property (Display *display, Window window, Atom property,
1387 unsigned char **data_ret, int *bytes_ret,
1388 Atom *actual_type_ret, int *actual_format_ret,
1389 unsigned long *actual_size_ret, int delete_p)
ede4db72
RS
1390{
1391 int total_size;
1392 unsigned long bytes_remaining;
1393 int offset = 0;
1394 unsigned char *tmp_data = 0;
1395 int result;
1396 int buffer_size = SELECTION_QUANTUM (display);
1b65481e 1397
d9c0d4a3
GM
1398 if (buffer_size > MAX_SELECTION_QUANTUM)
1399 buffer_size = MAX_SELECTION_QUANTUM;
1b65481e 1400
ede4db72 1401 BLOCK_INPUT;
1b65481e 1402
ede4db72
RS
1403 /* First probe the thing to find out how big it is. */
1404 result = XGetWindowProperty (display, window, property,
137edb72 1405 0L, 0L, False, AnyPropertyType,
ede4db72
RS
1406 actual_type_ret, actual_format_ret,
1407 actual_size_ret,
1408 &bytes_remaining, &tmp_data);
ede4db72
RS
1409 if (result != Success)
1410 {
2f65feb6 1411 UNBLOCK_INPUT;
ede4db72
RS
1412 *data_ret = 0;
1413 *bytes_ret = 0;
1414 return;
1415 }
1b65481e 1416
0158abbc
RS
1417 /* This was allocated by Xlib, so use XFree. */
1418 XFree ((char *) tmp_data);
1b65481e 1419
ede4db72
RS
1420 if (*actual_type_ret == None || *actual_format_ret == 0)
1421 {
2f65feb6 1422 UNBLOCK_INPUT;
ede4db72
RS
1423 return;
1424 }
1425
1426 total_size = bytes_remaining + 1;
1427 *data_ret = (unsigned char *) xmalloc (total_size);
1b65481e 1428
2a1a4c9d 1429 /* Now read, until we've gotten it all. */
ede4db72
RS
1430 while (bytes_remaining)
1431 {
d9c0d4a3 1432#ifdef TRACE_SELECTION
c2982e87 1433 unsigned long last = bytes_remaining;
ede4db72
RS
1434#endif
1435 result
1436 = XGetWindowProperty (display, window, property,
137edb72 1437 (long)offset/4, (long)buffer_size/4,
2f65feb6 1438 False,
ede4db72
RS
1439 AnyPropertyType,
1440 actual_type_ret, actual_format_ret,
1441 actual_size_ret, &bytes_remaining, &tmp_data);
d9c0d4a3 1442
c2982e87 1443 TRACE2 ("Read %lu bytes from property %s",
d9c0d4a3
GM
1444 last - bytes_remaining,
1445 XGetAtomName (display, property));
1446
ede4db72
RS
1447 /* If this doesn't return Success at this point, it means that
1448 some clod deleted the selection while we were in the midst of
d9c0d4a3
GM
1449 reading it. Deal with that, I guess.... */
1450 if (result != Success)
1451 break;
e22cf39c
JD
1452
1453 /* The man page for XGetWindowProperty says:
1454 "If the returned format is 32, the returned data is represented
1455 as a long array and should be cast to that type to obtain the
1456 elements."
1457 This applies even if long is more than 32 bits, the X library
1458 converts from 32 bit elements received from the X server to long
72af86bd 1459 and passes the long array to us. Thus, for that case memcpy can not
e22cf39c
JD
1460 be used. We convert to a 32 bit type here, because so much code
1461 assume on that.
1462
1463 The bytes and offsets passed to XGetWindowProperty refers to the
1464 property and those are indeed in 32 bit quantities if format is 32. */
1465
2172544b 1466 if (32 < BITS_PER_LONG && *actual_format_ret == 32)
e22cf39c
JD
1467 {
1468 unsigned long i;
1469 int *idata = (int *) ((*data_ret) + offset);
1470 long *ldata = (long *) tmp_data;
1471
1472 for (i = 0; i < *actual_size_ret; ++i)
1473 {
1474 idata[i]= (int) ldata[i];
1475 offset += 4;
1476 }
1477 }
1478 else
1479 {
1480 *actual_size_ret *= *actual_format_ret / 8;
72af86bd 1481 memcpy ((*data_ret) + offset, tmp_data, *actual_size_ret);
e22cf39c
JD
1482 offset += *actual_size_ret;
1483 }
1b65481e 1484
0158abbc
RS
1485 /* This was allocated by Xlib, so use XFree. */
1486 XFree ((char *) tmp_data);
ede4db72 1487 }
2f65feb6 1488
5c3a351a 1489 XFlush (display);
ede4db72
RS
1490 UNBLOCK_INPUT;
1491 *bytes_ret = offset;
1492}
1493\f
4feb31b2 1494/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1495
ede4db72 1496static void
d5a3eaaf
AS
1497receive_incremental_selection (Display *display, Window window, Atom property,
1498 Lisp_Object target_type,
1499 unsigned int min_size_bytes,
1500 unsigned char **data_ret, int *size_bytes_ret,
1501 Atom *type_ret, int *format_ret,
1502 unsigned long *size_ret)
ede4db72
RS
1503{
1504 int offset = 0;
d1f21a66 1505 struct prop_location *wait_object;
ede4db72
RS
1506 *size_bytes_ret = min_size_bytes;
1507 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
d9c0d4a3
GM
1508
1509 TRACE1 ("Read %d bytes incrementally", min_size_bytes);
2f65feb6
RS
1510
1511 /* At this point, we have read an INCR property.
1512 Delete the property to ack it.
1513 (But first, prepare to receive the next event in this handshake.)
ede4db72
RS
1514
1515 Now, we must loop, waiting for the sending window to put a value on
1516 that property, then reading the property, then deleting it to ack.
1517 We are done when the sender places a property of length 0.
1518 */
2f65feb6
RS
1519 BLOCK_INPUT;
1520 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
d9c0d4a3 1521 TRACE1 (" Delete property %s",
dd0fe424 1522 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
2f65feb6 1523 XDeleteProperty (display, window, property);
d9c0d4a3 1524 TRACE1 (" Expect new value of property %s",
dd0fe424 1525 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property))));
d1f21a66
RS
1526 wait_object = expect_property_change (display, window, property,
1527 PropertyNewValue);
5c3a351a 1528 XFlush (display);
2f65feb6
RS
1529 UNBLOCK_INPUT;
1530
ede4db72
RS
1531 while (1)
1532 {
1533 unsigned char *tmp_data;
1534 int tmp_size_bytes;
d9c0d4a3
GM
1535
1536 TRACE0 (" Wait for property change");
d1f21a66 1537 wait_for_property_change (wait_object);
1b65481e 1538
ede4db72 1539 /* expect it again immediately, because x_get_window_property may
2a1a4c9d 1540 .. no it won't, I don't get it.
d9c0d4a3
GM
1541 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1542 TRACE0 (" Get property value");
ede4db72
RS
1543 x_get_window_property (display, window, property,
1544 &tmp_data, &tmp_size_bytes,
1545 type_ret, format_ret, size_ret, 1);
1546
d9c0d4a3
GM
1547 TRACE1 (" Read increment of %d bytes", tmp_size_bytes);
1548
ede4db72
RS
1549 if (tmp_size_bytes == 0) /* we're done */
1550 {
d9c0d4a3
GM
1551 TRACE0 ("Done reading incrementally");
1552
2f65feb6
RS
1553 if (! waiting_for_other_props_on_window (display, window))
1554 XSelectInput (display, window, STANDARD_EVENT_SET);
4feb31b2 1555 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1556 calls xmalloc itself. */
70fdbb46 1557 xfree (tmp_data);
ede4db72
RS
1558 break;
1559 }
2f65feb6
RS
1560
1561 BLOCK_INPUT;
d9c0d4a3
GM
1562 TRACE1 (" ACK by deleting property %s",
1563 XGetAtomName (display, property));
2f65feb6 1564 XDeleteProperty (display, window, property);
d1f21a66
RS
1565 wait_object = expect_property_change (display, window, property,
1566 PropertyNewValue);
5c3a351a 1567 XFlush (display);
2f65feb6
RS
1568 UNBLOCK_INPUT;
1569
ede4db72
RS
1570 if (*size_bytes_ret < offset + tmp_size_bytes)
1571 {
ede4db72
RS
1572 *size_bytes_ret = offset + tmp_size_bytes;
1573 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
1574 }
1b65481e 1575
72af86bd 1576 memcpy ((*data_ret) + offset, tmp_data, tmp_size_bytes);
ede4db72 1577 offset += tmp_size_bytes;
1b65481e 1578
4feb31b2 1579 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1580 calls xmalloc itself. */
4feb31b2 1581 xfree (tmp_data);
ede4db72
RS
1582 }
1583}
d9c0d4a3 1584
ede4db72
RS
1585\f
1586/* Once a requested selection is "ready" (we got a SelectionNotify event),
1587 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1588 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1589
1590static Lisp_Object
d5a3eaaf
AS
1591x_get_window_property_as_lisp_data (Display *display, Window window,
1592 Atom property,
1593 Lisp_Object target_type,
1594 Atom selection_atom)
ede4db72
RS
1595{
1596 Atom actual_type;
1597 int actual_format;
1598 unsigned long actual_size;
1599 unsigned char *data = 0;
1600 int bytes = 0;
1601 Lisp_Object val;
5c3a351a 1602 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1603
d9c0d4a3
GM
1604 TRACE0 ("Reading selection data");
1605
ede4db72
RS
1606 x_get_window_property (display, window, property, &data, &bytes,
1607 &actual_type, &actual_format, &actual_size, 1);
1608 if (! data)
1609 {
1610 int there_is_a_selection_owner;
1611 BLOCK_INPUT;
1612 there_is_a_selection_owner
1613 = XGetSelectionOwner (display, selection_atom);
1614 UNBLOCK_INPUT;
4d30ce50
KS
1615 if (there_is_a_selection_owner)
1616 signal_error ("Selection owner couldn't convert",
1617 actual_type
1618 ? list2 (target_type,
1619 x_atom_to_symbol (display, actual_type))
1620 : target_type);
1621 else
1622 signal_error ("No selection",
1623 x_atom_to_symbol (display, selection_atom));
ede4db72 1624 }
1b65481e 1625
5c3a351a 1626 if (actual_type == dpyinfo->Xatom_INCR)
ede4db72
RS
1627 {
1628 /* That wasn't really the data, just the beginning. */
1629
1630 unsigned int min_size_bytes = * ((unsigned int *) data);
1631 BLOCK_INPUT;
4feb31b2 1632 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1633 calls xmalloc itself. */
4feb31b2 1634 xfree ((char *) data);
ede4db72
RS
1635 UNBLOCK_INPUT;
1636 receive_incremental_selection (display, window, property, target_type,
1637 min_size_bytes, &data, &bytes,
1638 &actual_type, &actual_format,
1639 &actual_size);
1640 }
1641
2f65feb6 1642 BLOCK_INPUT;
d9c0d4a3 1643 TRACE1 (" Delete property %s", XGetAtomName (display, property));
2f65feb6 1644 XDeleteProperty (display, window, property);
5c3a351a 1645 XFlush (display);
2f65feb6
RS
1646 UNBLOCK_INPUT;
1647
ede4db72
RS
1648 /* It's been read. Now convert it to a lisp object in some semi-rational
1649 manner. */
1650 val = selection_data_to_lisp_data (display, data, bytes,
1651 actual_type, actual_format);
1b65481e 1652
4feb31b2 1653 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1654 calls xmalloc itself. */
4feb31b2 1655 xfree ((char *) data);
ede4db72
RS
1656 return val;
1657}
1658\f
1659/* These functions convert from the selection data read from the server into
1660 something that we can use from Lisp, and vice versa.
1661
1662 Type: Format: Size: Lisp Type:
1663 ----- ------- ----- -----------
1664 * 8 * String
1665 ATOM 32 1 Symbol
1666 ATOM 32 > 1 Vector of Symbols
1667 * 16 1 Integer
1668 * 16 > 1 Vector of Integers
1669 * 32 1 if <=16 bits: Integer
1670 if > 16 bits: Cons of top16, bot16
1671 * 32 > 1 Vector of the above
1672
1673 When converting a Lisp number to C, it is assumed to be of format 16 if
1674 it is an integer, and of format 32 if it is a cons of two integers.
1675
1676 When converting a vector of numbers from Lisp to C, it is assumed to be
1677 of format 16 if every element in the vector is an integer, and is assumed
1678 to be of format 32 if any element is a cons of two integers.
1679
1680 When converting an object to C, it may be of the form (SYMBOL . <data>)
1681 where SYMBOL is what we should claim that the type is. Format and
b8d6f4af
JD
1682 representation are as above.
1683
1684 Important: When format is 32, data should contain an array of int,
1685 not an array of long as the X library returns. This makes a difference
1686 when sizeof(long) != sizeof(int). */
ede4db72
RS
1687
1688
1689
1690static Lisp_Object
eec47d6b
DN
1691selection_data_to_lisp_data (Display *display, const unsigned char *data,
1692 int size, Atom type, int format)
ede4db72 1693{
5c3a351a 1694 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1695
5c3a351a 1696 if (type == dpyinfo->Xatom_NULL)
ede4db72
RS
1697 return QNULL;
1698
1699 /* Convert any 8-bit data to a string, for compactness. */
1700 else if (format == 8)
e6c7c988 1701 {
e57ad4d8
KH
1702 Lisp_Object str, lispy_type;
1703
1704 str = make_unibyte_string ((char *) data, size);
1705 /* Indicate that this string is from foreign selection by a text
1706 property `foreign-selection' so that the caller of
1707 x-get-selection-internal (usually x-get-selection) can know
1708 that the string must be decode. */
1709 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1710 lispy_type = QCOMPOUND_TEXT;
1711 else if (type == dpyinfo->Xatom_UTF8_STRING)
1712 lispy_type = QUTF8_STRING;
e6c7c988 1713 else
e57ad4d8
KH
1714 lispy_type = QSTRING;
1715 Fput_text_property (make_number (0), make_number (size),
1716 Qforeign_selection, lispy_type, str);
e6c7c988
KH
1717 return str;
1718 }
ede4db72
RS
1719 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1720 a vector of symbols.
1721 */
1722 else if (type == XA_ATOM)
1723 {
1724 int i;
b8d6f4af
JD
1725 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1726 But the callers of these function has made sure the data for
1727 format == 32 is an array of int. Thus, use int instead
1728 of Atom. */
1729 int *idata = (int *) data;
1730
1731 if (size == sizeof (int))
1732 return x_atom_to_symbol (display, (Atom) idata[0]);
ede4db72
RS
1733 else
1734 {
b8d6f4af 1735 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)),
e607a484 1736 make_number (0));
b8d6f4af 1737 for (i = 0; i < size / sizeof (int); i++)
e607a484 1738 Faset (v, make_number (i),
b8d6f4af 1739 x_atom_to_symbol (display, (Atom) idata[i]));
ede4db72
RS
1740 return v;
1741 }
1742 }
1743
1ad08acd
RS
1744 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1745 If the number is 32 bits and won't fit in a Lisp_Int,
1746 convert it to a cons of integers, 16 bits in each half.
ede4db72 1747 */
2f51feb8
AS
1748 else if (format == 32 && size == sizeof (int))
1749 return long_to_cons (((unsigned int *) data) [0]);
ede4db72
RS
1750 else if (format == 16 && size == sizeof (short))
1751 return make_number ((int) (((unsigned short *) data) [0]));
1752
1753 /* Convert any other kind of data to a vector of numbers, represented
1754 as above (as an integer, or a cons of two 16 bit integers.)
1755 */
1756 else if (format == 16)
1757 {
1758 int i;
937a3875
RS
1759 Lisp_Object v;
1760 v = Fmake_vector (make_number (size / 2), make_number (0));
1761 for (i = 0; i < size / 2; i++)
ede4db72
RS
1762 {
1763 int j = (int) ((unsigned short *) data) [i];
e607a484 1764 Faset (v, make_number (i), make_number (j));
ede4db72
RS
1765 }
1766 return v;
1767 }
1768 else
1769 {
1770 int i;
e607a484 1771 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0));
ede4db72
RS
1772 for (i = 0; i < size / 4; i++)
1773 {
2f51feb8 1774 unsigned int j = ((unsigned int *) data) [i];
e607a484 1775 Faset (v, make_number (i), long_to_cons (j));
ede4db72
RS
1776 }
1777 return v;
1778 }
1779}
1780
1781
4feb31b2 1782/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1783
ede4db72 1784static void
d5a3eaaf
AS
1785lisp_data_to_selection_data (Display *display, Lisp_Object obj,
1786 unsigned char **data_ret, Atom *type_ret,
1787 unsigned int *size_ret,
1788 int *format_ret, int *nofree_ret)
ede4db72
RS
1789{
1790 Lisp_Object type = Qnil;
5c3a351a 1791 struct x_display_info *dpyinfo = x_display_info_for_display (display);
aca39f42
RS
1792
1793 *nofree_ret = 0;
1794
8e713be6 1795 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
ede4db72 1796 {
8e713be6
KR
1797 type = XCAR (obj);
1798 obj = XCDR (obj);
1799 if (CONSP (obj) && NILP (XCDR (obj)))
1800 obj = XCAR (obj);
ede4db72
RS
1801 }
1802
1803 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1804 { /* This is not the same as declining */
1805 *format_ret = 32;
1806 *size_ret = 0;
1807 *data_ret = 0;
1808 type = QNULL;
1809 }
1810 else if (STRINGP (obj))
1811 {
1bd70c6e
KH
1812 if (SCHARS (obj) < SBYTES (obj))
1813 /* OBJ is a multibyte string containing a non-ASCII char. */
4d30ce50 1814 signal_error ("Non-ASCII string must be encoded in advance", obj);
7b9ae523 1815 if (NILP (type))
5109c8dd
KH
1816 type = QSTRING;
1817 *format_ret = 8;
1818 *size_ret = SBYTES (obj);
1819 *data_ret = SDATA (obj);
1820 *nofree_ret = 1;
ede4db72
RS
1821 }
1822 else if (SYMBOLP (obj))
1823 {
1824 *format_ret = 32;
1825 *size_ret = 1;
1826 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
1827 (*data_ret) [sizeof (Atom)] = 0;
5c3a351a 1828 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj);
ede4db72
RS
1829 if (NILP (type)) type = QATOM;
1830 }
7da64e5c 1831 else if (INTEGERP (obj)
ede4db72
RS
1832 && XINT (obj) < 0xFFFF
1833 && XINT (obj) > -0xFFFF)
1834 {
1835 *format_ret = 16;
1836 *size_ret = 1;
1837 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
1838 (*data_ret) [sizeof (short)] = 0;
1839 (*(short **) data_ret) [0] = (short) XINT (obj);
1840 if (NILP (type)) type = QINTEGER;
1841 }
a87ed99c 1842 else if (INTEGERP (obj)
8e713be6
KR
1843 || (CONSP (obj) && INTEGERP (XCAR (obj))
1844 && (INTEGERP (XCDR (obj))
1845 || (CONSP (XCDR (obj))
1846 && INTEGERP (XCAR (XCDR (obj)))))))
ede4db72
RS
1847 {
1848 *format_ret = 32;
1849 *size_ret = 1;
1850 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
1851 (*data_ret) [sizeof (long)] = 0;
1852 (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
1853 if (NILP (type)) type = QINTEGER;
1854 }
1855 else if (VECTORP (obj))
1856 {
1857 /* Lisp_Vectors may represent a set of ATOMs;
1858 a set of 16 or 32 bit INTEGERs;
1859 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1860 */
1861 int i;
1862
1863 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1864 /* This vector is an ATOM set */
1865 {
1866 if (NILP (type)) type = QATOM;
77b37c05 1867 *size_ret = ASIZE (obj);
ede4db72
RS
1868 *format_ret = 32;
1869 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
1870 for (i = 0; i < *size_ret; i++)
1871 if (SYMBOLP (XVECTOR (obj)->contents [i]))
1872 (*(Atom **) data_ret) [i]
5c3a351a 1873 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]);
ede4db72 1874 else
4d30ce50 1875 signal_error ("All elements of selection vector must have same type", obj);
ede4db72
RS
1876 }
1877#if 0 /* #### MULTIPLE doesn't work yet */
1878 else if (VECTORP (XVECTOR (obj)->contents [0]))
1879 /* This vector is an ATOM_PAIR set */
1880 {
1881 if (NILP (type)) type = QATOM_PAIR;
77b37c05 1882 *size_ret = ASIZE (obj);
ede4db72
RS
1883 *format_ret = 32;
1884 *data_ret = (unsigned char *)
1885 xmalloc ((*size_ret) * sizeof (Atom) * 2);
1886 for (i = 0; i < *size_ret; i++)
1887 if (VECTORP (XVECTOR (obj)->contents [i]))
1888 {
1889 Lisp_Object pair = XVECTOR (obj)->contents [i];
77b37c05 1890 if (ASIZE (pair) != 2)
4d30ce50
KS
1891 signal_error (
1892 "Elements of the vector must be vectors of exactly two elements",
1893 pair);
1b65481e 1894
ede4db72 1895 (*(Atom **) data_ret) [i * 2]
5c3a351a
RS
1896 = symbol_to_x_atom (dpyinfo, display,
1897 XVECTOR (pair)->contents [0]);
ede4db72 1898 (*(Atom **) data_ret) [(i * 2) + 1]
5c3a351a
RS
1899 = symbol_to_x_atom (dpyinfo, display,
1900 XVECTOR (pair)->contents [1]);
ede4db72
RS
1901 }
1902 else
4d30ce50
KS
1903 signal_error ("All elements of the vector must be of the same type",
1904 obj);
1b65481e 1905
ede4db72
RS
1906 }
1907#endif
1908 else
1909 /* This vector is an INTEGER set, or something like it */
1910 {
e22cf39c 1911 int data_size = 2;
77b37c05 1912 *size_ret = ASIZE (obj);
ede4db72
RS
1913 if (NILP (type)) type = QINTEGER;
1914 *format_ret = 16;
1915 for (i = 0; i < *size_ret; i++)
1916 if (CONSP (XVECTOR (obj)->contents [i]))
1917 *format_ret = 32;
7da64e5c 1918 else if (!INTEGERP (XVECTOR (obj)->contents [i]))
4d30ce50
KS
1919 signal_error (/* Qselection_error */
1920 "Elements of selection vector must be integers or conses of integers",
1921 obj);
ede4db72 1922
e22cf39c
JD
1923 /* Use sizeof(long) even if it is more than 32 bits. See comment
1924 in x_get_window_property and x_fill_property_data. */
6e816df5 1925
e22cf39c
JD
1926 if (*format_ret == 32) data_size = sizeof(long);
1927 *data_ret = (unsigned char *) xmalloc (*size_ret * data_size);
ede4db72
RS
1928 for (i = 0; i < *size_ret; i++)
1929 if (*format_ret == 32)
1930 (*((unsigned long **) data_ret)) [i]
1931 = cons_to_long (XVECTOR (obj)->contents [i]);
1932 else
1933 (*((unsigned short **) data_ret)) [i]
1934 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
1935 }
1936 }
1937 else
4d30ce50 1938 signal_error (/* Qselection_error */ "Unrecognized selection data", obj);
ede4db72 1939
5c3a351a 1940 *type_ret = symbol_to_x_atom (dpyinfo, display, type);
ede4db72
RS
1941}
1942
1943static Lisp_Object
971de7fb 1944clean_local_selection_data (Lisp_Object obj)
ede4db72
RS
1945{
1946 if (CONSP (obj)
8e713be6
KR
1947 && INTEGERP (XCAR (obj))
1948 && CONSP (XCDR (obj))
1949 && INTEGERP (XCAR (XCDR (obj)))
1950 && NILP (XCDR (XCDR (obj))))
1951 obj = Fcons (XCAR (obj), XCDR (obj));
ede4db72
RS
1952
1953 if (CONSP (obj)
8e713be6
KR
1954 && INTEGERP (XCAR (obj))
1955 && INTEGERP (XCDR (obj)))
ede4db72 1956 {
8e713be6
KR
1957 if (XINT (XCAR (obj)) == 0)
1958 return XCDR (obj);
1959 if (XINT (XCAR (obj)) == -1)
1960 return make_number (- XINT (XCDR (obj)));
ede4db72
RS
1961 }
1962 if (VECTORP (obj))
1963 {
1964 int i;
77b37c05 1965 int size = ASIZE (obj);
ede4db72
RS
1966 Lisp_Object copy;
1967 if (size == 1)
1968 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
e607a484 1969 copy = Fmake_vector (make_number (size), Qnil);
ede4db72
RS
1970 for (i = 0; i < size; i++)
1971 XVECTOR (copy)->contents [i]
1972 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
1973 return copy;
1974 }
1975 return obj;
1976}
1977\f
1978/* Called from XTread_socket to handle SelectionNotify events.
606140dd
KH
1979 If it's the selection we are waiting for, stop waiting
1980 by setting the car of reading_selection_reply to non-nil.
1981 We store t there if the reply is successful, lambda if not. */
ede4db72
RS
1982
1983void
971de7fb 1984x_handle_selection_notify (XSelectionEvent *event)
ede4db72 1985{
5d0ba25b 1986 if (event->requestor != reading_selection_window)
ede4db72
RS
1987 return;
1988 if (event->selection != reading_which_selection)
1989 return;
1990
d9c0d4a3 1991 TRACE0 ("Received SelectionNotify");
f3fbd155
KR
1992 XSETCAR (reading_selection_reply,
1993 (event->property != 0 ? Qt : Qlambda));
ede4db72
RS
1994}
1995
1996\f
a0d76c27 1997DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
8c1a1077
PJ
1998 Sx_own_selection_internal, 2, 2, 0,
1999 doc: /* Assert an X selection of the given TYPE with the given VALUE.
2000TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2001\(Those are literal upper-case symbol names, since that's what X expects.)
2002VALUE is typically a string, or a cons of two markers, but may be
2003anything that the functions on `selection-converter-alist' know about. */)
5842a27b 2004 (Lisp_Object selection_name, Lisp_Object selection_value)
ede4db72 2005{
703e0710 2006 check_x ();
b7826503 2007 CHECK_SYMBOL (selection_name);
253b2298 2008 if (NILP (selection_value)) error ("SELECTION-VALUE may not be nil");
ede4db72
RS
2009 x_own_selection (selection_name, selection_value);
2010 return selection_value;
2011}
2012
2013
2014/* Request the selection value from the owner. If we are the owner,
2015 simply return our selection value. If we are not the owner, this
2016 will block until all of the data has arrived. */
2017
a0d76c27 2018DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
3a42401d 2019 Sx_get_selection_internal, 2, 3, 0,
8c1a1077
PJ
2020 doc: /* Return text selected from some X window.
2021SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2022\(Those are literal upper-case symbol names, since that's what X expects.)
3a42401d
JD
2023TYPE is the type of data desired, typically `STRING'.
2024TIME_STAMP is the time to use in the XConvertSelection call for foreign
2025selections. If omitted, defaults to the time for the last event. */)
5842a27b 2026 (Lisp_Object selection_symbol, Lisp_Object target_type, Lisp_Object time_stamp)
ede4db72
RS
2027{
2028 Lisp_Object val = Qnil;
2029 struct gcpro gcpro1, gcpro2;
2030 GCPRO2 (target_type, val); /* we store newly consed data into these */
703e0710 2031 check_x ();
b7826503 2032 CHECK_SYMBOL (selection_symbol);
ede4db72
RS
2033
2034#if 0 /* #### MULTIPLE doesn't work yet */
2035 if (CONSP (target_type)
8e713be6 2036 && XCAR (target_type) == QMULTIPLE)
ede4db72 2037 {
b7826503 2038 CHECK_VECTOR (XCDR (target_type));
ede4db72
RS
2039 /* So we don't destructively modify this... */
2040 target_type = copy_multiple_data (target_type);
2041 }
2042 else
2043#endif
b7826503 2044 CHECK_SYMBOL (target_type);
ede4db72 2045
5109c8dd 2046 val = x_get_local_selection (selection_symbol, target_type, 1);
ede4db72
RS
2047
2048 if (NILP (val))
2049 {
3a42401d 2050 val = x_get_foreign_selection (selection_symbol, target_type, time_stamp);
ede4db72
RS
2051 goto DONE;
2052 }
2053
2054 if (CONSP (val)
8e713be6 2055 && SYMBOLP (XCAR (val)))
ede4db72 2056 {
8e713be6
KR
2057 val = XCDR (val);
2058 if (CONSP (val) && NILP (XCDR (val)))
2059 val = XCAR (val);
ede4db72
RS
2060 }
2061 val = clean_local_selection_data (val);
2062 DONE:
2063 UNGCPRO;
2064 return val;
2065}
2066
a0d76c27 2067DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
8c1a1077
PJ
2068 Sx_disown_selection_internal, 1, 2, 0,
2069 doc: /* If we own the selection SELECTION, disown it.
2070Disowning it means there is no such selection. */)
aa0daa9f 2071 (Lisp_Object selection, Lisp_Object time_object)
ede4db72 2072{
ede4db72
RS
2073 Time timestamp;
2074 Atom selection_atom;
31df61d6
AS
2075 union {
2076 struct selection_input_event sie;
2077 struct input_event ie;
2078 } event;
3834c318 2079 Display *display;
5c3a351a 2080 struct x_display_info *dpyinfo;
378c33ca 2081 struct frame *sf = SELECTED_FRAME ();
ede4db72 2082
703e0710 2083 check_x ();
428a555e
KL
2084 if (! FRAME_X_P (sf))
2085 return Qnil;
2086
378c33ca
GM
2087 display = FRAME_X_DISPLAY (sf);
2088 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
b7826503 2089 CHECK_SYMBOL (selection);
aa0daa9f 2090 if (NILP (time_object))
7da64e5c 2091 timestamp = last_event_timestamp;
ede4db72 2092 else
aa0daa9f 2093 timestamp = cons_to_long (time_object);
ede4db72
RS
2094
2095 if (NILP (assq_no_quit (selection, Vselection_alist)))
2096 return Qnil; /* Don't disown the selection when we're not the owner. */
2097
5c3a351a 2098 selection_atom = symbol_to_x_atom (dpyinfo, display, selection);
ede4db72
RS
2099
2100 BLOCK_INPUT;
2101 XSetSelectionOwner (display, selection_atom, None, timestamp);
2102 UNBLOCK_INPUT;
2103
eb8c3be9 2104 /* It doesn't seem to be guaranteed that a SelectionClear event will be
ede4db72
RS
2105 generated for a window which owns the selection when that window sets
2106 the selection owner to None. The NCD server does, the MIT Sun4 server
2107 doesn't. So we synthesize one; this means we might get two, but
2108 that's ok, because the second one won't have any effect. */
31df61d6
AS
2109 SELECTION_EVENT_DISPLAY (&event.sie) = display;
2110 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom;
2111 SELECTION_EVENT_TIME (&event.sie) = timestamp;
2112 x_handle_selection_clear (&event.ie);
ede4db72
RS
2113
2114 return Qt;
2115}
2116
ede4db72 2117DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
8c1a1077
PJ
2118 0, 1, 0,
2119 doc: /* Whether the current Emacs process owns the given X Selection.
2120The arg should be the name of the selection in question, typically one of
2121the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2122\(Those are literal upper-case symbol names, since that's what X expects.)
2123For convenience, the symbol nil is the same as `PRIMARY',
2124and t is the same as `SECONDARY'. */)
5842a27b 2125 (Lisp_Object selection)
ede4db72 2126{
703e0710 2127 check_x ();
b7826503 2128 CHECK_SYMBOL (selection);
ede4db72
RS
2129 if (EQ (selection, Qnil)) selection = QPRIMARY;
2130 if (EQ (selection, Qt)) selection = QSECONDARY;
1b65481e 2131
ede4db72
RS
2132 if (NILP (Fassq (selection, Vselection_alist)))
2133 return Qnil;
2134 return Qt;
2135}
2136
2137DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
8c1a1077
PJ
2138 0, 1, 0,
2139 doc: /* Whether there is an owner for the given X Selection.
2140The arg should be the name of the selection in question, typically one of
2141the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2142\(Those are literal upper-case symbol names, since that's what X expects.)
2143For convenience, the symbol nil is the same as `PRIMARY',
2144and t is the same as `SECONDARY'. */)
5842a27b 2145 (Lisp_Object selection)
ede4db72
RS
2146{
2147 Window owner;
356ba514 2148 Atom atom;
3834c318 2149 Display *dpy;
378c33ca 2150 struct frame *sf = SELECTED_FRAME ();
3834c318 2151
b8c70430 2152 /* It should be safe to call this before we have an X frame. */
378c33ca 2153 if (! FRAME_X_P (sf))
b8c70430
RS
2154 return Qnil;
2155
378c33ca 2156 dpy = FRAME_X_DISPLAY (sf);
b7826503 2157 CHECK_SYMBOL (selection);
ede4db72
RS
2158 if (!NILP (Fx_selection_owner_p (selection)))
2159 return Qt;
356ba514
RS
2160 if (EQ (selection, Qnil)) selection = QPRIMARY;
2161 if (EQ (selection, Qt)) selection = QSECONDARY;
378c33ca 2162 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection);
356ba514
RS
2163 if (atom == 0)
2164 return Qnil;
ede4db72 2165 BLOCK_INPUT;
356ba514 2166 owner = XGetSelectionOwner (dpy, atom);
ede4db72
RS
2167 UNBLOCK_INPUT;
2168 return (owner ? Qt : Qnil);
2169}
2170
2171\f
1fb3821b
JD
2172/***********************************************************************
2173 Drag and drop support
2174***********************************************************************/
2175/* Check that lisp values are of correct type for x_fill_property_data.
2176 That is, number, string or a cons with two numbers (low and high 16
44f730c8
PE
2177 bit parts of a 32 bit number). Return the number of items in DATA,
2178 or -1 if there is an error. */
1fb3821b
JD
2179
2180int
971de7fb 2181x_check_property_data (Lisp_Object data)
1fb3821b
JD
2182{
2183 Lisp_Object iter;
2184 int size = 0;
2185
44f730c8 2186 for (iter = data; CONSP (iter); iter = XCDR (iter))
1fb3821b
JD
2187 {
2188 Lisp_Object o = XCAR (iter);
2189
2190 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
44f730c8 2191 return -1;
1fb3821b
JD
2192 else if (CONSP (o) &&
2193 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
44f730c8
PE
2194 return -1;
2195 size++;
1fb3821b
JD
2196 }
2197
2198 return size;
2199}
2200
2201/* Convert lisp values to a C array. Values may be a number, a string
2202 which is taken as an X atom name and converted to the atom value, or
2203 a cons containing the two 16 bit parts of a 32 bit number.
2204
2205 DPY is the display use to look up X atoms.
2206 DATA is a Lisp list of values to be converted.
2207 RET is the C array that contains the converted values. It is assumed
ff59904a 2208 it is big enough to hold all values.
e22cf39c
JD
2209 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2210 be stored in RET. Note that long is used for 32 even if long is more
2211 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2212 XClientMessageEvent). */
1fb3821b
JD
2213
2214void
971de7fb 2215x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format)
1fb3821b 2216{
e22cf39c
JD
2217 long val;
2218 long *d32 = (long *) ret;
2219 short *d16 = (short *) ret;
2220 char *d08 = (char *) ret;
1fb3821b
JD
2221 Lisp_Object iter;
2222
2223 for (iter = data; CONSP (iter); iter = XCDR (iter))
2224 {
2225 Lisp_Object o = XCAR (iter);
2226
2227 if (INTEGERP (o))
e22cf39c 2228 val = (long) XFASTINT (o);
1fb3821b 2229 else if (FLOATP (o))
e22cf39c 2230 val = (long) XFLOAT_DATA (o);
1fb3821b 2231 else if (CONSP (o))
e22cf39c 2232 val = (long) cons_to_long (o);
1fb3821b
JD
2233 else if (STRINGP (o))
2234 {
2235 BLOCK_INPUT;
51b59d79 2236 val = (long) XInternAtom (dpy, SSDATA (o), False);
1fb3821b
JD
2237 UNBLOCK_INPUT;
2238 }
2239 else
2240 error ("Wrong type, must be string, number or cons");
2241
2242 if (format == 8)
e22cf39c 2243 *d08++ = (char) val;
1fb3821b 2244 else if (format == 16)
e22cf39c 2245 *d16++ = (short) val;
1fb3821b
JD
2246 else
2247 *d32++ = val;
2248 }
2249}
2250
2251/* Convert an array of C values to a Lisp list.
2252 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2253 DATA is a C array of values to be converted.
2254 TYPE is the type of the data. Only XA_ATOM is special, it converts
2255 each number in DATA to its corresponfing X atom as a symbol.
2256 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2257 be stored in RET.
2258 SIZE is the number of elements in DATA.
2259
b8d6f4af
JD
2260 Important: When format is 32, data should contain an array of int,
2261 not an array of long as the X library returns. This makes a difference
2262 when sizeof(long) != sizeof(int).
2263
1fb3821b
JD
2264 Also see comment for selection_data_to_lisp_data above. */
2265
2266Lisp_Object
eec47d6b
DN
2267x_property_data_to_lisp (struct frame *f, const unsigned char *data,
2268 Atom type, int format, long unsigned int size)
1fb3821b
JD
2269{
2270 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
2271 data, size*format/8, type, format);
2272}
2273
31f16913 2274/* Get the mouse position in frame relative coordinates. */
1fb3821b
JD
2275
2276static void
971de7fb 2277mouse_position_for_drop (FRAME_PTR f, int *x, int *y)
1fb3821b
JD
2278{
2279 Window root, dummy_window;
2280 int dummy;
2281
2282 BLOCK_INPUT;
2283
2284 XQueryPointer (FRAME_X_DISPLAY (f),
2285 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2286
2287 /* The root window which contains the pointer. */
2288 &root,
2289
2290 /* Window pointer is on, not used */
2291 &dummy_window,
2292
2293 /* The position on that root window. */
2294 x, y,
2295
2296 /* x/y in dummy_window coordinates, not used. */
2297 &dummy, &dummy,
2298
2299 /* Modifier keys and pointer buttons, about which
2300 we don't care. */
2301 (unsigned int *) &dummy);
2302
2303
2304 /* Absolute to relative. */
2305 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2306 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2307
2308 UNBLOCK_INPUT;
2309}
2310
2311DEFUN ("x-get-atom-name", Fx_get_atom_name,
2312 Sx_get_atom_name, 1, 2, 0,
2313 doc: /* Return the X atom name for VALUE as a string.
2314VALUE may be a number or a cons where the car is the upper 16 bits and
2315the cdr is the lower 16 bits of a 32 bit value.
2316Use the display for FRAME or the current frame if FRAME is not given or nil.
2317
2318If the value is 0 or the atom is not known, return the empty string. */)
5842a27b 2319 (Lisp_Object value, Lisp_Object frame)
1fb3821b
JD
2320{
2321 struct frame *f = check_x_frame (frame);
2322 char *name = 0;
42ca4633 2323 char empty[] = "";
1fb3821b 2324 Lisp_Object ret = Qnil;
1fb3821b
JD
2325 Display *dpy = FRAME_X_DISPLAY (f);
2326 Atom atom;
c525d842 2327 int had_errors;
1fb3821b
JD
2328
2329 if (INTEGERP (value))
2330 atom = (Atom) XUINT (value);
2331 else if (FLOATP (value))
ff59904a 2332 atom = (Atom) XFLOAT_DATA (value);
1fb3821b
JD
2333 else if (CONSP (value))
2334 atom = (Atom) cons_to_long (value);
2335 else
2336 error ("Wrong type, value must be number or cons");
2337
2338 BLOCK_INPUT;
9ba8e10d 2339 x_catch_errors (dpy);
42ca4633 2340 name = atom ? XGetAtomName (dpy, atom) : empty;
c525d842
CY
2341 had_errors = x_had_errors_p (dpy);
2342 x_uncatch_errors ();
1fb3821b 2343
c525d842 2344 if (!had_errors)
1fb3821b
JD
2345 ret = make_string (name, strlen (name));
2346
1fb3821b 2347 if (atom && name) XFree (name);
8b3ad112 2348 if (NILP (ret)) ret = empty_unibyte_string;
1fb3821b
JD
2349
2350 UNBLOCK_INPUT;
2351
2352 return ret;
2353}
2354
9fc68699
JD
2355DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom,
2356 Sx_register_dnd_atom, 1, 2, 0,
2357 doc: /* Request that dnd events are made for ClientMessages with ATOM.
2358ATOM can be a symbol or a string. The ATOM is interned on the display that
2359FRAME is on. If FRAME is nil, the selected frame is used. */)
5842a27b 2360 (Lisp_Object atom, Lisp_Object frame)
9fc68699
JD
2361{
2362 Atom x_atom;
2363 struct frame *f = check_x_frame (frame);
2364 size_t i;
2365 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
2366
2367
2368 if (SYMBOLP (atom))
2369 x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom);
2370 else if (STRINGP (atom))
2371 {
2372 BLOCK_INPUT;
51b59d79 2373 x_atom = XInternAtom (FRAME_X_DISPLAY (f), SSDATA (atom), False);
9fc68699
JD
2374 UNBLOCK_INPUT;
2375 }
2376 else
2377 error ("ATOM must be a symbol or a string");
2378
db9cd97a 2379 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
9fc68699
JD
2380 if (dpyinfo->x_dnd_atoms[i] == x_atom)
2381 return Qnil;
2382
db9cd97a 2383 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size)
9fc68699
JD
2384 {
2385 dpyinfo->x_dnd_atoms_size *= 2;
2386 dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms,
2387 sizeof (*dpyinfo->x_dnd_atoms)
2388 * dpyinfo->x_dnd_atoms_size);
2389 }
2390
2391 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom;
2392 return Qnil;
2393}
2394
2395/* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
1fb3821b
JD
2396
2397int
971de7fb 2398x_handle_dnd_message (struct frame *f, XClientMessageEvent *event, struct x_display_info *dpyinfo, struct input_event *bufp)
1fb3821b
JD
2399{
2400 Lisp_Object vec;
2401 Lisp_Object frame;
e22cf39c
JD
2402 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2403 unsigned long size = 160/event->format;
1fb3821b 2404 int x, y;
31f16913
JD
2405 unsigned char *data = (unsigned char *) event->data.b;
2406 int idata[5];
9fc68699
JD
2407 size_t i;
2408
db9cd97a 2409 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i)
9fc68699
JD
2410 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break;
2411
2412 if (i == dpyinfo->x_dnd_atoms_length) return 0;
1fb3821b
JD
2413
2414 XSETFRAME (frame, f);
2415
31f16913
JD
2416 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2417 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2418 function expects them to be of size int (i.e. 32). So to be able to
2419 use that function, put the data in the form it expects if format is 32. */
2420
2172544b 2421 if (32 < BITS_PER_LONG && event->format == 32)
31f16913 2422 {
31f16913
JD
2423 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */
2424 idata[i] = (int) event->data.l[i];
2425 data = (unsigned char *) idata;
2426 }
2427
d2f14999 2428 vec = Fmake_vector (make_number (4), Qnil);
3ae565b3
SM
2429 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2430 event->message_type)));
2431 ASET (vec, 1, frame);
2432 ASET (vec, 2, make_number (event->format));
2433 ASET (vec, 3, x_property_data_to_lisp (f,
2434 data,
2435 event->message_type,
2436 event->format,
2437 size));
1fb3821b
JD
2438
2439 mouse_position_for_drop (f, &x, &y);
2440 bufp->kind = DRAG_N_DROP_EVENT;
862c94ca 2441 bufp->frame_or_window = frame;
1fb3821b
JD
2442 bufp->timestamp = CurrentTime;
2443 bufp->x = make_number (x);
2444 bufp->y = make_number (y);
862c94ca 2445 bufp->arg = vec;
1fb3821b
JD
2446 bufp->modifiers = 0;
2447
2448 return 1;
2449}
2450
2451DEFUN ("x-send-client-message", Fx_send_client_event,
2452 Sx_send_client_message, 6, 6, 0,
2453 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2454
2455For DISPLAY, specify either a frame or a display name (a string).
2456If DISPLAY is nil, that stands for the selected frame's display.
2457DEST may be a number, in which case it is a Window id. The value 0 may
2458be used to send to the root window of the DISPLAY.
2459If DEST is a cons, it is converted to a 32 bit number
2460with the high 16 bits from the car and the lower 16 bit from the cdr. That
2461number is then used as a window id.
2462If DEST is a frame the event is sent to the outer window of that frame.
69785ad0 2463A value of nil means the currently selected frame.
1fb3821b
JD
2464If DEST is the string "PointerWindow" the event is sent to the window that
2465contains the pointer. If DEST is the string "InputFocus" the event is
2466sent to the window that has the input focus.
2467FROM is the frame sending the event. Use nil for currently selected frame.
2468MESSAGE-TYPE is the name of an Atom as a string.
2469FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2470bits. VALUES is a list of numbers, cons and/or strings containing the values
2471to send. If a value is a string, it is converted to an Atom and the value of
2472the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2473with the high 16 bits from the car and the lower 16 bit from the cdr.
2474If more values than fits into the event is given, the excessive values
2475are ignored. */)
5842a27b 2476 (Lisp_Object display, Lisp_Object dest, Lisp_Object from, Lisp_Object message_type, Lisp_Object format, Lisp_Object values)
2d9074ba
JD
2477{
2478 struct x_display_info *dpyinfo = check_x_display_info (display);
2479
933e29ff 2480 CHECK_STRING (message_type);
2d9074ba 2481 x_send_client_event(display, dest, from,
933e29ff 2482 XInternAtom (dpyinfo->display,
42a5b22f 2483 SSDATA (message_type),
933e29ff 2484 False),
2d9074ba
JD
2485 format, values);
2486
2487 return Qnil;
2488}
2489
2490void
2491x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from, Atom message_type, Lisp_Object format, Lisp_Object values)
1fb3821b
JD
2492{
2493 struct x_display_info *dpyinfo = check_x_display_info (display);
2494 Window wdest;
2495 XEvent event;
1fb3821b 2496 struct frame *f = check_x_frame (from);
1fb3821b
JD
2497 int to_root;
2498
1fb3821b
JD
2499 CHECK_NUMBER (format);
2500 CHECK_CONS (values);
2501
2502 if (x_check_property_data (values) == -1)
2503 error ("Bad data in VALUES, must be number, cons or string");
2504
2505 event.xclient.type = ClientMessage;
2506 event.xclient.format = XFASTINT (format);
2507
2508 if (event.xclient.format != 8 && event.xclient.format != 16
2509 && event.xclient.format != 32)
2510 error ("FORMAT must be one of 8, 16 or 32");
a0ecb2ac 2511
1fb3821b
JD
2512 if (FRAMEP (dest) || NILP (dest))
2513 {
2514 struct frame *fdest = check_x_frame (dest);
2515 wdest = FRAME_OUTER_WINDOW (fdest);
2516 }
2517 else if (STRINGP (dest))
2518 {
42a5b22f 2519 if (strcmp (SSDATA (dest), "PointerWindow") == 0)
1fb3821b 2520 wdest = PointerWindow;
42a5b22f 2521 else if (strcmp (SSDATA (dest), "InputFocus") == 0)
1fb3821b
JD
2522 wdest = InputFocus;
2523 else
2524 error ("DEST as a string must be one of PointerWindow or InputFocus");
2525 }
2526 else if (INTEGERP (dest))
2527 wdest = (Window) XFASTINT (dest);
2528 else if (FLOATP (dest))
ff59904a 2529 wdest = (Window) XFLOAT_DATA (dest);
1fb3821b
JD
2530 else if (CONSP (dest))
2531 {
2532 if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest)))
2533 error ("Both car and cdr for DEST must be numbers");
2534 else
2535 wdest = (Window) cons_to_long (dest);
2536 }
2537 else
2538 error ("DEST must be a frame, nil, string, number or cons");
2539
2540 if (wdest == 0) wdest = dpyinfo->root_window;
2541 to_root = wdest == dpyinfo->root_window;
2542
1fb3821b
JD
2543 BLOCK_INPUT;
2544
2d9074ba 2545 event.xclient.message_type = message_type;
1fb3821b
JD
2546 event.xclient.display = dpyinfo->display;
2547
2548 /* Some clients (metacity for example) expects sending window to be here
2549 when sending to the root window. */
2550 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2551
6e816df5 2552
1fb3821b
JD
2553 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2554 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2555 event.xclient.format);
2556
2557 /* If event mask is 0 the event is sent to the client that created
2558 the destination window. But if we are sending to the root window,
2559 there is no such client. Then we set the event mask to 0xffff. The
2560 event then goes to clients selecting for events on the root window. */
9ba8e10d 2561 x_catch_errors (dpyinfo->display);
1fb3821b
JD
2562 {
2563 int propagate = to_root ? False : True;
2564 unsigned mask = to_root ? 0xffff : 0;
2565 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2566 XFlush (dpyinfo->display);
2567 }
4545fa20 2568 x_uncatch_errors ();
1fb3821b 2569 UNBLOCK_INPUT;
1fb3821b
JD
2570}
2571
2572\f
ede4db72 2573void
971de7fb 2574syms_of_xselect (void)
ede4db72 2575{
ede4db72
RS
2576 defsubr (&Sx_get_selection_internal);
2577 defsubr (&Sx_own_selection_internal);
2578 defsubr (&Sx_disown_selection_internal);
2579 defsubr (&Sx_selection_owner_p);
2580 defsubr (&Sx_selection_exists_p);
2581
1fb3821b
JD
2582 defsubr (&Sx_get_atom_name);
2583 defsubr (&Sx_send_client_message);
9fc68699 2584 defsubr (&Sx_register_dnd_atom);
1fb3821b 2585
ede4db72
RS
2586 reading_selection_reply = Fcons (Qnil, Qnil);
2587 staticpro (&reading_selection_reply);
2588 reading_selection_window = 0;
2589 reading_which_selection = 0;
2590
2591 property_change_wait_list = 0;
2f65feb6 2592 prop_location_identifier = 0;
ede4db72
RS
2593 property_change_reply = Fcons (Qnil, Qnil);
2594 staticpro (&property_change_reply);
2595
2596 Vselection_alist = Qnil;
2597 staticpro (&Vselection_alist);
2598
29208e82 2599 DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist,
8c1a1077
PJ
2600 doc: /* An alist associating X Windows selection-types with functions.
2601These functions are called to convert the selection, with three args:
2602the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2603a desired type to which the selection should be converted;
2604and the local selection value (whatever was given to `x-own-selection').
2605
2606The function should return the value to send to the X server
2607\(typically a string). A return value of nil
2608means that the conversion could not be done.
2609A return value which is the symbol `NULL'
2610means that a side-effect was executed,
2611and there is no meaningful selection value. */);
ede4db72
RS
2612 Vselection_converter_alist = Qnil;
2613
29208e82 2614 DEFVAR_LISP ("x-lost-selection-functions", Vx_lost_selection_functions,
8c1a1077
PJ
2615 doc: /* A list of functions to be called when Emacs loses an X selection.
2616\(This happens when some other X client makes its own selection
2617or when a Lisp program explicitly clears the selection.)
2618The functions are called with one argument, the selection type
2619\(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
c917a8de 2620 Vx_lost_selection_functions = Qnil;
ede4db72 2621
29208e82 2622 DEFVAR_LISP ("x-sent-selection-functions", Vx_sent_selection_functions,
8c1a1077
PJ
2623 doc: /* A list of functions to be called when Emacs answers a selection request.
2624The functions are called with four arguments:
2625 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2626 - the selection-type which Emacs was asked to convert the
2627 selection into before sending (for example, `STRING' or `LENGTH');
2628 - a flag indicating success or failure for responding to the request.
2629We might have failed (and declined the request) for any number of reasons,
2630including being asked for a selection that we no longer own, or being asked
2631to convert into a type that we don't know about or that is inappropriate.
2632This hook doesn't let you change the behavior of Emacs's selection replies,
2633it merely informs you that they have happened. */);
c917a8de 2634 Vx_sent_selection_functions = Qnil;
ede4db72 2635
29208e82 2636 DEFVAR_INT ("x-selection-timeout", x_selection_timeout,
8c1a1077
PJ
2637 doc: /* Number of milliseconds to wait for a selection reply.
2638If the selection owner doesn't reply in this time, we give up.
2639A value of 0 means wait as long as necessary. This is initialized from the
2640\"*selectionTimeout\" resource. */);
ede4db72
RS
2641 x_selection_timeout = 0;
2642
9852377f 2643 /* QPRIMARY is defined in keyboard.c. */
f3d4e0a4
CY
2644 DEFSYM (QSECONDARY, "SECONDARY");
2645 DEFSYM (QSTRING, "STRING");
2646 DEFSYM (QINTEGER, "INTEGER");
2647 DEFSYM (QCLIPBOARD, "CLIPBOARD");
2648 DEFSYM (QTIMESTAMP, "TIMESTAMP");
2649 DEFSYM (QTEXT, "TEXT");
2650 DEFSYM (QCOMPOUND_TEXT, "COMPOUND_TEXT");
2651 DEFSYM (QUTF8_STRING, "UTF8_STRING");
2652 DEFSYM (QDELETE, "DELETE");
2653 DEFSYM (QMULTIPLE, "MULTIPLE");
2654 DEFSYM (QINCR, "INCR");
2655 DEFSYM (QEMACS_TMP, "_EMACS_TMP_");
2656 DEFSYM (QTARGETS, "TARGETS");
2657 DEFSYM (QATOM, "ATOM");
2658 DEFSYM (QATOM_PAIR, "ATOM_PAIR");
2659 DEFSYM (QSAVE_TARGETS, "SAVE_TARGETS");
2660 DEFSYM (QNULL, "NULL");
2661 DEFSYM (Qcompound_text_with_extensions, "compound-text-with-extensions");
2662 DEFSYM (Qforeign_selection, "foreign-selection");
ede4db72 2663}