1 /* X Selection processing for Emacs.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
22 /* Rewritten by jwz */
26 #include "xterm.h" /* for all of the X includes */
27 #include "dispextern.h" /* frame.h seems to want this */
28 #include "frame.h" /* Need this to get the X window of selected_frame */
29 #include "blockinput.h"
34 #include "composite.h"
36 #define CUT_BUFFER_SUPPORT
38 Lisp_Object QPRIMARY
, QSECONDARY
, QSTRING
, QINTEGER
, QCLIPBOARD
, QTIMESTAMP
,
39 QTEXT
, QDELETE
, QMULTIPLE
, QINCR
, QEMACS_TMP
, QTARGETS
, QATOM
, QNULL
,
42 Lisp_Object QCOMPOUND_TEXT
; /* This is a type of selection. */
44 #ifdef CUT_BUFFER_SUPPORT
45 Lisp_Object QCUT_BUFFER0
, QCUT_BUFFER1
, QCUT_BUFFER2
, QCUT_BUFFER3
,
46 QCUT_BUFFER4
, QCUT_BUFFER5
, QCUT_BUFFER6
, QCUT_BUFFER7
;
49 static Lisp_Object Vx_lost_selection_hooks
;
50 static Lisp_Object Vx_sent_selection_hooks
;
51 /* Coding system for communicating with other X clients via cutbuffer,
52 selection, and clipboard. */
53 static Lisp_Object Vselection_coding_system
;
55 /* Coding system for the next communicating with other X clients. */
56 static Lisp_Object Vnext_selection_coding_system
;
58 /* If this is a smaller number than the max-request-size of the display,
59 emacs will use INCR selection transfer when the selection is larger
60 than this. The max-request-size is usually around 64k, so if you want
61 emacs to use incremental selection transfers when the selection is
62 smaller than that, set this. I added this mostly for debugging the
63 incremental transfer stuff, but it might improve server performance. */
64 #define MAX_SELECTION_QUANTUM 0xFFFFFF
67 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
69 #define SELECTION_QUANTUM(dpy) (((dpy)->max_request_size << 2) - 100)
72 /* The timestamp of the last input event Emacs received from the X server. */
73 /* Defined in keyboard.c. */
74 extern unsigned long last_event_timestamp
;
76 /* This is an association list whose elements are of the form
77 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
78 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
79 SELECTION-VALUE is the value that emacs owns for that selection.
80 It may be any kind of Lisp object.
81 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
82 as a cons of two 16-bit numbers (making a 32 bit time.)
83 FRAME is the frame for which we made the selection.
84 If there is an entry in this alist, then it can be assumed that Emacs owns
86 The only (eq) parts of this list that are visible from Lisp are the
88 static Lisp_Object Vselection_alist
;
90 /* This is an alist whose CARs are selection-types (whose names are the same
91 as the names of X Atoms) and whose CDRs are the names of Lisp functions to
92 call to convert the given Emacs selection value to a string representing
93 the given selection type. This is for Lisp-level extension of the emacs
94 selection handling. */
95 static Lisp_Object Vselection_converter_alist
;
97 /* If the selection owner takes too long to reply to a selection request,
98 we give up on it. This is in milliseconds (0 = no timeout.) */
99 static int x_selection_timeout
;
101 /* Utility functions */
103 static void lisp_data_to_selection_data ();
104 static Lisp_Object
selection_data_to_lisp_data ();
105 static Lisp_Object
x_get_window_property_as_lisp_data ();
107 /* This converts a Lisp symbol to a server Atom, avoiding a server
108 roundtrip whenever possible. */
111 symbol_to_x_atom (dpyinfo
, display
, sym
)
112 struct x_display_info
*dpyinfo
;
117 if (NILP (sym
)) return 0;
118 if (EQ (sym
, QPRIMARY
)) return XA_PRIMARY
;
119 if (EQ (sym
, QSECONDARY
)) return XA_SECONDARY
;
120 if (EQ (sym
, QSTRING
)) return XA_STRING
;
121 if (EQ (sym
, QINTEGER
)) return XA_INTEGER
;
122 if (EQ (sym
, QATOM
)) return XA_ATOM
;
123 if (EQ (sym
, QCLIPBOARD
)) return dpyinfo
->Xatom_CLIPBOARD
;
124 if (EQ (sym
, QTIMESTAMP
)) return dpyinfo
->Xatom_TIMESTAMP
;
125 if (EQ (sym
, QTEXT
)) return dpyinfo
->Xatom_TEXT
;
126 if (EQ (sym
, QCOMPOUND_TEXT
)) return dpyinfo
->Xatom_COMPOUND_TEXT
;
127 if (EQ (sym
, QDELETE
)) return dpyinfo
->Xatom_DELETE
;
128 if (EQ (sym
, QMULTIPLE
)) return dpyinfo
->Xatom_MULTIPLE
;
129 if (EQ (sym
, QINCR
)) return dpyinfo
->Xatom_INCR
;
130 if (EQ (sym
, QEMACS_TMP
)) return dpyinfo
->Xatom_EMACS_TMP
;
131 if (EQ (sym
, QTARGETS
)) return dpyinfo
->Xatom_TARGETS
;
132 if (EQ (sym
, QNULL
)) return dpyinfo
->Xatom_NULL
;
133 #ifdef CUT_BUFFER_SUPPORT
134 if (EQ (sym
, QCUT_BUFFER0
)) return XA_CUT_BUFFER0
;
135 if (EQ (sym
, QCUT_BUFFER1
)) return XA_CUT_BUFFER1
;
136 if (EQ (sym
, QCUT_BUFFER2
)) return XA_CUT_BUFFER2
;
137 if (EQ (sym
, QCUT_BUFFER3
)) return XA_CUT_BUFFER3
;
138 if (EQ (sym
, QCUT_BUFFER4
)) return XA_CUT_BUFFER4
;
139 if (EQ (sym
, QCUT_BUFFER5
)) return XA_CUT_BUFFER5
;
140 if (EQ (sym
, QCUT_BUFFER6
)) return XA_CUT_BUFFER6
;
141 if (EQ (sym
, QCUT_BUFFER7
)) return XA_CUT_BUFFER7
;
143 if (!SYMBOLP (sym
)) abort ();
146 fprintf (stderr
, " XInternAtom %s\n", (char *) XSYMBOL (sym
)->name
->data
);
149 val
= XInternAtom (display
, (char *) XSYMBOL (sym
)->name
->data
, False
);
155 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
156 and calls to intern whenever possible. */
159 x_atom_to_symbol (dpyinfo
, display
, atom
)
160 struct x_display_info
*dpyinfo
;
166 if (! atom
) return Qnil
;
179 #ifdef CUT_BUFFER_SUPPORT
199 if (atom
== dpyinfo
->Xatom_CLIPBOARD
)
201 if (atom
== dpyinfo
->Xatom_TIMESTAMP
)
203 if (atom
== dpyinfo
->Xatom_TEXT
)
205 if (atom
== dpyinfo
->Xatom_COMPOUND_TEXT
)
206 return QCOMPOUND_TEXT
;
207 if (atom
== dpyinfo
->Xatom_DELETE
)
209 if (atom
== dpyinfo
->Xatom_MULTIPLE
)
211 if (atom
== dpyinfo
->Xatom_INCR
)
213 if (atom
== dpyinfo
->Xatom_EMACS_TMP
)
215 if (atom
== dpyinfo
->Xatom_TARGETS
)
217 if (atom
== dpyinfo
->Xatom_NULL
)
221 str
= XGetAtomName (display
, atom
);
224 fprintf (stderr
, " XGetAtomName --> %s\n", str
);
226 if (! str
) return Qnil
;
229 /* This was allocated by Xlib, so use XFree. */
235 /* Do protocol to assert ourself as a selection owner.
236 Update the Vselection_alist so that we can reply to later requests for
240 x_own_selection (selection_name
, selection_value
)
241 Lisp_Object selection_name
, selection_value
;
243 struct frame
*sf
= SELECTED_FRAME ();
244 Window selecting_window
= FRAME_X_WINDOW (sf
);
245 Display
*display
= FRAME_X_DISPLAY (sf
);
246 Time time
= last_event_timestamp
;
248 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
251 CHECK_SYMBOL (selection_name
, 0);
252 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_name
);
255 count
= x_catch_errors (display
);
256 XSetSelectionOwner (display
, selection_atom
, selecting_window
, time
);
257 x_check_errors (display
, "Can't set selection: %s");
258 x_uncatch_errors (display
, count
);
261 /* Now update the local cache */
263 Lisp_Object selection_time
;
264 Lisp_Object selection_data
;
265 Lisp_Object prev_value
;
267 selection_time
= long_to_cons ((unsigned long) time
);
268 selection_data
= Fcons (selection_name
,
269 Fcons (selection_value
,
270 Fcons (selection_time
,
271 Fcons (selected_frame
, Qnil
))));
272 prev_value
= assq_no_quit (selection_name
, Vselection_alist
);
274 Vselection_alist
= Fcons (selection_data
, Vselection_alist
);
276 /* If we already owned the selection, remove the old selection data.
277 Perhaps we should destructively modify it instead.
278 Don't use Fdelq as that may QUIT. */
279 if (!NILP (prev_value
))
281 Lisp_Object rest
; /* we know it's not the CAR, so it's easy. */
282 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
283 if (EQ (prev_value
, Fcar (XCDR (rest
))))
285 XCDR (rest
) = Fcdr (XCDR (rest
));
292 /* Given a selection-name and desired type, look up our local copy of
293 the selection value and convert it to the type.
294 The value is nil or a string.
295 This function is used both for remote requests
296 and for local x-get-selection-internal.
298 This calls random Lisp code, and may signal or gc. */
301 x_get_local_selection (selection_symbol
, target_type
)
302 Lisp_Object selection_symbol
, target_type
;
304 Lisp_Object local_value
;
305 Lisp_Object handler_fn
, value
, type
, check
;
308 local_value
= assq_no_quit (selection_symbol
, Vselection_alist
);
310 if (NILP (local_value
)) return Qnil
;
312 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
313 if (EQ (target_type
, QTIMESTAMP
))
316 value
= XCAR (XCDR (XCDR (local_value
)));
319 else if (EQ (target_type
, QDELETE
))
322 Fx_disown_selection_internal
324 XCAR (XCDR (XCDR (local_value
))));
329 #if 0 /* #### MULTIPLE doesn't work yet */
330 else if (CONSP (target_type
)
331 && XCAR (target_type
) == QMULTIPLE
)
336 pairs
= XCDR (target_type
);
337 size
= XVECTOR (pairs
)->size
;
338 /* If the target is MULTIPLE, then target_type looks like
339 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
340 We modify the second element of each pair in the vector and
341 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
343 for (i
= 0; i
< size
; i
++)
346 pair
= XVECTOR (pairs
)->contents
[i
];
347 XVECTOR (pair
)->contents
[1]
348 = x_get_local_selection (XVECTOR (pair
)->contents
[0],
349 XVECTOR (pair
)->contents
[1]);
356 /* Don't allow a quit within the converter.
357 When the user types C-g, he would be surprised
358 if by luck it came during a converter. */
359 count
= specpdl_ptr
- specpdl
;
360 specbind (Qinhibit_quit
, Qt
);
362 CHECK_SYMBOL (target_type
, 0);
363 handler_fn
= Fcdr (Fassq (target_type
, Vselection_converter_alist
));
364 if (!NILP (handler_fn
))
365 value
= call3 (handler_fn
,
366 selection_symbol
, target_type
,
367 XCAR (XCDR (local_value
)));
370 unbind_to (count
, Qnil
);
373 /* Make sure this value is of a type that we could transmit
374 to another X client. */
378 && SYMBOLP (XCAR (value
)))
380 check
= XCDR (value
);
388 /* Check for a value that cons_to_long could handle. */
389 else if (CONSP (check
)
390 && INTEGERP (XCAR (check
))
391 && (INTEGERP (XCDR (check
))
393 (CONSP (XCDR (check
))
394 && INTEGERP (XCAR (XCDR (check
)))
395 && NILP (XCDR (XCDR (check
))))))
400 Fcons (build_string ("invalid data returned by selection-conversion function"),
401 Fcons (handler_fn
, Fcons (value
, Qnil
))));
404 /* Subroutines of x_reply_selection_request. */
406 /* Send a SelectionNotify event to the requestor with property=None,
407 meaning we were unable to do what they wanted. */
410 x_decline_selection_request (event
)
411 struct input_event
*event
;
413 XSelectionEvent reply
;
414 reply
.type
= SelectionNotify
;
415 reply
.display
= SELECTION_EVENT_DISPLAY (event
);
416 reply
.requestor
= SELECTION_EVENT_REQUESTOR (event
);
417 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
418 reply
.time
= SELECTION_EVENT_TIME (event
);
419 reply
.target
= SELECTION_EVENT_TARGET (event
);
420 reply
.property
= None
;
423 XSendEvent (reply
.display
, reply
.requestor
, False
, 0L,
425 XFlush (reply
.display
);
429 /* This is the selection request currently being processed.
430 It is set to zero when the request is fully processed. */
431 static struct input_event
*x_selection_current_request
;
433 /* Used as an unwind-protect clause so that, if a selection-converter signals
434 an error, we tell the requester that we were unable to do what they wanted
435 before we throw to top-level or go into the debugger or whatever. */
438 x_selection_request_lisp_error (ignore
)
441 if (x_selection_current_request
!= 0)
442 x_decline_selection_request (x_selection_current_request
);
447 /* This stuff is so that INCR selections are reentrant (that is, so we can
448 be servicing multiple INCR selection requests simultaneously.) I haven't
449 actually tested that yet. */
451 /* Keep a list of the property changes that are awaited. */
461 struct prop_location
*next
;
464 static struct prop_location
*expect_property_change ();
465 static void wait_for_property_change ();
466 static void unexpect_property_change ();
467 static int waiting_for_other_props_on_window ();
469 static int prop_location_identifier
;
471 static Lisp_Object property_change_reply
;
473 static struct prop_location
*property_change_reply_object
;
475 static struct prop_location
*property_change_wait_list
;
478 queue_selection_requests_unwind (frame
)
481 FRAME_PTR f
= XFRAME (frame
);
484 x_stop_queuing_selection_requests (FRAME_X_DISPLAY (f
));
488 /* Return some frame whose display info is DPYINFO.
489 Return nil if there is none. */
492 some_frame_on_display (dpyinfo
)
493 struct x_display_info
*dpyinfo
;
495 Lisp_Object list
, frame
;
497 FOR_EACH_FRAME (list
, frame
)
499 if (FRAME_X_DISPLAY_INFO (XFRAME (frame
)) == dpyinfo
)
506 /* Send the reply to a selection request event EVENT.
507 TYPE is the type of selection data requested.
508 DATA and SIZE describe the data to send, already converted.
509 FORMAT is the unit-size (in bits) of the data to be transmitted. */
512 x_reply_selection_request (event
, format
, data
, size
, type
)
513 struct input_event
*event
;
518 XSelectionEvent reply
;
519 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
520 Window window
= SELECTION_EVENT_REQUESTOR (event
);
522 int format_bytes
= format
/8;
523 int max_bytes
= SELECTION_QUANTUM (display
);
524 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
527 if (max_bytes
> MAX_SELECTION_QUANTUM
)
528 max_bytes
= MAX_SELECTION_QUANTUM
;
530 reply
.type
= SelectionNotify
;
531 reply
.display
= display
;
532 reply
.requestor
= window
;
533 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
534 reply
.time
= SELECTION_EVENT_TIME (event
);
535 reply
.target
= SELECTION_EVENT_TARGET (event
);
536 reply
.property
= SELECTION_EVENT_PROPERTY (event
);
537 if (reply
.property
== None
)
538 reply
.property
= reply
.target
;
540 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
542 count
= x_catch_errors (display
);
544 /* Store the data on the requested property.
545 If the selection is large, only store the first N bytes of it.
547 bytes_remaining
= size
* format_bytes
;
548 if (bytes_remaining
<= max_bytes
)
550 /* Send all the data at once, with minimal handshaking. */
552 fprintf (stderr
,"\nStoring all %d\n", bytes_remaining
);
554 XChangeProperty (display
, window
, reply
.property
, type
, format
,
555 PropModeReplace
, data
, size
);
556 /* At this point, the selection was successfully stored; ack it. */
557 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
561 /* Send an INCR selection. */
562 struct prop_location
*wait_object
;
566 frame
= some_frame_on_display (dpyinfo
);
568 /* If the display no longer has frames, we can't expect
569 to get many more selection requests from it, so don't
570 bother trying to queue them. */
573 x_start_queuing_selection_requests (display
);
575 record_unwind_protect (queue_selection_requests_unwind
,
579 if (x_window_to_frame (dpyinfo
, window
)) /* #### debug */
580 error ("Attempt to transfer an INCR to ourself!");
582 fprintf (stderr
, "\nINCR %d\n", bytes_remaining
);
584 wait_object
= expect_property_change (display
, window
, reply
.property
,
587 XChangeProperty (display
, window
, reply
.property
, dpyinfo
->Xatom_INCR
,
589 (unsigned char *) &bytes_remaining
, 1);
590 XSelectInput (display
, window
, PropertyChangeMask
);
591 /* Tell 'em the INCR data is there... */
592 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
595 had_errors
= x_had_errors_p (display
);
598 /* First, wait for the requester to ack by deleting the property.
599 This can run random lisp code (process handlers) or signal. */
601 wait_for_property_change (wait_object
);
603 while (bytes_remaining
)
605 int i
= ((bytes_remaining
< max_bytes
)
612 = expect_property_change (display
, window
, reply
.property
,
615 fprintf (stderr
," INCR adding %d\n", i
);
617 /* Append the next chunk of data to the property. */
618 XChangeProperty (display
, window
, reply
.property
, type
, format
,
619 PropModeAppend
, data
, i
/ format_bytes
);
620 bytes_remaining
-= i
;
623 had_errors
= x_had_errors_p (display
);
629 /* Now wait for the requester to ack this chunk by deleting the
630 property. This can run random lisp code or signal.
632 wait_for_property_change (wait_object
);
634 /* Now write a zero-length chunk to the property to tell the requester
637 fprintf (stderr
," INCR done\n");
640 if (! waiting_for_other_props_on_window (display
, window
))
641 XSelectInput (display
, window
, 0L);
643 XChangeProperty (display
, window
, reply
.property
, type
, format
,
644 PropModeReplace
, data
, 0);
648 x_uncatch_errors (display
, count
);
652 /* Handle a SelectionRequest event EVENT.
653 This is called from keyboard.c when such an event is found in the queue. */
656 x_handle_selection_request (event
)
657 struct input_event
*event
;
659 struct gcpro gcpro1
, gcpro2
, gcpro3
;
660 Lisp_Object local_selection_data
;
661 Lisp_Object selection_symbol
;
662 Lisp_Object target_symbol
;
663 Lisp_Object converted_selection
;
664 Time local_selection_time
;
665 Lisp_Object successful_p
;
667 struct x_display_info
*dpyinfo
668 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event
));
670 local_selection_data
= Qnil
;
671 target_symbol
= Qnil
;
672 converted_selection
= Qnil
;
675 GCPRO3 (local_selection_data
, converted_selection
, target_symbol
);
677 selection_symbol
= x_atom_to_symbol (dpyinfo
,
678 SELECTION_EVENT_DISPLAY (event
),
679 SELECTION_EVENT_SELECTION (event
));
681 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
683 if (NILP (local_selection_data
))
685 /* Someone asked for the selection, but we don't have it any more.
687 x_decline_selection_request (event
);
691 local_selection_time
= (Time
)
692 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
694 if (SELECTION_EVENT_TIME (event
) != CurrentTime
695 && local_selection_time
> SELECTION_EVENT_TIME (event
))
697 /* Someone asked for the selection, and we have one, but not the one
700 x_decline_selection_request (event
);
704 count
= specpdl_ptr
- specpdl
;
705 x_selection_current_request
= event
;
706 record_unwind_protect (x_selection_request_lisp_error
, Qnil
);
708 target_symbol
= x_atom_to_symbol (dpyinfo
, SELECTION_EVENT_DISPLAY (event
),
709 SELECTION_EVENT_TARGET (event
));
711 #if 0 /* #### MULTIPLE doesn't work yet */
712 if (EQ (target_symbol
, QMULTIPLE
))
713 target_symbol
= fetch_multiple_target (event
);
716 /* Convert lisp objects back into binary data */
719 = x_get_local_selection (selection_symbol
, target_symbol
);
721 if (! NILP (converted_selection
))
729 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event
),
731 &data
, &type
, &size
, &format
, &nofree
);
733 x_reply_selection_request (event
, format
, data
, size
, type
);
736 /* Indicate we have successfully processed this event. */
737 x_selection_current_request
= 0;
739 /* Use xfree, not XFree, because lisp_data_to_selection_data
740 calls xmalloc itself. */
744 unbind_to (count
, Qnil
);
750 /* Let random lisp code notice that the selection has been asked for. */
753 rest
= Vx_sent_selection_hooks
;
754 if (!EQ (rest
, Qunbound
))
755 for (; CONSP (rest
); rest
= Fcdr (rest
))
756 call3 (Fcar (rest
), selection_symbol
, target_symbol
, successful_p
);
760 /* Handle a SelectionClear event EVENT, which indicates that some
761 client cleared out our previously asserted selection.
762 This is called from keyboard.c when such an event is found in the queue. */
765 x_handle_selection_clear (event
)
766 struct input_event
*event
;
768 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
769 Atom selection
= SELECTION_EVENT_SELECTION (event
);
770 Time changed_owner_time
= SELECTION_EVENT_TIME (event
);
772 Lisp_Object selection_symbol
, local_selection_data
;
773 Time local_selection_time
;
774 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
775 struct x_display_info
*t_dpyinfo
;
777 /* If the new selection owner is also Emacs,
778 don't clear the new selection. */
780 /* Check each display on the same terminal,
781 to see if this Emacs job now owns the selection
782 through that display. */
783 for (t_dpyinfo
= x_display_list
; t_dpyinfo
; t_dpyinfo
= t_dpyinfo
->next
)
784 if (t_dpyinfo
->kboard
== dpyinfo
->kboard
)
787 = XGetSelectionOwner (t_dpyinfo
->display
, selection
);
788 if (x_window_to_frame (t_dpyinfo
, owner_window
) != 0)
796 selection_symbol
= x_atom_to_symbol (dpyinfo
, display
, selection
);
798 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
800 /* Well, we already believe that we don't own it, so that's just fine. */
801 if (NILP (local_selection_data
)) return;
803 local_selection_time
= (Time
)
804 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
806 /* This SelectionClear is for a selection that we no longer own, so we can
807 disregard it. (That is, we have reasserted the selection since this
808 request was generated.) */
810 if (changed_owner_time
!= CurrentTime
811 && local_selection_time
> changed_owner_time
)
814 /* Otherwise, we're really honest and truly being told to drop it.
815 Don't use Fdelq as that may QUIT;. */
817 if (EQ (local_selection_data
, Fcar (Vselection_alist
)))
818 Vselection_alist
= Fcdr (Vselection_alist
);
822 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
823 if (EQ (local_selection_data
, Fcar (XCDR (rest
))))
825 XCDR (rest
) = Fcdr (XCDR (rest
));
830 /* Let random lisp code notice that the selection has been stolen. */
834 rest
= Vx_lost_selection_hooks
;
835 if (!EQ (rest
, Qunbound
))
837 for (; CONSP (rest
); rest
= Fcdr (rest
))
838 call1 (Fcar (rest
), selection_symbol
);
839 prepare_menu_bars ();
840 redisplay_preserve_echo_area ();
845 /* Clear all selections that were made from frame F.
846 We do this when about to delete a frame. */
849 x_clear_frame_selections (f
)
855 XSETFRAME (frame
, f
);
857 /* Otherwise, we're really honest and truly being told to drop it.
858 Don't use Fdelq as that may QUIT;. */
860 /* Delete elements from the beginning of Vselection_alist. */
861 while (!NILP (Vselection_alist
)
862 && EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist
)))))))
864 /* Let random Lisp code notice that the selection has been stolen. */
865 Lisp_Object hooks
, selection_symbol
;
867 hooks
= Vx_lost_selection_hooks
;
868 selection_symbol
= Fcar (Fcar (Vselection_alist
));
870 if (!EQ (hooks
, Qunbound
))
872 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
873 call1 (Fcar (hooks
), selection_symbol
);
874 #if 0 /* This can crash when deleting a frame
875 from x_connection_closed. Anyway, it seems unnecessary;
876 something else should cause a redisplay. */
877 redisplay_preserve_echo_area ();
881 Vselection_alist
= Fcdr (Vselection_alist
);
884 /* Delete elements after the beginning of Vselection_alist. */
885 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
886 if (EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest
))))))))
888 /* Let random Lisp code notice that the selection has been stolen. */
889 Lisp_Object hooks
, selection_symbol
;
891 hooks
= Vx_lost_selection_hooks
;
892 selection_symbol
= Fcar (Fcar (XCDR (rest
)));
894 if (!EQ (hooks
, Qunbound
))
896 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
897 call1 (Fcar (hooks
), selection_symbol
);
898 #if 0 /* See above */
899 redisplay_preserve_echo_area ();
902 XCDR (rest
) = Fcdr (XCDR (rest
));
907 /* Nonzero if any properties for DISPLAY and WINDOW
908 are on the list of what we are waiting for. */
911 waiting_for_other_props_on_window (display
, window
)
915 struct prop_location
*rest
= property_change_wait_list
;
917 if (rest
->display
== display
&& rest
->window
== window
)
924 /* Add an entry to the list of property changes we are waiting for.
925 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
926 The return value is a number that uniquely identifies
927 this awaited property change. */
929 static struct prop_location
*
930 expect_property_change (display
, window
, property
, state
)
936 struct prop_location
*pl
937 = (struct prop_location
*) xmalloc (sizeof (struct prop_location
));
938 pl
->identifier
= ++prop_location_identifier
;
939 pl
->display
= display
;
941 pl
->property
= property
;
942 pl
->desired_state
= state
;
943 pl
->next
= property_change_wait_list
;
945 property_change_wait_list
= pl
;
949 /* Delete an entry from the list of property changes we are waiting for.
950 IDENTIFIER is the number that uniquely identifies the entry. */
953 unexpect_property_change (location
)
954 struct prop_location
*location
;
956 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
959 if (rest
== location
)
962 prev
->next
= rest
->next
;
964 property_change_wait_list
= rest
->next
;
973 /* Remove the property change expectation element for IDENTIFIER. */
976 wait_for_property_change_unwind (identifierval
)
977 Lisp_Object identifierval
;
979 unexpect_property_change ((struct prop_location
*)
980 (XFASTINT (XCAR (identifierval
)) << 16
981 | XFASTINT (XCDR (identifierval
))));
985 /* Actually wait for a property change.
986 IDENTIFIER should be the value that expect_property_change returned. */
989 wait_for_property_change (location
)
990 struct prop_location
*location
;
993 int count
= specpdl_ptr
- specpdl
;
996 tem
= Fcons (Qnil
, Qnil
);
997 XSETFASTINT (XCAR (tem
), (EMACS_UINT
)location
>> 16);
998 XSETFASTINT (XCDR (tem
), (EMACS_UINT
)location
& 0xffff);
1000 /* Make sure to do unexpect_property_change if we quit or err. */
1001 record_unwind_protect (wait_for_property_change_unwind
, tem
);
1003 XCAR (property_change_reply
) = Qnil
;
1005 property_change_reply_object
= location
;
1006 /* If the event we are waiting for arrives beyond here, it will set
1007 property_change_reply, because property_change_reply_object says so. */
1008 if (! location
->arrived
)
1010 secs
= x_selection_timeout
/ 1000;
1011 usecs
= (x_selection_timeout
% 1000) * 1000;
1012 wait_reading_process_input (secs
, usecs
, property_change_reply
, 0);
1014 if (NILP (XCAR (property_change_reply
)))
1015 error ("Timed out waiting for property-notify event");
1018 unbind_to (count
, Qnil
);
1021 /* Called from XTread_socket in response to a PropertyNotify event. */
1024 x_handle_property_notify (event
)
1025 XPropertyEvent
*event
;
1027 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1030 if (rest
->property
== event
->atom
1031 && rest
->window
== event
->window
1032 && rest
->display
== event
->display
1033 && rest
->desired_state
== event
->state
)
1036 fprintf (stderr
, "Saw expected prop-%s on %s\n",
1037 (event
->state
== PropertyDelete
? "delete" : "change"),
1038 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo
, event
->display
,
1045 /* If this is the one wait_for_property_change is waiting for,
1046 tell it to wake up. */
1047 if (rest
== property_change_reply_object
)
1048 XCAR (property_change_reply
) = Qt
;
1051 prev
->next
= rest
->next
;
1053 property_change_wait_list
= rest
->next
;
1061 fprintf (stderr
, "Saw UNexpected prop-%s on %s\n",
1062 (event
->state
== PropertyDelete
? "delete" : "change"),
1063 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo
,
1064 event
->display
, event
->atom
))
1071 #if 0 /* #### MULTIPLE doesn't work yet */
1074 fetch_multiple_target (event
)
1075 XSelectionRequestEvent
*event
;
1077 Display
*display
= event
->display
;
1078 Window window
= event
->requestor
;
1079 Atom target
= event
->target
;
1080 Atom selection_atom
= event
->selection
;
1085 x_get_window_property_as_lisp_data (display
, window
, target
,
1086 QMULTIPLE
, selection_atom
));
1090 copy_multiple_data (obj
)
1097 return Fcons (XCAR (obj
), copy_multiple_data (XCDR (obj
)));
1099 CHECK_VECTOR (obj
, 0);
1100 vec
= Fmake_vector (size
= XVECTOR (obj
)->size
, Qnil
);
1101 for (i
= 0; i
< size
; i
++)
1103 Lisp_Object vec2
= XVECTOR (obj
)->contents
[i
];
1104 CHECK_VECTOR (vec2
, 0);
1105 if (XVECTOR (vec2
)->size
!= 2)
1106 /* ??? Confusing error message */
1107 Fsignal (Qerror
, Fcons (build_string ("vectors must be of length 2"),
1108 Fcons (vec2
, Qnil
)));
1109 XVECTOR (vec
)->contents
[i
] = Fmake_vector (2, Qnil
);
1110 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[0]
1111 = XVECTOR (vec2
)->contents
[0];
1112 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[1]
1113 = XVECTOR (vec2
)->contents
[1];
1121 /* Variables for communication with x_handle_selection_notify. */
1122 static Atom reading_which_selection
;
1123 static Lisp_Object reading_selection_reply
;
1124 static Window reading_selection_window
;
1126 /* Do protocol to read selection-data from the server.
1127 Converts this to Lisp data and returns it. */
1130 x_get_foreign_selection (selection_symbol
, target_type
)
1131 Lisp_Object selection_symbol
, target_type
;
1133 struct frame
*sf
= SELECTED_FRAME ();
1134 Window requestor_window
= FRAME_X_WINDOW (sf
);
1135 Display
*display
= FRAME_X_DISPLAY (sf
);
1136 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1137 Time requestor_time
= last_event_timestamp
;
1138 Atom target_property
= dpyinfo
->Xatom_EMACS_TMP
;
1139 Atom selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_symbol
);
1145 if (CONSP (target_type
))
1146 type_atom
= symbol_to_x_atom (dpyinfo
, display
, XCAR (target_type
));
1148 type_atom
= symbol_to_x_atom (dpyinfo
, display
, target_type
);
1151 count
= x_catch_errors (display
);
1152 XConvertSelection (display
, selection_atom
, type_atom
, target_property
,
1153 requestor_window
, requestor_time
);
1156 /* Prepare to block until the reply has been read. */
1157 reading_selection_window
= requestor_window
;
1158 reading_which_selection
= selection_atom
;
1159 XCAR (reading_selection_reply
) = Qnil
;
1161 frame
= some_frame_on_display (dpyinfo
);
1163 /* If the display no longer has frames, we can't expect
1164 to get many more selection requests from it, so don't
1165 bother trying to queue them. */
1168 x_start_queuing_selection_requests (display
);
1170 record_unwind_protect (queue_selection_requests_unwind
,
1175 /* This allows quits. Also, don't wait forever. */
1176 secs
= x_selection_timeout
/ 1000;
1177 usecs
= (x_selection_timeout
% 1000) * 1000;
1178 wait_reading_process_input (secs
, usecs
, reading_selection_reply
, 0);
1181 x_check_errors (display
, "Cannot get selection: %s");
1182 x_uncatch_errors (display
, count
);
1185 if (NILP (XCAR (reading_selection_reply
)))
1186 error ("Timed out waiting for reply from selection owner");
1187 if (EQ (XCAR (reading_selection_reply
), Qlambda
))
1188 error ("No `%s' selection", XSYMBOL (selection_symbol
)->name
->data
);
1190 /* Otherwise, the selection is waiting for us on the requested property. */
1192 x_get_window_property_as_lisp_data (display
, requestor_window
,
1193 target_property
, target_type
,
1197 /* Subroutines of x_get_window_property_as_lisp_data */
1199 /* Use xfree, not XFree, to free the data obtained with this function. */
1202 x_get_window_property (display
, window
, property
, data_ret
, bytes_ret
,
1203 actual_type_ret
, actual_format_ret
, actual_size_ret
,
1208 unsigned char **data_ret
;
1210 Atom
*actual_type_ret
;
1211 int *actual_format_ret
;
1212 unsigned long *actual_size_ret
;
1216 unsigned long bytes_remaining
;
1218 unsigned char *tmp_data
= 0;
1220 int buffer_size
= SELECTION_QUANTUM (display
);
1221 if (buffer_size
> MAX_SELECTION_QUANTUM
) buffer_size
= MAX_SELECTION_QUANTUM
;
1224 /* First probe the thing to find out how big it is. */
1225 result
= XGetWindowProperty (display
, window
, property
,
1226 0L, 0L, False
, AnyPropertyType
,
1227 actual_type_ret
, actual_format_ret
,
1229 &bytes_remaining
, &tmp_data
);
1230 if (result
!= Success
)
1237 /* This was allocated by Xlib, so use XFree. */
1238 XFree ((char *) tmp_data
);
1240 if (*actual_type_ret
== None
|| *actual_format_ret
== 0)
1246 total_size
= bytes_remaining
+ 1;
1247 *data_ret
= (unsigned char *) xmalloc (total_size
);
1249 /* Now read, until we've gotten it all. */
1250 while (bytes_remaining
)
1253 int last
= bytes_remaining
;
1256 = XGetWindowProperty (display
, window
, property
,
1257 (long)offset
/4, (long)buffer_size
/4,
1260 actual_type_ret
, actual_format_ret
,
1261 actual_size_ret
, &bytes_remaining
, &tmp_data
);
1263 fprintf (stderr
, "<< read %d\n", last
-bytes_remaining
);
1265 /* If this doesn't return Success at this point, it means that
1266 some clod deleted the selection while we were in the midst of
1267 reading it. Deal with that, I guess....
1269 if (result
!= Success
) break;
1270 *actual_size_ret
*= *actual_format_ret
/ 8;
1271 bcopy (tmp_data
, (*data_ret
) + offset
, *actual_size_ret
);
1272 offset
+= *actual_size_ret
;
1273 /* This was allocated by Xlib, so use XFree. */
1274 XFree ((char *) tmp_data
);
1279 *bytes_ret
= offset
;
1282 /* Use xfree, not XFree, to free the data obtained with this function. */
1285 receive_incremental_selection (display
, window
, property
, target_type
,
1286 min_size_bytes
, data_ret
, size_bytes_ret
,
1287 type_ret
, format_ret
, size_ret
)
1291 Lisp_Object target_type
; /* for error messages only */
1292 unsigned int min_size_bytes
;
1293 unsigned char **data_ret
;
1294 int *size_bytes_ret
;
1296 unsigned long *size_ret
;
1300 struct prop_location
*wait_object
;
1301 *size_bytes_ret
= min_size_bytes
;
1302 *data_ret
= (unsigned char *) xmalloc (*size_bytes_ret
);
1304 fprintf (stderr
, "\nread INCR %d\n", min_size_bytes
);
1307 /* At this point, we have read an INCR property.
1308 Delete the property to ack it.
1309 (But first, prepare to receive the next event in this handshake.)
1311 Now, we must loop, waiting for the sending window to put a value on
1312 that property, then reading the property, then deleting it to ack.
1313 We are done when the sender places a property of length 0.
1316 XSelectInput (display
, window
, STANDARD_EVENT_SET
| PropertyChangeMask
);
1317 XDeleteProperty (display
, window
, property
);
1318 wait_object
= expect_property_change (display
, window
, property
,
1325 unsigned char *tmp_data
;
1327 wait_for_property_change (wait_object
);
1328 /* expect it again immediately, because x_get_window_property may
1329 .. no it won't, I don't get it.
1330 .. Ok, I get it now, the Xt code that implements INCR is broken.
1332 x_get_window_property (display
, window
, property
,
1333 &tmp_data
, &tmp_size_bytes
,
1334 type_ret
, format_ret
, size_ret
, 1);
1336 if (tmp_size_bytes
== 0) /* we're done */
1339 fprintf (stderr
, " read INCR done\n");
1341 if (! waiting_for_other_props_on_window (display
, window
))
1342 XSelectInput (display
, window
, STANDARD_EVENT_SET
);
1343 unexpect_property_change (wait_object
);
1344 /* Use xfree, not XFree, because x_get_window_property
1345 calls xmalloc itself. */
1346 if (tmp_data
) xfree (tmp_data
);
1351 XDeleteProperty (display
, window
, property
);
1352 wait_object
= expect_property_change (display
, window
, property
,
1358 fprintf (stderr
, " read INCR %d\n", tmp_size_bytes
);
1360 if (*size_bytes_ret
< offset
+ tmp_size_bytes
)
1363 fprintf (stderr
, " read INCR realloc %d -> %d\n",
1364 *size_bytes_ret
, offset
+ tmp_size_bytes
);
1366 *size_bytes_ret
= offset
+ tmp_size_bytes
;
1367 *data_ret
= (unsigned char *) xrealloc (*data_ret
, *size_bytes_ret
);
1369 bcopy (tmp_data
, (*data_ret
) + offset
, tmp_size_bytes
);
1370 offset
+= tmp_size_bytes
;
1371 /* Use xfree, not XFree, because x_get_window_property
1372 calls xmalloc itself. */
1377 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1378 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1379 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1382 x_get_window_property_as_lisp_data (display
, window
, property
, target_type
,
1387 Lisp_Object target_type
; /* for error messages only */
1388 Atom selection_atom
; /* for error messages only */
1392 unsigned long actual_size
;
1393 unsigned char *data
= 0;
1396 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1398 x_get_window_property (display
, window
, property
, &data
, &bytes
,
1399 &actual_type
, &actual_format
, &actual_size
, 1);
1402 int there_is_a_selection_owner
;
1404 there_is_a_selection_owner
1405 = XGetSelectionOwner (display
, selection_atom
);
1408 there_is_a_selection_owner
1409 ? Fcons (build_string ("selection owner couldn't convert"),
1411 ? Fcons (target_type
,
1412 Fcons (x_atom_to_symbol (dpyinfo
, display
,
1415 : Fcons (target_type
, Qnil
))
1416 : Fcons (build_string ("no selection"),
1417 Fcons (x_atom_to_symbol (dpyinfo
, display
,
1422 if (actual_type
== dpyinfo
->Xatom_INCR
)
1424 /* That wasn't really the data, just the beginning. */
1426 unsigned int min_size_bytes
= * ((unsigned int *) data
);
1428 /* Use xfree, not XFree, because x_get_window_property
1429 calls xmalloc itself. */
1430 xfree ((char *) data
);
1432 receive_incremental_selection (display
, window
, property
, target_type
,
1433 min_size_bytes
, &data
, &bytes
,
1434 &actual_type
, &actual_format
,
1439 XDeleteProperty (display
, window
, property
);
1443 /* It's been read. Now convert it to a lisp object in some semi-rational
1445 val
= selection_data_to_lisp_data (display
, data
, bytes
,
1446 actual_type
, actual_format
);
1448 /* Use xfree, not XFree, because x_get_window_property
1449 calls xmalloc itself. */
1450 xfree ((char *) data
);
1454 /* These functions convert from the selection data read from the server into
1455 something that we can use from Lisp, and vice versa.
1457 Type: Format: Size: Lisp Type:
1458 ----- ------- ----- -----------
1461 ATOM 32 > 1 Vector of Symbols
1463 * 16 > 1 Vector of Integers
1464 * 32 1 if <=16 bits: Integer
1465 if > 16 bits: Cons of top16, bot16
1466 * 32 > 1 Vector of the above
1468 When converting a Lisp number to C, it is assumed to be of format 16 if
1469 it is an integer, and of format 32 if it is a cons of two integers.
1471 When converting a vector of numbers from Lisp to C, it is assumed to be
1472 of format 16 if every element in the vector is an integer, and is assumed
1473 to be of format 32 if any element is a cons of two integers.
1475 When converting an object to C, it may be of the form (SYMBOL . <data>)
1476 where SYMBOL is what we should claim that the type is. Format and
1477 representation are as above. */
1482 selection_data_to_lisp_data (display
, data
, size
, type
, format
)
1484 unsigned char *data
;
1488 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1490 if (type
== dpyinfo
->Xatom_NULL
)
1493 /* Convert any 8-bit data to a string, for compactness. */
1494 else if (format
== 8)
1497 int require_encoding
= 0;
1503 ! NILP (buffer_defaults
.enable_multibyte_characters
)
1507 /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode
1508 DATA to Emacs internal format because DATA may be encoded
1509 in compound text format. In addtion, if TYPE is `STRING'
1510 and DATA contains any 8-bit Latin-1 code, we should also
1512 if (type
== dpyinfo
->Xatom_TEXT
1513 || type
== dpyinfo
->Xatom_COMPOUND_TEXT
)
1514 require_encoding
= 1;
1515 else if (type
== XA_STRING
)
1518 for (i
= 0; i
< size
; i
++)
1520 if (data
[i
] >= 0x80)
1522 require_encoding
= 1;
1528 if (!require_encoding
)
1530 str
= make_unibyte_string ((char *) data
, size
);
1531 Vlast_coding_system_used
= Qraw_text
;
1537 struct coding_system coding
;
1539 if (NILP (Vnext_selection_coding_system
))
1540 Vnext_selection_coding_system
= Vselection_coding_system
;
1542 (Fcheck_coding_system(Vnext_selection_coding_system
), &coding
);
1543 coding
.src_multibyte
= 0;
1544 coding
.dst_multibyte
= 1;
1545 Vnext_selection_coding_system
= Qnil
;
1546 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1547 bufsize
= decoding_buffer_size (&coding
, size
);
1548 buf
= (unsigned char *) xmalloc (bufsize
);
1549 decode_coding (&coding
, data
, buf
, size
, bufsize
);
1550 str
= make_string_from_bytes ((char *) buf
,
1551 coding
.produced_char
, coding
.produced
);
1553 Vlast_coding_system_used
= coding
.symbol
;
1555 compose_chars_in_text (0, XSTRING (str
)->size
, str
);
1558 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1559 a vector of symbols.
1561 else if (type
== XA_ATOM
)
1564 if (size
== sizeof (Atom
))
1565 return x_atom_to_symbol (dpyinfo
, display
, *((Atom
*) data
));
1568 Lisp_Object v
= Fmake_vector (make_number (size
/ sizeof (Atom
)),
1570 for (i
= 0; i
< size
/ sizeof (Atom
); i
++)
1571 Faset (v
, make_number (i
),
1572 x_atom_to_symbol (dpyinfo
, display
, ((Atom
*) data
) [i
]));
1577 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1578 If the number is > 16 bits, convert it to a cons of integers,
1579 16 bits in each half.
1581 else if (format
== 32 && size
== sizeof (long))
1582 return long_to_cons (((unsigned long *) data
) [0]);
1583 else if (format
== 16 && size
== sizeof (short))
1584 return make_number ((int) (((unsigned short *) data
) [0]));
1586 /* Convert any other kind of data to a vector of numbers, represented
1587 as above (as an integer, or a cons of two 16 bit integers.)
1589 else if (format
== 16)
1593 v
= Fmake_vector (make_number (size
/ 2), make_number (0));
1594 for (i
= 0; i
< size
/ 2; i
++)
1596 int j
= (int) ((unsigned short *) data
) [i
];
1597 Faset (v
, make_number (i
), make_number (j
));
1604 Lisp_Object v
= Fmake_vector (make_number (size
/ 4), make_number (0));
1605 for (i
= 0; i
< size
/ 4; i
++)
1607 unsigned long j
= ((unsigned long *) data
) [i
];
1608 Faset (v
, make_number (i
), long_to_cons (j
));
1615 /* Use xfree, not XFree, to free the data obtained with this function. */
1618 lisp_data_to_selection_data (display
, obj
,
1619 data_ret
, type_ret
, size_ret
,
1620 format_ret
, nofree_ret
)
1623 unsigned char **data_ret
;
1625 unsigned int *size_ret
;
1629 Lisp_Object type
= Qnil
;
1630 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1634 if (CONSP (obj
) && SYMBOLP (XCAR (obj
)))
1638 if (CONSP (obj
) && NILP (XCDR (obj
)))
1642 if (EQ (obj
, QNULL
) || (EQ (type
, QNULL
)))
1643 { /* This is not the same as declining */
1649 else if (STRINGP (obj
))
1651 /* Since we are now handling multilingual text, we must consider
1652 sending back compound text. */
1655 if (NILP (Vnext_selection_coding_system
))
1656 Vnext_selection_coding_system
= Vselection_coding_system
;
1659 *data_ret
= x_encode_text (obj
, Vnext_selection_coding_system
,
1660 (int *) size_ret
, &stringp
);
1661 *nofree_ret
= (*data_ret
== XSTRING (obj
)->data
);
1663 type
= (stringp
? QSTRING
: QCOMPOUND_TEXT
);
1664 Vlast_coding_system_used
= (*nofree_ret
1666 : Vnext_selection_coding_system
);
1667 Vnext_selection_coding_system
= Qnil
;
1669 else if (SYMBOLP (obj
))
1673 *data_ret
= (unsigned char *) xmalloc (sizeof (Atom
) + 1);
1674 (*data_ret
) [sizeof (Atom
)] = 0;
1675 (*(Atom
**) data_ret
) [0] = symbol_to_x_atom (dpyinfo
, display
, obj
);
1676 if (NILP (type
)) type
= QATOM
;
1678 else if (INTEGERP (obj
)
1679 && XINT (obj
) < 0xFFFF
1680 && XINT (obj
) > -0xFFFF)
1684 *data_ret
= (unsigned char *) xmalloc (sizeof (short) + 1);
1685 (*data_ret
) [sizeof (short)] = 0;
1686 (*(short **) data_ret
) [0] = (short) XINT (obj
);
1687 if (NILP (type
)) type
= QINTEGER
;
1689 else if (INTEGERP (obj
)
1690 || (CONSP (obj
) && INTEGERP (XCAR (obj
))
1691 && (INTEGERP (XCDR (obj
))
1692 || (CONSP (XCDR (obj
))
1693 && INTEGERP (XCAR (XCDR (obj
)))))))
1697 *data_ret
= (unsigned char *) xmalloc (sizeof (long) + 1);
1698 (*data_ret
) [sizeof (long)] = 0;
1699 (*(unsigned long **) data_ret
) [0] = cons_to_long (obj
);
1700 if (NILP (type
)) type
= QINTEGER
;
1702 else if (VECTORP (obj
))
1704 /* Lisp_Vectors may represent a set of ATOMs;
1705 a set of 16 or 32 bit INTEGERs;
1706 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1710 if (SYMBOLP (XVECTOR (obj
)->contents
[0]))
1711 /* This vector is an ATOM set */
1713 if (NILP (type
)) type
= QATOM
;
1714 *size_ret
= XVECTOR (obj
)->size
;
1716 *data_ret
= (unsigned char *) xmalloc ((*size_ret
) * sizeof (Atom
));
1717 for (i
= 0; i
< *size_ret
; i
++)
1718 if (SYMBOLP (XVECTOR (obj
)->contents
[i
]))
1719 (*(Atom
**) data_ret
) [i
]
1720 = symbol_to_x_atom (dpyinfo
, display
, XVECTOR (obj
)->contents
[i
]);
1722 Fsignal (Qerror
, /* Qselection_error */
1724 ("all elements of selection vector must have same type"),
1725 Fcons (obj
, Qnil
)));
1727 #if 0 /* #### MULTIPLE doesn't work yet */
1728 else if (VECTORP (XVECTOR (obj
)->contents
[0]))
1729 /* This vector is an ATOM_PAIR set */
1731 if (NILP (type
)) type
= QATOM_PAIR
;
1732 *size_ret
= XVECTOR (obj
)->size
;
1734 *data_ret
= (unsigned char *)
1735 xmalloc ((*size_ret
) * sizeof (Atom
) * 2);
1736 for (i
= 0; i
< *size_ret
; i
++)
1737 if (VECTORP (XVECTOR (obj
)->contents
[i
]))
1739 Lisp_Object pair
= XVECTOR (obj
)->contents
[i
];
1740 if (XVECTOR (pair
)->size
!= 2)
1743 ("elements of the vector must be vectors of exactly two elements"),
1744 Fcons (pair
, Qnil
)));
1746 (*(Atom
**) data_ret
) [i
* 2]
1747 = symbol_to_x_atom (dpyinfo
, display
,
1748 XVECTOR (pair
)->contents
[0]);
1749 (*(Atom
**) data_ret
) [(i
* 2) + 1]
1750 = symbol_to_x_atom (dpyinfo
, display
,
1751 XVECTOR (pair
)->contents
[1]);
1756 ("all elements of the vector must be of the same type"),
1757 Fcons (obj
, Qnil
)));
1762 /* This vector is an INTEGER set, or something like it */
1764 *size_ret
= XVECTOR (obj
)->size
;
1765 if (NILP (type
)) type
= QINTEGER
;
1767 for (i
= 0; i
< *size_ret
; i
++)
1768 if (CONSP (XVECTOR (obj
)->contents
[i
]))
1770 else if (!INTEGERP (XVECTOR (obj
)->contents
[i
]))
1771 Fsignal (Qerror
, /* Qselection_error */
1773 ("elements of selection vector must be integers or conses of integers"),
1774 Fcons (obj
, Qnil
)));
1776 *data_ret
= (unsigned char *) xmalloc (*size_ret
* (*format_ret
/8));
1777 for (i
= 0; i
< *size_ret
; i
++)
1778 if (*format_ret
== 32)
1779 (*((unsigned long **) data_ret
)) [i
]
1780 = cons_to_long (XVECTOR (obj
)->contents
[i
]);
1782 (*((unsigned short **) data_ret
)) [i
]
1783 = (unsigned short) cons_to_long (XVECTOR (obj
)->contents
[i
]);
1787 Fsignal (Qerror
, /* Qselection_error */
1788 Fcons (build_string ("unrecognised selection data"),
1789 Fcons (obj
, Qnil
)));
1791 *type_ret
= symbol_to_x_atom (dpyinfo
, display
, type
);
1795 clean_local_selection_data (obj
)
1799 && INTEGERP (XCAR (obj
))
1800 && CONSP (XCDR (obj
))
1801 && INTEGERP (XCAR (XCDR (obj
)))
1802 && NILP (XCDR (XCDR (obj
))))
1803 obj
= Fcons (XCAR (obj
), XCDR (obj
));
1806 && INTEGERP (XCAR (obj
))
1807 && INTEGERP (XCDR (obj
)))
1809 if (XINT (XCAR (obj
)) == 0)
1811 if (XINT (XCAR (obj
)) == -1)
1812 return make_number (- XINT (XCDR (obj
)));
1817 int size
= XVECTOR (obj
)->size
;
1820 return clean_local_selection_data (XVECTOR (obj
)->contents
[0]);
1821 copy
= Fmake_vector (make_number (size
), Qnil
);
1822 for (i
= 0; i
< size
; i
++)
1823 XVECTOR (copy
)->contents
[i
]
1824 = clean_local_selection_data (XVECTOR (obj
)->contents
[i
]);
1830 /* Called from XTread_socket to handle SelectionNotify events.
1831 If it's the selection we are waiting for, stop waiting
1832 by setting the car of reading_selection_reply to non-nil.
1833 We store t there if the reply is successful, lambda if not. */
1836 x_handle_selection_notify (event
)
1837 XSelectionEvent
*event
;
1839 if (event
->requestor
!= reading_selection_window
)
1841 if (event
->selection
!= reading_which_selection
)
1844 XCAR (reading_selection_reply
)
1845 = (event
->property
!= 0 ? Qt
: Qlambda
);
1849 DEFUN ("x-own-selection-internal", Fx_own_selection_internal
,
1850 Sx_own_selection_internal
, 2, 2, 0,
1851 "Assert an X selection of the given TYPE with the given VALUE.\n\
1852 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1853 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
1854 VALUE is typically a string, or a cons of two markers, but may be\n\
1855 anything that the functions on `selection-converter-alist' know about.")
1856 (selection_name
, selection_value
)
1857 Lisp_Object selection_name
, selection_value
;
1860 CHECK_SYMBOL (selection_name
, 0);
1861 if (NILP (selection_value
)) error ("selection-value may not be nil");
1862 x_own_selection (selection_name
, selection_value
);
1863 return selection_value
;
1867 /* Request the selection value from the owner. If we are the owner,
1868 simply return our selection value. If we are not the owner, this
1869 will block until all of the data has arrived. */
1871 DEFUN ("x-get-selection-internal", Fx_get_selection_internal
,
1872 Sx_get_selection_internal
, 2, 2, 0,
1873 "Return text selected from some X window.\n\
1874 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1875 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
1876 TYPE is the type of data desired, typically `STRING'.")
1877 (selection_symbol
, target_type
)
1878 Lisp_Object selection_symbol
, target_type
;
1880 Lisp_Object val
= Qnil
;
1881 struct gcpro gcpro1
, gcpro2
;
1882 GCPRO2 (target_type
, val
); /* we store newly consed data into these */
1884 CHECK_SYMBOL (selection_symbol
, 0);
1886 #if 0 /* #### MULTIPLE doesn't work yet */
1887 if (CONSP (target_type
)
1888 && XCAR (target_type
) == QMULTIPLE
)
1890 CHECK_VECTOR (XCDR (target_type
), 0);
1891 /* So we don't destructively modify this... */
1892 target_type
= copy_multiple_data (target_type
);
1896 CHECK_SYMBOL (target_type
, 0);
1898 val
= x_get_local_selection (selection_symbol
, target_type
);
1902 val
= x_get_foreign_selection (selection_symbol
, target_type
);
1907 && SYMBOLP (XCAR (val
)))
1910 if (CONSP (val
) && NILP (XCDR (val
)))
1913 val
= clean_local_selection_data (val
);
1919 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal
,
1920 Sx_disown_selection_internal
, 1, 2, 0,
1921 "If we own the selection SELECTION, disown it.\n\
1922 Disowning it means there is no such selection.")
1924 Lisp_Object selection
;
1928 Atom selection_atom
;
1929 struct selection_input_event event
;
1931 struct x_display_info
*dpyinfo
;
1932 struct frame
*sf
= SELECTED_FRAME ();
1935 display
= FRAME_X_DISPLAY (sf
);
1936 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1937 CHECK_SYMBOL (selection
, 0);
1939 timestamp
= last_event_timestamp
;
1941 timestamp
= cons_to_long (time
);
1943 if (NILP (assq_no_quit (selection
, Vselection_alist
)))
1944 return Qnil
; /* Don't disown the selection when we're not the owner. */
1946 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection
);
1949 XSetSelectionOwner (display
, selection_atom
, None
, timestamp
);
1952 /* It doesn't seem to be guaranteed that a SelectionClear event will be
1953 generated for a window which owns the selection when that window sets
1954 the selection owner to None. The NCD server does, the MIT Sun4 server
1955 doesn't. So we synthesize one; this means we might get two, but
1956 that's ok, because the second one won't have any effect. */
1957 SELECTION_EVENT_DISPLAY (&event
) = display
;
1958 SELECTION_EVENT_SELECTION (&event
) = selection_atom
;
1959 SELECTION_EVENT_TIME (&event
) = timestamp
;
1960 x_handle_selection_clear ((struct input_event
*) &event
);
1965 /* Get rid of all the selections in buffer BUFFER.
1966 This is used when we kill a buffer. */
1969 x_disown_buffer_selections (buffer
)
1973 struct buffer
*buf
= XBUFFER (buffer
);
1975 for (tail
= Vselection_alist
; CONSP (tail
); tail
= XCDR (tail
))
1977 Lisp_Object elt
, value
;
1980 if (CONSP (value
) && MARKERP (XCAR (value
))
1981 && XMARKER (XCAR (value
))->buffer
== buf
)
1982 Fx_disown_selection_internal (XCAR (elt
), Qnil
);
1986 DEFUN ("x-selection-owner-p", Fx_selection_owner_p
, Sx_selection_owner_p
,
1988 "Whether the current Emacs process owns the given X Selection.\n\
1989 The arg should be the name of the selection in question, typically one of\n\
1990 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1991 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
1992 For convenience, the symbol nil is the same as `PRIMARY',\n\
1993 and t is the same as `SECONDARY'.)")
1995 Lisp_Object selection
;
1998 CHECK_SYMBOL (selection
, 0);
1999 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2000 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2002 if (NILP (Fassq (selection
, Vselection_alist
)))
2007 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
2009 "Whether there is an owner for the given X Selection.\n\
2010 The arg should be the name of the selection in question, typically one of\n\
2011 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
2012 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
2013 For convenience, the symbol nil is the same as `PRIMARY',\n\
2014 and t is the same as `SECONDARY'.)")
2016 Lisp_Object selection
;
2021 struct frame
*sf
= SELECTED_FRAME ();
2023 /* It should be safe to call this before we have an X frame. */
2024 if (! FRAME_X_P (sf
))
2027 dpy
= FRAME_X_DISPLAY (sf
);
2028 CHECK_SYMBOL (selection
, 0);
2029 if (!NILP (Fx_selection_owner_p (selection
)))
2031 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2032 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2033 atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
), dpy
, selection
);
2037 owner
= XGetSelectionOwner (dpy
, atom
);
2039 return (owner
? Qt
: Qnil
);
2043 #ifdef CUT_BUFFER_SUPPORT
2045 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2047 initialize_cut_buffers (display
, window
)
2051 unsigned char *data
= (unsigned char *) "";
2053 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2054 PropModeAppend, data, 0)
2055 FROB (XA_CUT_BUFFER0
);
2056 FROB (XA_CUT_BUFFER1
);
2057 FROB (XA_CUT_BUFFER2
);
2058 FROB (XA_CUT_BUFFER3
);
2059 FROB (XA_CUT_BUFFER4
);
2060 FROB (XA_CUT_BUFFER5
);
2061 FROB (XA_CUT_BUFFER6
);
2062 FROB (XA_CUT_BUFFER7
);
2068 #define CHECK_CUT_BUFFER(symbol,n) \
2069 { CHECK_SYMBOL ((symbol), (n)); \
2070 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2071 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2072 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2073 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2075 Fcons (build_string ("doesn't name a cut buffer"), \
2076 Fcons ((symbol), Qnil))); \
2079 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal
,
2080 Sx_get_cut_buffer_internal
, 1, 1, 0,
2081 "Returns the value of the named cut buffer (typically CUT_BUFFER0).")
2087 unsigned char *data
;
2094 struct x_display_info
*dpyinfo
;
2095 struct frame
*sf
= SELECTED_FRAME ();
2098 display
= FRAME_X_DISPLAY (sf
);
2099 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2100 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2101 CHECK_CUT_BUFFER (buffer
, 0);
2102 buffer_atom
= symbol_to_x_atom (dpyinfo
, display
, buffer
);
2104 x_get_window_property (display
, window
, buffer_atom
, &data
, &bytes
,
2105 &type
, &format
, &size
, 0);
2106 if (!data
|| !format
)
2109 if (format
!= 8 || type
!= XA_STRING
)
2111 Fcons (build_string ("cut buffer doesn't contain 8-bit data"),
2112 Fcons (x_atom_to_symbol (dpyinfo
, display
, type
),
2113 Fcons (make_number (format
), Qnil
))));
2115 ret
= (bytes
? make_string ((char *) data
, bytes
) : Qnil
);
2116 /* Use xfree, not XFree, because x_get_window_property
2117 calls xmalloc itself. */
2123 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal
,
2124 Sx_store_cut_buffer_internal
, 2, 2, 0,
2125 "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
2127 Lisp_Object buffer
, string
;
2131 unsigned char *data
;
2133 int bytes_remaining
;
2136 struct frame
*sf
= SELECTED_FRAME ();
2139 display
= FRAME_X_DISPLAY (sf
);
2140 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2142 max_bytes
= SELECTION_QUANTUM (display
);
2143 if (max_bytes
> MAX_SELECTION_QUANTUM
)
2144 max_bytes
= MAX_SELECTION_QUANTUM
;
2146 CHECK_CUT_BUFFER (buffer
, 0);
2147 CHECK_STRING (string
, 0);
2148 buffer_atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
),
2150 data
= (unsigned char *) XSTRING (string
)->data
;
2151 bytes
= STRING_BYTES (XSTRING (string
));
2152 bytes_remaining
= bytes
;
2154 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2156 initialize_cut_buffers (display
, window
);
2157 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2162 /* Don't mess up with an empty value. */
2163 if (!bytes_remaining
)
2164 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2165 PropModeReplace
, data
, 0);
2167 while (bytes_remaining
)
2169 int chunk
= (bytes_remaining
< max_bytes
2170 ? bytes_remaining
: max_bytes
);
2171 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2172 (bytes_remaining
== bytes
2177 bytes_remaining
-= chunk
;
2184 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal
,
2185 Sx_rotate_cut_buffers_internal
, 1, 1, 0,
2186 "Rotate the values of the cut buffers by the given number of step.\n\
2187 Positive means shift the values forward, negative means backward.")
2194 struct frame
*sf
= SELECTED_FRAME ();
2197 display
= FRAME_X_DISPLAY (sf
);
2198 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2199 CHECK_NUMBER (n
, 0);
2202 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2204 initialize_cut_buffers (display
, window
);
2205 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2208 props
[0] = XA_CUT_BUFFER0
;
2209 props
[1] = XA_CUT_BUFFER1
;
2210 props
[2] = XA_CUT_BUFFER2
;
2211 props
[3] = XA_CUT_BUFFER3
;
2212 props
[4] = XA_CUT_BUFFER4
;
2213 props
[5] = XA_CUT_BUFFER5
;
2214 props
[6] = XA_CUT_BUFFER6
;
2215 props
[7] = XA_CUT_BUFFER7
;
2217 XRotateWindowProperties (display
, window
, props
, 8, XINT (n
));
2227 defsubr (&Sx_get_selection_internal
);
2228 defsubr (&Sx_own_selection_internal
);
2229 defsubr (&Sx_disown_selection_internal
);
2230 defsubr (&Sx_selection_owner_p
);
2231 defsubr (&Sx_selection_exists_p
);
2233 #ifdef CUT_BUFFER_SUPPORT
2234 defsubr (&Sx_get_cut_buffer_internal
);
2235 defsubr (&Sx_store_cut_buffer_internal
);
2236 defsubr (&Sx_rotate_cut_buffers_internal
);
2239 reading_selection_reply
= Fcons (Qnil
, Qnil
);
2240 staticpro (&reading_selection_reply
);
2241 reading_selection_window
= 0;
2242 reading_which_selection
= 0;
2244 property_change_wait_list
= 0;
2245 prop_location_identifier
= 0;
2246 property_change_reply
= Fcons (Qnil
, Qnil
);
2247 staticpro (&property_change_reply
);
2249 Vselection_alist
= Qnil
;
2250 staticpro (&Vselection_alist
);
2252 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist
,
2253 "An alist associating X Windows selection-types with functions.\n\
2254 These functions are called to convert the selection, with three args:\n\
2255 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2256 a desired type to which the selection should be converted;\n\
2257 and the local selection value (whatever was given to `x-own-selection').\n\
2259 The function should return the value to send to the X server\n\
2260 \(typically a string). A return value of nil\n\
2261 means that the conversion could not be done.\n\
2262 A return value which is the symbol `NULL'\n\
2263 means that a side-effect was executed,\n\
2264 and there is no meaningful selection value.");
2265 Vselection_converter_alist
= Qnil
;
2267 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks
,
2268 "A list of functions to be called when Emacs loses an X selection.\n\
2269 \(This happens when some other X client makes its own selection\n\
2270 or when a Lisp program explicitly clears the selection.)\n\
2271 The functions are called with one argument, the selection type\n\
2272 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD').");
2273 Vx_lost_selection_hooks
= Qnil
;
2275 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks
,
2276 "A list of functions to be called when Emacs answers a selection request.\n\
2277 The functions are called with four arguments:\n\
2278 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2279 - the selection-type which Emacs was asked to convert the\n\
2280 selection into before sending (for example, `STRING' or `LENGTH');\n\
2281 - a flag indicating success or failure for responding to the request.\n\
2282 We might have failed (and declined the request) for any number of reasons,\n\
2283 including being asked for a selection that we no longer own, or being asked\n\
2284 to convert into a type that we don't know about or that is inappropriate.\n\
2285 This hook doesn't let you change the behavior of Emacs's selection replies,\n\
2286 it merely informs you that they have happened.");
2287 Vx_sent_selection_hooks
= Qnil
;
2289 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system
,
2290 "Coding system for communicating with other X clients.\n\
2291 When sending or receiving text via cut_buffer, selection, and clipboard,\n\
2292 the text is encoded or decoded by this coding system.\n\
2293 The default value is `compound-text'.");
2294 Vselection_coding_system
= intern ("compound-text");
2296 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system
,
2297 "Coding system for the next communication with other X clients.\n\
2298 Usually, `selection-coding-system' is used for communicating with\n\
2299 other X clients. But, if this variable is set, it is used for the\n\
2300 next communication only. After the communication, this variable is\n\
2302 Vnext_selection_coding_system
= Qnil
;
2304 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout
,
2305 "Number of milliseconds to wait for a selection reply.\n\
2306 If the selection owner doesn't reply in this time, we give up.\n\
2307 A value of 0 means wait as long as necessary. This is initialized from the\n\
2308 \"*selectionTimeout\" resource.");
2309 x_selection_timeout
= 0;
2311 QPRIMARY
= intern ("PRIMARY"); staticpro (&QPRIMARY
);
2312 QSECONDARY
= intern ("SECONDARY"); staticpro (&QSECONDARY
);
2313 QSTRING
= intern ("STRING"); staticpro (&QSTRING
);
2314 QINTEGER
= intern ("INTEGER"); staticpro (&QINTEGER
);
2315 QCLIPBOARD
= intern ("CLIPBOARD"); staticpro (&QCLIPBOARD
);
2316 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2317 QTEXT
= intern ("TEXT"); staticpro (&QTEXT
);
2318 QCOMPOUND_TEXT
= intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT
);
2319 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2320 QDELETE
= intern ("DELETE"); staticpro (&QDELETE
);
2321 QMULTIPLE
= intern ("MULTIPLE"); staticpro (&QMULTIPLE
);
2322 QINCR
= intern ("INCR"); staticpro (&QINCR
);
2323 QEMACS_TMP
= intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP
);
2324 QTARGETS
= intern ("TARGETS"); staticpro (&QTARGETS
);
2325 QATOM
= intern ("ATOM"); staticpro (&QATOM
);
2326 QATOM_PAIR
= intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR
);
2327 QNULL
= intern ("NULL"); staticpro (&QNULL
);
2329 #ifdef CUT_BUFFER_SUPPORT
2330 QCUT_BUFFER0
= intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0
);
2331 QCUT_BUFFER1
= intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1
);
2332 QCUT_BUFFER2
= intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2
);
2333 QCUT_BUFFER3
= intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3
);
2334 QCUT_BUFFER4
= intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4
);
2335 QCUT_BUFFER5
= intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5
);
2336 QCUT_BUFFER6
= intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6
);
2337 QCUT_BUFFER7
= intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7
);