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"
35 #define CUT_BUFFER_SUPPORT
37 Lisp_Object QPRIMARY
, QSECONDARY
, QSTRING
, QINTEGER
, QCLIPBOARD
, QTIMESTAMP
,
38 QTEXT
, QDELETE
, QMULTIPLE
, QINCR
, QEMACS_TMP
, QTARGETS
, QATOM
, QNULL
,
41 Lisp_Object QCOMPOUND_TEXT
; /* This is a type of selection. */
43 #ifdef CUT_BUFFER_SUPPORT
44 Lisp_Object QCUT_BUFFER0
, QCUT_BUFFER1
, QCUT_BUFFER2
, QCUT_BUFFER3
,
45 QCUT_BUFFER4
, QCUT_BUFFER5
, QCUT_BUFFER6
, QCUT_BUFFER7
;
48 static Lisp_Object Vx_lost_selection_hooks
;
49 static Lisp_Object Vx_sent_selection_hooks
;
50 /* Coding system for communicating with other X clients via cutbuffer,
51 selection, and clipboard. */
52 static Lisp_Object Vselection_coding_system
;
54 /* Coding system for the next communicating with other X clients. */
55 static Lisp_Object Vnext_selection_coding_system
;
57 /* If this is a smaller number than the max-request-size of the display,
58 emacs will use INCR selection transfer when the selection is larger
59 than this. The max-request-size is usually around 64k, so if you want
60 emacs to use incremental selection transfers when the selection is
61 smaller than that, set this. I added this mostly for debugging the
62 incremental transfer stuff, but it might improve server performance. */
63 #define MAX_SELECTION_QUANTUM 0xFFFFFF
66 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
68 #define SELECTION_QUANTUM(dpy) (((dpy)->max_request_size << 2) - 100)
71 /* The timestamp of the last input event Emacs received from the X server. */
72 /* Defined in keyboard.c. */
73 extern unsigned long last_event_timestamp
;
75 /* This is an association list whose elements are of the form
76 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
77 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
78 SELECTION-VALUE is the value that emacs owns for that selection.
79 It may be any kind of Lisp object.
80 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
81 as a cons of two 16-bit numbers (making a 32 bit time.)
82 FRAME is the frame for which we made the selection.
83 If there is an entry in this alist, then it can be assumed that Emacs owns
85 The only (eq) parts of this list that are visible from Lisp are the
87 static Lisp_Object Vselection_alist
;
89 /* This is an alist whose CARs are selection-types (whose names are the same
90 as the names of X Atoms) and whose CDRs are the names of Lisp functions to
91 call to convert the given Emacs selection value to a string representing
92 the given selection type. This is for Lisp-level extension of the emacs
93 selection handling. */
94 static Lisp_Object Vselection_converter_alist
;
96 /* If the selection owner takes too long to reply to a selection request,
97 we give up on it. This is in milliseconds (0 = no timeout.) */
98 static int x_selection_timeout
;
100 /* Utility functions */
102 static void lisp_data_to_selection_data ();
103 static Lisp_Object
selection_data_to_lisp_data ();
104 static Lisp_Object
x_get_window_property_as_lisp_data ();
106 /* This converts a Lisp symbol to a server Atom, avoiding a server
107 roundtrip whenever possible. */
110 symbol_to_x_atom (dpyinfo
, display
, sym
)
111 struct x_display_info
*dpyinfo
;
116 if (NILP (sym
)) return 0;
117 if (EQ (sym
, QPRIMARY
)) return XA_PRIMARY
;
118 if (EQ (sym
, QSECONDARY
)) return XA_SECONDARY
;
119 if (EQ (sym
, QSTRING
)) return XA_STRING
;
120 if (EQ (sym
, QINTEGER
)) return XA_INTEGER
;
121 if (EQ (sym
, QATOM
)) return XA_ATOM
;
122 if (EQ (sym
, QCLIPBOARD
)) return dpyinfo
->Xatom_CLIPBOARD
;
123 if (EQ (sym
, QTIMESTAMP
)) return dpyinfo
->Xatom_TIMESTAMP
;
124 if (EQ (sym
, QTEXT
)) return dpyinfo
->Xatom_TEXT
;
125 if (EQ (sym
, QCOMPOUND_TEXT
)) return dpyinfo
->Xatom_COMPOUND_TEXT
;
126 if (EQ (sym
, QDELETE
)) return dpyinfo
->Xatom_DELETE
;
127 if (EQ (sym
, QMULTIPLE
)) return dpyinfo
->Xatom_MULTIPLE
;
128 if (EQ (sym
, QINCR
)) return dpyinfo
->Xatom_INCR
;
129 if (EQ (sym
, QEMACS_TMP
)) return dpyinfo
->Xatom_EMACS_TMP
;
130 if (EQ (sym
, QTARGETS
)) return dpyinfo
->Xatom_TARGETS
;
131 if (EQ (sym
, QNULL
)) return dpyinfo
->Xatom_NULL
;
132 #ifdef CUT_BUFFER_SUPPORT
133 if (EQ (sym
, QCUT_BUFFER0
)) return XA_CUT_BUFFER0
;
134 if (EQ (sym
, QCUT_BUFFER1
)) return XA_CUT_BUFFER1
;
135 if (EQ (sym
, QCUT_BUFFER2
)) return XA_CUT_BUFFER2
;
136 if (EQ (sym
, QCUT_BUFFER3
)) return XA_CUT_BUFFER3
;
137 if (EQ (sym
, QCUT_BUFFER4
)) return XA_CUT_BUFFER4
;
138 if (EQ (sym
, QCUT_BUFFER5
)) return XA_CUT_BUFFER5
;
139 if (EQ (sym
, QCUT_BUFFER6
)) return XA_CUT_BUFFER6
;
140 if (EQ (sym
, QCUT_BUFFER7
)) return XA_CUT_BUFFER7
;
142 if (!SYMBOLP (sym
)) abort ();
145 fprintf (stderr
, " XInternAtom %s\n", (char *) XSYMBOL (sym
)->name
->data
);
148 val
= XInternAtom (display
, (char *) XSYMBOL (sym
)->name
->data
, False
);
154 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
155 and calls to intern whenever possible. */
158 x_atom_to_symbol (dpyinfo
, display
, atom
)
159 struct x_display_info
*dpyinfo
;
165 if (! atom
) return Qnil
;
178 #ifdef CUT_BUFFER_SUPPORT
198 if (atom
== dpyinfo
->Xatom_CLIPBOARD
)
200 if (atom
== dpyinfo
->Xatom_TIMESTAMP
)
202 if (atom
== dpyinfo
->Xatom_TEXT
)
204 if (atom
== dpyinfo
->Xatom_COMPOUND_TEXT
)
205 return QCOMPOUND_TEXT
;
206 if (atom
== dpyinfo
->Xatom_DELETE
)
208 if (atom
== dpyinfo
->Xatom_MULTIPLE
)
210 if (atom
== dpyinfo
->Xatom_INCR
)
212 if (atom
== dpyinfo
->Xatom_EMACS_TMP
)
214 if (atom
== dpyinfo
->Xatom_TARGETS
)
216 if (atom
== dpyinfo
->Xatom_NULL
)
220 str
= XGetAtomName (display
, atom
);
223 fprintf (stderr
, " XGetAtomName --> %s\n", str
);
225 if (! str
) return Qnil
;
228 /* This was allocated by Xlib, so use XFree. */
234 /* Do protocol to assert ourself as a selection owner.
235 Update the Vselection_alist so that we can reply to later requests for
239 x_own_selection (selection_name
, selection_value
)
240 Lisp_Object selection_name
, selection_value
;
242 struct frame
*sf
= SELECTED_FRAME ();
243 Window selecting_window
= FRAME_X_WINDOW (sf
);
244 Display
*display
= FRAME_X_DISPLAY (sf
);
245 Time time
= last_event_timestamp
;
247 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
250 CHECK_SYMBOL (selection_name
, 0);
251 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_name
);
254 count
= x_catch_errors (display
);
255 XSetSelectionOwner (display
, selection_atom
, selecting_window
, time
);
256 x_check_errors (display
, "Can't set selection: %s");
257 x_uncatch_errors (display
, count
);
260 /* Now update the local cache */
262 Lisp_Object selection_time
;
263 Lisp_Object selection_data
;
264 Lisp_Object prev_value
;
266 selection_time
= long_to_cons ((unsigned long) time
);
267 selection_data
= Fcons (selection_name
,
268 Fcons (selection_value
,
269 Fcons (selection_time
,
270 Fcons (selected_frame
, Qnil
))));
271 prev_value
= assq_no_quit (selection_name
, Vselection_alist
);
273 Vselection_alist
= Fcons (selection_data
, Vselection_alist
);
275 /* If we already owned the selection, remove the old selection data.
276 Perhaps we should destructively modify it instead.
277 Don't use Fdelq as that may QUIT. */
278 if (!NILP (prev_value
))
280 Lisp_Object rest
; /* we know it's not the CAR, so it's easy. */
281 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
282 if (EQ (prev_value
, Fcar (XCDR (rest
))))
284 XCDR (rest
) = Fcdr (XCDR (rest
));
291 /* Given a selection-name and desired type, look up our local copy of
292 the selection value and convert it to the type.
293 The value is nil or a string.
294 This function is used both for remote requests
295 and for local x-get-selection-internal.
297 This calls random Lisp code, and may signal or gc. */
300 x_get_local_selection (selection_symbol
, target_type
)
301 Lisp_Object selection_symbol
, target_type
;
303 Lisp_Object local_value
;
304 Lisp_Object handler_fn
, value
, type
, check
;
307 local_value
= assq_no_quit (selection_symbol
, Vselection_alist
);
309 if (NILP (local_value
)) return Qnil
;
311 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
312 if (EQ (target_type
, QTIMESTAMP
))
315 value
= XCAR (XCDR (XCDR (local_value
)));
318 else if (EQ (target_type
, QDELETE
))
321 Fx_disown_selection_internal
323 XCAR (XCDR (XCDR (local_value
))));
328 #if 0 /* #### MULTIPLE doesn't work yet */
329 else if (CONSP (target_type
)
330 && XCAR (target_type
) == QMULTIPLE
)
335 pairs
= XCDR (target_type
);
336 size
= XVECTOR (pairs
)->size
;
337 /* If the target is MULTIPLE, then target_type looks like
338 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
339 We modify the second element of each pair in the vector and
340 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
342 for (i
= 0; i
< size
; i
++)
345 pair
= XVECTOR (pairs
)->contents
[i
];
346 XVECTOR (pair
)->contents
[1]
347 = x_get_local_selection (XVECTOR (pair
)->contents
[0],
348 XVECTOR (pair
)->contents
[1]);
355 /* Don't allow a quit within the converter.
356 When the user types C-g, he would be surprised
357 if by luck it came during a converter. */
358 count
= specpdl_ptr
- specpdl
;
359 specbind (Qinhibit_quit
, Qt
);
361 CHECK_SYMBOL (target_type
, 0);
362 handler_fn
= Fcdr (Fassq (target_type
, Vselection_converter_alist
));
363 if (!NILP (handler_fn
))
364 value
= call3 (handler_fn
,
365 selection_symbol
, target_type
,
366 XCAR (XCDR (local_value
)));
369 unbind_to (count
, Qnil
);
372 /* Make sure this value is of a type that we could transmit
373 to another X client. */
377 && SYMBOLP (XCAR (value
)))
379 check
= XCDR (value
);
387 /* Check for a value that cons_to_long could handle. */
388 else if (CONSP (check
)
389 && INTEGERP (XCAR (check
))
390 && (INTEGERP (XCDR (check
))
392 (CONSP (XCDR (check
))
393 && INTEGERP (XCAR (XCDR (check
)))
394 && NILP (XCDR (XCDR (check
))))))
399 Fcons (build_string ("invalid data returned by selection-conversion function"),
400 Fcons (handler_fn
, Fcons (value
, Qnil
))));
403 /* Subroutines of x_reply_selection_request. */
405 /* Send a SelectionNotify event to the requestor with property=None,
406 meaning we were unable to do what they wanted. */
409 x_decline_selection_request (event
)
410 struct input_event
*event
;
412 XSelectionEvent reply
;
413 reply
.type
= SelectionNotify
;
414 reply
.display
= SELECTION_EVENT_DISPLAY (event
);
415 reply
.requestor
= SELECTION_EVENT_REQUESTOR (event
);
416 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
417 reply
.time
= SELECTION_EVENT_TIME (event
);
418 reply
.target
= SELECTION_EVENT_TARGET (event
);
419 reply
.property
= None
;
422 XSendEvent (reply
.display
, reply
.requestor
, False
, 0L,
424 XFlush (reply
.display
);
428 /* This is the selection request currently being processed.
429 It is set to zero when the request is fully processed. */
430 static struct input_event
*x_selection_current_request
;
432 /* Used as an unwind-protect clause so that, if a selection-converter signals
433 an error, we tell the requester that we were unable to do what they wanted
434 before we throw to top-level or go into the debugger or whatever. */
437 x_selection_request_lisp_error (ignore
)
440 if (x_selection_current_request
!= 0)
441 x_decline_selection_request (x_selection_current_request
);
446 /* This stuff is so that INCR selections are reentrant (that is, so we can
447 be servicing multiple INCR selection requests simultaneously.) I haven't
448 actually tested that yet. */
450 /* Keep a list of the property changes that are awaited. */
460 struct prop_location
*next
;
463 static struct prop_location
*expect_property_change ();
464 static void wait_for_property_change ();
465 static void unexpect_property_change ();
466 static int waiting_for_other_props_on_window ();
468 static int prop_location_identifier
;
470 static Lisp_Object property_change_reply
;
472 static struct prop_location
*property_change_reply_object
;
474 static struct prop_location
*property_change_wait_list
;
477 queue_selection_requests_unwind (frame
)
480 FRAME_PTR f
= XFRAME (frame
);
483 x_stop_queuing_selection_requests (FRAME_X_DISPLAY (f
));
487 /* Return some frame whose display info is DPYINFO.
488 Return nil if there is none. */
491 some_frame_on_display (dpyinfo
)
492 struct x_display_info
*dpyinfo
;
494 Lisp_Object list
, frame
;
496 FOR_EACH_FRAME (list
, frame
)
498 if (FRAME_X_DISPLAY_INFO (XFRAME (frame
)) == dpyinfo
)
505 /* Send the reply to a selection request event EVENT.
506 TYPE is the type of selection data requested.
507 DATA and SIZE describe the data to send, already converted.
508 FORMAT is the unit-size (in bits) of the data to be transmitted. */
511 x_reply_selection_request (event
, format
, data
, size
, type
)
512 struct input_event
*event
;
517 XSelectionEvent reply
;
518 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
519 Window window
= SELECTION_EVENT_REQUESTOR (event
);
521 int format_bytes
= format
/8;
522 int max_bytes
= SELECTION_QUANTUM (display
);
523 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
526 if (max_bytes
> MAX_SELECTION_QUANTUM
)
527 max_bytes
= MAX_SELECTION_QUANTUM
;
529 reply
.type
= SelectionNotify
;
530 reply
.display
= display
;
531 reply
.requestor
= window
;
532 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
533 reply
.time
= SELECTION_EVENT_TIME (event
);
534 reply
.target
= SELECTION_EVENT_TARGET (event
);
535 reply
.property
= SELECTION_EVENT_PROPERTY (event
);
536 if (reply
.property
== None
)
537 reply
.property
= reply
.target
;
539 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
541 count
= x_catch_errors (display
);
543 /* Store the data on the requested property.
544 If the selection is large, only store the first N bytes of it.
546 bytes_remaining
= size
* format_bytes
;
547 if (bytes_remaining
<= max_bytes
)
549 /* Send all the data at once, with minimal handshaking. */
551 fprintf (stderr
,"\nStoring all %d\n", bytes_remaining
);
553 XChangeProperty (display
, window
, reply
.property
, type
, format
,
554 PropModeReplace
, data
, size
);
555 /* At this point, the selection was successfully stored; ack it. */
556 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
560 /* Send an INCR selection. */
561 struct prop_location
*wait_object
;
565 frame
= some_frame_on_display (dpyinfo
);
567 /* If the display no longer has frames, we can't expect
568 to get many more selection requests from it, so don't
569 bother trying to queue them. */
572 x_start_queuing_selection_requests (display
);
574 record_unwind_protect (queue_selection_requests_unwind
,
578 if (x_window_to_frame (dpyinfo
, window
)) /* #### debug */
579 error ("Attempt to transfer an INCR to ourself!");
581 fprintf (stderr
, "\nINCR %d\n", bytes_remaining
);
583 wait_object
= expect_property_change (display
, window
, reply
.property
,
586 XChangeProperty (display
, window
, reply
.property
, dpyinfo
->Xatom_INCR
,
588 (unsigned char *) &bytes_remaining
, 1);
589 XSelectInput (display
, window
, PropertyChangeMask
);
590 /* Tell 'em the INCR data is there... */
591 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
594 had_errors
= x_had_errors_p (display
);
597 /* First, wait for the requester to ack by deleting the property.
598 This can run random lisp code (process handlers) or signal. */
600 wait_for_property_change (wait_object
);
602 while (bytes_remaining
)
604 int i
= ((bytes_remaining
< max_bytes
)
611 = expect_property_change (display
, window
, reply
.property
,
614 fprintf (stderr
," INCR adding %d\n", i
);
616 /* Append the next chunk of data to the property. */
617 XChangeProperty (display
, window
, reply
.property
, type
, format
,
618 PropModeAppend
, data
, i
/ format_bytes
);
619 bytes_remaining
-= i
;
622 had_errors
= x_had_errors_p (display
);
628 /* Now wait for the requester to ack this chunk by deleting the
629 property. This can run random lisp code or signal.
631 wait_for_property_change (wait_object
);
633 /* Now write a zero-length chunk to the property to tell the requester
636 fprintf (stderr
," INCR done\n");
639 if (! waiting_for_other_props_on_window (display
, window
))
640 XSelectInput (display
, window
, 0L);
642 XChangeProperty (display
, window
, reply
.property
, type
, format
,
643 PropModeReplace
, data
, 0);
647 x_uncatch_errors (display
, count
);
651 /* Handle a SelectionRequest event EVENT.
652 This is called from keyboard.c when such an event is found in the queue. */
655 x_handle_selection_request (event
)
656 struct input_event
*event
;
658 struct gcpro gcpro1
, gcpro2
, gcpro3
;
659 Lisp_Object local_selection_data
;
660 Lisp_Object selection_symbol
;
661 Lisp_Object target_symbol
;
662 Lisp_Object converted_selection
;
663 Time local_selection_time
;
664 Lisp_Object successful_p
;
666 struct x_display_info
*dpyinfo
667 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event
));
669 local_selection_data
= Qnil
;
670 target_symbol
= Qnil
;
671 converted_selection
= Qnil
;
674 GCPRO3 (local_selection_data
, converted_selection
, target_symbol
);
676 selection_symbol
= x_atom_to_symbol (dpyinfo
,
677 SELECTION_EVENT_DISPLAY (event
),
678 SELECTION_EVENT_SELECTION (event
));
680 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
682 if (NILP (local_selection_data
))
684 /* Someone asked for the selection, but we don't have it any more.
686 x_decline_selection_request (event
);
690 local_selection_time
= (Time
)
691 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
693 if (SELECTION_EVENT_TIME (event
) != CurrentTime
694 && local_selection_time
> SELECTION_EVENT_TIME (event
))
696 /* Someone asked for the selection, and we have one, but not the one
699 x_decline_selection_request (event
);
703 count
= specpdl_ptr
- specpdl
;
704 x_selection_current_request
= event
;
705 record_unwind_protect (x_selection_request_lisp_error
, Qnil
);
707 target_symbol
= x_atom_to_symbol (dpyinfo
, SELECTION_EVENT_DISPLAY (event
),
708 SELECTION_EVENT_TARGET (event
));
710 #if 0 /* #### MULTIPLE doesn't work yet */
711 if (EQ (target_symbol
, QMULTIPLE
))
712 target_symbol
= fetch_multiple_target (event
);
715 /* Convert lisp objects back into binary data */
718 = x_get_local_selection (selection_symbol
, target_symbol
);
720 if (! NILP (converted_selection
))
728 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event
),
730 &data
, &type
, &size
, &format
, &nofree
);
732 x_reply_selection_request (event
, format
, data
, size
, type
);
735 /* Indicate we have successfully processed this event. */
736 x_selection_current_request
= 0;
738 /* Use xfree, not XFree, because lisp_data_to_selection_data
739 calls xmalloc itself. */
743 unbind_to (count
, Qnil
);
749 /* Let random lisp code notice that the selection has been asked for. */
752 rest
= Vx_sent_selection_hooks
;
753 if (!EQ (rest
, Qunbound
))
754 for (; CONSP (rest
); rest
= Fcdr (rest
))
755 call3 (Fcar (rest
), selection_symbol
, target_symbol
, successful_p
);
759 /* Handle a SelectionClear event EVENT, which indicates that some
760 client cleared out our previously asserted selection.
761 This is called from keyboard.c when such an event is found in the queue. */
764 x_handle_selection_clear (event
)
765 struct input_event
*event
;
767 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
768 Atom selection
= SELECTION_EVENT_SELECTION (event
);
769 Time changed_owner_time
= SELECTION_EVENT_TIME (event
);
771 Lisp_Object selection_symbol
, local_selection_data
;
772 Time local_selection_time
;
773 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
774 struct x_display_info
*t_dpyinfo
;
776 /* If the new selection owner is also Emacs,
777 don't clear the new selection. */
779 /* Check each display on the same terminal,
780 to see if this Emacs job now owns the selection
781 through that display. */
782 for (t_dpyinfo
= x_display_list
; t_dpyinfo
; t_dpyinfo
= t_dpyinfo
->next
)
783 if (t_dpyinfo
->kboard
== dpyinfo
->kboard
)
786 = XGetSelectionOwner (t_dpyinfo
->display
, selection
);
787 if (x_window_to_frame (t_dpyinfo
, owner_window
) != 0)
795 selection_symbol
= x_atom_to_symbol (dpyinfo
, display
, selection
);
797 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
799 /* Well, we already believe that we don't own it, so that's just fine. */
800 if (NILP (local_selection_data
)) return;
802 local_selection_time
= (Time
)
803 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
805 /* This SelectionClear is for a selection that we no longer own, so we can
806 disregard it. (That is, we have reasserted the selection since this
807 request was generated.) */
809 if (changed_owner_time
!= CurrentTime
810 && local_selection_time
> changed_owner_time
)
813 /* Otherwise, we're really honest and truly being told to drop it.
814 Don't use Fdelq as that may QUIT;. */
816 if (EQ (local_selection_data
, Fcar (Vselection_alist
)))
817 Vselection_alist
= Fcdr (Vselection_alist
);
821 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
822 if (EQ (local_selection_data
, Fcar (XCDR (rest
))))
824 XCDR (rest
) = Fcdr (XCDR (rest
));
829 /* Let random lisp code notice that the selection has been stolen. */
833 rest
= Vx_lost_selection_hooks
;
834 if (!EQ (rest
, Qunbound
))
836 for (; CONSP (rest
); rest
= Fcdr (rest
))
837 call1 (Fcar (rest
), selection_symbol
);
838 prepare_menu_bars ();
839 redisplay_preserve_echo_area ();
844 /* Clear all selections that were made from frame F.
845 We do this when about to delete a frame. */
848 x_clear_frame_selections (f
)
854 XSETFRAME (frame
, f
);
856 /* Otherwise, we're really honest and truly being told to drop it.
857 Don't use Fdelq as that may QUIT;. */
859 /* Delete elements from the beginning of Vselection_alist. */
860 while (!NILP (Vselection_alist
)
861 && EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist
)))))))
863 /* Let random Lisp code notice that the selection has been stolen. */
864 Lisp_Object hooks
, selection_symbol
;
866 hooks
= Vx_lost_selection_hooks
;
867 selection_symbol
= Fcar (Fcar (Vselection_alist
));
869 if (!EQ (hooks
, Qunbound
))
871 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
872 call1 (Fcar (hooks
), selection_symbol
);
873 #if 0 /* This can crash when deleting a frame
874 from x_connection_closed. Anyway, it seems unnecessary;
875 something else should cause a redisplay. */
876 redisplay_preserve_echo_area ();
880 Vselection_alist
= Fcdr (Vselection_alist
);
883 /* Delete elements after the beginning of Vselection_alist. */
884 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
885 if (EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest
))))))))
887 /* Let random Lisp code notice that the selection has been stolen. */
888 Lisp_Object hooks
, selection_symbol
;
890 hooks
= Vx_lost_selection_hooks
;
891 selection_symbol
= Fcar (Fcar (XCDR (rest
)));
893 if (!EQ (hooks
, Qunbound
))
895 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
896 call1 (Fcar (hooks
), selection_symbol
);
897 #if 0 /* See above */
898 redisplay_preserve_echo_area ();
901 XCDR (rest
) = Fcdr (XCDR (rest
));
906 /* Nonzero if any properties for DISPLAY and WINDOW
907 are on the list of what we are waiting for. */
910 waiting_for_other_props_on_window (display
, window
)
914 struct prop_location
*rest
= property_change_wait_list
;
916 if (rest
->display
== display
&& rest
->window
== window
)
923 /* Add an entry to the list of property changes we are waiting for.
924 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
925 The return value is a number that uniquely identifies
926 this awaited property change. */
928 static struct prop_location
*
929 expect_property_change (display
, window
, property
, state
)
935 struct prop_location
*pl
936 = (struct prop_location
*) xmalloc (sizeof (struct prop_location
));
937 pl
->identifier
= ++prop_location_identifier
;
938 pl
->display
= display
;
940 pl
->property
= property
;
941 pl
->desired_state
= state
;
942 pl
->next
= property_change_wait_list
;
944 property_change_wait_list
= pl
;
948 /* Delete an entry from the list of property changes we are waiting for.
949 IDENTIFIER is the number that uniquely identifies the entry. */
952 unexpect_property_change (location
)
953 struct prop_location
*location
;
955 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
958 if (rest
== location
)
961 prev
->next
= rest
->next
;
963 property_change_wait_list
= rest
->next
;
972 /* Remove the property change expectation element for IDENTIFIER. */
975 wait_for_property_change_unwind (identifierval
)
976 Lisp_Object identifierval
;
978 unexpect_property_change ((struct prop_location
*)
979 (XFASTINT (XCAR (identifierval
)) << 16
980 | XFASTINT (XCDR (identifierval
))));
984 /* Actually wait for a property change.
985 IDENTIFIER should be the value that expect_property_change returned. */
988 wait_for_property_change (location
)
989 struct prop_location
*location
;
992 int count
= specpdl_ptr
- specpdl
;
995 tem
= Fcons (Qnil
, Qnil
);
996 XSETFASTINT (XCAR (tem
), (EMACS_UINT
)location
>> 16);
997 XSETFASTINT (XCDR (tem
), (EMACS_UINT
)location
& 0xffff);
999 /* Make sure to do unexpect_property_change if we quit or err. */
1000 record_unwind_protect (wait_for_property_change_unwind
, tem
);
1002 XCAR (property_change_reply
) = Qnil
;
1004 property_change_reply_object
= location
;
1005 /* If the event we are waiting for arrives beyond here, it will set
1006 property_change_reply, because property_change_reply_object says so. */
1007 if (! location
->arrived
)
1009 secs
= x_selection_timeout
/ 1000;
1010 usecs
= (x_selection_timeout
% 1000) * 1000;
1011 wait_reading_process_input (secs
, usecs
, property_change_reply
, 0);
1013 if (NILP (XCAR (property_change_reply
)))
1014 error ("Timed out waiting for property-notify event");
1017 unbind_to (count
, Qnil
);
1020 /* Called from XTread_socket in response to a PropertyNotify event. */
1023 x_handle_property_notify (event
)
1024 XPropertyEvent
*event
;
1026 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1029 if (rest
->property
== event
->atom
1030 && rest
->window
== event
->window
1031 && rest
->display
== event
->display
1032 && rest
->desired_state
== event
->state
)
1035 fprintf (stderr
, "Saw expected prop-%s on %s\n",
1036 (event
->state
== PropertyDelete
? "delete" : "change"),
1037 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo
, event
->display
,
1044 /* If this is the one wait_for_property_change is waiting for,
1045 tell it to wake up. */
1046 if (rest
== property_change_reply_object
)
1047 XCAR (property_change_reply
) = Qt
;
1050 prev
->next
= rest
->next
;
1052 property_change_wait_list
= rest
->next
;
1060 fprintf (stderr
, "Saw UNexpected prop-%s on %s\n",
1061 (event
->state
== PropertyDelete
? "delete" : "change"),
1062 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo
,
1063 event
->display
, event
->atom
))
1070 #if 0 /* #### MULTIPLE doesn't work yet */
1073 fetch_multiple_target (event
)
1074 XSelectionRequestEvent
*event
;
1076 Display
*display
= event
->display
;
1077 Window window
= event
->requestor
;
1078 Atom target
= event
->target
;
1079 Atom selection_atom
= event
->selection
;
1084 x_get_window_property_as_lisp_data (display
, window
, target
,
1085 QMULTIPLE
, selection_atom
));
1089 copy_multiple_data (obj
)
1096 return Fcons (XCAR (obj
), copy_multiple_data (XCDR (obj
)));
1098 CHECK_VECTOR (obj
, 0);
1099 vec
= Fmake_vector (size
= XVECTOR (obj
)->size
, Qnil
);
1100 for (i
= 0; i
< size
; i
++)
1102 Lisp_Object vec2
= XVECTOR (obj
)->contents
[i
];
1103 CHECK_VECTOR (vec2
, 0);
1104 if (XVECTOR (vec2
)->size
!= 2)
1105 /* ??? Confusing error message */
1106 Fsignal (Qerror
, Fcons (build_string ("vectors must be of length 2"),
1107 Fcons (vec2
, Qnil
)));
1108 XVECTOR (vec
)->contents
[i
] = Fmake_vector (2, Qnil
);
1109 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[0]
1110 = XVECTOR (vec2
)->contents
[0];
1111 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[1]
1112 = XVECTOR (vec2
)->contents
[1];
1120 /* Variables for communication with x_handle_selection_notify. */
1121 static Atom reading_which_selection
;
1122 static Lisp_Object reading_selection_reply
;
1123 static Window reading_selection_window
;
1125 /* Do protocol to read selection-data from the server.
1126 Converts this to Lisp data and returns it. */
1129 x_get_foreign_selection (selection_symbol
, target_type
)
1130 Lisp_Object selection_symbol
, target_type
;
1132 struct frame
*sf
= SELECTED_FRAME ();
1133 Window requestor_window
= FRAME_X_WINDOW (sf
);
1134 Display
*display
= FRAME_X_DISPLAY (sf
);
1135 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1136 Time requestor_time
= last_event_timestamp
;
1137 Atom target_property
= dpyinfo
->Xatom_EMACS_TMP
;
1138 Atom selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_symbol
);
1144 if (CONSP (target_type
))
1145 type_atom
= symbol_to_x_atom (dpyinfo
, display
, XCAR (target_type
));
1147 type_atom
= symbol_to_x_atom (dpyinfo
, display
, target_type
);
1150 count
= x_catch_errors (display
);
1151 XConvertSelection (display
, selection_atom
, type_atom
, target_property
,
1152 requestor_window
, requestor_time
);
1155 /* Prepare to block until the reply has been read. */
1156 reading_selection_window
= requestor_window
;
1157 reading_which_selection
= selection_atom
;
1158 XCAR (reading_selection_reply
) = Qnil
;
1160 frame
= some_frame_on_display (dpyinfo
);
1162 /* If the display no longer has frames, we can't expect
1163 to get many more selection requests from it, so don't
1164 bother trying to queue them. */
1167 x_start_queuing_selection_requests (display
);
1169 record_unwind_protect (queue_selection_requests_unwind
,
1174 /* This allows quits. Also, don't wait forever. */
1175 secs
= x_selection_timeout
/ 1000;
1176 usecs
= (x_selection_timeout
% 1000) * 1000;
1177 wait_reading_process_input (secs
, usecs
, reading_selection_reply
, 0);
1180 x_check_errors (display
, "Cannot get selection: %s");
1181 x_uncatch_errors (display
, count
);
1184 if (NILP (XCAR (reading_selection_reply
)))
1185 error ("Timed out waiting for reply from selection owner");
1186 if (EQ (XCAR (reading_selection_reply
), Qlambda
))
1187 error ("No `%s' selection", XSYMBOL (selection_symbol
)->name
->data
);
1189 /* Otherwise, the selection is waiting for us on the requested property. */
1191 x_get_window_property_as_lisp_data (display
, requestor_window
,
1192 target_property
, target_type
,
1196 /* Subroutines of x_get_window_property_as_lisp_data */
1198 /* Use xfree, not XFree, to free the data obtained with this function. */
1201 x_get_window_property (display
, window
, property
, data_ret
, bytes_ret
,
1202 actual_type_ret
, actual_format_ret
, actual_size_ret
,
1207 unsigned char **data_ret
;
1209 Atom
*actual_type_ret
;
1210 int *actual_format_ret
;
1211 unsigned long *actual_size_ret
;
1215 unsigned long bytes_remaining
;
1217 unsigned char *tmp_data
= 0;
1219 int buffer_size
= SELECTION_QUANTUM (display
);
1220 if (buffer_size
> MAX_SELECTION_QUANTUM
) buffer_size
= MAX_SELECTION_QUANTUM
;
1223 /* First probe the thing to find out how big it is. */
1224 result
= XGetWindowProperty (display
, window
, property
,
1225 0L, 0L, False
, AnyPropertyType
,
1226 actual_type_ret
, actual_format_ret
,
1228 &bytes_remaining
, &tmp_data
);
1229 if (result
!= Success
)
1236 /* This was allocated by Xlib, so use XFree. */
1237 XFree ((char *) tmp_data
);
1239 if (*actual_type_ret
== None
|| *actual_format_ret
== 0)
1245 total_size
= bytes_remaining
+ 1;
1246 *data_ret
= (unsigned char *) xmalloc (total_size
);
1248 /* Now read, until we've gotten it all. */
1249 while (bytes_remaining
)
1252 int last
= bytes_remaining
;
1255 = XGetWindowProperty (display
, window
, property
,
1256 (long)offset
/4, (long)buffer_size
/4,
1259 actual_type_ret
, actual_format_ret
,
1260 actual_size_ret
, &bytes_remaining
, &tmp_data
);
1262 fprintf (stderr
, "<< read %d\n", last
-bytes_remaining
);
1264 /* If this doesn't return Success at this point, it means that
1265 some clod deleted the selection while we were in the midst of
1266 reading it. Deal with that, I guess....
1268 if (result
!= Success
) break;
1269 *actual_size_ret
*= *actual_format_ret
/ 8;
1270 bcopy (tmp_data
, (*data_ret
) + offset
, *actual_size_ret
);
1271 offset
+= *actual_size_ret
;
1272 /* This was allocated by Xlib, so use XFree. */
1273 XFree ((char *) tmp_data
);
1278 *bytes_ret
= offset
;
1281 /* Use xfree, not XFree, to free the data obtained with this function. */
1284 receive_incremental_selection (display
, window
, property
, target_type
,
1285 min_size_bytes
, data_ret
, size_bytes_ret
,
1286 type_ret
, format_ret
, size_ret
)
1290 Lisp_Object target_type
; /* for error messages only */
1291 unsigned int min_size_bytes
;
1292 unsigned char **data_ret
;
1293 int *size_bytes_ret
;
1295 unsigned long *size_ret
;
1299 struct prop_location
*wait_object
;
1300 *size_bytes_ret
= min_size_bytes
;
1301 *data_ret
= (unsigned char *) xmalloc (*size_bytes_ret
);
1303 fprintf (stderr
, "\nread INCR %d\n", min_size_bytes
);
1306 /* At this point, we have read an INCR property.
1307 Delete the property to ack it.
1308 (But first, prepare to receive the next event in this handshake.)
1310 Now, we must loop, waiting for the sending window to put a value on
1311 that property, then reading the property, then deleting it to ack.
1312 We are done when the sender places a property of length 0.
1315 XSelectInput (display
, window
, STANDARD_EVENT_SET
| PropertyChangeMask
);
1316 XDeleteProperty (display
, window
, property
);
1317 wait_object
= expect_property_change (display
, window
, property
,
1324 unsigned char *tmp_data
;
1326 wait_for_property_change (wait_object
);
1327 /* expect it again immediately, because x_get_window_property may
1328 .. no it won't, I don't get it.
1329 .. Ok, I get it now, the Xt code that implements INCR is broken.
1331 x_get_window_property (display
, window
, property
,
1332 &tmp_data
, &tmp_size_bytes
,
1333 type_ret
, format_ret
, size_ret
, 1);
1335 if (tmp_size_bytes
== 0) /* we're done */
1338 fprintf (stderr
, " read INCR done\n");
1340 if (! waiting_for_other_props_on_window (display
, window
))
1341 XSelectInput (display
, window
, STANDARD_EVENT_SET
);
1342 unexpect_property_change (wait_object
);
1343 /* Use xfree, not XFree, because x_get_window_property
1344 calls xmalloc itself. */
1345 if (tmp_data
) xfree (tmp_data
);
1350 XDeleteProperty (display
, window
, property
);
1351 wait_object
= expect_property_change (display
, window
, property
,
1357 fprintf (stderr
, " read INCR %d\n", tmp_size_bytes
);
1359 if (*size_bytes_ret
< offset
+ tmp_size_bytes
)
1362 fprintf (stderr
, " read INCR realloc %d -> %d\n",
1363 *size_bytes_ret
, offset
+ tmp_size_bytes
);
1365 *size_bytes_ret
= offset
+ tmp_size_bytes
;
1366 *data_ret
= (unsigned char *) xrealloc (*data_ret
, *size_bytes_ret
);
1368 bcopy (tmp_data
, (*data_ret
) + offset
, tmp_size_bytes
);
1369 offset
+= tmp_size_bytes
;
1370 /* Use xfree, not XFree, because x_get_window_property
1371 calls xmalloc itself. */
1376 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1377 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1378 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1381 x_get_window_property_as_lisp_data (display
, window
, property
, target_type
,
1386 Lisp_Object target_type
; /* for error messages only */
1387 Atom selection_atom
; /* for error messages only */
1391 unsigned long actual_size
;
1392 unsigned char *data
= 0;
1395 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1397 x_get_window_property (display
, window
, property
, &data
, &bytes
,
1398 &actual_type
, &actual_format
, &actual_size
, 1);
1401 int there_is_a_selection_owner
;
1403 there_is_a_selection_owner
1404 = XGetSelectionOwner (display
, selection_atom
);
1407 there_is_a_selection_owner
1408 ? Fcons (build_string ("selection owner couldn't convert"),
1410 ? Fcons (target_type
,
1411 Fcons (x_atom_to_symbol (dpyinfo
, display
,
1414 : Fcons (target_type
, Qnil
))
1415 : Fcons (build_string ("no selection"),
1416 Fcons (x_atom_to_symbol (dpyinfo
, display
,
1421 if (actual_type
== dpyinfo
->Xatom_INCR
)
1423 /* That wasn't really the data, just the beginning. */
1425 unsigned int min_size_bytes
= * ((unsigned int *) data
);
1427 /* Use xfree, not XFree, because x_get_window_property
1428 calls xmalloc itself. */
1429 xfree ((char *) data
);
1431 receive_incremental_selection (display
, window
, property
, target_type
,
1432 min_size_bytes
, &data
, &bytes
,
1433 &actual_type
, &actual_format
,
1438 XDeleteProperty (display
, window
, property
);
1442 /* It's been read. Now convert it to a lisp object in some semi-rational
1444 val
= selection_data_to_lisp_data (display
, data
, bytes
,
1445 actual_type
, actual_format
);
1447 /* Use xfree, not XFree, because x_get_window_property
1448 calls xmalloc itself. */
1449 xfree ((char *) data
);
1453 /* These functions convert from the selection data read from the server into
1454 something that we can use from Lisp, and vice versa.
1456 Type: Format: Size: Lisp Type:
1457 ----- ------- ----- -----------
1460 ATOM 32 > 1 Vector of Symbols
1462 * 16 > 1 Vector of Integers
1463 * 32 1 if <=16 bits: Integer
1464 if > 16 bits: Cons of top16, bot16
1465 * 32 > 1 Vector of the above
1467 When converting a Lisp number to C, it is assumed to be of format 16 if
1468 it is an integer, and of format 32 if it is a cons of two integers.
1470 When converting a vector of numbers from Lisp to C, it is assumed to be
1471 of format 16 if every element in the vector is an integer, and is assumed
1472 to be of format 32 if any element is a cons of two integers.
1474 When converting an object to C, it may be of the form (SYMBOL . <data>)
1475 where SYMBOL is what we should claim that the type is. Format and
1476 representation are as above. */
1481 selection_data_to_lisp_data (display
, data
, size
, type
, format
)
1483 unsigned char *data
;
1487 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1489 if (type
== dpyinfo
->Xatom_NULL
)
1492 /* Convert any 8-bit data to a string, for compactness. */
1493 else if (format
== 8)
1496 int require_encoding
= 0;
1502 ! NILP (buffer_defaults
.enable_multibyte_characters
)
1506 /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode
1507 DATA to Emacs internal format because DATA may be encoded
1508 in compound text format. In addtion, if TYPE is `STRING'
1509 and DATA contains any 8-bit Latin-1 code, we should also
1511 if (type
== dpyinfo
->Xatom_TEXT
1512 || type
== dpyinfo
->Xatom_COMPOUND_TEXT
)
1513 require_encoding
= 1;
1514 else if (type
== XA_STRING
)
1517 for (i
= 0; i
< size
; i
++)
1519 if (data
[i
] >= 0x80)
1521 require_encoding
= 1;
1527 if (!require_encoding
)
1529 str
= make_unibyte_string ((char *) data
, size
);
1530 Vlast_coding_system_used
= Qraw_text
;
1536 struct coding_system coding
;
1538 if (NILP (Vnext_selection_coding_system
))
1539 Vnext_selection_coding_system
= Vselection_coding_system
;
1541 (Fcheck_coding_system(Vnext_selection_coding_system
), &coding
);
1542 Vnext_selection_coding_system
= Qnil
;
1543 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1544 bufsize
= decoding_buffer_size (&coding
, size
);
1545 buf
= (unsigned char *) xmalloc (bufsize
);
1546 decode_coding (&coding
, data
, buf
, size
, bufsize
);
1547 size
= (coding
.fake_multibyte
1548 ? multibyte_chars_in_text (buf
, coding
.produced
)
1549 : coding
.produced_char
);
1550 str
= make_string_from_bytes ((char *) buf
, size
, coding
.produced
);
1552 Vlast_coding_system_used
= coding
.symbol
;
1556 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1557 a vector of symbols.
1559 else if (type
== XA_ATOM
)
1562 if (size
== sizeof (Atom
))
1563 return x_atom_to_symbol (dpyinfo
, display
, *((Atom
*) data
));
1566 Lisp_Object v
= Fmake_vector (make_number (size
/ sizeof (Atom
)),
1568 for (i
= 0; i
< size
/ sizeof (Atom
); i
++)
1569 Faset (v
, make_number (i
),
1570 x_atom_to_symbol (dpyinfo
, display
, ((Atom
*) data
) [i
]));
1575 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1576 If the number is > 16 bits, convert it to a cons of integers,
1577 16 bits in each half.
1579 else if (format
== 32 && size
== sizeof (long))
1580 return long_to_cons (((unsigned long *) data
) [0]);
1581 else if (format
== 16 && size
== sizeof (short))
1582 return make_number ((int) (((unsigned short *) data
) [0]));
1584 /* Convert any other kind of data to a vector of numbers, represented
1585 as above (as an integer, or a cons of two 16 bit integers.)
1587 else if (format
== 16)
1591 v
= Fmake_vector (make_number (size
/ 2), make_number (0));
1592 for (i
= 0; i
< size
/ 2; i
++)
1594 int j
= (int) ((unsigned short *) data
) [i
];
1595 Faset (v
, make_number (i
), make_number (j
));
1602 Lisp_Object v
= Fmake_vector (make_number (size
/ 4), make_number (0));
1603 for (i
= 0; i
< size
/ 4; i
++)
1605 unsigned long j
= ((unsigned long *) data
) [i
];
1606 Faset (v
, make_number (i
), long_to_cons (j
));
1613 /* Use xfree, not XFree, to free the data obtained with this function. */
1616 lisp_data_to_selection_data (display
, obj
,
1617 data_ret
, type_ret
, size_ret
,
1618 format_ret
, nofree_ret
)
1621 unsigned char **data_ret
;
1623 unsigned int *size_ret
;
1627 Lisp_Object type
= Qnil
;
1628 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1632 if (CONSP (obj
) && SYMBOLP (XCAR (obj
)))
1636 if (CONSP (obj
) && NILP (XCDR (obj
)))
1640 if (EQ (obj
, QNULL
) || (EQ (type
, QNULL
)))
1641 { /* This is not the same as declining */
1647 else if (STRINGP (obj
))
1649 /* Since we are now handling multilingual text, we must consider
1650 sending back compound text. */
1651 int charsets
[MAX_CHARSET
+ 1];
1655 *size_ret
= STRING_BYTES (XSTRING (obj
));
1656 *data_ret
= XSTRING (obj
)->data
;
1657 bzero (charsets
, (MAX_CHARSET
+ 1) * sizeof (int));
1658 num
= ((*size_ret
<= 1 /* Check the possibility of short cut. */
1659 || !STRING_MULTIBYTE (obj
)
1660 || *size_ret
== XSTRING (obj
)->size
)
1662 : find_charset_in_str (*data_ret
, *size_ret
, charsets
, Qnil
, 0, 1));
1664 if (!num
|| (num
== 1 && charsets
[CHARSET_ASCII
]))
1666 /* No multibyte character in OBJ. We need not encode it. */
1668 if (NILP (type
)) type
= QSTRING
;
1669 Vlast_coding_system_used
= Qraw_text
;
1673 /* We must encode contents of OBJ to compound text format.
1674 The format is compatible with what the target `STRING'
1675 expects if OBJ contains only ASCII and Latin-1
1679 struct coding_system coding
;
1681 if (NILP (Vnext_selection_coding_system
))
1682 Vnext_selection_coding_system
= Vselection_coding_system
;
1684 (Fcheck_coding_system (Vnext_selection_coding_system
), &coding
);
1685 Vnext_selection_coding_system
= Qnil
;
1686 coding
.mode
|= CODING_MODE_LAST_BLOCK
;
1687 bufsize
= encoding_buffer_size (&coding
, *size_ret
);
1688 buf
= (unsigned char *) xmalloc (bufsize
);
1689 encode_coding (&coding
, *data_ret
, buf
, *size_ret
, bufsize
);
1690 *size_ret
= coding
.produced
;
1692 if (charsets
[charset_latin_iso8859_1
]
1693 && (num
== 1 || (num
== 2 && charsets
[CHARSET_ASCII
])))
1695 /* Ok, we can return it as `STRING'. */
1696 if (NILP (type
)) type
= QSTRING
;
1700 /* We must return it as `COMPOUND_TEXT'. */
1701 if (NILP (type
)) type
= QCOMPOUND_TEXT
;
1703 Vlast_coding_system_used
= coding
.symbol
;
1706 else if (SYMBOLP (obj
))
1710 *data_ret
= (unsigned char *) xmalloc (sizeof (Atom
) + 1);
1711 (*data_ret
) [sizeof (Atom
)] = 0;
1712 (*(Atom
**) data_ret
) [0] = symbol_to_x_atom (dpyinfo
, display
, obj
);
1713 if (NILP (type
)) type
= QATOM
;
1715 else if (INTEGERP (obj
)
1716 && XINT (obj
) < 0xFFFF
1717 && XINT (obj
) > -0xFFFF)
1721 *data_ret
= (unsigned char *) xmalloc (sizeof (short) + 1);
1722 (*data_ret
) [sizeof (short)] = 0;
1723 (*(short **) data_ret
) [0] = (short) XINT (obj
);
1724 if (NILP (type
)) type
= QINTEGER
;
1726 else if (INTEGERP (obj
)
1727 || (CONSP (obj
) && INTEGERP (XCAR (obj
))
1728 && (INTEGERP (XCDR (obj
))
1729 || (CONSP (XCDR (obj
))
1730 && INTEGERP (XCAR (XCDR (obj
)))))))
1734 *data_ret
= (unsigned char *) xmalloc (sizeof (long) + 1);
1735 (*data_ret
) [sizeof (long)] = 0;
1736 (*(unsigned long **) data_ret
) [0] = cons_to_long (obj
);
1737 if (NILP (type
)) type
= QINTEGER
;
1739 else if (VECTORP (obj
))
1741 /* Lisp_Vectors may represent a set of ATOMs;
1742 a set of 16 or 32 bit INTEGERs;
1743 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1747 if (SYMBOLP (XVECTOR (obj
)->contents
[0]))
1748 /* This vector is an ATOM set */
1750 if (NILP (type
)) type
= QATOM
;
1751 *size_ret
= XVECTOR (obj
)->size
;
1753 *data_ret
= (unsigned char *) xmalloc ((*size_ret
) * sizeof (Atom
));
1754 for (i
= 0; i
< *size_ret
; i
++)
1755 if (SYMBOLP (XVECTOR (obj
)->contents
[i
]))
1756 (*(Atom
**) data_ret
) [i
]
1757 = symbol_to_x_atom (dpyinfo
, display
, XVECTOR (obj
)->contents
[i
]);
1759 Fsignal (Qerror
, /* Qselection_error */
1761 ("all elements of selection vector must have same type"),
1762 Fcons (obj
, Qnil
)));
1764 #if 0 /* #### MULTIPLE doesn't work yet */
1765 else if (VECTORP (XVECTOR (obj
)->contents
[0]))
1766 /* This vector is an ATOM_PAIR set */
1768 if (NILP (type
)) type
= QATOM_PAIR
;
1769 *size_ret
= XVECTOR (obj
)->size
;
1771 *data_ret
= (unsigned char *)
1772 xmalloc ((*size_ret
) * sizeof (Atom
) * 2);
1773 for (i
= 0; i
< *size_ret
; i
++)
1774 if (VECTORP (XVECTOR (obj
)->contents
[i
]))
1776 Lisp_Object pair
= XVECTOR (obj
)->contents
[i
];
1777 if (XVECTOR (pair
)->size
!= 2)
1780 ("elements of the vector must be vectors of exactly two elements"),
1781 Fcons (pair
, Qnil
)));
1783 (*(Atom
**) data_ret
) [i
* 2]
1784 = symbol_to_x_atom (dpyinfo
, display
,
1785 XVECTOR (pair
)->contents
[0]);
1786 (*(Atom
**) data_ret
) [(i
* 2) + 1]
1787 = symbol_to_x_atom (dpyinfo
, display
,
1788 XVECTOR (pair
)->contents
[1]);
1793 ("all elements of the vector must be of the same type"),
1794 Fcons (obj
, Qnil
)));
1799 /* This vector is an INTEGER set, or something like it */
1801 *size_ret
= XVECTOR (obj
)->size
;
1802 if (NILP (type
)) type
= QINTEGER
;
1804 for (i
= 0; i
< *size_ret
; i
++)
1805 if (CONSP (XVECTOR (obj
)->contents
[i
]))
1807 else if (!INTEGERP (XVECTOR (obj
)->contents
[i
]))
1808 Fsignal (Qerror
, /* Qselection_error */
1810 ("elements of selection vector must be integers or conses of integers"),
1811 Fcons (obj
, Qnil
)));
1813 *data_ret
= (unsigned char *) xmalloc (*size_ret
* (*format_ret
/8));
1814 for (i
= 0; i
< *size_ret
; i
++)
1815 if (*format_ret
== 32)
1816 (*((unsigned long **) data_ret
)) [i
]
1817 = cons_to_long (XVECTOR (obj
)->contents
[i
]);
1819 (*((unsigned short **) data_ret
)) [i
]
1820 = (unsigned short) cons_to_long (XVECTOR (obj
)->contents
[i
]);
1824 Fsignal (Qerror
, /* Qselection_error */
1825 Fcons (build_string ("unrecognised selection data"),
1826 Fcons (obj
, Qnil
)));
1828 *type_ret
= symbol_to_x_atom (dpyinfo
, display
, type
);
1832 clean_local_selection_data (obj
)
1836 && INTEGERP (XCAR (obj
))
1837 && CONSP (XCDR (obj
))
1838 && INTEGERP (XCAR (XCDR (obj
)))
1839 && NILP (XCDR (XCDR (obj
))))
1840 obj
= Fcons (XCAR (obj
), XCDR (obj
));
1843 && INTEGERP (XCAR (obj
))
1844 && INTEGERP (XCDR (obj
)))
1846 if (XINT (XCAR (obj
)) == 0)
1848 if (XINT (XCAR (obj
)) == -1)
1849 return make_number (- XINT (XCDR (obj
)));
1854 int size
= XVECTOR (obj
)->size
;
1857 return clean_local_selection_data (XVECTOR (obj
)->contents
[0]);
1858 copy
= Fmake_vector (make_number (size
), Qnil
);
1859 for (i
= 0; i
< size
; i
++)
1860 XVECTOR (copy
)->contents
[i
]
1861 = clean_local_selection_data (XVECTOR (obj
)->contents
[i
]);
1867 /* Called from XTread_socket to handle SelectionNotify events.
1868 If it's the selection we are waiting for, stop waiting
1869 by setting the car of reading_selection_reply to non-nil.
1870 We store t there if the reply is successful, lambda if not. */
1873 x_handle_selection_notify (event
)
1874 XSelectionEvent
*event
;
1876 if (event
->requestor
!= reading_selection_window
)
1878 if (event
->selection
!= reading_which_selection
)
1881 XCAR (reading_selection_reply
)
1882 = (event
->property
!= 0 ? Qt
: Qlambda
);
1886 DEFUN ("x-own-selection-internal", Fx_own_selection_internal
,
1887 Sx_own_selection_internal
, 2, 2, 0,
1888 "Assert an X selection of the given TYPE with the given VALUE.\n\
1889 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1890 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
1891 VALUE is typically a string, or a cons of two markers, but may be\n\
1892 anything that the functions on `selection-converter-alist' know about.")
1893 (selection_name
, selection_value
)
1894 Lisp_Object selection_name
, selection_value
;
1897 CHECK_SYMBOL (selection_name
, 0);
1898 if (NILP (selection_value
)) error ("selection-value may not be nil");
1899 x_own_selection (selection_name
, selection_value
);
1900 return selection_value
;
1904 /* Request the selection value from the owner. If we are the owner,
1905 simply return our selection value. If we are not the owner, this
1906 will block until all of the data has arrived. */
1908 DEFUN ("x-get-selection-internal", Fx_get_selection_internal
,
1909 Sx_get_selection_internal
, 2, 2, 0,
1910 "Return text selected from some X window.\n\
1911 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
1912 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
1913 TYPE is the type of data desired, typically `STRING'.")
1914 (selection_symbol
, target_type
)
1915 Lisp_Object selection_symbol
, target_type
;
1917 Lisp_Object val
= Qnil
;
1918 struct gcpro gcpro1
, gcpro2
;
1919 GCPRO2 (target_type
, val
); /* we store newly consed data into these */
1921 CHECK_SYMBOL (selection_symbol
, 0);
1923 #if 0 /* #### MULTIPLE doesn't work yet */
1924 if (CONSP (target_type
)
1925 && XCAR (target_type
) == QMULTIPLE
)
1927 CHECK_VECTOR (XCDR (target_type
), 0);
1928 /* So we don't destructively modify this... */
1929 target_type
= copy_multiple_data (target_type
);
1933 CHECK_SYMBOL (target_type
, 0);
1935 val
= x_get_local_selection (selection_symbol
, target_type
);
1939 val
= x_get_foreign_selection (selection_symbol
, target_type
);
1944 && SYMBOLP (XCAR (val
)))
1947 if (CONSP (val
) && NILP (XCDR (val
)))
1950 val
= clean_local_selection_data (val
);
1956 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal
,
1957 Sx_disown_selection_internal
, 1, 2, 0,
1958 "If we own the selection SELECTION, disown it.\n\
1959 Disowning it means there is no such selection.")
1961 Lisp_Object selection
;
1965 Atom selection_atom
;
1966 struct selection_input_event event
;
1968 struct x_display_info
*dpyinfo
;
1969 struct frame
*sf
= SELECTED_FRAME ();
1972 display
= FRAME_X_DISPLAY (sf
);
1973 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1974 CHECK_SYMBOL (selection
, 0);
1976 timestamp
= last_event_timestamp
;
1978 timestamp
= cons_to_long (time
);
1980 if (NILP (assq_no_quit (selection
, Vselection_alist
)))
1981 return Qnil
; /* Don't disown the selection when we're not the owner. */
1983 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection
);
1986 XSetSelectionOwner (display
, selection_atom
, None
, timestamp
);
1989 /* It doesn't seem to be guaranteed that a SelectionClear event will be
1990 generated for a window which owns the selection when that window sets
1991 the selection owner to None. The NCD server does, the MIT Sun4 server
1992 doesn't. So we synthesize one; this means we might get two, but
1993 that's ok, because the second one won't have any effect. */
1994 SELECTION_EVENT_DISPLAY (&event
) = display
;
1995 SELECTION_EVENT_SELECTION (&event
) = selection_atom
;
1996 SELECTION_EVENT_TIME (&event
) = timestamp
;
1997 x_handle_selection_clear ((struct input_event
*) &event
);
2002 /* Get rid of all the selections in buffer BUFFER.
2003 This is used when we kill a buffer. */
2006 x_disown_buffer_selections (buffer
)
2010 struct buffer
*buf
= XBUFFER (buffer
);
2012 for (tail
= Vselection_alist
; CONSP (tail
); tail
= XCDR (tail
))
2014 Lisp_Object elt
, value
;
2017 if (CONSP (value
) && MARKERP (XCAR (value
))
2018 && XMARKER (XCAR (value
))->buffer
== buf
)
2019 Fx_disown_selection_internal (XCAR (elt
), Qnil
);
2023 DEFUN ("x-selection-owner-p", Fx_selection_owner_p
, Sx_selection_owner_p
,
2025 "Whether the current Emacs process owns the given X Selection.\n\
2026 The arg should be the name of the selection in question, typically one of\n\
2027 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
2028 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
2029 For convenience, the symbol nil is the same as `PRIMARY',\n\
2030 and t is the same as `SECONDARY'.)")
2032 Lisp_Object selection
;
2035 CHECK_SYMBOL (selection
, 0);
2036 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2037 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2039 if (NILP (Fassq (selection
, Vselection_alist
)))
2044 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
2046 "Whether there is an owner for the given X Selection.\n\
2047 The arg should be the name of the selection in question, typically one of\n\
2048 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\
2049 \(Those are literal upper-case symbol names, since that's what X expects.)\n\
2050 For convenience, the symbol nil is the same as `PRIMARY',\n\
2051 and t is the same as `SECONDARY'.)")
2053 Lisp_Object selection
;
2058 struct frame
*sf
= SELECTED_FRAME ();
2060 /* It should be safe to call this before we have an X frame. */
2061 if (! FRAME_X_P (sf
))
2064 dpy
= FRAME_X_DISPLAY (sf
);
2065 CHECK_SYMBOL (selection
, 0);
2066 if (!NILP (Fx_selection_owner_p (selection
)))
2068 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2069 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2070 atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
), dpy
, selection
);
2074 owner
= XGetSelectionOwner (dpy
, atom
);
2076 return (owner
? Qt
: Qnil
);
2080 #ifdef CUT_BUFFER_SUPPORT
2082 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2084 initialize_cut_buffers (display
, window
)
2088 unsigned char *data
= (unsigned char *) "";
2090 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2091 PropModeAppend, data, 0)
2092 FROB (XA_CUT_BUFFER0
);
2093 FROB (XA_CUT_BUFFER1
);
2094 FROB (XA_CUT_BUFFER2
);
2095 FROB (XA_CUT_BUFFER3
);
2096 FROB (XA_CUT_BUFFER4
);
2097 FROB (XA_CUT_BUFFER5
);
2098 FROB (XA_CUT_BUFFER6
);
2099 FROB (XA_CUT_BUFFER7
);
2105 #define CHECK_CUT_BUFFER(symbol,n) \
2106 { CHECK_SYMBOL ((symbol), (n)); \
2107 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2108 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2109 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2110 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2112 Fcons (build_string ("doesn't name a cut buffer"), \
2113 Fcons ((symbol), Qnil))); \
2116 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal
,
2117 Sx_get_cut_buffer_internal
, 1, 1, 0,
2118 "Returns the value of the named cut buffer (typically CUT_BUFFER0).")
2124 unsigned char *data
;
2131 struct x_display_info
*dpyinfo
;
2132 struct frame
*sf
= SELECTED_FRAME ();
2135 display
= FRAME_X_DISPLAY (sf
);
2136 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2137 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2138 CHECK_CUT_BUFFER (buffer
, 0);
2139 buffer_atom
= symbol_to_x_atom (dpyinfo
, display
, buffer
);
2141 x_get_window_property (display
, window
, buffer_atom
, &data
, &bytes
,
2142 &type
, &format
, &size
, 0);
2143 if (!data
|| !format
)
2146 if (format
!= 8 || type
!= XA_STRING
)
2148 Fcons (build_string ("cut buffer doesn't contain 8-bit data"),
2149 Fcons (x_atom_to_symbol (dpyinfo
, display
, type
),
2150 Fcons (make_number (format
), Qnil
))));
2152 ret
= (bytes
? make_string ((char *) data
, bytes
) : Qnil
);
2153 /* Use xfree, not XFree, because x_get_window_property
2154 calls xmalloc itself. */
2160 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal
,
2161 Sx_store_cut_buffer_internal
, 2, 2, 0,
2162 "Sets the value of the named cut buffer (typically CUT_BUFFER0).")
2164 Lisp_Object buffer
, string
;
2168 unsigned char *data
;
2170 int bytes_remaining
;
2173 struct frame
*sf
= SELECTED_FRAME ();
2176 display
= FRAME_X_DISPLAY (sf
);
2177 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2179 max_bytes
= SELECTION_QUANTUM (display
);
2180 if (max_bytes
> MAX_SELECTION_QUANTUM
)
2181 max_bytes
= MAX_SELECTION_QUANTUM
;
2183 CHECK_CUT_BUFFER (buffer
, 0);
2184 CHECK_STRING (string
, 0);
2185 buffer_atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
),
2187 data
= (unsigned char *) XSTRING (string
)->data
;
2188 bytes
= STRING_BYTES (XSTRING (string
));
2189 bytes_remaining
= bytes
;
2191 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2193 initialize_cut_buffers (display
, window
);
2194 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2199 /* Don't mess up with an empty value. */
2200 if (!bytes_remaining
)
2201 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2202 PropModeReplace
, data
, 0);
2204 while (bytes_remaining
)
2206 int chunk
= (bytes_remaining
< max_bytes
2207 ? bytes_remaining
: max_bytes
);
2208 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2209 (bytes_remaining
== bytes
2214 bytes_remaining
-= chunk
;
2221 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal
,
2222 Sx_rotate_cut_buffers_internal
, 1, 1, 0,
2223 "Rotate the values of the cut buffers by the given number of step.\n\
2224 Positive means shift the values forward, negative means backward.")
2231 struct frame
*sf
= SELECTED_FRAME ();
2234 display
= FRAME_X_DISPLAY (sf
);
2235 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2236 CHECK_NUMBER (n
, 0);
2239 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2241 initialize_cut_buffers (display
, window
);
2242 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2245 props
[0] = XA_CUT_BUFFER0
;
2246 props
[1] = XA_CUT_BUFFER1
;
2247 props
[2] = XA_CUT_BUFFER2
;
2248 props
[3] = XA_CUT_BUFFER3
;
2249 props
[4] = XA_CUT_BUFFER4
;
2250 props
[5] = XA_CUT_BUFFER5
;
2251 props
[6] = XA_CUT_BUFFER6
;
2252 props
[7] = XA_CUT_BUFFER7
;
2254 XRotateWindowProperties (display
, window
, props
, 8, XINT (n
));
2264 defsubr (&Sx_get_selection_internal
);
2265 defsubr (&Sx_own_selection_internal
);
2266 defsubr (&Sx_disown_selection_internal
);
2267 defsubr (&Sx_selection_owner_p
);
2268 defsubr (&Sx_selection_exists_p
);
2270 #ifdef CUT_BUFFER_SUPPORT
2271 defsubr (&Sx_get_cut_buffer_internal
);
2272 defsubr (&Sx_store_cut_buffer_internal
);
2273 defsubr (&Sx_rotate_cut_buffers_internal
);
2276 reading_selection_reply
= Fcons (Qnil
, Qnil
);
2277 staticpro (&reading_selection_reply
);
2278 reading_selection_window
= 0;
2279 reading_which_selection
= 0;
2281 property_change_wait_list
= 0;
2282 prop_location_identifier
= 0;
2283 property_change_reply
= Fcons (Qnil
, Qnil
);
2284 staticpro (&property_change_reply
);
2286 Vselection_alist
= Qnil
;
2287 staticpro (&Vselection_alist
);
2289 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist
,
2290 "An alist associating X Windows selection-types with functions.\n\
2291 These functions are called to convert the selection, with three args:\n\
2292 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2293 a desired type to which the selection should be converted;\n\
2294 and the local selection value (whatever was given to `x-own-selection').\n\
2296 The function should return the value to send to the X server\n\
2297 \(typically a string). A return value of nil\n\
2298 means that the conversion could not be done.\n\
2299 A return value which is the symbol `NULL'\n\
2300 means that a side-effect was executed,\n\
2301 and there is no meaningful selection value.");
2302 Vselection_converter_alist
= Qnil
;
2304 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks
,
2305 "A list of functions to be called when Emacs loses an X selection.\n\
2306 \(This happens when some other X client makes its own selection\n\
2307 or when a Lisp program explicitly clears the selection.)\n\
2308 The functions are called with one argument, the selection type\n\
2309 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD').");
2310 Vx_lost_selection_hooks
= Qnil
;
2312 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks
,
2313 "A list of functions to be called when Emacs answers a selection request.\n\
2314 The functions are called with four arguments:\n\
2315 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\
2316 - the selection-type which Emacs was asked to convert the\n\
2317 selection into before sending (for example, `STRING' or `LENGTH');\n\
2318 - a flag indicating success or failure for responding to the request.\n\
2319 We might have failed (and declined the request) for any number of reasons,\n\
2320 including being asked for a selection that we no longer own, or being asked\n\
2321 to convert into a type that we don't know about or that is inappropriate.\n\
2322 This hook doesn't let you change the behavior of Emacs's selection replies,\n\
2323 it merely informs you that they have happened.");
2324 Vx_sent_selection_hooks
= Qnil
;
2326 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system
,
2327 "Coding system for communicating with other X clients.\n\
2328 When sending or receiving text via cut_buffer, selection, and clipboard,\n\
2329 the text is encoded or decoded by this coding system.\n\
2330 The default value is `compound-text'.");
2331 Vselection_coding_system
= intern ("compound-text");
2333 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system
,
2334 "Coding system for the next communication with other X clients.\n\
2335 Usually, `selection-coding-system' is used for communicating with\n\
2336 other X clients. But, if this variable is set, it is used for the\n\
2337 next communication only. After the communication, this variable is\n\
2339 Vnext_selection_coding_system
= Qnil
;
2341 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout
,
2342 "Number of milliseconds to wait for a selection reply.\n\
2343 If the selection owner doesn't reply in this time, we give up.\n\
2344 A value of 0 means wait as long as necessary. This is initialized from the\n\
2345 \"*selectionTimeout\" resource.");
2346 x_selection_timeout
= 0;
2348 QPRIMARY
= intern ("PRIMARY"); staticpro (&QPRIMARY
);
2349 QSECONDARY
= intern ("SECONDARY"); staticpro (&QSECONDARY
);
2350 QSTRING
= intern ("STRING"); staticpro (&QSTRING
);
2351 QINTEGER
= intern ("INTEGER"); staticpro (&QINTEGER
);
2352 QCLIPBOARD
= intern ("CLIPBOARD"); staticpro (&QCLIPBOARD
);
2353 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2354 QTEXT
= intern ("TEXT"); staticpro (&QTEXT
);
2355 QCOMPOUND_TEXT
= intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT
);
2356 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2357 QDELETE
= intern ("DELETE"); staticpro (&QDELETE
);
2358 QMULTIPLE
= intern ("MULTIPLE"); staticpro (&QMULTIPLE
);
2359 QINCR
= intern ("INCR"); staticpro (&QINCR
);
2360 QEMACS_TMP
= intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP
);
2361 QTARGETS
= intern ("TARGETS"); staticpro (&QTARGETS
);
2362 QATOM
= intern ("ATOM"); staticpro (&QATOM
);
2363 QATOM_PAIR
= intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR
);
2364 QNULL
= intern ("NULL"); staticpro (&QNULL
);
2366 #ifdef CUT_BUFFER_SUPPORT
2367 QCUT_BUFFER0
= intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0
);
2368 QCUT_BUFFER1
= intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1
);
2369 QCUT_BUFFER2
= intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2
);
2370 QCUT_BUFFER3
= intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3
);
2371 QCUT_BUFFER4
= intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4
);
2372 QCUT_BUFFER5
= intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5
);
2373 QCUT_BUFFER6
= intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6
);
2374 QCUT_BUFFER7
= intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7
);