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