Rename wait_reading_process_input to wait_reading_process_output.
[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
8f4f023f
RS
111static Lisp_Object Vx_lost_selection_hooks;
112static Lisp_Object Vx_sent_selection_hooks;
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. */
afe1529d 747 XFlush (display);
5a499696 748 x_uncatch_errors (display, count);
afe1529d 749 UNBLOCK_INPUT;
ede4db72
RS
750}
751\f
752/* Handle a SelectionRequest event EVENT.
753 This is called from keyboard.c when such an event is found in the queue. */
754
755void
756x_handle_selection_request (event)
757 struct input_event *event;
758{
759 struct gcpro gcpro1, gcpro2, gcpro3;
9d2d1dd8 760 Lisp_Object local_selection_data;
ede4db72 761 Lisp_Object selection_symbol;
9d2d1dd8
KH
762 Lisp_Object target_symbol;
763 Lisp_Object converted_selection;
ede4db72 764 Time local_selection_time;
9d2d1dd8 765 Lisp_Object successful_p;
ede4db72 766 int count;
5c3a351a
RS
767 struct x_display_info *dpyinfo
768 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event));
ede4db72 769
9d2d1dd8
KH
770 local_selection_data = Qnil;
771 target_symbol = Qnil;
772 converted_selection = Qnil;
773 successful_p = Qnil;
774
ede4db72
RS
775 GCPRO3 (local_selection_data, converted_selection, target_symbol);
776
d9c0d4a3 777 selection_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event),
ede4db72
RS
778 SELECTION_EVENT_SELECTION (event));
779
780 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
ede4db72
RS
781
782 if (NILP (local_selection_data))
783 {
784 /* Someone asked for the selection, but we don't have it any more.
785 */
786 x_decline_selection_request (event);
787 goto DONE;
788 }
789
790 local_selection_time = (Time)
8e713be6 791 cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
ede4db72
RS
792
793 if (SELECTION_EVENT_TIME (event) != CurrentTime
7da64e5c 794 && local_selection_time > SELECTION_EVENT_TIME (event))
ede4db72
RS
795 {
796 /* Someone asked for the selection, and we have one, but not the one
797 they're looking for.
798 */
799 x_decline_selection_request (event);
800 goto DONE;
801 }
802
ede4db72 803 x_selection_current_request = event;
331379bf 804 count = SPECPDL_INDEX ();
ca29f2b8 805 selection_request_dpyinfo = dpyinfo;
ede4db72
RS
806 record_unwind_protect (x_selection_request_lisp_error, Qnil);
807
d9c0d4a3 808 target_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event),
ede4db72
RS
809 SELECTION_EVENT_TARGET (event));
810
811#if 0 /* #### MULTIPLE doesn't work yet */
812 if (EQ (target_symbol, QMULTIPLE))
813 target_symbol = fetch_multiple_target (event);
814#endif
1b65481e 815
ede4db72 816 /* Convert lisp objects back into binary data */
1b65481e 817
ede4db72 818 converted_selection
5109c8dd 819 = x_get_local_selection (selection_symbol, target_symbol, 0);
1b65481e 820
ede4db72
RS
821 if (! NILP (converted_selection))
822 {
823 unsigned char *data;
824 unsigned int size;
825 int format;
826 Atom type;
aca39f42
RS
827 int nofree;
828
2f65feb6
RS
829 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event),
830 converted_selection,
aca39f42 831 &data, &type, &size, &format, &nofree);
1b65481e 832
ede4db72
RS
833 x_reply_selection_request (event, format, data, size, type);
834 successful_p = Qt;
835
836 /* Indicate we have successfully processed this event. */
7da64e5c 837 x_selection_current_request = 0;
ede4db72 838
4feb31b2 839 /* Use xfree, not XFree, because lisp_data_to_selection_data
0158abbc 840 calls xmalloc itself. */
aca39f42 841 if (!nofree)
4feb31b2 842 xfree (data);
ede4db72
RS
843 }
844 unbind_to (count, Qnil);
845
846 DONE:
847
ede4db72
RS
848 /* Let random lisp code notice that the selection has been asked for. */
849 {
9d2d1dd8
KH
850 Lisp_Object rest;
851 rest = Vx_sent_selection_hooks;
ede4db72
RS
852 if (!EQ (rest, Qunbound))
853 for (; CONSP (rest); rest = Fcdr (rest))
854 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
855 }
4f06187f
RS
856
857 UNGCPRO;
ede4db72
RS
858}
859\f
e18e6130 860/* Handle a SelectionClear event EVENT, which indicates that some
ede4db72
RS
861 client cleared out our previously asserted selection.
862 This is called from keyboard.c when such an event is found in the queue. */
863
864void
865x_handle_selection_clear (event)
866 struct input_event *event;
867{
868 Display *display = SELECTION_EVENT_DISPLAY (event);
869 Atom selection = SELECTION_EVENT_SELECTION (event);
870 Time changed_owner_time = SELECTION_EVENT_TIME (event);
1b65481e 871
ede4db72
RS
872 Lisp_Object selection_symbol, local_selection_data;
873 Time local_selection_time;
5c3a351a 874 struct x_display_info *dpyinfo = x_display_info_for_display (display);
e18e6130
RS
875 struct x_display_info *t_dpyinfo;
876
877 /* If the new selection owner is also Emacs,
878 don't clear the new selection. */
879 BLOCK_INPUT;
880 /* Check each display on the same terminal,
881 to see if this Emacs job now owns the selection
882 through that display. */
883 for (t_dpyinfo = x_display_list; t_dpyinfo; t_dpyinfo = t_dpyinfo->next)
884 if (t_dpyinfo->kboard == dpyinfo->kboard)
885 {
886 Window owner_window
887 = XGetSelectionOwner (t_dpyinfo->display, selection);
888 if (x_window_to_frame (t_dpyinfo, owner_window) != 0)
889 {
890 UNBLOCK_INPUT;
891 return;
892 }
893 }
894 UNBLOCK_INPUT;
ede4db72 895
d9c0d4a3 896 selection_symbol = x_atom_to_symbol (display, selection);
ede4db72
RS
897
898 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist);
899
900 /* Well, we already believe that we don't own it, so that's just fine. */
901 if (NILP (local_selection_data)) return;
902
903 local_selection_time = (Time)
8e713be6 904 cons_to_long (XCAR (XCDR (XCDR (local_selection_data))));
ede4db72
RS
905
906 /* This SelectionClear is for a selection that we no longer own, so we can
907 disregard it. (That is, we have reasserted the selection since this
908 request was generated.) */
909
910 if (changed_owner_time != CurrentTime
911 && local_selection_time > changed_owner_time)
912 return;
913
914 /* Otherwise, we're really honest and truly being told to drop it.
915 Don't use Fdelq as that may QUIT;. */
916
917 if (EQ (local_selection_data, Fcar (Vselection_alist)))
918 Vselection_alist = Fcdr (Vselection_alist);
919 else
920 {
921 Lisp_Object rest;
922 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
8e713be6 923 if (EQ (local_selection_data, Fcar (XCDR (rest))))
ede4db72 924 {
f3fbd155 925 XSETCDR (rest, Fcdr (XCDR (rest)));
ede4db72
RS
926 break;
927 }
928 }
929
930 /* Let random lisp code notice that the selection has been stolen. */
931
932 {
d1f21a66
RS
933 Lisp_Object rest;
934 rest = Vx_lost_selection_hooks;
ede4db72 935 if (!EQ (rest, Qunbound))
d1f21a66
RS
936 {
937 for (; CONSP (rest); rest = Fcdr (rest))
938 call1 (Fcar (rest), selection_symbol);
7c6b2ea4 939 prepare_menu_bars ();
3007ebfb 940 redisplay_preserve_echo_area (20);
d1f21a66 941 }
ede4db72
RS
942 }
943}
944
118bd841
RS
945/* Clear all selections that were made from frame F.
946 We do this when about to delete a frame. */
947
948void
949x_clear_frame_selections (f)
950 FRAME_PTR f;
951{
952 Lisp_Object frame;
953 Lisp_Object rest;
954
90851bbe 955 XSETFRAME (frame, f);
118bd841
RS
956
957 /* Otherwise, we're really honest and truly being told to drop it.
958 Don't use Fdelq as that may QUIT;. */
959
0d199f9c
RS
960 /* Delete elements from the beginning of Vselection_alist. */
961 while (!NILP (Vselection_alist)
962 && EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist)))))))
963 {
964 /* Let random Lisp code notice that the selection has been stolen. */
965 Lisp_Object hooks, selection_symbol;
966
967 hooks = Vx_lost_selection_hooks;
968 selection_symbol = Fcar (Fcar (Vselection_alist));
969
970 if (!EQ (hooks, Qunbound))
971 {
972 for (; CONSP (hooks); hooks = Fcdr (hooks))
973 call1 (Fcar (hooks), selection_symbol);
996b804d
MB
974#if 0 /* This can crash when deleting a frame
975 from x_connection_closed. Anyway, it seems unnecessary;
976 something else should cause a redisplay. */
3007ebfb 977 redisplay_preserve_echo_area (21);
996b804d 978#endif
0d199f9c
RS
979 }
980
981 Vselection_alist = Fcdr (Vselection_alist);
982 }
983
984 /* Delete elements after the beginning of Vselection_alist. */
118bd841 985 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
8e713be6 986 if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest))))))))
118bd841
RS
987 {
988 /* Let random Lisp code notice that the selection has been stolen. */
989 Lisp_Object hooks, selection_symbol;
990
991 hooks = Vx_lost_selection_hooks;
8e713be6 992 selection_symbol = Fcar (Fcar (XCDR (rest)));
118bd841
RS
993
994 if (!EQ (hooks, Qunbound))
995 {
996 for (; CONSP (hooks); hooks = Fcdr (hooks))
997 call1 (Fcar (hooks), selection_symbol);
996b804d 998#if 0 /* See above */
3007ebfb 999 redisplay_preserve_echo_area (22);
996b804d 1000#endif
118bd841 1001 }
f3fbd155 1002 XSETCDR (rest, Fcdr (XCDR (rest)));
118bd841
RS
1003 break;
1004 }
1005}
ede4db72 1006\f
ede4db72
RS
1007/* Nonzero if any properties for DISPLAY and WINDOW
1008 are on the list of what we are waiting for. */
1009
1010static int
1011waiting_for_other_props_on_window (display, window)
1012 Display *display;
1013 Window window;
1014{
1015 struct prop_location *rest = property_change_wait_list;
1016 while (rest)
1017 if (rest->display == display && rest->window == window)
1018 return 1;
1019 else
1020 rest = rest->next;
1021 return 0;
1022}
1023
1024/* Add an entry to the list of property changes we are waiting for.
1025 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1026 The return value is a number that uniquely identifies
1027 this awaited property change. */
1028
d1f21a66 1029static struct prop_location *
ede4db72
RS
1030expect_property_change (display, window, property, state)
1031 Display *display;
1032 Window window;
6c070502 1033 Atom property;
ede4db72
RS
1034 int state;
1035{
d9c0d4a3 1036 struct prop_location *pl = (struct prop_location *) xmalloc (sizeof *pl);
2f65feb6 1037 pl->identifier = ++prop_location_identifier;
ede4db72
RS
1038 pl->display = display;
1039 pl->window = window;
1040 pl->property = property;
1041 pl->desired_state = state;
1042 pl->next = property_change_wait_list;
d1f21a66 1043 pl->arrived = 0;
ede4db72 1044 property_change_wait_list = pl;
d1f21a66 1045 return pl;
ede4db72
RS
1046}
1047
1048/* Delete an entry from the list of property changes we are waiting for.
2f65feb6 1049 IDENTIFIER is the number that uniquely identifies the entry. */
ede4db72
RS
1050
1051static void
d1f21a66
RS
1052unexpect_property_change (location)
1053 struct prop_location *location;
ede4db72
RS
1054{
1055 struct prop_location *prev = 0, *rest = property_change_wait_list;
1056 while (rest)
1057 {
d1f21a66 1058 if (rest == location)
ede4db72
RS
1059 {
1060 if (prev)
1061 prev->next = rest->next;
1062 else
1063 property_change_wait_list = rest->next;
4feb31b2 1064 xfree (rest);
ede4db72
RS
1065 return;
1066 }
1067 prev = rest;
1068 rest = rest->next;
1069 }
1070}
1071
2f65feb6
RS
1072/* Remove the property change expectation element for IDENTIFIER. */
1073
1074static Lisp_Object
1075wait_for_property_change_unwind (identifierval)
1076 Lisp_Object identifierval;
1077{
c4898489 1078 unexpect_property_change ((struct prop_location *)
8e713be6
KR
1079 (XFASTINT (XCAR (identifierval)) << 16
1080 | XFASTINT (XCDR (identifierval))));
ab552306 1081 return Qnil;
2f65feb6
RS
1082}
1083
ede4db72 1084/* Actually wait for a property change.
2f65feb6 1085 IDENTIFIER should be the value that expect_property_change returned. */
ede4db72
RS
1086
1087static void
d1f21a66
RS
1088wait_for_property_change (location)
1089 struct prop_location *location;
ede4db72 1090{
2f65feb6 1091 int secs, usecs;
aed13378 1092 int count = SPECPDL_INDEX ();
d1f21a66
RS
1093 Lisp_Object tem;
1094
c4898489 1095 tem = Fcons (Qnil, Qnil);
f3fbd155
KR
1096 XSETCARFASTINT (tem, (EMACS_UINT)location >> 16);
1097 XSETCDRFASTINT (tem, (EMACS_UINT)location & 0xffff);
2f65feb6
RS
1098
1099 /* Make sure to do unexpect_property_change if we quit or err. */
d1f21a66 1100 record_unwind_protect (wait_for_property_change_unwind, tem);
2f65feb6 1101
f3fbd155 1102 XSETCAR (property_change_reply, Qnil);
2f65feb6 1103
afe1529d
RS
1104 property_change_reply_object = location;
1105 /* If the event we are waiting for arrives beyond here, it will set
1106 property_change_reply, because property_change_reply_object says so. */
d1f21a66
RS
1107 if (! location->arrived)
1108 {
d1f21a66
RS
1109 secs = x_selection_timeout / 1000;
1110 usecs = (x_selection_timeout % 1000) * 1000;
d9c0d4a3 1111 TRACE2 (" Waiting %d secs, %d usecs", secs, usecs);
d64b707c
KS
1112 wait_reading_process_output (secs, usecs, 0, 0,
1113 property_change_reply, NULL, 0);
d1f21a66 1114
8e713be6 1115 if (NILP (XCAR (property_change_reply)))
d9c0d4a3
GM
1116 {
1117 TRACE0 (" Timed out");
1118 error ("Timed out waiting for property-notify event");
1119 }
d1f21a66 1120 }
2f65feb6
RS
1121
1122 unbind_to (count, Qnil);
ede4db72
RS
1123}
1124
1125/* Called from XTread_socket in response to a PropertyNotify event. */
1126
1127void
1128x_handle_property_notify (event)
1129 XPropertyEvent *event;
1130{
1131 struct prop_location *prev = 0, *rest = property_change_wait_list;
d9c0d4a3 1132
ede4db72
RS
1133 while (rest)
1134 {
1135 if (rest->property == event->atom
1136 && rest->window == event->window
1137 && rest->display == event->display
1138 && rest->desired_state == event->state)
1139 {
d9c0d4a3
GM
1140 TRACE2 ("Expected %s of property %s",
1141 (event->state == PropertyDelete ? "deletion" : "change"),
1142 XGetAtomName (event->display, event->atom));
ede4db72 1143
d1f21a66
RS
1144 rest->arrived = 1;
1145
ede4db72
RS
1146 /* If this is the one wait_for_property_change is waiting for,
1147 tell it to wake up. */
d1f21a66 1148 if (rest == property_change_reply_object)
f3fbd155 1149 XSETCAR (property_change_reply, Qt);
ede4db72
RS
1150
1151 if (prev)
1152 prev->next = rest->next;
1153 else
1154 property_change_wait_list = rest->next;
4feb31b2 1155 xfree (rest);
ede4db72
RS
1156 return;
1157 }
1b65481e 1158
ede4db72
RS
1159 prev = rest;
1160 rest = rest->next;
1161 }
ede4db72
RS
1162}
1163
1164
1165\f
1166#if 0 /* #### MULTIPLE doesn't work yet */
1167
1168static Lisp_Object
1169fetch_multiple_target (event)
1170 XSelectionRequestEvent *event;
1171{
1172 Display *display = event->display;
5d0ba25b 1173 Window window = event->requestor;
ede4db72
RS
1174 Atom target = event->target;
1175 Atom selection_atom = event->selection;
1176 int result;
1177
1178 return
1179 Fcons (QMULTIPLE,
1180 x_get_window_property_as_lisp_data (display, window, target,
1181 QMULTIPLE, selection_atom));
1182}
1183
1184static Lisp_Object
1185copy_multiple_data (obj)
1186 Lisp_Object obj;
1187{
1188 Lisp_Object vec;
1189 int i;
1190 int size;
1191 if (CONSP (obj))
8e713be6 1192 return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj)));
1b65481e 1193
b7826503 1194 CHECK_VECTOR (obj);
ede4db72
RS
1195 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil);
1196 for (i = 0; i < size; i++)
1197 {
1198 Lisp_Object vec2 = XVECTOR (obj)->contents [i];
b7826503 1199 CHECK_VECTOR (vec2);
ede4db72
RS
1200 if (XVECTOR (vec2)->size != 2)
1201 /* ??? Confusing error message */
1202 Fsignal (Qerror, Fcons (build_string ("vectors must be of length 2"),
1203 Fcons (vec2, Qnil)));
1204 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil);
1205 XVECTOR (XVECTOR (vec)->contents [i])->contents [0]
1206 = XVECTOR (vec2)->contents [0];
1207 XVECTOR (XVECTOR (vec)->contents [i])->contents [1]
1208 = XVECTOR (vec2)->contents [1];
1209 }
1210 return vec;
1211}
1212
1213#endif
1214
1215\f
1216/* Variables for communication with x_handle_selection_notify. */
1217static Atom reading_which_selection;
1218static Lisp_Object reading_selection_reply;
1219static Window reading_selection_window;
1220
1221/* Do protocol to read selection-data from the server.
1222 Converts this to Lisp data and returns it. */
1223
1224static Lisp_Object
3a42401d
JD
1225x_get_foreign_selection (selection_symbol, target_type, time_stamp)
1226 Lisp_Object selection_symbol, target_type, time_stamp;
ede4db72 1227{
378c33ca
GM
1228 struct frame *sf = SELECTED_FRAME ();
1229 Window requestor_window = FRAME_X_WINDOW (sf);
1230 Display *display = FRAME_X_DISPLAY (sf);
1231 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (sf);
5d0ba25b 1232 Time requestor_time = last_event_timestamp;
5c3a351a
RS
1233 Atom target_property = dpyinfo->Xatom_EMACS_TMP;
1234 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol);
ede4db72 1235 Atom type_atom;
80da0190 1236 int secs, usecs;
5a499696 1237 int count;
55b2d45d 1238 Lisp_Object frame;
ede4db72
RS
1239
1240 if (CONSP (target_type))
8e713be6 1241 type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type));
ede4db72 1242 else
5c3a351a 1243 type_atom = symbol_to_x_atom (dpyinfo, display, target_type);
ede4db72 1244
3a42401d
JD
1245 if (! NILP (time_stamp))
1246 {
1247 if (CONSP (time_stamp))
1248 requestor_time = (Time) cons_to_long (time_stamp);
1249 else if (INTEGERP (time_stamp))
1250 requestor_time = (Time) XUINT (time_stamp);
1251 else if (FLOATP (time_stamp))
1252 requestor_time = (Time) XFLOAT (time_stamp);
1253 else
1254 error ("TIME_STAMP must be cons or number");
1255 }
1256
ede4db72 1257 BLOCK_INPUT;
1b65481e 1258
5a499696 1259 count = x_catch_errors (display);
1b65481e 1260
d9c0d4a3
GM
1261 TRACE2 ("Get selection %s, type %s",
1262 XGetAtomName (display, type_atom),
1263 XGetAtomName (display, target_property));
1264
ede4db72 1265 XConvertSelection (display, selection_atom, type_atom, target_property,
5d0ba25b 1266 requestor_window, requestor_time);
5c3a351a 1267 XFlush (display);
ede4db72
RS
1268
1269 /* Prepare to block until the reply has been read. */
5d0ba25b 1270 reading_selection_window = requestor_window;
ede4db72 1271 reading_which_selection = selection_atom;
f3fbd155 1272 XSETCAR (reading_selection_reply, Qnil);
55b2d45d
RS
1273
1274 frame = some_frame_on_display (dpyinfo);
1275
1276 /* If the display no longer has frames, we can't expect
1277 to get many more selection requests from it, so don't
1278 bother trying to queue them. */
1279 if (!NILP (frame))
1280 {
1281 x_start_queuing_selection_requests (display);
1282
1283 record_unwind_protect (queue_selection_requests_unwind,
1284 frame);
1285 }
ede4db72
RS
1286 UNBLOCK_INPUT;
1287
80da0190
RS
1288 /* This allows quits. Also, don't wait forever. */
1289 secs = x_selection_timeout / 1000;
1290 usecs = (x_selection_timeout % 1000) * 1000;
d9c0d4a3 1291 TRACE1 (" Start waiting %d secs for SelectionNotify", secs);
d64b707c
KS
1292 wait_reading_process_output (secs, usecs, 0, 0,
1293 reading_selection_reply, NULL, 0);
d9c0d4a3 1294 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply)));
ede4db72 1295
7c6b2ea4 1296 BLOCK_INPUT;
a7b24d46 1297 x_check_errors (display, "Cannot get selection: %s");
5a499696 1298 x_uncatch_errors (display, count);
7c6b2ea4
RS
1299 UNBLOCK_INPUT;
1300
8e713be6 1301 if (NILP (XCAR (reading_selection_reply)))
606140dd 1302 error ("Timed out waiting for reply from selection owner");
8e713be6 1303 if (EQ (XCAR (reading_selection_reply), Qlambda))
d5db4077 1304 error ("No `%s' selection", SDATA (SYMBOL_NAME (selection_symbol)));
ede4db72
RS
1305
1306 /* Otherwise, the selection is waiting for us on the requested property. */
1307 return
5d0ba25b 1308 x_get_window_property_as_lisp_data (display, requestor_window,
ede4db72
RS
1309 target_property, target_type,
1310 selection_atom);
1311}
1312\f
1313/* Subroutines of x_get_window_property_as_lisp_data */
1314
4feb31b2 1315/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1316
ede4db72
RS
1317static void
1318x_get_window_property (display, window, property, data_ret, bytes_ret,
1319 actual_type_ret, actual_format_ret, actual_size_ret,
1320 delete_p)
1321 Display *display;
1322 Window window;
1323 Atom property;
1324 unsigned char **data_ret;
1325 int *bytes_ret;
1326 Atom *actual_type_ret;
1327 int *actual_format_ret;
1328 unsigned long *actual_size_ret;
1329 int delete_p;
1330{
1331 int total_size;
1332 unsigned long bytes_remaining;
1333 int offset = 0;
1334 unsigned char *tmp_data = 0;
1335 int result;
1336 int buffer_size = SELECTION_QUANTUM (display);
1b65481e 1337
d9c0d4a3
GM
1338 if (buffer_size > MAX_SELECTION_QUANTUM)
1339 buffer_size = MAX_SELECTION_QUANTUM;
1b65481e 1340
ede4db72 1341 BLOCK_INPUT;
1b65481e 1342
ede4db72
RS
1343 /* First probe the thing to find out how big it is. */
1344 result = XGetWindowProperty (display, window, property,
137edb72 1345 0L, 0L, False, AnyPropertyType,
ede4db72
RS
1346 actual_type_ret, actual_format_ret,
1347 actual_size_ret,
1348 &bytes_remaining, &tmp_data);
ede4db72
RS
1349 if (result != Success)
1350 {
2f65feb6 1351 UNBLOCK_INPUT;
ede4db72
RS
1352 *data_ret = 0;
1353 *bytes_ret = 0;
1354 return;
1355 }
1b65481e 1356
0158abbc
RS
1357 /* This was allocated by Xlib, so use XFree. */
1358 XFree ((char *) tmp_data);
1b65481e 1359
ede4db72
RS
1360 if (*actual_type_ret == None || *actual_format_ret == 0)
1361 {
2f65feb6 1362 UNBLOCK_INPUT;
ede4db72
RS
1363 return;
1364 }
1365
1366 total_size = bytes_remaining + 1;
1367 *data_ret = (unsigned char *) xmalloc (total_size);
1b65481e 1368
2a1a4c9d 1369 /* Now read, until we've gotten it all. */
ede4db72
RS
1370 while (bytes_remaining)
1371 {
d9c0d4a3 1372#ifdef TRACE_SELECTION
ede4db72
RS
1373 int last = bytes_remaining;
1374#endif
1375 result
1376 = XGetWindowProperty (display, window, property,
137edb72 1377 (long)offset/4, (long)buffer_size/4,
2f65feb6 1378 False,
ede4db72
RS
1379 AnyPropertyType,
1380 actual_type_ret, actual_format_ret,
1381 actual_size_ret, &bytes_remaining, &tmp_data);
d9c0d4a3
GM
1382
1383 TRACE2 ("Read %ld bytes from property %s",
1384 last - bytes_remaining,
1385 XGetAtomName (display, property));
1386
ede4db72
RS
1387 /* If this doesn't return Success at this point, it means that
1388 some clod deleted the selection while we were in the midst of
d9c0d4a3
GM
1389 reading it. Deal with that, I guess.... */
1390 if (result != Success)
1391 break;
ede4db72
RS
1392 *actual_size_ret *= *actual_format_ret / 8;
1393 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret);
1394 offset += *actual_size_ret;
1b65481e 1395
0158abbc
RS
1396 /* This was allocated by Xlib, so use XFree. */
1397 XFree ((char *) tmp_data);
ede4db72 1398 }
2f65feb6 1399
5c3a351a 1400 XFlush (display);
ede4db72
RS
1401 UNBLOCK_INPUT;
1402 *bytes_ret = offset;
1403}
1404\f
4feb31b2 1405/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1406
ede4db72
RS
1407static void
1408receive_incremental_selection (display, window, property, target_type,
1409 min_size_bytes, data_ret, size_bytes_ret,
1410 type_ret, format_ret, size_ret)
1411 Display *display;
1412 Window window;
1413 Atom property;
1414 Lisp_Object target_type; /* for error messages only */
1415 unsigned int min_size_bytes;
1416 unsigned char **data_ret;
1417 int *size_bytes_ret;
1418 Atom *type_ret;
1419 unsigned long *size_ret;
1420 int *format_ret;
1421{
1422 int offset = 0;
d1f21a66 1423 struct prop_location *wait_object;
ede4db72
RS
1424 *size_bytes_ret = min_size_bytes;
1425 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret);
d9c0d4a3
GM
1426
1427 TRACE1 ("Read %d bytes incrementally", min_size_bytes);
2f65feb6
RS
1428
1429 /* At this point, we have read an INCR property.
1430 Delete the property to ack it.
1431 (But first, prepare to receive the next event in this handshake.)
ede4db72
RS
1432
1433 Now, we must loop, waiting for the sending window to put a value on
1434 that property, then reading the property, then deleting it to ack.
1435 We are done when the sender places a property of length 0.
1436 */
2f65feb6
RS
1437 BLOCK_INPUT;
1438 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask);
d9c0d4a3
GM
1439 TRACE1 (" Delete property %s",
1440 XSYMBOL (x_atom_to_symbol (display, property))->name->data);
2f65feb6 1441 XDeleteProperty (display, window, property);
d9c0d4a3
GM
1442 TRACE1 (" Expect new value of property %s",
1443 XSYMBOL (x_atom_to_symbol (display, property))->name->data);
d1f21a66
RS
1444 wait_object = expect_property_change (display, window, property,
1445 PropertyNewValue);
5c3a351a 1446 XFlush (display);
2f65feb6
RS
1447 UNBLOCK_INPUT;
1448
ede4db72
RS
1449 while (1)
1450 {
1451 unsigned char *tmp_data;
1452 int tmp_size_bytes;
d9c0d4a3
GM
1453
1454 TRACE0 (" Wait for property change");
d1f21a66 1455 wait_for_property_change (wait_object);
1b65481e 1456
ede4db72 1457 /* expect it again immediately, because x_get_window_property may
2a1a4c9d 1458 .. no it won't, I don't get it.
d9c0d4a3
GM
1459 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1460 TRACE0 (" Get property value");
ede4db72
RS
1461 x_get_window_property (display, window, property,
1462 &tmp_data, &tmp_size_bytes,
1463 type_ret, format_ret, size_ret, 1);
1464
d9c0d4a3
GM
1465 TRACE1 (" Read increment of %d bytes", tmp_size_bytes);
1466
ede4db72
RS
1467 if (tmp_size_bytes == 0) /* we're done */
1468 {
d9c0d4a3
GM
1469 TRACE0 ("Done reading incrementally");
1470
2f65feb6
RS
1471 if (! waiting_for_other_props_on_window (display, window))
1472 XSelectInput (display, window, STANDARD_EVENT_SET);
d1f21a66 1473 unexpect_property_change (wait_object);
4feb31b2 1474 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1475 calls xmalloc itself. */
4feb31b2 1476 if (tmp_data) xfree (tmp_data);
ede4db72
RS
1477 break;
1478 }
2f65feb6
RS
1479
1480 BLOCK_INPUT;
d9c0d4a3
GM
1481 TRACE1 (" ACK by deleting property %s",
1482 XGetAtomName (display, property));
2f65feb6 1483 XDeleteProperty (display, window, property);
d1f21a66
RS
1484 wait_object = expect_property_change (display, window, property,
1485 PropertyNewValue);
5c3a351a 1486 XFlush (display);
2f65feb6
RS
1487 UNBLOCK_INPUT;
1488
ede4db72
RS
1489 if (*size_bytes_ret < offset + tmp_size_bytes)
1490 {
ede4db72
RS
1491 *size_bytes_ret = offset + tmp_size_bytes;
1492 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret);
1493 }
1b65481e 1494
018cfa07 1495 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes);
ede4db72 1496 offset += tmp_size_bytes;
1b65481e 1497
4feb31b2 1498 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1499 calls xmalloc itself. */
4feb31b2 1500 xfree (tmp_data);
ede4db72
RS
1501 }
1502}
d9c0d4a3 1503
ede4db72
RS
1504\f
1505/* Once a requested selection is "ready" (we got a SelectionNotify event),
1506 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1507 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1508
1509static Lisp_Object
1510x_get_window_property_as_lisp_data (display, window, property, target_type,
1511 selection_atom)
1512 Display *display;
1513 Window window;
1514 Atom property;
1515 Lisp_Object target_type; /* for error messages only */
1516 Atom selection_atom; /* for error messages only */
1517{
1518 Atom actual_type;
1519 int actual_format;
1520 unsigned long actual_size;
1521 unsigned char *data = 0;
1522 int bytes = 0;
1523 Lisp_Object val;
5c3a351a 1524 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1525
d9c0d4a3
GM
1526 TRACE0 ("Reading selection data");
1527
ede4db72
RS
1528 x_get_window_property (display, window, property, &data, &bytes,
1529 &actual_type, &actual_format, &actual_size, 1);
1530 if (! data)
1531 {
1532 int there_is_a_selection_owner;
1533 BLOCK_INPUT;
1534 there_is_a_selection_owner
1535 = XGetSelectionOwner (display, selection_atom);
1536 UNBLOCK_INPUT;
5a499696
RS
1537 Fsignal (Qerror,
1538 there_is_a_selection_owner
1539 ? Fcons (build_string ("selection owner couldn't convert"),
ede4db72
RS
1540 actual_type
1541 ? Fcons (target_type,
d9c0d4a3 1542 Fcons (x_atom_to_symbol (display,
5c3a351a 1543 actual_type),
ede4db72
RS
1544 Qnil))
1545 : Fcons (target_type, Qnil))
5a499696 1546 : Fcons (build_string ("no selection"),
d9c0d4a3 1547 Fcons (x_atom_to_symbol (display,
5a499696
RS
1548 selection_atom),
1549 Qnil)));
ede4db72 1550 }
1b65481e 1551
5c3a351a 1552 if (actual_type == dpyinfo->Xatom_INCR)
ede4db72
RS
1553 {
1554 /* That wasn't really the data, just the beginning. */
1555
1556 unsigned int min_size_bytes = * ((unsigned int *) data);
1557 BLOCK_INPUT;
4feb31b2 1558 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1559 calls xmalloc itself. */
4feb31b2 1560 xfree ((char *) data);
ede4db72
RS
1561 UNBLOCK_INPUT;
1562 receive_incremental_selection (display, window, property, target_type,
1563 min_size_bytes, &data, &bytes,
1564 &actual_type, &actual_format,
1565 &actual_size);
1566 }
1567
2f65feb6 1568 BLOCK_INPUT;
d9c0d4a3 1569 TRACE1 (" Delete property %s", XGetAtomName (display, property));
2f65feb6 1570 XDeleteProperty (display, window, property);
5c3a351a 1571 XFlush (display);
2f65feb6
RS
1572 UNBLOCK_INPUT;
1573
ede4db72
RS
1574 /* It's been read. Now convert it to a lisp object in some semi-rational
1575 manner. */
1576 val = selection_data_to_lisp_data (display, data, bytes,
1577 actual_type, actual_format);
1b65481e 1578
4feb31b2 1579 /* Use xfree, not XFree, because x_get_window_property
0158abbc 1580 calls xmalloc itself. */
4feb31b2 1581 xfree ((char *) data);
ede4db72
RS
1582 return val;
1583}
1584\f
1585/* These functions convert from the selection data read from the server into
1586 something that we can use from Lisp, and vice versa.
1587
1588 Type: Format: Size: Lisp Type:
1589 ----- ------- ----- -----------
1590 * 8 * String
1591 ATOM 32 1 Symbol
1592 ATOM 32 > 1 Vector of Symbols
1593 * 16 1 Integer
1594 * 16 > 1 Vector of Integers
1595 * 32 1 if <=16 bits: Integer
1596 if > 16 bits: Cons of top16, bot16
1597 * 32 > 1 Vector of the above
1598
1599 When converting a Lisp number to C, it is assumed to be of format 16 if
1600 it is an integer, and of format 32 if it is a cons of two integers.
1601
1602 When converting a vector of numbers from Lisp to C, it is assumed to be
1603 of format 16 if every element in the vector is an integer, and is assumed
1604 to be of format 32 if any element is a cons of two integers.
1605
1606 When converting an object to C, it may be of the form (SYMBOL . <data>)
1607 where SYMBOL is what we should claim that the type is. Format and
1608 representation are as above. */
1609
1610
1611
1612static Lisp_Object
1613selection_data_to_lisp_data (display, data, size, type, format)
1614 Display *display;
1615 unsigned char *data;
1616 Atom type;
1617 int size, format;
1618{
5c3a351a 1619 struct x_display_info *dpyinfo = x_display_info_for_display (display);
ede4db72 1620
5c3a351a 1621 if (type == dpyinfo->Xatom_NULL)
ede4db72
RS
1622 return QNULL;
1623
1624 /* Convert any 8-bit data to a string, for compactness. */
1625 else if (format == 8)
e6c7c988 1626 {
e57ad4d8
KH
1627 Lisp_Object str, lispy_type;
1628
1629 str = make_unibyte_string ((char *) data, size);
1630 /* Indicate that this string is from foreign selection by a text
1631 property `foreign-selection' so that the caller of
1632 x-get-selection-internal (usually x-get-selection) can know
1633 that the string must be decode. */
1634 if (type == dpyinfo->Xatom_COMPOUND_TEXT)
1635 lispy_type = QCOMPOUND_TEXT;
1636 else if (type == dpyinfo->Xatom_UTF8_STRING)
1637 lispy_type = QUTF8_STRING;
e6c7c988 1638 else
e57ad4d8
KH
1639 lispy_type = QSTRING;
1640 Fput_text_property (make_number (0), make_number (size),
1641 Qforeign_selection, lispy_type, str);
e6c7c988
KH
1642 return str;
1643 }
ede4db72
RS
1644 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1645 a vector of symbols.
1646 */
1647 else if (type == XA_ATOM)
1648 {
1649 int i;
1650 if (size == sizeof (Atom))
d9c0d4a3 1651 return x_atom_to_symbol (display, *((Atom *) data));
ede4db72
RS
1652 else
1653 {
e607a484
RS
1654 Lisp_Object v = Fmake_vector (make_number (size / sizeof (Atom)),
1655 make_number (0));
ede4db72 1656 for (i = 0; i < size / sizeof (Atom); i++)
e607a484 1657 Faset (v, make_number (i),
d9c0d4a3 1658 x_atom_to_symbol (display, ((Atom *) data) [i]));
ede4db72
RS
1659 return v;
1660 }
1661 }
1662
1663 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1664 If the number is > 16 bits, convert it to a cons of integers,
1665 16 bits in each half.
1666 */
2f51feb8
AS
1667 else if (format == 32 && size == sizeof (int))
1668 return long_to_cons (((unsigned int *) data) [0]);
ede4db72
RS
1669 else if (format == 16 && size == sizeof (short))
1670 return make_number ((int) (((unsigned short *) data) [0]));
1671
1672 /* Convert any other kind of data to a vector of numbers, represented
1673 as above (as an integer, or a cons of two 16 bit integers.)
1674 */
1675 else if (format == 16)
1676 {
1677 int i;
937a3875
RS
1678 Lisp_Object v;
1679 v = Fmake_vector (make_number (size / 2), make_number (0));
1680 for (i = 0; i < size / 2; i++)
ede4db72
RS
1681 {
1682 int j = (int) ((unsigned short *) data) [i];
e607a484 1683 Faset (v, make_number (i), make_number (j));
ede4db72
RS
1684 }
1685 return v;
1686 }
1687 else
1688 {
1689 int i;
e607a484 1690 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0));
ede4db72
RS
1691 for (i = 0; i < size / 4; i++)
1692 {
2f51feb8 1693 unsigned int j = ((unsigned int *) data) [i];
e607a484 1694 Faset (v, make_number (i), long_to_cons (j));
ede4db72
RS
1695 }
1696 return v;
1697 }
1698}
1699
1700
4feb31b2 1701/* Use xfree, not XFree, to free the data obtained with this function. */
0158abbc 1702
ede4db72
RS
1703static void
1704lisp_data_to_selection_data (display, obj,
aca39f42
RS
1705 data_ret, type_ret, size_ret,
1706 format_ret, nofree_ret)
ede4db72
RS
1707 Display *display;
1708 Lisp_Object obj;
1709 unsigned char **data_ret;
1710 Atom *type_ret;
1711 unsigned int *size_ret;
1712 int *format_ret;
aca39f42 1713 int *nofree_ret;
ede4db72
RS
1714{
1715 Lisp_Object type = Qnil;
5c3a351a 1716 struct x_display_info *dpyinfo = x_display_info_for_display (display);
aca39f42
RS
1717
1718 *nofree_ret = 0;
1719
8e713be6 1720 if (CONSP (obj) && SYMBOLP (XCAR (obj)))
ede4db72 1721 {
8e713be6
KR
1722 type = XCAR (obj);
1723 obj = XCDR (obj);
1724 if (CONSP (obj) && NILP (XCDR (obj)))
1725 obj = XCAR (obj);
ede4db72
RS
1726 }
1727
1728 if (EQ (obj, QNULL) || (EQ (type, QNULL)))
1729 { /* This is not the same as declining */
1730 *format_ret = 32;
1731 *size_ret = 0;
1732 *data_ret = 0;
1733 type = QNULL;
1734 }
1735 else if (STRINGP (obj))
1736 {
5109c8dd 1737 xassert (! STRING_MULTIBYTE (obj));
7b9ae523 1738 if (NILP (type))
5109c8dd
KH
1739 type = QSTRING;
1740 *format_ret = 8;
1741 *size_ret = SBYTES (obj);
1742 *data_ret = SDATA (obj);
1743 *nofree_ret = 1;
ede4db72
RS
1744 }
1745 else if (SYMBOLP (obj))
1746 {
1747 *format_ret = 32;
1748 *size_ret = 1;
1749 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1);
1750 (*data_ret) [sizeof (Atom)] = 0;
5c3a351a 1751 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj);
ede4db72
RS
1752 if (NILP (type)) type = QATOM;
1753 }
7da64e5c 1754 else if (INTEGERP (obj)
ede4db72
RS
1755 && XINT (obj) < 0xFFFF
1756 && XINT (obj) > -0xFFFF)
1757 {
1758 *format_ret = 16;
1759 *size_ret = 1;
1760 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1);
1761 (*data_ret) [sizeof (short)] = 0;
1762 (*(short **) data_ret) [0] = (short) XINT (obj);
1763 if (NILP (type)) type = QINTEGER;
1764 }
a87ed99c 1765 else if (INTEGERP (obj)
8e713be6
KR
1766 || (CONSP (obj) && INTEGERP (XCAR (obj))
1767 && (INTEGERP (XCDR (obj))
1768 || (CONSP (XCDR (obj))
1769 && INTEGERP (XCAR (XCDR (obj)))))))
ede4db72
RS
1770 {
1771 *format_ret = 32;
1772 *size_ret = 1;
1773 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1);
1774 (*data_ret) [sizeof (long)] = 0;
1775 (*(unsigned long **) data_ret) [0] = cons_to_long (obj);
1776 if (NILP (type)) type = QINTEGER;
1777 }
1778 else if (VECTORP (obj))
1779 {
1780 /* Lisp_Vectors may represent a set of ATOMs;
1781 a set of 16 or 32 bit INTEGERs;
1782 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1783 */
1784 int i;
1785
1786 if (SYMBOLP (XVECTOR (obj)->contents [0]))
1787 /* This vector is an ATOM set */
1788 {
1789 if (NILP (type)) type = QATOM;
1790 *size_ret = XVECTOR (obj)->size;
1791 *format_ret = 32;
1792 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom));
1793 for (i = 0; i < *size_ret; i++)
1794 if (SYMBOLP (XVECTOR (obj)->contents [i]))
1795 (*(Atom **) data_ret) [i]
5c3a351a 1796 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]);
ede4db72
RS
1797 else
1798 Fsignal (Qerror, /* Qselection_error */
1799 Fcons (build_string
1800 ("all elements of selection vector must have same type"),
1801 Fcons (obj, Qnil)));
1802 }
1803#if 0 /* #### MULTIPLE doesn't work yet */
1804 else if (VECTORP (XVECTOR (obj)->contents [0]))
1805 /* This vector is an ATOM_PAIR set */
1806 {
1807 if (NILP (type)) type = QATOM_PAIR;
1808 *size_ret = XVECTOR (obj)->size;
1809 *format_ret = 32;
1810 *data_ret = (unsigned char *)
1811 xmalloc ((*size_ret) * sizeof (Atom) * 2);
1812 for (i = 0; i < *size_ret; i++)
1813 if (VECTORP (XVECTOR (obj)->contents [i]))
1814 {
1815 Lisp_Object pair = XVECTOR (obj)->contents [i];
1816 if (XVECTOR (pair)->size != 2)
1817 Fsignal (Qerror,
1b65481e 1818 Fcons (build_string
ede4db72
RS
1819 ("elements of the vector must be vectors of exactly two elements"),
1820 Fcons (pair, Qnil)));
1b65481e 1821
ede4db72 1822 (*(Atom **) data_ret) [i * 2]
5c3a351a
RS
1823 = symbol_to_x_atom (dpyinfo, display,
1824 XVECTOR (pair)->contents [0]);
ede4db72 1825 (*(Atom **) data_ret) [(i * 2) + 1]
5c3a351a
RS
1826 = symbol_to_x_atom (dpyinfo, display,
1827 XVECTOR (pair)->contents [1]);
ede4db72
RS
1828 }
1829 else
1830 Fsignal (Qerror,
1831 Fcons (build_string
1832 ("all elements of the vector must be of the same type"),
1833 Fcons (obj, Qnil)));
1b65481e 1834
ede4db72
RS
1835 }
1836#endif
1837 else
1838 /* This vector is an INTEGER set, or something like it */
1839 {
1840 *size_ret = XVECTOR (obj)->size;
1841 if (NILP (type)) type = QINTEGER;
1842 *format_ret = 16;
1843 for (i = 0; i < *size_ret; i++)
1844 if (CONSP (XVECTOR (obj)->contents [i]))
1845 *format_ret = 32;
7da64e5c 1846 else if (!INTEGERP (XVECTOR (obj)->contents [i]))
ede4db72
RS
1847 Fsignal (Qerror, /* Qselection_error */
1848 Fcons (build_string
1849 ("elements of selection vector must be integers or conses of integers"),
1850 Fcons (obj, Qnil)));
1851
1852 *data_ret = (unsigned char *) xmalloc (*size_ret * (*format_ret/8));
1853 for (i = 0; i < *size_ret; i++)
1854 if (*format_ret == 32)
1855 (*((unsigned long **) data_ret)) [i]
1856 = cons_to_long (XVECTOR (obj)->contents [i]);
1857 else
1858 (*((unsigned short **) data_ret)) [i]
1859 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]);
1860 }
1861 }
1862 else
1863 Fsignal (Qerror, /* Qselection_error */
1864 Fcons (build_string ("unrecognised selection data"),
1865 Fcons (obj, Qnil)));
1866
5c3a351a 1867 *type_ret = symbol_to_x_atom (dpyinfo, display, type);
ede4db72
RS
1868}
1869
1870static Lisp_Object
1871clean_local_selection_data (obj)
1872 Lisp_Object obj;
1873{
1874 if (CONSP (obj)
8e713be6
KR
1875 && INTEGERP (XCAR (obj))
1876 && CONSP (XCDR (obj))
1877 && INTEGERP (XCAR (XCDR (obj)))
1878 && NILP (XCDR (XCDR (obj))))
1879 obj = Fcons (XCAR (obj), XCDR (obj));
ede4db72
RS
1880
1881 if (CONSP (obj)
8e713be6
KR
1882 && INTEGERP (XCAR (obj))
1883 && INTEGERP (XCDR (obj)))
ede4db72 1884 {
8e713be6
KR
1885 if (XINT (XCAR (obj)) == 0)
1886 return XCDR (obj);
1887 if (XINT (XCAR (obj)) == -1)
1888 return make_number (- XINT (XCDR (obj)));
ede4db72
RS
1889 }
1890 if (VECTORP (obj))
1891 {
1892 int i;
1893 int size = XVECTOR (obj)->size;
1894 Lisp_Object copy;
1895 if (size == 1)
1896 return clean_local_selection_data (XVECTOR (obj)->contents [0]);
e607a484 1897 copy = Fmake_vector (make_number (size), Qnil);
ede4db72
RS
1898 for (i = 0; i < size; i++)
1899 XVECTOR (copy)->contents [i]
1900 = clean_local_selection_data (XVECTOR (obj)->contents [i]);
1901 return copy;
1902 }
1903 return obj;
1904}
1905\f
1906/* Called from XTread_socket to handle SelectionNotify events.
606140dd
KH
1907 If it's the selection we are waiting for, stop waiting
1908 by setting the car of reading_selection_reply to non-nil.
1909 We store t there if the reply is successful, lambda if not. */
ede4db72
RS
1910
1911void
1912x_handle_selection_notify (event)
1913 XSelectionEvent *event;
1914{
5d0ba25b 1915 if (event->requestor != reading_selection_window)
ede4db72
RS
1916 return;
1917 if (event->selection != reading_which_selection)
1918 return;
1919
d9c0d4a3 1920 TRACE0 ("Received SelectionNotify");
f3fbd155
KR
1921 XSETCAR (reading_selection_reply,
1922 (event->property != 0 ? Qt : Qlambda));
ede4db72
RS
1923}
1924
1925\f
a0d76c27 1926DEFUN ("x-own-selection-internal", Fx_own_selection_internal,
8c1a1077
PJ
1927 Sx_own_selection_internal, 2, 2, 0,
1928 doc: /* Assert an X selection of the given TYPE with the given VALUE.
1929TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1930\(Those are literal upper-case symbol names, since that's what X expects.)
1931VALUE is typically a string, or a cons of two markers, but may be
1932anything that the functions on `selection-converter-alist' know about. */)
1933 (selection_name, selection_value)
ede4db72
RS
1934 Lisp_Object selection_name, selection_value;
1935{
703e0710 1936 check_x ();
b7826503 1937 CHECK_SYMBOL (selection_name);
606140dd 1938 if (NILP (selection_value)) error ("selection-value may not be nil");
ede4db72
RS
1939 x_own_selection (selection_name, selection_value);
1940 return selection_value;
1941}
1942
1943
1944/* Request the selection value from the owner. If we are the owner,
1945 simply return our selection value. If we are not the owner, this
1946 will block until all of the data has arrived. */
1947
a0d76c27 1948DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
3a42401d 1949 Sx_get_selection_internal, 2, 3, 0,
8c1a1077
PJ
1950 doc: /* Return text selected from some X window.
1951SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1952\(Those are literal upper-case symbol names, since that's what X expects.)
3a42401d
JD
1953TYPE is the type of data desired, typically `STRING'.
1954TIME_STAMP is the time to use in the XConvertSelection call for foreign
1955selections. If omitted, defaults to the time for the last event. */)
1956 (selection_symbol, target_type, time_stamp)
1957 Lisp_Object selection_symbol, target_type, time_stamp;
ede4db72
RS
1958{
1959 Lisp_Object val = Qnil;
1960 struct gcpro gcpro1, gcpro2;
1961 GCPRO2 (target_type, val); /* we store newly consed data into these */
703e0710 1962 check_x ();
b7826503 1963 CHECK_SYMBOL (selection_symbol);
ede4db72
RS
1964
1965#if 0 /* #### MULTIPLE doesn't work yet */
1966 if (CONSP (target_type)
8e713be6 1967 && XCAR (target_type) == QMULTIPLE)
ede4db72 1968 {
b7826503 1969 CHECK_VECTOR (XCDR (target_type));
ede4db72
RS
1970 /* So we don't destructively modify this... */
1971 target_type = copy_multiple_data (target_type);
1972 }
1973 else
1974#endif
b7826503 1975 CHECK_SYMBOL (target_type);
ede4db72 1976
5109c8dd 1977 val = x_get_local_selection (selection_symbol, target_type, 1);
ede4db72
RS
1978
1979 if (NILP (val))
1980 {
3a42401d 1981 val = x_get_foreign_selection (selection_symbol, target_type, time_stamp);
ede4db72
RS
1982 goto DONE;
1983 }
1984
1985 if (CONSP (val)
8e713be6 1986 && SYMBOLP (XCAR (val)))
ede4db72 1987 {
8e713be6
KR
1988 val = XCDR (val);
1989 if (CONSP (val) && NILP (XCDR (val)))
1990 val = XCAR (val);
ede4db72
RS
1991 }
1992 val = clean_local_selection_data (val);
1993 DONE:
1994 UNGCPRO;
1995 return val;
1996}
1997
a0d76c27 1998DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal,
8c1a1077
PJ
1999 Sx_disown_selection_internal, 1, 2, 0,
2000 doc: /* If we own the selection SELECTION, disown it.
2001Disowning it means there is no such selection. */)
2002 (selection, time)
ede4db72
RS
2003 Lisp_Object selection;
2004 Lisp_Object time;
2005{
ede4db72
RS
2006 Time timestamp;
2007 Atom selection_atom;
44d46531 2008 struct selection_input_event event;
3834c318 2009 Display *display;
5c3a351a 2010 struct x_display_info *dpyinfo;
378c33ca 2011 struct frame *sf = SELECTED_FRAME ();
ede4db72 2012
703e0710 2013 check_x ();
378c33ca
GM
2014 display = FRAME_X_DISPLAY (sf);
2015 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
b7826503 2016 CHECK_SYMBOL (selection);
ede4db72 2017 if (NILP (time))
7da64e5c 2018 timestamp = last_event_timestamp;
ede4db72
RS
2019 else
2020 timestamp = cons_to_long (time);
2021
2022 if (NILP (assq_no_quit (selection, Vselection_alist)))
2023 return Qnil; /* Don't disown the selection when we're not the owner. */
2024
5c3a351a 2025 selection_atom = symbol_to_x_atom (dpyinfo, display, selection);
ede4db72
RS
2026
2027 BLOCK_INPUT;
2028 XSetSelectionOwner (display, selection_atom, None, timestamp);
2029 UNBLOCK_INPUT;
2030
eb8c3be9 2031 /* It doesn't seem to be guaranteed that a SelectionClear event will be
ede4db72
RS
2032 generated for a window which owns the selection when that window sets
2033 the selection owner to None. The NCD server does, the MIT Sun4 server
2034 doesn't. So we synthesize one; this means we might get two, but
2035 that's ok, because the second one won't have any effect. */
8d47f8c4
RS
2036 SELECTION_EVENT_DISPLAY (&event) = display;
2037 SELECTION_EVENT_SELECTION (&event) = selection_atom;
2038 SELECTION_EVENT_TIME (&event) = timestamp;
44d46531 2039 x_handle_selection_clear ((struct input_event *) &event);
ede4db72
RS
2040
2041 return Qt;
2042}
2043
a87ed99c
RS
2044/* Get rid of all the selections in buffer BUFFER.
2045 This is used when we kill a buffer. */
2046
2047void
2048x_disown_buffer_selections (buffer)
2049 Lisp_Object buffer;
2050{
2051 Lisp_Object tail;
2052 struct buffer *buf = XBUFFER (buffer);
2053
8e713be6 2054 for (tail = Vselection_alist; CONSP (tail); tail = XCDR (tail))
a87ed99c
RS
2055 {
2056 Lisp_Object elt, value;
8e713be6
KR
2057 elt = XCAR (tail);
2058 value = XCDR (elt);
2059 if (CONSP (value) && MARKERP (XCAR (value))
2060 && XMARKER (XCAR (value))->buffer == buf)
2061 Fx_disown_selection_internal (XCAR (elt), Qnil);
a87ed99c
RS
2062 }
2063}
ede4db72
RS
2064
2065DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p,
8c1a1077
PJ
2066 0, 1, 0,
2067 doc: /* Whether the current Emacs process owns the given X Selection.
2068The arg should be the name of the selection in question, typically one of
2069the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2070\(Those are literal upper-case symbol names, since that's what X expects.)
2071For convenience, the symbol nil is the same as `PRIMARY',
2072and t is the same as `SECONDARY'. */)
2073 (selection)
ede4db72
RS
2074 Lisp_Object selection;
2075{
703e0710 2076 check_x ();
b7826503 2077 CHECK_SYMBOL (selection);
ede4db72
RS
2078 if (EQ (selection, Qnil)) selection = QPRIMARY;
2079 if (EQ (selection, Qt)) selection = QSECONDARY;
1b65481e 2080
ede4db72
RS
2081 if (NILP (Fassq (selection, Vselection_alist)))
2082 return Qnil;
2083 return Qt;
2084}
2085
2086DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p,
8c1a1077
PJ
2087 0, 1, 0,
2088 doc: /* Whether there is an owner for the given X Selection.
2089The arg should be the name of the selection in question, typically one of
2090the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2091\(Those are literal upper-case symbol names, since that's what X expects.)
2092For convenience, the symbol nil is the same as `PRIMARY',
2093and t is the same as `SECONDARY'. */)
2094 (selection)
ede4db72
RS
2095 Lisp_Object selection;
2096{
2097 Window owner;
356ba514 2098 Atom atom;
3834c318 2099 Display *dpy;
378c33ca 2100 struct frame *sf = SELECTED_FRAME ();
3834c318 2101
b8c70430 2102 /* It should be safe to call this before we have an X frame. */
378c33ca 2103 if (! FRAME_X_P (sf))
b8c70430
RS
2104 return Qnil;
2105
378c33ca 2106 dpy = FRAME_X_DISPLAY (sf);
b7826503 2107 CHECK_SYMBOL (selection);
ede4db72
RS
2108 if (!NILP (Fx_selection_owner_p (selection)))
2109 return Qt;
356ba514
RS
2110 if (EQ (selection, Qnil)) selection = QPRIMARY;
2111 if (EQ (selection, Qt)) selection = QSECONDARY;
378c33ca 2112 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection);
356ba514
RS
2113 if (atom == 0)
2114 return Qnil;
ede4db72 2115 BLOCK_INPUT;
356ba514 2116 owner = XGetSelectionOwner (dpy, atom);
ede4db72
RS
2117 UNBLOCK_INPUT;
2118 return (owner ? Qt : Qnil);
2119}
2120
2121\f
2122#ifdef CUT_BUFFER_SUPPORT
2123
ede4db72
RS
2124/* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2125static void
2126initialize_cut_buffers (display, window)
2127 Display *display;
2128 Window window;
2129{
2130 unsigned char *data = (unsigned char *) "";
2131 BLOCK_INPUT;
2132#define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2133 PropModeAppend, data, 0)
2134 FROB (XA_CUT_BUFFER0);
2135 FROB (XA_CUT_BUFFER1);
2136 FROB (XA_CUT_BUFFER2);
2137 FROB (XA_CUT_BUFFER3);
2138 FROB (XA_CUT_BUFFER4);
2139 FROB (XA_CUT_BUFFER5);
2140 FROB (XA_CUT_BUFFER6);
2141 FROB (XA_CUT_BUFFER7);
2142#undef FROB
2143 UNBLOCK_INPUT;
ede4db72
RS
2144}
2145
2146
b7826503
PJ
2147#define CHECK_CUT_BUFFER(symbol) \
2148 { CHECK_SYMBOL ((symbol)); \
ede4db72
RS
2149 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2150 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2151 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2152 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2153 Fsignal (Qerror, \
a87ed99c 2154 Fcons (build_string ("doesn't name a cut buffer"), \
ede4db72
RS
2155 Fcons ((symbol), Qnil))); \
2156 }
2157
a87ed99c 2158DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal,
8c1a1077
PJ
2159 Sx_get_cut_buffer_internal, 1, 1, 0,
2160 doc: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */)
2161 (buffer)
ede4db72
RS
2162 Lisp_Object buffer;
2163{
3834c318 2164 Window window;
ede4db72
RS
2165 Atom buffer_atom;
2166 unsigned char *data;
2167 int bytes;
2168 Atom type;
2169 int format;
2170 unsigned long size;
2171 Lisp_Object ret;
3834c318 2172 Display *display;
5c3a351a 2173 struct x_display_info *dpyinfo;
378c33ca 2174 struct frame *sf = SELECTED_FRAME ();
ede4db72 2175
703e0710 2176 check_x ();
378c33ca
GM
2177 display = FRAME_X_DISPLAY (sf);
2178 dpyinfo = FRAME_X_DISPLAY_INFO (sf);
3834c318 2179 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
b7826503 2180 CHECK_CUT_BUFFER (buffer);
5c3a351a 2181 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer);
ede4db72
RS
2182
2183 x_get_window_property (display, window, buffer_atom, &data, &bytes,
2184 &type, &format, &size, 0);
22e00739
RS
2185 if (!data || !format)
2186 return Qnil;
1b65481e 2187
ede4db72
RS
2188 if (format != 8 || type != XA_STRING)
2189 Fsignal (Qerror,
2190 Fcons (build_string ("cut buffer doesn't contain 8-bit data"),
d9c0d4a3 2191 Fcons (x_atom_to_symbol (display, type),
ede4db72
RS
2192 Fcons (make_number (format), Qnil))));
2193
2194 ret = (bytes ? make_string ((char *) data, bytes) : Qnil);
4feb31b2 2195 /* Use xfree, not XFree, because x_get_window_property
0158abbc 2196 calls xmalloc itself. */
4feb31b2 2197 xfree (data);
ede4db72
RS
2198 return ret;
2199}
2200
2201
a87ed99c 2202DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal,
8c1a1077
PJ
2203 Sx_store_cut_buffer_internal, 2, 2, 0,
2204 doc: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
2205 (buffer, string)
ede4db72
RS
2206 Lisp_Object buffer, string;
2207{
3834c318 2208 Window window;
ede4db72
RS
2209 Atom buffer_atom;
2210 unsigned char *data;
2211 int bytes;
2212 int bytes_remaining;
3834c318
RS
2213 int max_bytes;
2214 Display *display;
378c33ca 2215 struct frame *sf = SELECTED_FRAME ();
ede4db72 2216
703e0710 2217 check_x ();
378c33ca 2218 display = FRAME_X_DISPLAY (sf);
3834c318
RS
2219 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
2220
2221 max_bytes = SELECTION_QUANTUM (display);
2222 if (max_bytes > MAX_SELECTION_QUANTUM)
2223 max_bytes = MAX_SELECTION_QUANTUM;
2224
b7826503
PJ
2225 CHECK_CUT_BUFFER (buffer);
2226 CHECK_STRING (string);
378c33ca 2227 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf),
5c3a351a 2228 display, buffer);
d5db4077
KR
2229 data = (unsigned char *) SDATA (string);
2230 bytes = SBYTES (string);
ede4db72
RS
2231 bytes_remaining = bytes;
2232
378c33ca 2233 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
04649dbc
KH
2234 {
2235 initialize_cut_buffers (display, window);
378c33ca 2236 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
04649dbc 2237 }
ede4db72
RS
2238
2239 BLOCK_INPUT;
10608c8c
RS
2240
2241 /* Don't mess up with an empty value. */
2242 if (!bytes_remaining)
2243 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2244 PropModeReplace, data, 0);
2245
ede4db72
RS
2246 while (bytes_remaining)
2247 {
2248 int chunk = (bytes_remaining < max_bytes
2249 ? bytes_remaining : max_bytes);
2250 XChangeProperty (display, window, buffer_atom, XA_STRING, 8,
2251 (bytes_remaining == bytes
2252 ? PropModeReplace
2253 : PropModeAppend),
2254 data, chunk);
2255 data += chunk;
2256 bytes_remaining -= chunk;
2257 }
2258 UNBLOCK_INPUT;
2259 return string;
2260}
2261
2262
a87ed99c 2263DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal,
8c1a1077
PJ
2264 Sx_rotate_cut_buffers_internal, 1, 1, 0,
2265 doc: /* Rotate the values of the cut buffers by the given number of step.
2266Positive means shift the values forward, negative means backward. */)
2267 (n)
ede4db72
RS
2268 Lisp_Object n;
2269{
3834c318
RS
2270 Window window;
2271 Atom props[8];
2272 Display *display;
378c33ca 2273 struct frame *sf = SELECTED_FRAME ();
ede4db72 2274
703e0710 2275 check_x ();
378c33ca 2276 display = FRAME_X_DISPLAY (sf);
3834c318 2277 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */
b7826503 2278 CHECK_NUMBER (n);
3834c318
RS
2279 if (XINT (n) == 0)
2280 return n;
378c33ca 2281 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized)
04649dbc
KH
2282 {
2283 initialize_cut_buffers (display, window);
378c33ca 2284 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1;
04649dbc 2285 }
3834c318 2286
ede4db72
RS
2287 props[0] = XA_CUT_BUFFER0;
2288 props[1] = XA_CUT_BUFFER1;
2289 props[2] = XA_CUT_BUFFER2;
2290 props[3] = XA_CUT_BUFFER3;
2291 props[4] = XA_CUT_BUFFER4;
2292 props[5] = XA_CUT_BUFFER5;
2293 props[6] = XA_CUT_BUFFER6;
2294 props[7] = XA_CUT_BUFFER7;
2295 BLOCK_INPUT;
2296 XRotateWindowProperties (display, window, props, 8, XINT (n));
2297 UNBLOCK_INPUT;
2298 return n;
2299}
2300
2301#endif
2302\f
1fb3821b
JD
2303/***********************************************************************
2304 Drag and drop support
2305***********************************************************************/
2306/* Check that lisp values are of correct type for x_fill_property_data.
2307 That is, number, string or a cons with two numbers (low and high 16
2308 bit parts of a 32 bit number). */
2309
2310int
2311x_check_property_data (data)
2312 Lisp_Object data;
2313{
2314 Lisp_Object iter;
2315 int size = 0;
2316
2317 for (iter = data; CONSP (iter) && size != -1; iter = XCDR (iter), ++size)
2318 {
2319 Lisp_Object o = XCAR (iter);
2320
2321 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o))
2322 size = -1;
2323 else if (CONSP (o) &&
2324 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o))))
2325 size = -1;
2326 }
2327
2328 return size;
2329}
2330
2331/* Convert lisp values to a C array. Values may be a number, a string
2332 which is taken as an X atom name and converted to the atom value, or
2333 a cons containing the two 16 bit parts of a 32 bit number.
2334
2335 DPY is the display use to look up X atoms.
2336 DATA is a Lisp list of values to be converted.
2337 RET is the C array that contains the converted values. It is assumed
2338 it is big enough to hol all values.
2339 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2340 be stored in RET. */
2341
2342void
2343x_fill_property_data (dpy, data, ret, format)
2344 Display *dpy;
2345 Lisp_Object data;
2346 void *ret;
2347 int format;
2348{
2349 CARD32 val;
2350 CARD32 *d32 = (CARD32 *) ret;
2351 CARD16 *d16 = (CARD16 *) ret;
2352 CARD8 *d08 = (CARD8 *) ret;
2353 Lisp_Object iter;
2354
2355 for (iter = data; CONSP (iter); iter = XCDR (iter))
2356 {
2357 Lisp_Object o = XCAR (iter);
2358
2359 if (INTEGERP (o))
2360 val = (CARD32) XFASTINT (o);
2361 else if (FLOATP (o))
2362 val = (CARD32) XFLOAT (o);
2363 else if (CONSP (o))
2364 val = (CARD32) cons_to_long (o);
2365 else if (STRINGP (o))
2366 {
2367 BLOCK_INPUT;
2368 val = XInternAtom (dpy, (char *) SDATA (o), False);
2369 UNBLOCK_INPUT;
2370 }
2371 else
2372 error ("Wrong type, must be string, number or cons");
2373
2374 if (format == 8)
2375 *d08++ = (CARD8) val;
2376 else if (format == 16)
2377 *d16++ = (CARD16) val;
2378 else
2379 *d32++ = val;
2380 }
2381}
2382
2383/* Convert an array of C values to a Lisp list.
2384 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2385 DATA is a C array of values to be converted.
2386 TYPE is the type of the data. Only XA_ATOM is special, it converts
2387 each number in DATA to its corresponfing X atom as a symbol.
2388 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2389 be stored in RET.
2390 SIZE is the number of elements in DATA.
2391
2392 Also see comment for selection_data_to_lisp_data above. */
2393
2394Lisp_Object
2395x_property_data_to_lisp (f, data, type, format, size)
2396 struct frame *f;
2397 unsigned char *data;
2398 Atom type;
2399 int format;
2400 unsigned long size;
2401{
2402 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f),
2403 data, size*format/8, type, format);
2404}
2405
2406/* Get the mouse position frame relative coordinates. */
2407
2408static void
2409mouse_position_for_drop (f, x, y)
2410 FRAME_PTR f;
2411 int *x;
2412 int *y;
2413{
2414 Window root, dummy_window;
2415 int dummy;
2416
2417 BLOCK_INPUT;
2418
2419 XQueryPointer (FRAME_X_DISPLAY (f),
2420 DefaultRootWindow (FRAME_X_DISPLAY (f)),
2421
2422 /* The root window which contains the pointer. */
2423 &root,
2424
2425 /* Window pointer is on, not used */
2426 &dummy_window,
2427
2428 /* The position on that root window. */
2429 x, y,
2430
2431 /* x/y in dummy_window coordinates, not used. */
2432 &dummy, &dummy,
2433
2434 /* Modifier keys and pointer buttons, about which
2435 we don't care. */
2436 (unsigned int *) &dummy);
2437
2438
2439 /* Absolute to relative. */
2440 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f);
2441 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f);
2442
2443 UNBLOCK_INPUT;
2444}
2445
2446DEFUN ("x-get-atom-name", Fx_get_atom_name,
2447 Sx_get_atom_name, 1, 2, 0,
2448 doc: /* Return the X atom name for VALUE as a string.
2449VALUE may be a number or a cons where the car is the upper 16 bits and
2450the cdr is the lower 16 bits of a 32 bit value.
2451Use the display for FRAME or the current frame if FRAME is not given or nil.
2452
2453If the value is 0 or the atom is not known, return the empty string. */)
2454 (value, frame)
2455 Lisp_Object value, frame;
2456{
2457 struct frame *f = check_x_frame (frame);
2458 char *name = 0;
2459 Lisp_Object ret = Qnil;
2460 int count;
2461 Display *dpy = FRAME_X_DISPLAY (f);
2462 Atom atom;
2463
2464 if (INTEGERP (value))
2465 atom = (Atom) XUINT (value);
2466 else if (FLOATP (value))
2467 atom = (Atom) XFLOAT (value);
2468 else if (CONSP (value))
2469 atom = (Atom) cons_to_long (value);
2470 else
2471 error ("Wrong type, value must be number or cons");
2472
2473 BLOCK_INPUT;
2474 count = x_catch_errors (dpy);
2475
2476 name = atom ? XGetAtomName (dpy, atom) : "";
2477
2478 if (! x_had_errors_p (dpy))
2479 ret = make_string (name, strlen (name));
2480
2481 x_uncatch_errors (dpy, count);
2482
2483 if (atom && name) XFree (name);
2484 if (NILP (ret)) ret = make_string ("", 0);
2485
2486 UNBLOCK_INPUT;
2487
2488 return ret;
2489}
2490
2491/* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT.
2492 TODO: Check if this client event really is a DND event? */
2493
2494int
2495x_handle_dnd_message (f, event, dpyinfo, bufp)
2496 struct frame *f;
2497 XClientMessageEvent *event;
2498 struct x_display_info *dpyinfo;
2499 struct input_event *bufp;
2500{
2501 Lisp_Object vec;
2502 Lisp_Object frame;
2503 unsigned long size = (8*sizeof (event->data))/event->format;
2504 int x, y;
2505
2506 XSETFRAME (frame, f);
2507
d2f14999 2508 vec = Fmake_vector (make_number (4), Qnil);
1fb3821b
JD
2509 AREF (vec, 0) = SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f),
2510 event->message_type));
2511 AREF (vec, 1) = frame;
d2f14999 2512 AREF (vec, 2) = make_number (event->format);
1fb3821b
JD
2513 AREF (vec, 3) = x_property_data_to_lisp (f,
2514 event->data.b,
2515 event->message_type,
2516 event->format,
2517 size);
2518
2519 mouse_position_for_drop (f, &x, &y);
2520 bufp->kind = DRAG_N_DROP_EVENT;
2521 bufp->frame_or_window = Fcons (frame, vec);
2522 bufp->timestamp = CurrentTime;
2523 bufp->x = make_number (x);
2524 bufp->y = make_number (y);
2525 bufp->arg = Qnil;
2526 bufp->modifiers = 0;
2527
2528 return 1;
2529}
2530
2531DEFUN ("x-send-client-message", Fx_send_client_event,
2532 Sx_send_client_message, 6, 6, 0,
2533 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2534
2535For DISPLAY, specify either a frame or a display name (a string).
2536If DISPLAY is nil, that stands for the selected frame's display.
2537DEST may be a number, in which case it is a Window id. The value 0 may
2538be used to send to the root window of the DISPLAY.
2539If DEST is a cons, it is converted to a 32 bit number
2540with the high 16 bits from the car and the lower 16 bit from the cdr. That
2541number is then used as a window id.
2542If DEST is a frame the event is sent to the outer window of that frame.
2543Nil means the currently selected frame.
2544If DEST is the string "PointerWindow" the event is sent to the window that
2545contains the pointer. If DEST is the string "InputFocus" the event is
2546sent to the window that has the input focus.
2547FROM is the frame sending the event. Use nil for currently selected frame.
2548MESSAGE-TYPE is the name of an Atom as a string.
2549FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2550bits. VALUES is a list of numbers, cons and/or strings containing the values
2551to send. If a value is a string, it is converted to an Atom and the value of
2552the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2553with the high 16 bits from the car and the lower 16 bit from the cdr.
2554If more values than fits into the event is given, the excessive values
2555are ignored. */)
2556 (display, dest, from, message_type, format, values)
2557 Lisp_Object display, dest, from, message_type, format, values;
2558{
2559 struct x_display_info *dpyinfo = check_x_display_info (display);
2560 Window wdest;
2561 XEvent event;
2562 Lisp_Object cons;
2563 int size;
2564 struct frame *f = check_x_frame (from);
2565 int count;
2566 int to_root;
2567
2568 CHECK_STRING (message_type);
2569 CHECK_NUMBER (format);
2570 CHECK_CONS (values);
2571
2572 if (x_check_property_data (values) == -1)
2573 error ("Bad data in VALUES, must be number, cons or string");
2574
2575 event.xclient.type = ClientMessage;
2576 event.xclient.format = XFASTINT (format);
2577
2578 if (event.xclient.format != 8 && event.xclient.format != 16
2579 && event.xclient.format != 32)
2580 error ("FORMAT must be one of 8, 16 or 32");
a0ecb2ac 2581
1fb3821b
JD
2582 if (FRAMEP (dest) || NILP (dest))
2583 {
2584 struct frame *fdest = check_x_frame (dest);
2585 wdest = FRAME_OUTER_WINDOW (fdest);
2586 }
2587 else if (STRINGP (dest))
2588 {
2589 if (strcmp (SDATA (dest), "PointerWindow") == 0)
2590 wdest = PointerWindow;
2591 else if (strcmp (SDATA (dest), "InputFocus") == 0)
2592 wdest = InputFocus;
2593 else
2594 error ("DEST as a string must be one of PointerWindow or InputFocus");
2595 }
2596 else if (INTEGERP (dest))
2597 wdest = (Window) XFASTINT (dest);
2598 else if (FLOATP (dest))
2599 wdest = (Window) XFLOAT (dest);
2600 else if (CONSP (dest))
2601 {
2602 if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest)))
2603 error ("Both car and cdr for DEST must be numbers");
2604 else
2605 wdest = (Window) cons_to_long (dest);
2606 }
2607 else
2608 error ("DEST must be a frame, nil, string, number or cons");
2609
2610 if (wdest == 0) wdest = dpyinfo->root_window;
2611 to_root = wdest == dpyinfo->root_window;
2612
2613 for (cons = values, size = 0; CONSP (cons); cons = XCDR (cons), ++size)
2614 ;
2615
2616 BLOCK_INPUT;
2617
2618 event.xclient.message_type
2619 = XInternAtom (dpyinfo->display, SDATA (message_type), False);
2620 event.xclient.display = dpyinfo->display;
2621
2622 /* Some clients (metacity for example) expects sending window to be here
2623 when sending to the root window. */
2624 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest;
2625
2626 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b));
2627 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b,
2628 event.xclient.format);
2629
2630 /* If event mask is 0 the event is sent to the client that created
2631 the destination window. But if we are sending to the root window,
2632 there is no such client. Then we set the event mask to 0xffff. The
2633 event then goes to clients selecting for events on the root window. */
2634 count = x_catch_errors (dpyinfo->display);
2635 {
2636 int propagate = to_root ? False : True;
2637 unsigned mask = to_root ? 0xffff : 0;
2638 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event);
2639 XFlush (dpyinfo->display);
2640 }
2641 x_uncatch_errors (dpyinfo->display, count);
2642 UNBLOCK_INPUT;
2643
2644 return Qnil;
2645}
2646
2647\f
ede4db72
RS
2648void
2649syms_of_xselect ()
2650{
ede4db72
RS
2651 defsubr (&Sx_get_selection_internal);
2652 defsubr (&Sx_own_selection_internal);
2653 defsubr (&Sx_disown_selection_internal);
2654 defsubr (&Sx_selection_owner_p);
2655 defsubr (&Sx_selection_exists_p);
2656
2657#ifdef CUT_BUFFER_SUPPORT
a87ed99c
RS
2658 defsubr (&Sx_get_cut_buffer_internal);
2659 defsubr (&Sx_store_cut_buffer_internal);
2660 defsubr (&Sx_rotate_cut_buffers_internal);
ede4db72
RS
2661#endif
2662
1fb3821b
JD
2663 defsubr (&Sx_get_atom_name);
2664 defsubr (&Sx_send_client_message);
2665
ede4db72
RS
2666 reading_selection_reply = Fcons (Qnil, Qnil);
2667 staticpro (&reading_selection_reply);
2668 reading_selection_window = 0;
2669 reading_which_selection = 0;
2670
2671 property_change_wait_list = 0;
2f65feb6 2672 prop_location_identifier = 0;
ede4db72
RS
2673 property_change_reply = Fcons (Qnil, Qnil);
2674 staticpro (&property_change_reply);
2675
2676 Vselection_alist = Qnil;
2677 staticpro (&Vselection_alist);
2678
2679 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist,
8c1a1077
PJ
2680 doc: /* An alist associating X Windows selection-types with functions.
2681These functions are called to convert the selection, with three args:
2682the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2683a desired type to which the selection should be converted;
2684and the local selection value (whatever was given to `x-own-selection').
2685
2686The function should return the value to send to the X server
2687\(typically a string). A return value of nil
2688means that the conversion could not be done.
2689A return value which is the symbol `NULL'
2690means that a side-effect was executed,
2691and there is no meaningful selection value. */);
ede4db72
RS
2692 Vselection_converter_alist = Qnil;
2693
2694 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks,
8c1a1077
PJ
2695 doc: /* A list of functions to be called when Emacs loses an X selection.
2696\(This happens when some other X client makes its own selection
2697or when a Lisp program explicitly clears the selection.)
2698The functions are called with one argument, the selection type
2699\(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
ede4db72
RS
2700 Vx_lost_selection_hooks = Qnil;
2701
2702 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks,
8c1a1077
PJ
2703 doc: /* A list of functions to be called when Emacs answers a selection request.
2704The functions are called with four arguments:
2705 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2706 - the selection-type which Emacs was asked to convert the
2707 selection into before sending (for example, `STRING' or `LENGTH');
2708 - a flag indicating success or failure for responding to the request.
2709We might have failed (and declined the request) for any number of reasons,
2710including being asked for a selection that we no longer own, or being asked
2711to convert into a type that we don't know about or that is inappropriate.
2712This hook doesn't let you change the behavior of Emacs's selection replies,
2713it merely informs you that they have happened. */);
ede4db72
RS
2714 Vx_sent_selection_hooks = Qnil;
2715
93e4ce1b 2716 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system,
8c1a1077
PJ
2717 doc: /* Coding system for communicating with other X clients.
2718When sending or receiving text via cut_buffer, selection, and clipboard,
2719the text is encoded or decoded by this coding system.
5a79ea57
EZ
2720The default value is `compound-text-with-extensions'. */);
2721 Vselection_coding_system = intern ("compound-text-with-extensions");
2584c9ec 2722
16cd5029 2723 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system,
8c1a1077
PJ
2724 doc: /* Coding system for the next communication with other X clients.
2725Usually, `selection-coding-system' is used for communicating with
f8f8d464
JB
2726other X clients. But, if this variable is set, it is used for the
2727next communication only. After the communication, this variable is
8c1a1077 2728set to nil. */);
16cd5029
KH
2729 Vnext_selection_coding_system = Qnil;
2730
ede4db72 2731 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout,
8c1a1077
PJ
2732 doc: /* Number of milliseconds to wait for a selection reply.
2733If the selection owner doesn't reply in this time, we give up.
2734A value of 0 means wait as long as necessary. This is initialized from the
2735\"*selectionTimeout\" resource. */);
ede4db72
RS
2736 x_selection_timeout = 0;
2737
2738 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY);
2739 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY);
2740 QSTRING = intern ("STRING"); staticpro (&QSTRING);
2741 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER);
2742 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
2743 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2744 QTEXT = intern ("TEXT"); staticpro (&QTEXT);
e6c7c988 2745 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
5109c8dd 2746 QUTF8_STRING = intern ("UTF8_STRING"); staticpro (&QUTF8_STRING);
ede4db72
RS
2747 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2748 QDELETE = intern ("DELETE"); staticpro (&QDELETE);
2749 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE);
2750 QINCR = intern ("INCR"); staticpro (&QINCR);
2751 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP);
2752 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS);
2753 QATOM = intern ("ATOM"); staticpro (&QATOM);
2754 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR);
2755 QNULL = intern ("NULL"); staticpro (&QNULL);
5a79ea57
EZ
2756 Qcompound_text_with_extensions = intern ("compound-text-with-extensions");
2757 staticpro (&Qcompound_text_with_extensions);
ede4db72
RS
2758
2759#ifdef CUT_BUFFER_SUPPORT
2760 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0);
2761 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1);
2762 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2);
2763 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3);
2764 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4);
2765 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5);
2766 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6);
2767 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7);
2768#endif
2769
e57ad4d8
KH
2770 Qforeign_selection = intern ("foreign-selection");
2771 staticpro (&Qforeign_selection);
ede4db72 2772}
ab5796a9
MB
2773
2774/* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236
2775 (do not change this comment) */