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