1 /* X Selection processing for Emacs.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
5 This file is part of GNU Emacs.
7 GNU Emacs is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GNU Emacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Emacs; see the file COPYING. If not, write to
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA. */
23 /* Rewritten by jwz */
26 #include <stdio.h> /* termhooks.h needs this */
28 #ifdef HAVE_SYS_TYPES_H
29 #include <sys/types.h>
36 #include "xterm.h" /* for all of the X includes */
37 #include "dispextern.h" /* frame.h seems to want this */
38 #include "frame.h" /* Need this to get the X window of selected_frame */
39 #include "blockinput.h"
42 #include "termhooks.h"
45 #include <X11/Xproto.h>
49 static Lisp_Object x_atom_to_symbol
P_ ((Display
*dpy
, Atom atom
));
50 static Atom symbol_to_x_atom
P_ ((struct x_display_info
*, Display
*,
52 static void x_own_selection
P_ ((Lisp_Object
, Lisp_Object
));
53 static Lisp_Object x_get_local_selection
P_ ((Lisp_Object
, Lisp_Object
, int));
54 static void x_decline_selection_request
P_ ((struct input_event
*));
55 static Lisp_Object x_selection_request_lisp_error
P_ ((Lisp_Object
));
56 static Lisp_Object queue_selection_requests_unwind
P_ ((Lisp_Object
));
57 static Lisp_Object some_frame_on_display
P_ ((struct x_display_info
*));
58 static Lisp_Object x_catch_errors_unwind
P_ ((Lisp_Object
));
59 static void x_reply_selection_request
P_ ((struct input_event
*, int,
60 unsigned char *, int, Atom
));
61 static int waiting_for_other_props_on_window
P_ ((Display
*, Window
));
62 static struct prop_location
*expect_property_change
P_ ((Display
*, Window
,
64 static void unexpect_property_change
P_ ((struct prop_location
*));
65 static Lisp_Object wait_for_property_change_unwind
P_ ((Lisp_Object
));
66 static void wait_for_property_change
P_ ((struct prop_location
*));
67 static Lisp_Object x_get_foreign_selection
P_ ((Lisp_Object
,
70 static void x_get_window_property
P_ ((Display
*, Window
, Atom
,
71 unsigned char **, int *,
72 Atom
*, int *, unsigned long *, int));
73 static void receive_incremental_selection
P_ ((Display
*, Window
, Atom
,
74 Lisp_Object
, unsigned,
75 unsigned char **, int *,
76 Atom
*, int *, unsigned long *));
77 static Lisp_Object x_get_window_property_as_lisp_data
P_ ((Display
*,
80 static Lisp_Object selection_data_to_lisp_data
P_ ((Display
*, unsigned char *,
82 static void lisp_data_to_selection_data
P_ ((Display
*, Lisp_Object
,
83 unsigned char **, Atom
*,
84 unsigned *, int *, int *));
85 static Lisp_Object clean_local_selection_data
P_ ((Lisp_Object
));
86 static void initialize_cut_buffers
P_ ((Display
*, Window
));
89 /* Printing traces to stderr. */
91 #ifdef TRACE_SELECTION
93 fprintf (stderr, "%d: " fmt "\n", getpid ())
94 #define TRACE1(fmt, a0) \
95 fprintf (stderr, "%d: " fmt "\n", getpid (), a0)
96 #define TRACE2(fmt, a0, a1) \
97 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1)
98 #define TRACE3(fmt, a0, a1, a2) \
99 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1, a2)
101 #define TRACE0(fmt) (void) 0
102 #define TRACE1(fmt, a0) (void) 0
103 #define TRACE2(fmt, a0, a1) (void) 0
104 #define TRACE3(fmt, a0, a1) (void) 0
108 #define CUT_BUFFER_SUPPORT
110 Lisp_Object QPRIMARY
, QSECONDARY
, QSTRING
, QINTEGER
, QCLIPBOARD
, QTIMESTAMP
,
111 QTEXT
, QDELETE
, QMULTIPLE
, QINCR
, QEMACS_TMP
, QTARGETS
, QATOM
, QNULL
,
114 Lisp_Object QCOMPOUND_TEXT
; /* This is a type of selection. */
115 Lisp_Object QUTF8_STRING
; /* This is a type of selection. */
117 Lisp_Object Qcompound_text_with_extensions
;
119 #ifdef CUT_BUFFER_SUPPORT
120 Lisp_Object QCUT_BUFFER0
, QCUT_BUFFER1
, QCUT_BUFFER2
, QCUT_BUFFER3
,
121 QCUT_BUFFER4
, QCUT_BUFFER5
, QCUT_BUFFER6
, QCUT_BUFFER7
;
124 static Lisp_Object Vx_lost_selection_functions
;
125 static Lisp_Object Vx_sent_selection_functions
;
126 static Lisp_Object Qforeign_selection
;
128 /* If this is a smaller number than the max-request-size of the display,
129 emacs will use INCR selection transfer when the selection is larger
130 than this. The max-request-size is usually around 64k, so if you want
131 emacs to use incremental selection transfers when the selection is
132 smaller than that, set this. I added this mostly for debugging the
133 incremental transfer stuff, but it might improve server performance. */
134 #define MAX_SELECTION_QUANTUM 0xFFFFFF
136 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
138 /* The timestamp of the last input event Emacs received from the X server. */
139 /* Defined in keyboard.c. */
140 extern unsigned long last_event_timestamp
;
142 /* This is an association list whose elements are of the form
143 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
144 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
145 SELECTION-VALUE is the value that emacs owns for that selection.
146 It may be any kind of Lisp object.
147 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
148 as a cons of two 16-bit numbers (making a 32 bit time.)
149 FRAME is the frame for which we made the selection.
150 If there is an entry in this alist, then it can be assumed that Emacs owns
152 The only (eq) parts of this list that are visible from Lisp are the
154 static Lisp_Object Vselection_alist
;
156 /* This is an alist whose CARs are selection-types (whose names are the same
157 as the names of X Atoms) and whose CDRs are the names of Lisp functions to
158 call to convert the given Emacs selection value to a string representing
159 the given selection type. This is for Lisp-level extension of the emacs
160 selection handling. */
161 static Lisp_Object Vselection_converter_alist
;
163 /* If the selection owner takes too long to reply to a selection request,
164 we give up on it. This is in milliseconds (0 = no timeout.) */
165 static EMACS_INT x_selection_timeout
;
169 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later
172 struct selection_event_queue
174 struct input_event event
;
175 struct selection_event_queue
*next
;
178 static struct selection_event_queue
*selection_queue
;
180 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
182 static int x_queue_selection_requests
;
184 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
187 x_queue_event (event
)
188 struct input_event
*event
;
190 struct selection_event_queue
*queue_tmp
;
192 /* Don't queue repeated requests.
193 This only happens for large requests which uses the incremental protocol. */
194 for (queue_tmp
= selection_queue
; queue_tmp
; queue_tmp
= queue_tmp
->next
)
196 if (!bcmp (&queue_tmp
->event
, event
, sizeof (*event
)))
198 TRACE1 ("DECLINE DUP SELECTION EVENT %08lx", (unsigned long)queue_tmp
);
199 x_decline_selection_request (event
);
205 = (struct selection_event_queue
*) xmalloc (sizeof (struct selection_event_queue
));
207 if (queue_tmp
!= NULL
)
209 TRACE1 ("QUEUE SELECTION EVENT %08lx", (unsigned long)queue_tmp
);
210 queue_tmp
->event
= *event
;
211 queue_tmp
->next
= selection_queue
;
212 selection_queue
= queue_tmp
;
216 /* Start queuing SELECTION_REQUEST_EVENT events. */
219 x_start_queuing_selection_requests ()
221 if (x_queue_selection_requests
)
224 x_queue_selection_requests
++;
225 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests
);
228 /* Stop queuing SELECTION_REQUEST_EVENT events. */
231 x_stop_queuing_selection_requests ()
233 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests
);
234 --x_queue_selection_requests
;
236 /* Take all the queued events and put them back
237 so that they get processed afresh. */
239 while (selection_queue
!= NULL
)
241 struct selection_event_queue
*queue_tmp
= selection_queue
;
242 TRACE1 ("RESTORE SELECTION EVENT %08lx", (unsigned long)queue_tmp
);
243 kbd_buffer_unget_event (&queue_tmp
->event
);
244 selection_queue
= queue_tmp
->next
;
245 xfree ((char *)queue_tmp
);
250 /* This converts a Lisp symbol to a server Atom, avoiding a server
251 roundtrip whenever possible. */
254 symbol_to_x_atom (dpyinfo
, display
, sym
)
255 struct x_display_info
*dpyinfo
;
260 if (NILP (sym
)) return 0;
261 if (EQ (sym
, QPRIMARY
)) return XA_PRIMARY
;
262 if (EQ (sym
, QSECONDARY
)) return XA_SECONDARY
;
263 if (EQ (sym
, QSTRING
)) return XA_STRING
;
264 if (EQ (sym
, QINTEGER
)) return XA_INTEGER
;
265 if (EQ (sym
, QATOM
)) return XA_ATOM
;
266 if (EQ (sym
, QCLIPBOARD
)) return dpyinfo
->Xatom_CLIPBOARD
;
267 if (EQ (sym
, QTIMESTAMP
)) return dpyinfo
->Xatom_TIMESTAMP
;
268 if (EQ (sym
, QTEXT
)) return dpyinfo
->Xatom_TEXT
;
269 if (EQ (sym
, QCOMPOUND_TEXT
)) return dpyinfo
->Xatom_COMPOUND_TEXT
;
270 if (EQ (sym
, QUTF8_STRING
)) return dpyinfo
->Xatom_UTF8_STRING
;
271 if (EQ (sym
, QDELETE
)) return dpyinfo
->Xatom_DELETE
;
272 if (EQ (sym
, QMULTIPLE
)) return dpyinfo
->Xatom_MULTIPLE
;
273 if (EQ (sym
, QINCR
)) return dpyinfo
->Xatom_INCR
;
274 if (EQ (sym
, QEMACS_TMP
)) return dpyinfo
->Xatom_EMACS_TMP
;
275 if (EQ (sym
, QTARGETS
)) return dpyinfo
->Xatom_TARGETS
;
276 if (EQ (sym
, QNULL
)) return dpyinfo
->Xatom_NULL
;
277 #ifdef CUT_BUFFER_SUPPORT
278 if (EQ (sym
, QCUT_BUFFER0
)) return XA_CUT_BUFFER0
;
279 if (EQ (sym
, QCUT_BUFFER1
)) return XA_CUT_BUFFER1
;
280 if (EQ (sym
, QCUT_BUFFER2
)) return XA_CUT_BUFFER2
;
281 if (EQ (sym
, QCUT_BUFFER3
)) return XA_CUT_BUFFER3
;
282 if (EQ (sym
, QCUT_BUFFER4
)) return XA_CUT_BUFFER4
;
283 if (EQ (sym
, QCUT_BUFFER5
)) return XA_CUT_BUFFER5
;
284 if (EQ (sym
, QCUT_BUFFER6
)) return XA_CUT_BUFFER6
;
285 if (EQ (sym
, QCUT_BUFFER7
)) return XA_CUT_BUFFER7
;
287 if (!SYMBOLP (sym
)) abort ();
289 TRACE1 (" XInternAtom %s", (char *) SDATA (SYMBOL_NAME (sym
)));
291 val
= XInternAtom (display
, (char *) SDATA (SYMBOL_NAME (sym
)), False
);
297 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
298 and calls to intern whenever possible. */
301 x_atom_to_symbol (dpy
, atom
)
305 struct x_display_info
*dpyinfo
;
324 #ifdef CUT_BUFFER_SUPPORT
344 dpyinfo
= x_display_info_for_display (dpy
);
345 if (atom
== dpyinfo
->Xatom_CLIPBOARD
)
347 if (atom
== dpyinfo
->Xatom_TIMESTAMP
)
349 if (atom
== dpyinfo
->Xatom_TEXT
)
351 if (atom
== dpyinfo
->Xatom_COMPOUND_TEXT
)
352 return QCOMPOUND_TEXT
;
353 if (atom
== dpyinfo
->Xatom_UTF8_STRING
)
355 if (atom
== dpyinfo
->Xatom_DELETE
)
357 if (atom
== dpyinfo
->Xatom_MULTIPLE
)
359 if (atom
== dpyinfo
->Xatom_INCR
)
361 if (atom
== dpyinfo
->Xatom_EMACS_TMP
)
363 if (atom
== dpyinfo
->Xatom_TARGETS
)
365 if (atom
== dpyinfo
->Xatom_NULL
)
369 str
= XGetAtomName (dpy
, atom
);
371 TRACE1 ("XGetAtomName --> %s", str
);
372 if (! str
) return Qnil
;
375 /* This was allocated by Xlib, so use XFree. */
381 /* Do protocol to assert ourself as a selection owner.
382 Update the Vselection_alist so that we can reply to later requests for
386 x_own_selection (selection_name
, selection_value
)
387 Lisp_Object selection_name
, selection_value
;
389 struct frame
*sf
= SELECTED_FRAME ();
390 Window selecting_window
;
392 Time time
= last_event_timestamp
;
394 struct x_display_info
*dpyinfo
;
396 if (! FRAME_X_P (sf
))
399 selecting_window
= FRAME_X_WINDOW (sf
);
400 display
= FRAME_X_DISPLAY (sf
);
401 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
403 CHECK_SYMBOL (selection_name
);
404 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_name
);
407 x_catch_errors (display
);
408 XSetSelectionOwner (display
, selection_atom
, selecting_window
, time
);
409 x_check_errors (display
, "Can't set selection: %s");
413 /* Now update the local cache */
415 Lisp_Object selection_time
;
416 Lisp_Object selection_data
;
417 Lisp_Object prev_value
;
419 selection_time
= long_to_cons ((unsigned long) time
);
420 selection_data
= Fcons (selection_name
,
421 Fcons (selection_value
,
422 Fcons (selection_time
,
423 Fcons (selected_frame
, Qnil
))));
424 prev_value
= assq_no_quit (selection_name
, Vselection_alist
);
426 Vselection_alist
= Fcons (selection_data
, Vselection_alist
);
428 /* If we already owned the selection, remove the old selection data.
429 Perhaps we should destructively modify it instead.
430 Don't use Fdelq as that may QUIT. */
431 if (!NILP (prev_value
))
433 Lisp_Object rest
; /* we know it's not the CAR, so it's easy. */
434 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
435 if (EQ (prev_value
, Fcar (XCDR (rest
))))
437 XSETCDR (rest
, Fcdr (XCDR (rest
)));
444 /* Given a selection-name and desired type, look up our local copy of
445 the selection value and convert it to the type.
446 The value is nil or a string.
447 This function is used both for remote requests (LOCAL_REQUEST is zero)
448 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
450 This calls random Lisp code, and may signal or gc. */
453 x_get_local_selection (selection_symbol
, target_type
, local_request
)
454 Lisp_Object selection_symbol
, target_type
;
457 Lisp_Object local_value
;
458 Lisp_Object handler_fn
, value
, type
, check
;
461 local_value
= assq_no_quit (selection_symbol
, Vselection_alist
);
463 if (NILP (local_value
)) return Qnil
;
465 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
466 if (EQ (target_type
, QTIMESTAMP
))
469 value
= XCAR (XCDR (XCDR (local_value
)));
472 else if (EQ (target_type
, QDELETE
))
475 Fx_disown_selection_internal
477 XCAR (XCDR (XCDR (local_value
))));
482 #if 0 /* #### MULTIPLE doesn't work yet */
483 else if (CONSP (target_type
)
484 && XCAR (target_type
) == QMULTIPLE
)
489 pairs
= XCDR (target_type
);
490 size
= XVECTOR (pairs
)->size
;
491 /* If the target is MULTIPLE, then target_type looks like
492 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
493 We modify the second element of each pair in the vector and
494 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
496 for (i
= 0; i
< size
; i
++)
499 pair
= XVECTOR (pairs
)->contents
[i
];
500 XVECTOR (pair
)->contents
[1]
501 = x_get_local_selection (XVECTOR (pair
)->contents
[0],
502 XVECTOR (pair
)->contents
[1],
510 /* Don't allow a quit within the converter.
511 When the user types C-g, he would be surprised
512 if by luck it came during a converter. */
513 count
= SPECPDL_INDEX ();
514 specbind (Qinhibit_quit
, Qt
);
516 CHECK_SYMBOL (target_type
);
517 handler_fn
= Fcdr (Fassq (target_type
, Vselection_converter_alist
));
518 /* gcpro is not needed here since nothing but HANDLER_FN
519 is live, and that ought to be a symbol. */
521 if (!NILP (handler_fn
))
522 value
= call3 (handler_fn
,
523 selection_symbol
, (local_request
? Qnil
: target_type
),
524 XCAR (XCDR (local_value
)));
527 unbind_to (count
, Qnil
);
530 /* Make sure this value is of a type that we could transmit
531 to another X client. */
535 && SYMBOLP (XCAR (value
)))
537 check
= XCDR (value
);
545 /* Check for a value that cons_to_long could handle. */
546 else if (CONSP (check
)
547 && INTEGERP (XCAR (check
))
548 && (INTEGERP (XCDR (check
))
550 (CONSP (XCDR (check
))
551 && INTEGERP (XCAR (XCDR (check
)))
552 && NILP (XCDR (XCDR (check
))))))
555 signal_error ("Invalid data returned by selection-conversion function",
556 list2 (handler_fn
, value
));
559 /* Subroutines of x_reply_selection_request. */
561 /* Send a SelectionNotify event to the requestor with property=None,
562 meaning we were unable to do what they wanted. */
565 x_decline_selection_request (event
)
566 struct input_event
*event
;
568 XSelectionEvent reply
;
570 reply
.type
= SelectionNotify
;
571 reply
.display
= SELECTION_EVENT_DISPLAY (event
);
572 reply
.requestor
= SELECTION_EVENT_REQUESTOR (event
);
573 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
574 reply
.time
= SELECTION_EVENT_TIME (event
);
575 reply
.target
= SELECTION_EVENT_TARGET (event
);
576 reply
.property
= None
;
578 /* The reason for the error may be that the receiver has
579 died in the meantime. Handle that case. */
581 x_catch_errors (reply
.display
);
582 XSendEvent (reply
.display
, reply
.requestor
, False
, 0L, (XEvent
*) &reply
);
583 XFlush (reply
.display
);
588 /* This is the selection request currently being processed.
589 It is set to zero when the request is fully processed. */
590 static struct input_event
*x_selection_current_request
;
592 /* Display info in x_selection_request. */
594 static struct x_display_info
*selection_request_dpyinfo
;
596 /* Used as an unwind-protect clause so that, if a selection-converter signals
597 an error, we tell the requester that we were unable to do what they wanted
598 before we throw to top-level or go into the debugger or whatever. */
601 x_selection_request_lisp_error (ignore
)
604 if (x_selection_current_request
!= 0
605 && selection_request_dpyinfo
->display
)
606 x_decline_selection_request (x_selection_current_request
);
611 x_catch_errors_unwind (dummy
)
621 /* This stuff is so that INCR selections are reentrant (that is, so we can
622 be servicing multiple INCR selection requests simultaneously.) I haven't
623 actually tested that yet. */
625 /* Keep a list of the property changes that are awaited. */
635 struct prop_location
*next
;
638 static struct prop_location
*expect_property_change ();
639 static void wait_for_property_change ();
640 static void unexpect_property_change ();
641 static int waiting_for_other_props_on_window ();
643 static int prop_location_identifier
;
645 static Lisp_Object property_change_reply
;
647 static struct prop_location
*property_change_reply_object
;
649 static struct prop_location
*property_change_wait_list
;
652 queue_selection_requests_unwind (tem
)
655 x_stop_queuing_selection_requests ();
659 /* Return some frame whose display info is DPYINFO.
660 Return nil if there is none. */
663 some_frame_on_display (dpyinfo
)
664 struct x_display_info
*dpyinfo
;
666 Lisp_Object list
, frame
;
668 FOR_EACH_FRAME (list
, frame
)
670 if (FRAME_X_P (XFRAME (frame
))
671 && FRAME_X_DISPLAY_INFO (XFRAME (frame
)) == dpyinfo
)
678 /* Send the reply to a selection request event EVENT.
679 TYPE is the type of selection data requested.
680 DATA and SIZE describe the data to send, already converted.
681 FORMAT is the unit-size (in bits) of the data to be transmitted. */
683 #ifdef TRACE_SELECTION
684 static int x_reply_selection_request_cnt
;
685 #endif /* TRACE_SELECTION */
688 x_reply_selection_request (event
, format
, data
, size
, type
)
689 struct input_event
*event
;
694 XSelectionEvent reply
;
695 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
696 Window window
= SELECTION_EVENT_REQUESTOR (event
);
698 int format_bytes
= format
/8;
699 int max_bytes
= SELECTION_QUANTUM (display
);
700 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
701 int count
= SPECPDL_INDEX ();
703 if (max_bytes
> MAX_SELECTION_QUANTUM
)
704 max_bytes
= MAX_SELECTION_QUANTUM
;
706 reply
.type
= SelectionNotify
;
707 reply
.display
= display
;
708 reply
.requestor
= window
;
709 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
710 reply
.time
= SELECTION_EVENT_TIME (event
);
711 reply
.target
= SELECTION_EVENT_TARGET (event
);
712 reply
.property
= SELECTION_EVENT_PROPERTY (event
);
713 if (reply
.property
== None
)
714 reply
.property
= reply
.target
;
717 /* The protected block contains wait_for_property_change, which can
718 run random lisp code (process handlers) or signal. Therefore, we
719 put the x_uncatch_errors call in an unwind. */
720 record_unwind_protect (x_catch_errors_unwind
, Qnil
);
721 x_catch_errors (display
);
723 #ifdef TRACE_SELECTION
725 char *sel
= XGetAtomName (display
, reply
.selection
);
726 char *tgt
= XGetAtomName (display
, reply
.target
);
727 TRACE3 ("%s, target %s (%d)", sel
, tgt
, ++x_reply_selection_request_cnt
);
728 if (sel
) XFree (sel
);
729 if (tgt
) XFree (tgt
);
731 #endif /* TRACE_SELECTION */
733 /* Store the data on the requested property.
734 If the selection is large, only store the first N bytes of it.
736 bytes_remaining
= size
* format_bytes
;
737 if (bytes_remaining
<= max_bytes
)
739 /* Send all the data at once, with minimal handshaking. */
740 TRACE1 ("Sending all %d bytes", bytes_remaining
);
741 XChangeProperty (display
, window
, reply
.property
, type
, format
,
742 PropModeReplace
, data
, size
);
743 /* At this point, the selection was successfully stored; ack it. */
744 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
748 /* Send an INCR selection. */
749 struct prop_location
*wait_object
;
753 frame
= some_frame_on_display (dpyinfo
);
755 /* If the display no longer has frames, we can't expect
756 to get many more selection requests from it, so don't
757 bother trying to queue them. */
760 x_start_queuing_selection_requests ();
762 record_unwind_protect (queue_selection_requests_unwind
,
766 if (x_window_to_frame (dpyinfo
, window
)) /* #### debug */
767 error ("Attempt to transfer an INCR to ourself!");
769 TRACE2 ("Start sending %d bytes incrementally (%s)",
770 bytes_remaining
, XGetAtomName (display
, reply
.property
));
771 wait_object
= expect_property_change (display
, window
, reply
.property
,
774 TRACE1 ("Set %s to number of bytes to send",
775 XGetAtomName (display
, reply
.property
));
777 /* XChangeProperty expects an array of long even if long is more than
781 value
[0] = bytes_remaining
;
782 XChangeProperty (display
, window
, reply
.property
, dpyinfo
->Xatom_INCR
,
784 (unsigned char *) value
, 1);
787 XSelectInput (display
, window
, PropertyChangeMask
);
789 /* Tell 'em the INCR data is there... */
790 TRACE0 ("Send SelectionNotify event");
791 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
794 had_errors
= x_had_errors_p (display
);
797 /* First, wait for the requester to ack by deleting the property.
798 This can run random lisp code (process handlers) or signal. */
801 TRACE1 ("Waiting for ACK (deletion of %s)",
802 XGetAtomName (display
, reply
.property
));
803 wait_for_property_change (wait_object
);
806 unexpect_property_change (wait_object
);
809 while (bytes_remaining
)
811 int i
= ((bytes_remaining
< max_bytes
)
818 = expect_property_change (display
, window
, reply
.property
,
821 TRACE1 ("Sending increment of %d bytes", i
);
822 TRACE1 ("Set %s to increment data",
823 XGetAtomName (display
, reply
.property
));
825 /* Append the next chunk of data to the property. */
826 XChangeProperty (display
, window
, reply
.property
, type
, format
,
827 PropModeAppend
, data
, i
/ format_bytes
);
828 bytes_remaining
-= i
;
831 had_errors
= x_had_errors_p (display
);
837 /* Now wait for the requester to ack this chunk by deleting the
838 property. This can run random lisp code or signal. */
839 TRACE1 ("Waiting for increment ACK (deletion of %s)",
840 XGetAtomName (display
, reply
.property
));
841 wait_for_property_change (wait_object
);
844 /* Now write a zero-length chunk to the property to tell the
845 requester that we're done. */
847 if (! waiting_for_other_props_on_window (display
, window
))
848 XSelectInput (display
, window
, 0L);
850 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
851 XGetAtomName (display
, reply
.property
));
852 XChangeProperty (display
, window
, reply
.property
, type
, format
,
853 PropModeReplace
, data
, 0);
854 TRACE0 ("Done sending incrementally");
857 /* rms, 2003-01-03: I think I have fixed this bug. */
858 /* The window we're communicating with may have been deleted
859 in the meantime (that's a real situation from a bug report).
860 In this case, there may be events in the event queue still
861 refering to the deleted window, and we'll get a BadWindow error
862 in XTread_socket when processing the events. I don't have
863 an idea how to fix that. gerd, 2001-01-98. */
864 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
865 delivered before uncatch errors. */
866 XSync (display
, False
);
869 /* GTK queues events in addition to the queue in Xlib. So we
870 UNBLOCK to enter the event loop and get possible errors delivered,
871 and then BLOCK again because x_uncatch_errors requires it. */
873 /* This calls x_uncatch_errors. */
874 unbind_to (count
, Qnil
);
878 /* Handle a SelectionRequest event EVENT.
879 This is called from keyboard.c when such an event is found in the queue. */
882 x_handle_selection_request (event
)
883 struct input_event
*event
;
885 struct gcpro gcpro1
, gcpro2
, gcpro3
;
886 Lisp_Object local_selection_data
;
887 Lisp_Object selection_symbol
;
888 Lisp_Object target_symbol
;
889 Lisp_Object converted_selection
;
890 Time local_selection_time
;
891 Lisp_Object successful_p
;
893 struct x_display_info
*dpyinfo
894 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event
));
896 TRACE2 ("x_handle_selection_request, from=0x%08lx time=%lu",
897 (unsigned long) SELECTION_EVENT_REQUESTOR (event
),
898 (unsigned long) SELECTION_EVENT_TIME (event
));
900 local_selection_data
= Qnil
;
901 target_symbol
= Qnil
;
902 converted_selection
= Qnil
;
905 GCPRO3 (local_selection_data
, converted_selection
, target_symbol
);
907 selection_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
908 SELECTION_EVENT_SELECTION (event
));
910 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
912 if (NILP (local_selection_data
))
914 /* Someone asked for the selection, but we don't have it any more.
916 x_decline_selection_request (event
);
920 local_selection_time
= (Time
)
921 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
923 if (SELECTION_EVENT_TIME (event
) != CurrentTime
924 && local_selection_time
> SELECTION_EVENT_TIME (event
))
926 /* Someone asked for the selection, and we have one, but not the one
929 x_decline_selection_request (event
);
933 x_selection_current_request
= event
;
934 count
= SPECPDL_INDEX ();
935 selection_request_dpyinfo
= dpyinfo
;
936 record_unwind_protect (x_selection_request_lisp_error
, Qnil
);
938 target_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
939 SELECTION_EVENT_TARGET (event
));
941 #if 0 /* #### MULTIPLE doesn't work yet */
942 if (EQ (target_symbol
, QMULTIPLE
))
943 target_symbol
= fetch_multiple_target (event
);
946 /* Convert lisp objects back into binary data */
949 = x_get_local_selection (selection_symbol
, target_symbol
, 0);
951 if (! NILP (converted_selection
))
959 if (CONSP (converted_selection
) && NILP (XCDR (converted_selection
)))
961 x_decline_selection_request (event
);
965 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event
),
967 &data
, &type
, &size
, &format
, &nofree
);
969 x_reply_selection_request (event
, format
, data
, size
, type
);
972 /* Indicate we have successfully processed this event. */
973 x_selection_current_request
= 0;
975 /* Use xfree, not XFree, because lisp_data_to_selection_data
976 calls xmalloc itself. */
982 unbind_to (count
, Qnil
);
986 /* Let random lisp code notice that the selection has been asked for. */
989 rest
= Vx_sent_selection_functions
;
990 if (!EQ (rest
, Qunbound
))
991 for (; CONSP (rest
); rest
= Fcdr (rest
))
992 call3 (Fcar (rest
), selection_symbol
, target_symbol
, successful_p
);
998 /* Handle a SelectionClear event EVENT, which indicates that some
999 client cleared out our previously asserted selection.
1000 This is called from keyboard.c when such an event is found in the queue. */
1003 x_handle_selection_clear (event
)
1004 struct input_event
*event
;
1006 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
1007 Atom selection
= SELECTION_EVENT_SELECTION (event
);
1008 Time changed_owner_time
= SELECTION_EVENT_TIME (event
);
1010 Lisp_Object selection_symbol
, local_selection_data
;
1011 Time local_selection_time
;
1012 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1013 struct x_display_info
*t_dpyinfo
;
1015 TRACE0 ("x_handle_selection_clear");
1018 /* If the new selection owner is also Emacs,
1019 don't clear the new selection. */
1021 /* Check each display on the same terminal,
1022 to see if this Emacs job now owns the selection
1023 through that display. */
1024 for (t_dpyinfo
= x_display_list
; t_dpyinfo
; t_dpyinfo
= t_dpyinfo
->next
)
1025 if (t_dpyinfo
->terminal
->kboard
== dpyinfo
->terminal
->kboard
)
1028 = XGetSelectionOwner (t_dpyinfo
->display
, selection
);
1029 if (x_window_to_frame (t_dpyinfo
, owner_window
) != 0)
1038 selection_symbol
= x_atom_to_symbol (display
, selection
);
1040 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
1042 /* Well, we already believe that we don't own it, so that's just fine. */
1043 if (NILP (local_selection_data
)) return;
1045 local_selection_time
= (Time
)
1046 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
1048 /* This SelectionClear is for a selection that we no longer own, so we can
1049 disregard it. (That is, we have reasserted the selection since this
1050 request was generated.) */
1052 if (changed_owner_time
!= CurrentTime
1053 && local_selection_time
> changed_owner_time
)
1056 /* Otherwise, we're really honest and truly being told to drop it.
1057 Don't use Fdelq as that may QUIT;. */
1059 if (EQ (local_selection_data
, Fcar (Vselection_alist
)))
1060 Vselection_alist
= Fcdr (Vselection_alist
);
1064 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
1065 if (EQ (local_selection_data
, Fcar (XCDR (rest
))))
1067 XSETCDR (rest
, Fcdr (XCDR (rest
)));
1072 /* Let random lisp code notice that the selection has been stolen. */
1076 rest
= Vx_lost_selection_functions
;
1077 if (!EQ (rest
, Qunbound
))
1079 for (; CONSP (rest
); rest
= Fcdr (rest
))
1080 call1 (Fcar (rest
), selection_symbol
);
1081 prepare_menu_bars ();
1082 redisplay_preserve_echo_area (20);
1088 x_handle_selection_event (event
)
1089 struct input_event
*event
;
1091 TRACE0 ("x_handle_selection_event");
1093 if (event
->kind
== SELECTION_REQUEST_EVENT
)
1095 if (x_queue_selection_requests
)
1096 x_queue_event (event
);
1098 x_handle_selection_request (event
);
1101 x_handle_selection_clear (event
);
1105 /* Clear all selections that were made from frame F.
1106 We do this when about to delete a frame. */
1109 x_clear_frame_selections (f
)
1115 XSETFRAME (frame
, f
);
1117 /* Otherwise, we're really honest and truly being told to drop it.
1118 Don't use Fdelq as that may QUIT;. */
1120 /* Delete elements from the beginning of Vselection_alist. */
1121 while (!NILP (Vselection_alist
)
1122 && EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist
)))))))
1124 /* Let random Lisp code notice that the selection has been stolen. */
1125 Lisp_Object hooks
, selection_symbol
;
1127 hooks
= Vx_lost_selection_functions
;
1128 selection_symbol
= Fcar (Fcar (Vselection_alist
));
1130 if (!EQ (hooks
, Qunbound
))
1132 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
1133 call1 (Fcar (hooks
), selection_symbol
);
1134 #if 0 /* This can crash when deleting a frame
1135 from x_connection_closed. Anyway, it seems unnecessary;
1136 something else should cause a redisplay. */
1137 redisplay_preserve_echo_area (21);
1141 Vselection_alist
= Fcdr (Vselection_alist
);
1144 /* Delete elements after the beginning of Vselection_alist. */
1145 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
1146 if (EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest
))))))))
1148 /* Let random Lisp code notice that the selection has been stolen. */
1149 Lisp_Object hooks
, selection_symbol
;
1151 hooks
= Vx_lost_selection_functions
;
1152 selection_symbol
= Fcar (Fcar (XCDR (rest
)));
1154 if (!EQ (hooks
, Qunbound
))
1156 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
1157 call1 (Fcar (hooks
), selection_symbol
);
1158 #if 0 /* See above */
1159 redisplay_preserve_echo_area (22);
1162 XSETCDR (rest
, Fcdr (XCDR (rest
)));
1167 /* Nonzero if any properties for DISPLAY and WINDOW
1168 are on the list of what we are waiting for. */
1171 waiting_for_other_props_on_window (display
, window
)
1175 struct prop_location
*rest
= property_change_wait_list
;
1177 if (rest
->display
== display
&& rest
->window
== window
)
1184 /* Add an entry to the list of property changes we are waiting for.
1185 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1186 The return value is a number that uniquely identifies
1187 this awaited property change. */
1189 static struct prop_location
*
1190 expect_property_change (display
, window
, property
, state
)
1196 struct prop_location
*pl
= (struct prop_location
*) xmalloc (sizeof *pl
);
1197 pl
->identifier
= ++prop_location_identifier
;
1198 pl
->display
= display
;
1199 pl
->window
= window
;
1200 pl
->property
= property
;
1201 pl
->desired_state
= state
;
1202 pl
->next
= property_change_wait_list
;
1204 property_change_wait_list
= pl
;
1208 /* Delete an entry from the list of property changes we are waiting for.
1209 IDENTIFIER is the number that uniquely identifies the entry. */
1212 unexpect_property_change (location
)
1213 struct prop_location
*location
;
1215 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1218 if (rest
== location
)
1221 prev
->next
= rest
->next
;
1223 property_change_wait_list
= rest
->next
;
1232 /* Remove the property change expectation element for IDENTIFIER. */
1235 wait_for_property_change_unwind (loc
)
1238 struct prop_location
*location
= XSAVE_VALUE (loc
)->pointer
;
1240 unexpect_property_change (location
);
1241 if (location
== property_change_reply_object
)
1242 property_change_reply_object
= 0;
1246 /* Actually wait for a property change.
1247 IDENTIFIER should be the value that expect_property_change returned. */
1250 wait_for_property_change (location
)
1251 struct prop_location
*location
;
1254 int count
= SPECPDL_INDEX ();
1256 if (property_change_reply_object
)
1259 /* Make sure to do unexpect_property_change if we quit or err. */
1260 record_unwind_protect (wait_for_property_change_unwind
,
1261 make_save_value (location
, 0));
1263 XSETCAR (property_change_reply
, Qnil
);
1264 property_change_reply_object
= location
;
1266 /* If the event we are waiting for arrives beyond here, it will set
1267 property_change_reply, because property_change_reply_object says so. */
1268 if (! location
->arrived
)
1270 secs
= x_selection_timeout
/ 1000;
1271 usecs
= (x_selection_timeout
% 1000) * 1000;
1272 TRACE2 (" Waiting %d secs, %d usecs", secs
, usecs
);
1273 wait_reading_process_output (secs
, usecs
, 0, 0,
1274 property_change_reply
, NULL
, 0);
1276 if (NILP (XCAR (property_change_reply
)))
1278 TRACE0 (" Timed out");
1279 error ("Timed out waiting for property-notify event");
1283 unbind_to (count
, Qnil
);
1286 /* Called from XTread_socket in response to a PropertyNotify event. */
1289 x_handle_property_notify (event
)
1290 XPropertyEvent
*event
;
1292 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1297 && rest
->property
== event
->atom
1298 && rest
->window
== event
->window
1299 && rest
->display
== event
->display
1300 && rest
->desired_state
== event
->state
)
1302 TRACE2 ("Expected %s of property %s",
1303 (event
->state
== PropertyDelete
? "deletion" : "change"),
1304 XGetAtomName (event
->display
, event
->atom
));
1308 /* If this is the one wait_for_property_change is waiting for,
1309 tell it to wake up. */
1310 if (rest
== property_change_reply_object
)
1311 XSETCAR (property_change_reply
, Qt
);
1323 #if 0 /* #### MULTIPLE doesn't work yet */
1326 fetch_multiple_target (event
)
1327 XSelectionRequestEvent
*event
;
1329 Display
*display
= event
->display
;
1330 Window window
= event
->requestor
;
1331 Atom target
= event
->target
;
1332 Atom selection_atom
= event
->selection
;
1337 x_get_window_property_as_lisp_data (display
, window
, target
,
1338 QMULTIPLE
, selection_atom
));
1342 copy_multiple_data (obj
)
1349 return Fcons (XCAR (obj
), copy_multiple_data (XCDR (obj
)));
1352 vec
= Fmake_vector (size
= XVECTOR (obj
)->size
, Qnil
);
1353 for (i
= 0; i
< size
; i
++)
1355 Lisp_Object vec2
= XVECTOR (obj
)->contents
[i
];
1356 CHECK_VECTOR (vec2
);
1357 if (XVECTOR (vec2
)->size
!= 2)
1358 /* ??? Confusing error message */
1359 signal_error ("Vectors must be of length 2", vec2
);
1360 XVECTOR (vec
)->contents
[i
] = Fmake_vector (2, Qnil
);
1361 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[0]
1362 = XVECTOR (vec2
)->contents
[0];
1363 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[1]
1364 = XVECTOR (vec2
)->contents
[1];
1372 /* Variables for communication with x_handle_selection_notify. */
1373 static Atom reading_which_selection
;
1374 static Lisp_Object reading_selection_reply
;
1375 static Window reading_selection_window
;
1377 /* Do protocol to read selection-data from the server.
1378 Converts this to Lisp data and returns it. */
1381 x_get_foreign_selection (selection_symbol
, target_type
, time_stamp
)
1382 Lisp_Object selection_symbol
, target_type
, time_stamp
;
1384 struct frame
*sf
= SELECTED_FRAME ();
1385 Window requestor_window
;
1387 struct x_display_info
*dpyinfo
;
1388 Time requestor_time
= last_event_timestamp
;
1389 Atom target_property
;
1390 Atom selection_atom
;
1393 int count
= SPECPDL_INDEX ();
1396 if (! FRAME_X_P (sf
))
1399 requestor_window
= FRAME_X_WINDOW (sf
);
1400 display
= FRAME_X_DISPLAY (sf
);
1401 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1402 target_property
= dpyinfo
->Xatom_EMACS_TMP
;
1403 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_symbol
);
1405 if (CONSP (target_type
))
1406 type_atom
= symbol_to_x_atom (dpyinfo
, display
, XCAR (target_type
));
1408 type_atom
= symbol_to_x_atom (dpyinfo
, display
, target_type
);
1410 if (! NILP (time_stamp
))
1412 if (CONSP (time_stamp
))
1413 requestor_time
= (Time
) cons_to_long (time_stamp
);
1414 else if (INTEGERP (time_stamp
))
1415 requestor_time
= (Time
) XUINT (time_stamp
);
1416 else if (FLOATP (time_stamp
))
1417 requestor_time
= (Time
) XFLOAT_DATA (time_stamp
);
1419 error ("TIME_STAMP must be cons or number");
1424 /* The protected block contains wait_reading_process_output, which
1425 can run random lisp code (process handlers) or signal.
1426 Therefore, we put the x_uncatch_errors call in an unwind. */
1427 record_unwind_protect (x_catch_errors_unwind
, Qnil
);
1428 x_catch_errors (display
);
1430 TRACE2 ("Get selection %s, type %s",
1431 XGetAtomName (display
, type_atom
),
1432 XGetAtomName (display
, target_property
));
1434 XConvertSelection (display
, selection_atom
, type_atom
, target_property
,
1435 requestor_window
, requestor_time
);
1438 /* Prepare to block until the reply has been read. */
1439 reading_selection_window
= requestor_window
;
1440 reading_which_selection
= selection_atom
;
1441 XSETCAR (reading_selection_reply
, Qnil
);
1443 frame
= some_frame_on_display (dpyinfo
);
1445 /* If the display no longer has frames, we can't expect
1446 to get many more selection requests from it, so don't
1447 bother trying to queue them. */
1450 x_start_queuing_selection_requests ();
1452 record_unwind_protect (queue_selection_requests_unwind
,
1457 /* This allows quits. Also, don't wait forever. */
1458 secs
= x_selection_timeout
/ 1000;
1459 usecs
= (x_selection_timeout
% 1000) * 1000;
1460 TRACE1 (" Start waiting %d secs for SelectionNotify", secs
);
1461 wait_reading_process_output (secs
, usecs
, 0, 0,
1462 reading_selection_reply
, NULL
, 0);
1463 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply
)));
1466 if (x_had_errors_p (display
))
1467 error ("Cannot get selection");
1468 /* This calls x_uncatch_errors. */
1469 unbind_to (count
, Qnil
);
1472 if (NILP (XCAR (reading_selection_reply
)))
1473 error ("Timed out waiting for reply from selection owner");
1474 if (EQ (XCAR (reading_selection_reply
), Qlambda
))
1475 error ("No `%s' selection", SDATA (SYMBOL_NAME (selection_symbol
)));
1477 /* Otherwise, the selection is waiting for us on the requested property. */
1479 x_get_window_property_as_lisp_data (display
, requestor_window
,
1480 target_property
, target_type
,
1484 /* Subroutines of x_get_window_property_as_lisp_data */
1486 /* Use xfree, not XFree, to free the data obtained with this function. */
1489 x_get_window_property (display
, window
, property
, data_ret
, bytes_ret
,
1490 actual_type_ret
, actual_format_ret
, actual_size_ret
,
1495 unsigned char **data_ret
;
1497 Atom
*actual_type_ret
;
1498 int *actual_format_ret
;
1499 unsigned long *actual_size_ret
;
1503 unsigned long bytes_remaining
;
1505 unsigned char *tmp_data
= 0;
1507 int buffer_size
= SELECTION_QUANTUM (display
);
1509 if (buffer_size
> MAX_SELECTION_QUANTUM
)
1510 buffer_size
= MAX_SELECTION_QUANTUM
;
1514 /* First probe the thing to find out how big it is. */
1515 result
= XGetWindowProperty (display
, window
, property
,
1516 0L, 0L, False
, AnyPropertyType
,
1517 actual_type_ret
, actual_format_ret
,
1519 &bytes_remaining
, &tmp_data
);
1520 if (result
!= Success
)
1528 /* This was allocated by Xlib, so use XFree. */
1529 XFree ((char *) tmp_data
);
1531 if (*actual_type_ret
== None
|| *actual_format_ret
== 0)
1537 total_size
= bytes_remaining
+ 1;
1538 *data_ret
= (unsigned char *) xmalloc (total_size
);
1540 /* Now read, until we've gotten it all. */
1541 while (bytes_remaining
)
1543 #ifdef TRACE_SELECTION
1544 int last
= bytes_remaining
;
1547 = XGetWindowProperty (display
, window
, property
,
1548 (long)offset
/4, (long)buffer_size
/4,
1551 actual_type_ret
, actual_format_ret
,
1552 actual_size_ret
, &bytes_remaining
, &tmp_data
);
1554 TRACE2 ("Read %ld bytes from property %s",
1555 last
- bytes_remaining
,
1556 XGetAtomName (display
, property
));
1558 /* If this doesn't return Success at this point, it means that
1559 some clod deleted the selection while we were in the midst of
1560 reading it. Deal with that, I guess.... */
1561 if (result
!= Success
)
1564 /* The man page for XGetWindowProperty says:
1565 "If the returned format is 32, the returned data is represented
1566 as a long array and should be cast to that type to obtain the
1568 This applies even if long is more than 32 bits, the X library
1569 converts from 32 bit elements received from the X server to long
1570 and passes the long array to us. Thus, for that case bcopy can not
1571 be used. We convert to a 32 bit type here, because so much code
1574 The bytes and offsets passed to XGetWindowProperty refers to the
1575 property and those are indeed in 32 bit quantities if format is 32. */
1577 if (*actual_format_ret
== 32 && *actual_format_ret
< BITS_PER_LONG
)
1580 int *idata
= (int *) ((*data_ret
) + offset
);
1581 long *ldata
= (long *) tmp_data
;
1583 for (i
= 0; i
< *actual_size_ret
; ++i
)
1585 idata
[i
]= (int) ldata
[i
];
1591 *actual_size_ret
*= *actual_format_ret
/ 8;
1592 bcopy (tmp_data
, (*data_ret
) + offset
, *actual_size_ret
);
1593 offset
+= *actual_size_ret
;
1596 /* This was allocated by Xlib, so use XFree. */
1597 XFree ((char *) tmp_data
);
1602 *bytes_ret
= offset
;
1605 /* Use xfree, not XFree, to free the data obtained with this function. */
1608 receive_incremental_selection (display
, window
, property
, target_type
,
1609 min_size_bytes
, data_ret
, size_bytes_ret
,
1610 type_ret
, format_ret
, size_ret
)
1614 Lisp_Object target_type
; /* for error messages only */
1615 unsigned int min_size_bytes
;
1616 unsigned char **data_ret
;
1617 int *size_bytes_ret
;
1619 unsigned long *size_ret
;
1623 struct prop_location
*wait_object
;
1624 *size_bytes_ret
= min_size_bytes
;
1625 *data_ret
= (unsigned char *) xmalloc (*size_bytes_ret
);
1627 TRACE1 ("Read %d bytes incrementally", min_size_bytes
);
1629 /* At this point, we have read an INCR property.
1630 Delete the property to ack it.
1631 (But first, prepare to receive the next event in this handshake.)
1633 Now, we must loop, waiting for the sending window to put a value on
1634 that property, then reading the property, then deleting it to ack.
1635 We are done when the sender places a property of length 0.
1638 XSelectInput (display
, window
, STANDARD_EVENT_SET
| PropertyChangeMask
);
1639 TRACE1 (" Delete property %s",
1640 SDATA (SYMBOL_NAME (x_atom_to_symbol (display
, property
))));
1641 XDeleteProperty (display
, window
, property
);
1642 TRACE1 (" Expect new value of property %s",
1643 SDATA (SYMBOL_NAME (x_atom_to_symbol (display
, property
))));
1644 wait_object
= expect_property_change (display
, window
, property
,
1651 unsigned char *tmp_data
;
1654 TRACE0 (" Wait for property change");
1655 wait_for_property_change (wait_object
);
1657 /* expect it again immediately, because x_get_window_property may
1658 .. no it won't, I don't get it.
1659 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1660 TRACE0 (" Get property value");
1661 x_get_window_property (display
, window
, property
,
1662 &tmp_data
, &tmp_size_bytes
,
1663 type_ret
, format_ret
, size_ret
, 1);
1665 TRACE1 (" Read increment of %d bytes", tmp_size_bytes
);
1667 if (tmp_size_bytes
== 0) /* we're done */
1669 TRACE0 ("Done reading incrementally");
1671 if (! waiting_for_other_props_on_window (display
, window
))
1672 XSelectInput (display
, window
, STANDARD_EVENT_SET
);
1673 /* Use xfree, not XFree, because x_get_window_property
1674 calls xmalloc itself. */
1675 if (tmp_data
) xfree (tmp_data
);
1680 TRACE1 (" ACK by deleting property %s",
1681 XGetAtomName (display
, property
));
1682 XDeleteProperty (display
, window
, property
);
1683 wait_object
= expect_property_change (display
, window
, property
,
1688 if (*size_bytes_ret
< offset
+ tmp_size_bytes
)
1690 *size_bytes_ret
= offset
+ tmp_size_bytes
;
1691 *data_ret
= (unsigned char *) xrealloc (*data_ret
, *size_bytes_ret
);
1694 bcopy (tmp_data
, (*data_ret
) + offset
, tmp_size_bytes
);
1695 offset
+= tmp_size_bytes
;
1697 /* Use xfree, not XFree, because x_get_window_property
1698 calls xmalloc itself. */
1704 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1705 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1706 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1709 x_get_window_property_as_lisp_data (display
, window
, property
, target_type
,
1714 Lisp_Object target_type
; /* for error messages only */
1715 Atom selection_atom
; /* for error messages only */
1719 unsigned long actual_size
;
1720 unsigned char *data
= 0;
1723 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1725 TRACE0 ("Reading selection data");
1727 x_get_window_property (display
, window
, property
, &data
, &bytes
,
1728 &actual_type
, &actual_format
, &actual_size
, 1);
1731 int there_is_a_selection_owner
;
1733 there_is_a_selection_owner
1734 = XGetSelectionOwner (display
, selection_atom
);
1736 if (there_is_a_selection_owner
)
1737 signal_error ("Selection owner couldn't convert",
1739 ? list2 (target_type
,
1740 x_atom_to_symbol (display
, actual_type
))
1743 signal_error ("No selection",
1744 x_atom_to_symbol (display
, selection_atom
));
1747 if (actual_type
== dpyinfo
->Xatom_INCR
)
1749 /* That wasn't really the data, just the beginning. */
1751 unsigned int min_size_bytes
= * ((unsigned int *) data
);
1753 /* Use xfree, not XFree, because x_get_window_property
1754 calls xmalloc itself. */
1755 xfree ((char *) data
);
1757 receive_incremental_selection (display
, window
, property
, target_type
,
1758 min_size_bytes
, &data
, &bytes
,
1759 &actual_type
, &actual_format
,
1764 TRACE1 (" Delete property %s", XGetAtomName (display
, property
));
1765 XDeleteProperty (display
, window
, property
);
1769 /* It's been read. Now convert it to a lisp object in some semi-rational
1771 val
= selection_data_to_lisp_data (display
, data
, bytes
,
1772 actual_type
, actual_format
);
1774 /* Use xfree, not XFree, because x_get_window_property
1775 calls xmalloc itself. */
1776 xfree ((char *) data
);
1780 /* These functions convert from the selection data read from the server into
1781 something that we can use from Lisp, and vice versa.
1783 Type: Format: Size: Lisp Type:
1784 ----- ------- ----- -----------
1787 ATOM 32 > 1 Vector of Symbols
1789 * 16 > 1 Vector of Integers
1790 * 32 1 if <=16 bits: Integer
1791 if > 16 bits: Cons of top16, bot16
1792 * 32 > 1 Vector of the above
1794 When converting a Lisp number to C, it is assumed to be of format 16 if
1795 it is an integer, and of format 32 if it is a cons of two integers.
1797 When converting a vector of numbers from Lisp to C, it is assumed to be
1798 of format 16 if every element in the vector is an integer, and is assumed
1799 to be of format 32 if any element is a cons of two integers.
1801 When converting an object to C, it may be of the form (SYMBOL . <data>)
1802 where SYMBOL is what we should claim that the type is. Format and
1803 representation are as above.
1805 Important: When format is 32, data should contain an array of int,
1806 not an array of long as the X library returns. This makes a difference
1807 when sizeof(long) != sizeof(int). */
1812 selection_data_to_lisp_data (display
, data
, size
, type
, format
)
1814 unsigned char *data
;
1818 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1820 if (type
== dpyinfo
->Xatom_NULL
)
1823 /* Convert any 8-bit data to a string, for compactness. */
1824 else if (format
== 8)
1826 Lisp_Object str
, lispy_type
;
1828 str
= make_unibyte_string ((char *) data
, size
);
1829 /* Indicate that this string is from foreign selection by a text
1830 property `foreign-selection' so that the caller of
1831 x-get-selection-internal (usually x-get-selection) can know
1832 that the string must be decode. */
1833 if (type
== dpyinfo
->Xatom_COMPOUND_TEXT
)
1834 lispy_type
= QCOMPOUND_TEXT
;
1835 else if (type
== dpyinfo
->Xatom_UTF8_STRING
)
1836 lispy_type
= QUTF8_STRING
;
1838 lispy_type
= QSTRING
;
1839 Fput_text_property (make_number (0), make_number (size
),
1840 Qforeign_selection
, lispy_type
, str
);
1843 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1844 a vector of symbols.
1846 else if (type
== XA_ATOM
)
1849 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1850 But the callers of these function has made sure the data for
1851 format == 32 is an array of int. Thus, use int instead
1853 int *idata
= (int *) data
;
1855 if (size
== sizeof (int))
1856 return x_atom_to_symbol (display
, (Atom
) idata
[0]);
1859 Lisp_Object v
= Fmake_vector (make_number (size
/ sizeof (int)),
1861 for (i
= 0; i
< size
/ sizeof (int); i
++)
1862 Faset (v
, make_number (i
),
1863 x_atom_to_symbol (display
, (Atom
) idata
[i
]));
1868 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1869 If the number is 32 bits and won't fit in a Lisp_Int,
1870 convert it to a cons of integers, 16 bits in each half.
1872 else if (format
== 32 && size
== sizeof (int))
1873 return long_to_cons (((unsigned int *) data
) [0]);
1874 else if (format
== 16 && size
== sizeof (short))
1875 return make_number ((int) (((unsigned short *) data
) [0]));
1877 /* Convert any other kind of data to a vector of numbers, represented
1878 as above (as an integer, or a cons of two 16 bit integers.)
1880 else if (format
== 16)
1884 v
= Fmake_vector (make_number (size
/ 2), make_number (0));
1885 for (i
= 0; i
< size
/ 2; i
++)
1887 int j
= (int) ((unsigned short *) data
) [i
];
1888 Faset (v
, make_number (i
), make_number (j
));
1895 Lisp_Object v
= Fmake_vector (make_number (size
/ 4), make_number (0));
1896 for (i
= 0; i
< size
/ 4; i
++)
1898 unsigned int j
= ((unsigned int *) data
) [i
];
1899 Faset (v
, make_number (i
), long_to_cons (j
));
1906 /* Use xfree, not XFree, to free the data obtained with this function. */
1909 lisp_data_to_selection_data (display
, obj
,
1910 data_ret
, type_ret
, size_ret
,
1911 format_ret
, nofree_ret
)
1914 unsigned char **data_ret
;
1916 unsigned int *size_ret
;
1920 Lisp_Object type
= Qnil
;
1921 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1925 if (CONSP (obj
) && SYMBOLP (XCAR (obj
)))
1929 if (CONSP (obj
) && NILP (XCDR (obj
)))
1933 if (EQ (obj
, QNULL
) || (EQ (type
, QNULL
)))
1934 { /* This is not the same as declining */
1940 else if (STRINGP (obj
))
1942 if (SCHARS (obj
) < SBYTES (obj
))
1943 /* OBJ is a multibyte string containing a non-ASCII char. */
1944 signal_error ("Non-ASCII string must be encoded in advance", obj
);
1948 *size_ret
= SBYTES (obj
);
1949 *data_ret
= SDATA (obj
);
1952 else if (SYMBOLP (obj
))
1956 *data_ret
= (unsigned char *) xmalloc (sizeof (Atom
) + 1);
1957 (*data_ret
) [sizeof (Atom
)] = 0;
1958 (*(Atom
**) data_ret
) [0] = symbol_to_x_atom (dpyinfo
, display
, obj
);
1959 if (NILP (type
)) type
= QATOM
;
1961 else if (INTEGERP (obj
)
1962 && XINT (obj
) < 0xFFFF
1963 && XINT (obj
) > -0xFFFF)
1967 *data_ret
= (unsigned char *) xmalloc (sizeof (short) + 1);
1968 (*data_ret
) [sizeof (short)] = 0;
1969 (*(short **) data_ret
) [0] = (short) XINT (obj
);
1970 if (NILP (type
)) type
= QINTEGER
;
1972 else if (INTEGERP (obj
)
1973 || (CONSP (obj
) && INTEGERP (XCAR (obj
))
1974 && (INTEGERP (XCDR (obj
))
1975 || (CONSP (XCDR (obj
))
1976 && INTEGERP (XCAR (XCDR (obj
)))))))
1980 *data_ret
= (unsigned char *) xmalloc (sizeof (long) + 1);
1981 (*data_ret
) [sizeof (long)] = 0;
1982 (*(unsigned long **) data_ret
) [0] = cons_to_long (obj
);
1983 if (NILP (type
)) type
= QINTEGER
;
1985 else if (VECTORP (obj
))
1987 /* Lisp_Vectors may represent a set of ATOMs;
1988 a set of 16 or 32 bit INTEGERs;
1989 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1993 if (SYMBOLP (XVECTOR (obj
)->contents
[0]))
1994 /* This vector is an ATOM set */
1996 if (NILP (type
)) type
= QATOM
;
1997 *size_ret
= XVECTOR (obj
)->size
;
1999 *data_ret
= (unsigned char *) xmalloc ((*size_ret
) * sizeof (Atom
));
2000 for (i
= 0; i
< *size_ret
; i
++)
2001 if (SYMBOLP (XVECTOR (obj
)->contents
[i
]))
2002 (*(Atom
**) data_ret
) [i
]
2003 = symbol_to_x_atom (dpyinfo
, display
, XVECTOR (obj
)->contents
[i
]);
2005 signal_error ("All elements of selection vector must have same type", obj
);
2007 #if 0 /* #### MULTIPLE doesn't work yet */
2008 else if (VECTORP (XVECTOR (obj
)->contents
[0]))
2009 /* This vector is an ATOM_PAIR set */
2011 if (NILP (type
)) type
= QATOM_PAIR
;
2012 *size_ret
= XVECTOR (obj
)->size
;
2014 *data_ret
= (unsigned char *)
2015 xmalloc ((*size_ret
) * sizeof (Atom
) * 2);
2016 for (i
= 0; i
< *size_ret
; i
++)
2017 if (VECTORP (XVECTOR (obj
)->contents
[i
]))
2019 Lisp_Object pair
= XVECTOR (obj
)->contents
[i
];
2020 if (XVECTOR (pair
)->size
!= 2)
2022 "Elements of the vector must be vectors of exactly two elements",
2025 (*(Atom
**) data_ret
) [i
* 2]
2026 = symbol_to_x_atom (dpyinfo
, display
,
2027 XVECTOR (pair
)->contents
[0]);
2028 (*(Atom
**) data_ret
) [(i
* 2) + 1]
2029 = symbol_to_x_atom (dpyinfo
, display
,
2030 XVECTOR (pair
)->contents
[1]);
2033 signal_error ("All elements of the vector must be of the same type",
2039 /* This vector is an INTEGER set, or something like it */
2042 *size_ret
= XVECTOR (obj
)->size
;
2043 if (NILP (type
)) type
= QINTEGER
;
2045 for (i
= 0; i
< *size_ret
; i
++)
2046 if (CONSP (XVECTOR (obj
)->contents
[i
]))
2048 else if (!INTEGERP (XVECTOR (obj
)->contents
[i
]))
2049 signal_error (/* Qselection_error */
2050 "Elements of selection vector must be integers or conses of integers",
2053 /* Use sizeof(long) even if it is more than 32 bits. See comment
2054 in x_get_window_property and x_fill_property_data. */
2056 if (*format_ret
== 32) data_size
= sizeof(long);
2057 *data_ret
= (unsigned char *) xmalloc (*size_ret
* data_size
);
2058 for (i
= 0; i
< *size_ret
; i
++)
2059 if (*format_ret
== 32)
2060 (*((unsigned long **) data_ret
)) [i
]
2061 = cons_to_long (XVECTOR (obj
)->contents
[i
]);
2063 (*((unsigned short **) data_ret
)) [i
]
2064 = (unsigned short) cons_to_long (XVECTOR (obj
)->contents
[i
]);
2068 signal_error (/* Qselection_error */ "Unrecognized selection data", obj
);
2070 *type_ret
= symbol_to_x_atom (dpyinfo
, display
, type
);
2074 clean_local_selection_data (obj
)
2078 && INTEGERP (XCAR (obj
))
2079 && CONSP (XCDR (obj
))
2080 && INTEGERP (XCAR (XCDR (obj
)))
2081 && NILP (XCDR (XCDR (obj
))))
2082 obj
= Fcons (XCAR (obj
), XCDR (obj
));
2085 && INTEGERP (XCAR (obj
))
2086 && INTEGERP (XCDR (obj
)))
2088 if (XINT (XCAR (obj
)) == 0)
2090 if (XINT (XCAR (obj
)) == -1)
2091 return make_number (- XINT (XCDR (obj
)));
2096 int size
= XVECTOR (obj
)->size
;
2099 return clean_local_selection_data (XVECTOR (obj
)->contents
[0]);
2100 copy
= Fmake_vector (make_number (size
), Qnil
);
2101 for (i
= 0; i
< size
; i
++)
2102 XVECTOR (copy
)->contents
[i
]
2103 = clean_local_selection_data (XVECTOR (obj
)->contents
[i
]);
2109 /* Called from XTread_socket to handle SelectionNotify events.
2110 If it's the selection we are waiting for, stop waiting
2111 by setting the car of reading_selection_reply to non-nil.
2112 We store t there if the reply is successful, lambda if not. */
2115 x_handle_selection_notify (event
)
2116 XSelectionEvent
*event
;
2118 if (event
->requestor
!= reading_selection_window
)
2120 if (event
->selection
!= reading_which_selection
)
2123 TRACE0 ("Received SelectionNotify");
2124 XSETCAR (reading_selection_reply
,
2125 (event
->property
!= 0 ? Qt
: Qlambda
));
2129 DEFUN ("x-own-selection-internal", Fx_own_selection_internal
,
2130 Sx_own_selection_internal
, 2, 2, 0,
2131 doc
: /* Assert an X selection of the given TYPE with the given VALUE.
2132 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2133 \(Those are literal upper-case symbol names, since that's what X expects.)
2134 VALUE is typically a string, or a cons of two markers, but may be
2135 anything that the functions on `selection-converter-alist' know about. */)
2136 (selection_name
, selection_value
)
2137 Lisp_Object selection_name
, selection_value
;
2140 CHECK_SYMBOL (selection_name
);
2141 if (NILP (selection_value
)) error ("SELECTION-VALUE may not be nil");
2142 x_own_selection (selection_name
, selection_value
);
2143 return selection_value
;
2147 /* Request the selection value from the owner. If we are the owner,
2148 simply return our selection value. If we are not the owner, this
2149 will block until all of the data has arrived. */
2151 DEFUN ("x-get-selection-internal", Fx_get_selection_internal
,
2152 Sx_get_selection_internal
, 2, 3, 0,
2153 doc
: /* Return text selected from some X window.
2154 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2155 \(Those are literal upper-case symbol names, since that's what X expects.)
2156 TYPE is the type of data desired, typically `STRING'.
2157 TIME_STAMP is the time to use in the XConvertSelection call for foreign
2158 selections. If omitted, defaults to the time for the last event. */)
2159 (selection_symbol
, target_type
, time_stamp
)
2160 Lisp_Object selection_symbol
, target_type
, time_stamp
;
2162 Lisp_Object val
= Qnil
;
2163 struct gcpro gcpro1
, gcpro2
;
2164 GCPRO2 (target_type
, val
); /* we store newly consed data into these */
2166 CHECK_SYMBOL (selection_symbol
);
2168 #if 0 /* #### MULTIPLE doesn't work yet */
2169 if (CONSP (target_type
)
2170 && XCAR (target_type
) == QMULTIPLE
)
2172 CHECK_VECTOR (XCDR (target_type
));
2173 /* So we don't destructively modify this... */
2174 target_type
= copy_multiple_data (target_type
);
2178 CHECK_SYMBOL (target_type
);
2180 val
= x_get_local_selection (selection_symbol
, target_type
, 1);
2184 val
= x_get_foreign_selection (selection_symbol
, target_type
, time_stamp
);
2189 && SYMBOLP (XCAR (val
)))
2192 if (CONSP (val
) && NILP (XCDR (val
)))
2195 val
= clean_local_selection_data (val
);
2201 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal
,
2202 Sx_disown_selection_internal
, 1, 2, 0,
2203 doc
: /* If we own the selection SELECTION, disown it.
2204 Disowning it means there is no such selection. */)
2206 Lisp_Object selection
;
2210 Atom selection_atom
;
2212 struct selection_input_event sie
;
2213 struct input_event ie
;
2216 struct x_display_info
*dpyinfo
;
2217 struct frame
*sf
= SELECTED_FRAME ();
2220 if (! FRAME_X_P (sf
))
2223 display
= FRAME_X_DISPLAY (sf
);
2224 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2225 CHECK_SYMBOL (selection
);
2227 timestamp
= last_event_timestamp
;
2229 timestamp
= cons_to_long (time
);
2231 if (NILP (assq_no_quit (selection
, Vselection_alist
)))
2232 return Qnil
; /* Don't disown the selection when we're not the owner. */
2234 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection
);
2237 XSetSelectionOwner (display
, selection_atom
, None
, timestamp
);
2240 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2241 generated for a window which owns the selection when that window sets
2242 the selection owner to None. The NCD server does, the MIT Sun4 server
2243 doesn't. So we synthesize one; this means we might get two, but
2244 that's ok, because the second one won't have any effect. */
2245 SELECTION_EVENT_DISPLAY (&event
.sie
) = display
;
2246 SELECTION_EVENT_SELECTION (&event
.sie
) = selection_atom
;
2247 SELECTION_EVENT_TIME (&event
.sie
) = timestamp
;
2248 x_handle_selection_clear (&event
.ie
);
2253 /* Get rid of all the selections in buffer BUFFER.
2254 This is used when we kill a buffer. */
2257 x_disown_buffer_selections (buffer
)
2261 struct buffer
*buf
= XBUFFER (buffer
);
2263 for (tail
= Vselection_alist
; CONSP (tail
); tail
= XCDR (tail
))
2265 Lisp_Object elt
, value
;
2268 if (CONSP (value
) && MARKERP (XCAR (value
))
2269 && XMARKER (XCAR (value
))->buffer
== buf
)
2270 Fx_disown_selection_internal (XCAR (elt
), Qnil
);
2274 DEFUN ("x-selection-owner-p", Fx_selection_owner_p
, Sx_selection_owner_p
,
2276 doc
: /* Whether the current Emacs process owns the given X Selection.
2277 The arg should be the name of the selection in question, typically one of
2278 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2279 \(Those are literal upper-case symbol names, since that's what X expects.)
2280 For convenience, the symbol nil is the same as `PRIMARY',
2281 and t is the same as `SECONDARY'. */)
2283 Lisp_Object selection
;
2286 CHECK_SYMBOL (selection
);
2287 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2288 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2290 if (NILP (Fassq (selection
, Vselection_alist
)))
2295 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
2297 doc
: /* Whether there is an owner for the given X Selection.
2298 The arg should be the name of the selection in question, typically one of
2299 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2300 \(Those are literal upper-case symbol names, since that's what X expects.)
2301 For convenience, the symbol nil is the same as `PRIMARY',
2302 and t is the same as `SECONDARY'. */)
2304 Lisp_Object selection
;
2309 struct frame
*sf
= SELECTED_FRAME ();
2311 /* It should be safe to call this before we have an X frame. */
2312 if (! FRAME_X_P (sf
))
2315 dpy
= FRAME_X_DISPLAY (sf
);
2316 CHECK_SYMBOL (selection
);
2317 if (!NILP (Fx_selection_owner_p (selection
)))
2319 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2320 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2321 atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
), dpy
, selection
);
2325 owner
= XGetSelectionOwner (dpy
, atom
);
2327 return (owner
? Qt
: Qnil
);
2331 #ifdef CUT_BUFFER_SUPPORT
2333 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2335 initialize_cut_buffers (display
, window
)
2339 unsigned char *data
= (unsigned char *) "";
2341 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2342 PropModeAppend, data, 0)
2343 FROB (XA_CUT_BUFFER0
);
2344 FROB (XA_CUT_BUFFER1
);
2345 FROB (XA_CUT_BUFFER2
);
2346 FROB (XA_CUT_BUFFER3
);
2347 FROB (XA_CUT_BUFFER4
);
2348 FROB (XA_CUT_BUFFER5
);
2349 FROB (XA_CUT_BUFFER6
);
2350 FROB (XA_CUT_BUFFER7
);
2356 #define CHECK_CUT_BUFFER(symbol) \
2357 do { CHECK_SYMBOL ((symbol)); \
2358 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2359 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2360 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2361 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2362 signal_error ("Doesn't name a cut buffer", (symbol)); \
2365 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal
,
2366 Sx_get_cut_buffer_internal
, 1, 1, 0,
2367 doc
: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */)
2373 unsigned char *data
;
2380 struct x_display_info
*dpyinfo
;
2381 struct frame
*sf
= SELECTED_FRAME ();
2385 if (! FRAME_X_P (sf
))
2388 display
= FRAME_X_DISPLAY (sf
);
2389 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2390 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2391 CHECK_CUT_BUFFER (buffer
);
2392 buffer_atom
= symbol_to_x_atom (dpyinfo
, display
, buffer
);
2394 x_get_window_property (display
, window
, buffer_atom
, &data
, &bytes
,
2395 &type
, &format
, &size
, 0);
2396 if (!data
|| !format
)
2399 if (format
!= 8 || type
!= XA_STRING
)
2400 signal_error ("Cut buffer doesn't contain 8-bit data",
2401 list2 (x_atom_to_symbol (display
, type
),
2402 make_number (format
)));
2404 ret
= (bytes
? make_unibyte_string ((char *) data
, bytes
) : Qnil
);
2405 /* Use xfree, not XFree, because x_get_window_property
2406 calls xmalloc itself. */
2412 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal
,
2413 Sx_store_cut_buffer_internal
, 2, 2, 0,
2414 doc
: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
2416 Lisp_Object buffer
, string
;
2420 unsigned char *data
;
2422 int bytes_remaining
;
2425 struct frame
*sf
= SELECTED_FRAME ();
2429 if (! FRAME_X_P (sf
))
2432 display
= FRAME_X_DISPLAY (sf
);
2433 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2435 max_bytes
= SELECTION_QUANTUM (display
);
2436 if (max_bytes
> MAX_SELECTION_QUANTUM
)
2437 max_bytes
= MAX_SELECTION_QUANTUM
;
2439 CHECK_CUT_BUFFER (buffer
);
2440 CHECK_STRING (string
);
2441 buffer_atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
),
2443 data
= (unsigned char *) SDATA (string
);
2444 bytes
= SBYTES (string
);
2445 bytes_remaining
= bytes
;
2447 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2449 initialize_cut_buffers (display
, window
);
2450 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2455 /* Don't mess up with an empty value. */
2456 if (!bytes_remaining
)
2457 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2458 PropModeReplace
, data
, 0);
2460 while (bytes_remaining
)
2462 int chunk
= (bytes_remaining
< max_bytes
2463 ? bytes_remaining
: max_bytes
);
2464 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2465 (bytes_remaining
== bytes
2470 bytes_remaining
-= chunk
;
2477 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal
,
2478 Sx_rotate_cut_buffers_internal
, 1, 1, 0,
2479 doc
: /* Rotate the values of the cut buffers by the given number of step.
2480 Positive means shift the values forward, negative means backward. */)
2487 struct frame
*sf
= SELECTED_FRAME ();
2491 if (! FRAME_X_P (sf
))
2494 display
= FRAME_X_DISPLAY (sf
);
2495 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2499 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2501 initialize_cut_buffers (display
, window
);
2502 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2505 props
[0] = XA_CUT_BUFFER0
;
2506 props
[1] = XA_CUT_BUFFER1
;
2507 props
[2] = XA_CUT_BUFFER2
;
2508 props
[3] = XA_CUT_BUFFER3
;
2509 props
[4] = XA_CUT_BUFFER4
;
2510 props
[5] = XA_CUT_BUFFER5
;
2511 props
[6] = XA_CUT_BUFFER6
;
2512 props
[7] = XA_CUT_BUFFER7
;
2514 XRotateWindowProperties (display
, window
, props
, 8, XINT (n
));
2521 /***********************************************************************
2522 Drag and drop support
2523 ***********************************************************************/
2524 /* Check that lisp values are of correct type for x_fill_property_data.
2525 That is, number, string or a cons with two numbers (low and high 16
2526 bit parts of a 32 bit number). */
2529 x_check_property_data (data
)
2535 for (iter
= data
; CONSP (iter
) && size
!= -1; iter
= XCDR (iter
), ++size
)
2537 Lisp_Object o
= XCAR (iter
);
2539 if (! NUMBERP (o
) && ! STRINGP (o
) && ! CONSP (o
))
2541 else if (CONSP (o
) &&
2542 (! NUMBERP (XCAR (o
)) || ! NUMBERP (XCDR (o
))))
2549 /* Convert lisp values to a C array. Values may be a number, a string
2550 which is taken as an X atom name and converted to the atom value, or
2551 a cons containing the two 16 bit parts of a 32 bit number.
2553 DPY is the display use to look up X atoms.
2554 DATA is a Lisp list of values to be converted.
2555 RET is the C array that contains the converted values. It is assumed
2556 it is big enough to hold all values.
2557 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2558 be stored in RET. Note that long is used for 32 even if long is more
2559 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2560 XClientMessageEvent). */
2563 x_fill_property_data (dpy
, data
, ret
, format
)
2570 long *d32
= (long *) ret
;
2571 short *d16
= (short *) ret
;
2572 char *d08
= (char *) ret
;
2575 for (iter
= data
; CONSP (iter
); iter
= XCDR (iter
))
2577 Lisp_Object o
= XCAR (iter
);
2580 val
= (long) XFASTINT (o
);
2581 else if (FLOATP (o
))
2582 val
= (long) XFLOAT_DATA (o
);
2584 val
= (long) cons_to_long (o
);
2585 else if (STRINGP (o
))
2588 val
= (long) XInternAtom (dpy
, (char *) SDATA (o
), False
);
2592 error ("Wrong type, must be string, number or cons");
2595 *d08
++ = (char) val
;
2596 else if (format
== 16)
2597 *d16
++ = (short) val
;
2603 /* Convert an array of C values to a Lisp list.
2604 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2605 DATA is a C array of values to be converted.
2606 TYPE is the type of the data. Only XA_ATOM is special, it converts
2607 each number in DATA to its corresponfing X atom as a symbol.
2608 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2610 SIZE is the number of elements in DATA.
2612 Important: When format is 32, data should contain an array of int,
2613 not an array of long as the X library returns. This makes a difference
2614 when sizeof(long) != sizeof(int).
2616 Also see comment for selection_data_to_lisp_data above. */
2619 x_property_data_to_lisp (f
, data
, type
, format
, size
)
2621 unsigned char *data
;
2626 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f
),
2627 data
, size
*format
/8, type
, format
);
2630 /* Get the mouse position in frame relative coordinates. */
2633 mouse_position_for_drop (f
, x
, y
)
2638 Window root
, dummy_window
;
2643 XQueryPointer (FRAME_X_DISPLAY (f
),
2644 DefaultRootWindow (FRAME_X_DISPLAY (f
)),
2646 /* The root window which contains the pointer. */
2649 /* Window pointer is on, not used */
2652 /* The position on that root window. */
2655 /* x/y in dummy_window coordinates, not used. */
2658 /* Modifier keys and pointer buttons, about which
2660 (unsigned int *) &dummy
);
2663 /* Absolute to relative. */
2664 *x
-= f
->left_pos
+ FRAME_OUTER_TO_INNER_DIFF_X (f
);
2665 *y
-= f
->top_pos
+ FRAME_OUTER_TO_INNER_DIFF_Y (f
);
2670 DEFUN ("x-get-atom-name", Fx_get_atom_name
,
2671 Sx_get_atom_name
, 1, 2, 0,
2672 doc
: /* Return the X atom name for VALUE as a string.
2673 VALUE may be a number or a cons where the car is the upper 16 bits and
2674 the cdr is the lower 16 bits of a 32 bit value.
2675 Use the display for FRAME or the current frame if FRAME is not given or nil.
2677 If the value is 0 or the atom is not known, return the empty string. */)
2679 Lisp_Object value
, frame
;
2681 struct frame
*f
= check_x_frame (frame
);
2683 Lisp_Object ret
= Qnil
;
2684 Display
*dpy
= FRAME_X_DISPLAY (f
);
2688 if (INTEGERP (value
))
2689 atom
= (Atom
) XUINT (value
);
2690 else if (FLOATP (value
))
2691 atom
= (Atom
) XFLOAT_DATA (value
);
2692 else if (CONSP (value
))
2693 atom
= (Atom
) cons_to_long (value
);
2695 error ("Wrong type, value must be number or cons");
2698 x_catch_errors (dpy
);
2699 name
= atom
? XGetAtomName (dpy
, atom
) : "";
2700 had_errors
= x_had_errors_p (dpy
);
2701 x_uncatch_errors ();
2704 ret
= make_string (name
, strlen (name
));
2706 if (atom
&& name
) XFree (name
);
2707 if (NILP (ret
)) ret
= empty_unibyte_string
;
2714 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom
,
2715 Sx_register_dnd_atom
, 1, 2, 0,
2716 doc
: /* Request that dnd events are made for ClientMessages with ATOM.
2717 ATOM can be a symbol or a string. The ATOM is interned on the display that
2718 FRAME is on. If FRAME is nil, the selected frame is used. */)
2720 Lisp_Object atom
, frame
;
2723 struct frame
*f
= check_x_frame (frame
);
2725 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2729 x_atom
= symbol_to_x_atom (dpyinfo
, FRAME_X_DISPLAY (f
), atom
);
2730 else if (STRINGP (atom
))
2733 x_atom
= XInternAtom (FRAME_X_DISPLAY (f
), (char *) SDATA (atom
), False
);
2737 error ("ATOM must be a symbol or a string");
2739 for (i
= 0; i
< dpyinfo
->x_dnd_atoms_length
; ++i
)
2740 if (dpyinfo
->x_dnd_atoms
[i
] == x_atom
)
2743 if (dpyinfo
->x_dnd_atoms_length
== dpyinfo
->x_dnd_atoms_size
)
2745 dpyinfo
->x_dnd_atoms_size
*= 2;
2746 dpyinfo
->x_dnd_atoms
= xrealloc (dpyinfo
->x_dnd_atoms
,
2747 sizeof (*dpyinfo
->x_dnd_atoms
)
2748 * dpyinfo
->x_dnd_atoms_size
);
2751 dpyinfo
->x_dnd_atoms
[dpyinfo
->x_dnd_atoms_length
++] = x_atom
;
2755 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2758 x_handle_dnd_message (f
, event
, dpyinfo
, bufp
)
2760 XClientMessageEvent
*event
;
2761 struct x_display_info
*dpyinfo
;
2762 struct input_event
*bufp
;
2766 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2767 unsigned long size
= 160/event
->format
;
2769 unsigned char *data
= (unsigned char *) event
->data
.b
;
2773 for (i
= 0; i
< dpyinfo
->x_dnd_atoms_length
; ++i
)
2774 if (dpyinfo
->x_dnd_atoms
[i
] == event
->message_type
) break;
2776 if (i
== dpyinfo
->x_dnd_atoms_length
) return 0;
2778 XSETFRAME (frame
, f
);
2780 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2781 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2782 function expects them to be of size int (i.e. 32). So to be able to
2783 use that function, put the data in the form it expects if format is 32. */
2785 if (event
->format
== 32 && event
->format
< BITS_PER_LONG
)
2788 for (i
= 0; i
< 5; ++i
) /* There are only 5 longs in a ClientMessage. */
2789 idata
[i
] = (int) event
->data
.l
[i
];
2790 data
= (unsigned char *) idata
;
2793 vec
= Fmake_vector (make_number (4), Qnil
);
2794 ASET (vec
, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f
),
2795 event
->message_type
)));
2796 ASET (vec
, 1, frame
);
2797 ASET (vec
, 2, make_number (event
->format
));
2798 ASET (vec
, 3, x_property_data_to_lisp (f
,
2800 event
->message_type
,
2804 mouse_position_for_drop (f
, &x
, &y
);
2805 bufp
->kind
= DRAG_N_DROP_EVENT
;
2806 bufp
->frame_or_window
= frame
;
2807 bufp
->timestamp
= CurrentTime
;
2808 bufp
->x
= make_number (x
);
2809 bufp
->y
= make_number (y
);
2811 bufp
->modifiers
= 0;
2816 DEFUN ("x-send-client-message", Fx_send_client_event
,
2817 Sx_send_client_message
, 6, 6, 0,
2818 doc
: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2820 For DISPLAY, specify either a frame or a display name (a string).
2821 If DISPLAY is nil, that stands for the selected frame's display.
2822 DEST may be a number, in which case it is a Window id. The value 0 may
2823 be used to send to the root window of the DISPLAY.
2824 If DEST is a cons, it is converted to a 32 bit number
2825 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2826 number is then used as a window id.
2827 If DEST is a frame the event is sent to the outer window of that frame.
2828 Nil means the currently selected frame.
2829 If DEST is the string "PointerWindow" the event is sent to the window that
2830 contains the pointer. If DEST is the string "InputFocus" the event is
2831 sent to the window that has the input focus.
2832 FROM is the frame sending the event. Use nil for currently selected frame.
2833 MESSAGE-TYPE is the name of an Atom as a string.
2834 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2835 bits. VALUES is a list of numbers, cons and/or strings containing the values
2836 to send. If a value is a string, it is converted to an Atom and the value of
2837 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2838 with the high 16 bits from the car and the lower 16 bit from the cdr.
2839 If more values than fits into the event is given, the excessive values
2841 (display
, dest
, from
, message_type
, format
, values
)
2842 Lisp_Object display
, dest
, from
, message_type
, format
, values
;
2844 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
2849 struct frame
*f
= check_x_frame (from
);
2852 CHECK_STRING (message_type
);
2853 CHECK_NUMBER (format
);
2854 CHECK_CONS (values
);
2856 if (x_check_property_data (values
) == -1)
2857 error ("Bad data in VALUES, must be number, cons or string");
2859 event
.xclient
.type
= ClientMessage
;
2860 event
.xclient
.format
= XFASTINT (format
);
2862 if (event
.xclient
.format
!= 8 && event
.xclient
.format
!= 16
2863 && event
.xclient
.format
!= 32)
2864 error ("FORMAT must be one of 8, 16 or 32");
2866 if (FRAMEP (dest
) || NILP (dest
))
2868 struct frame
*fdest
= check_x_frame (dest
);
2869 wdest
= FRAME_OUTER_WINDOW (fdest
);
2871 else if (STRINGP (dest
))
2873 if (strcmp (SDATA (dest
), "PointerWindow") == 0)
2874 wdest
= PointerWindow
;
2875 else if (strcmp (SDATA (dest
), "InputFocus") == 0)
2878 error ("DEST as a string must be one of PointerWindow or InputFocus");
2880 else if (INTEGERP (dest
))
2881 wdest
= (Window
) XFASTINT (dest
);
2882 else if (FLOATP (dest
))
2883 wdest
= (Window
) XFLOAT_DATA (dest
);
2884 else if (CONSP (dest
))
2886 if (! NUMBERP (XCAR (dest
)) || ! NUMBERP (XCDR (dest
)))
2887 error ("Both car and cdr for DEST must be numbers");
2889 wdest
= (Window
) cons_to_long (dest
);
2892 error ("DEST must be a frame, nil, string, number or cons");
2894 if (wdest
== 0) wdest
= dpyinfo
->root_window
;
2895 to_root
= wdest
== dpyinfo
->root_window
;
2897 for (cons
= values
, size
= 0; CONSP (cons
); cons
= XCDR (cons
), ++size
)
2902 event
.xclient
.message_type
2903 = XInternAtom (dpyinfo
->display
, SDATA (message_type
), False
);
2904 event
.xclient
.display
= dpyinfo
->display
;
2906 /* Some clients (metacity for example) expects sending window to be here
2907 when sending to the root window. */
2908 event
.xclient
.window
= to_root
? FRAME_OUTER_WINDOW (f
) : wdest
;
2911 memset (event
.xclient
.data
.b
, 0, sizeof (event
.xclient
.data
.b
));
2912 x_fill_property_data (dpyinfo
->display
, values
, event
.xclient
.data
.b
,
2913 event
.xclient
.format
);
2915 /* If event mask is 0 the event is sent to the client that created
2916 the destination window. But if we are sending to the root window,
2917 there is no such client. Then we set the event mask to 0xffff. The
2918 event then goes to clients selecting for events on the root window. */
2919 x_catch_errors (dpyinfo
->display
);
2921 int propagate
= to_root
? False
: True
;
2922 unsigned mask
= to_root
? 0xffff : 0;
2923 XSendEvent (dpyinfo
->display
, wdest
, propagate
, mask
, &event
);
2924 XFlush (dpyinfo
->display
);
2926 x_uncatch_errors ();
2936 defsubr (&Sx_get_selection_internal
);
2937 defsubr (&Sx_own_selection_internal
);
2938 defsubr (&Sx_disown_selection_internal
);
2939 defsubr (&Sx_selection_owner_p
);
2940 defsubr (&Sx_selection_exists_p
);
2942 #ifdef CUT_BUFFER_SUPPORT
2943 defsubr (&Sx_get_cut_buffer_internal
);
2944 defsubr (&Sx_store_cut_buffer_internal
);
2945 defsubr (&Sx_rotate_cut_buffers_internal
);
2948 defsubr (&Sx_get_atom_name
);
2949 defsubr (&Sx_send_client_message
);
2950 defsubr (&Sx_register_dnd_atom
);
2952 reading_selection_reply
= Fcons (Qnil
, Qnil
);
2953 staticpro (&reading_selection_reply
);
2954 reading_selection_window
= 0;
2955 reading_which_selection
= 0;
2957 property_change_wait_list
= 0;
2958 prop_location_identifier
= 0;
2959 property_change_reply
= Fcons (Qnil
, Qnil
);
2960 staticpro (&property_change_reply
);
2962 Vselection_alist
= Qnil
;
2963 staticpro (&Vselection_alist
);
2965 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist
,
2966 doc
: /* An alist associating X Windows selection-types with functions.
2967 These functions are called to convert the selection, with three args:
2968 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2969 a desired type to which the selection should be converted;
2970 and the local selection value (whatever was given to `x-own-selection').
2972 The function should return the value to send to the X server
2973 \(typically a string). A return value of nil
2974 means that the conversion could not be done.
2975 A return value which is the symbol `NULL'
2976 means that a side-effect was executed,
2977 and there is no meaningful selection value. */);
2978 Vselection_converter_alist
= Qnil
;
2980 DEFVAR_LISP ("x-lost-selection-functions", &Vx_lost_selection_functions
,
2981 doc
: /* A list of functions to be called when Emacs loses an X selection.
2982 \(This happens when some other X client makes its own selection
2983 or when a Lisp program explicitly clears the selection.)
2984 The functions are called with one argument, the selection type
2985 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2986 Vx_lost_selection_functions
= Qnil
;
2988 DEFVAR_LISP ("x-sent-selection-functions", &Vx_sent_selection_functions
,
2989 doc
: /* A list of functions to be called when Emacs answers a selection request.
2990 The functions are called with four arguments:
2991 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2992 - the selection-type which Emacs was asked to convert the
2993 selection into before sending (for example, `STRING' or `LENGTH');
2994 - a flag indicating success or failure for responding to the request.
2995 We might have failed (and declined the request) for any number of reasons,
2996 including being asked for a selection that we no longer own, or being asked
2997 to convert into a type that we don't know about or that is inappropriate.
2998 This hook doesn't let you change the behavior of Emacs's selection replies,
2999 it merely informs you that they have happened. */);
3000 Vx_sent_selection_functions
= Qnil
;
3002 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout
,
3003 doc
: /* Number of milliseconds to wait for a selection reply.
3004 If the selection owner doesn't reply in this time, we give up.
3005 A value of 0 means wait as long as necessary. This is initialized from the
3006 \"*selectionTimeout\" resource. */);
3007 x_selection_timeout
= 0;
3009 QPRIMARY
= intern ("PRIMARY"); staticpro (&QPRIMARY
);
3010 QSECONDARY
= intern ("SECONDARY"); staticpro (&QSECONDARY
);
3011 QSTRING
= intern ("STRING"); staticpro (&QSTRING
);
3012 QINTEGER
= intern ("INTEGER"); staticpro (&QINTEGER
);
3013 QCLIPBOARD
= intern ("CLIPBOARD"); staticpro (&QCLIPBOARD
);
3014 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
3015 QTEXT
= intern ("TEXT"); staticpro (&QTEXT
);
3016 QCOMPOUND_TEXT
= intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT
);
3017 QUTF8_STRING
= intern ("UTF8_STRING"); staticpro (&QUTF8_STRING
);
3018 QDELETE
= intern ("DELETE"); staticpro (&QDELETE
);
3019 QMULTIPLE
= intern ("MULTIPLE"); staticpro (&QMULTIPLE
);
3020 QINCR
= intern ("INCR"); staticpro (&QINCR
);
3021 QEMACS_TMP
= intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP
);
3022 QTARGETS
= intern ("TARGETS"); staticpro (&QTARGETS
);
3023 QATOM
= intern ("ATOM"); staticpro (&QATOM
);
3024 QATOM_PAIR
= intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR
);
3025 QNULL
= intern ("NULL"); staticpro (&QNULL
);
3026 Qcompound_text_with_extensions
= intern ("compound-text-with-extensions");
3027 staticpro (&Qcompound_text_with_extensions
);
3029 #ifdef CUT_BUFFER_SUPPORT
3030 QCUT_BUFFER0
= intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0
);
3031 QCUT_BUFFER1
= intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1
);
3032 QCUT_BUFFER2
= intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2
);
3033 QCUT_BUFFER3
= intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3
);
3034 QCUT_BUFFER4
= intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4
);
3035 QCUT_BUFFER5
= intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5
);
3036 QCUT_BUFFER6
= intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6
);
3037 QCUT_BUFFER7
= intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7
);
3040 Qforeign_selection
= intern ("foreign-selection");
3041 staticpro (&Qforeign_selection
);
3044 /* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236
3045 (do not change this comment) */