1 /* X Selection processing for Emacs.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2004
3 Free Software Foundation.
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 2, 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., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 /* Rewritten by jwz */
26 #include <stdio.h> /* termhooks.h needs this */
28 #include "xterm.h" /* for all of the X includes */
29 #include "dispextern.h" /* frame.h seems to want this */
30 #include "frame.h" /* Need this to get the X window of selected_frame */
31 #include "blockinput.h"
34 #include "termhooks.h"
36 #include <X11/Xproto.h>
40 static Lisp_Object x_atom_to_symbol
P_ ((Display
*dpy
, Atom atom
));
41 static Atom symbol_to_x_atom
P_ ((struct x_display_info
*, Display
*,
43 static void x_own_selection
P_ ((Lisp_Object
, Lisp_Object
));
44 static Lisp_Object x_get_local_selection
P_ ((Lisp_Object
, Lisp_Object
, int));
45 static void x_decline_selection_request
P_ ((struct input_event
*));
46 static Lisp_Object x_selection_request_lisp_error
P_ ((Lisp_Object
));
47 static Lisp_Object queue_selection_requests_unwind
P_ ((Lisp_Object
));
48 static Lisp_Object some_frame_on_display
P_ ((struct x_display_info
*));
49 static void x_reply_selection_request
P_ ((struct input_event
*, int,
50 unsigned char *, int, Atom
));
51 static int waiting_for_other_props_on_window
P_ ((Display
*, Window
));
52 static struct prop_location
*expect_property_change
P_ ((Display
*, Window
,
54 static void unexpect_property_change
P_ ((struct prop_location
*));
55 static Lisp_Object wait_for_property_change_unwind
P_ ((Lisp_Object
));
56 static void wait_for_property_change
P_ ((struct prop_location
*));
57 static Lisp_Object x_get_foreign_selection
P_ ((Lisp_Object
,
60 static void x_get_window_property
P_ ((Display
*, Window
, Atom
,
61 unsigned char **, int *,
62 Atom
*, int *, unsigned long *, int));
63 static void receive_incremental_selection
P_ ((Display
*, Window
, Atom
,
64 Lisp_Object
, unsigned,
65 unsigned char **, int *,
66 Atom
*, int *, unsigned long *));
67 static Lisp_Object x_get_window_property_as_lisp_data
P_ ((Display
*,
70 static Lisp_Object selection_data_to_lisp_data
P_ ((Display
*, unsigned char *,
72 static void lisp_data_to_selection_data
P_ ((Display
*, Lisp_Object
,
73 unsigned char **, Atom
*,
74 unsigned *, int *, int *));
75 static Lisp_Object clean_local_selection_data
P_ ((Lisp_Object
));
76 static void initialize_cut_buffers
P_ ((Display
*, Window
));
79 /* Printing traces to stderr. */
81 #ifdef TRACE_SELECTION
83 fprintf (stderr, "%d: " fmt "\n", getpid ())
84 #define TRACE1(fmt, a0) \
85 fprintf (stderr, "%d: " fmt "\n", getpid (), a0)
86 #define TRACE2(fmt, a0, a1) \
87 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1)
89 #define TRACE0(fmt) (void) 0
90 #define TRACE1(fmt, a0) (void) 0
91 #define TRACE2(fmt, a0, a1) (void) 0
95 #define CUT_BUFFER_SUPPORT
97 Lisp_Object QPRIMARY
, QSECONDARY
, QSTRING
, QINTEGER
, QCLIPBOARD
, QTIMESTAMP
,
98 QTEXT
, QDELETE
, QMULTIPLE
, QINCR
, QEMACS_TMP
, QTARGETS
, QATOM
, QNULL
,
101 Lisp_Object QCOMPOUND_TEXT
; /* This is a type of selection. */
102 Lisp_Object QUTF8_STRING
; /* This is a type of selection. */
104 Lisp_Object Qcompound_text_with_extensions
;
106 #ifdef CUT_BUFFER_SUPPORT
107 Lisp_Object QCUT_BUFFER0
, QCUT_BUFFER1
, QCUT_BUFFER2
, QCUT_BUFFER3
,
108 QCUT_BUFFER4
, QCUT_BUFFER5
, QCUT_BUFFER6
, QCUT_BUFFER7
;
111 static Lisp_Object Vx_lost_selection_hooks
;
112 static Lisp_Object Vx_sent_selection_hooks
;
113 /* Coding system for communicating with other X clients via cutbuffer,
114 selection, and clipboard. */
115 static Lisp_Object Vselection_coding_system
;
117 /* Coding system for the next communicating with other X clients. */
118 static Lisp_Object Vnext_selection_coding_system
;
120 static Lisp_Object Qforeign_selection
;
122 /* If this is a smaller number than the max-request-size of the display,
123 emacs will use INCR selection transfer when the selection is larger
124 than this. The max-request-size is usually around 64k, so if you want
125 emacs to use incremental selection transfers when the selection is
126 smaller than that, set this. I added this mostly for debugging the
127 incremental transfer stuff, but it might improve server performance. */
128 #define MAX_SELECTION_QUANTUM 0xFFFFFF
131 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
133 #define SELECTION_QUANTUM(dpy) (((dpy)->max_request_size << 2) - 100)
136 /* The timestamp of the last input event Emacs received from the X server. */
137 /* Defined in keyboard.c. */
138 extern unsigned long last_event_timestamp
;
140 /* This is an association list whose elements are of the form
141 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
142 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
143 SELECTION-VALUE is the value that emacs owns for that selection.
144 It may be any kind of Lisp object.
145 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
146 as a cons of two 16-bit numbers (making a 32 bit time.)
147 FRAME is the frame for which we made the selection.
148 If there is an entry in this alist, then it can be assumed that Emacs owns
150 The only (eq) parts of this list that are visible from Lisp are the
152 static Lisp_Object Vselection_alist
;
154 /* This is an alist whose CARs are selection-types (whose names are the same
155 as the names of X Atoms) and whose CDRs are the names of Lisp functions to
156 call to convert the given Emacs selection value to a string representing
157 the given selection type. This is for Lisp-level extension of the emacs
158 selection handling. */
159 static Lisp_Object Vselection_converter_alist
;
161 /* If the selection owner takes too long to reply to a selection request,
162 we give up on it. This is in milliseconds (0 = no timeout.) */
163 static EMACS_INT x_selection_timeout
;
165 /* Utility functions */
167 static void lisp_data_to_selection_data ();
168 static Lisp_Object
selection_data_to_lisp_data ();
169 static Lisp_Object
x_get_window_property_as_lisp_data ();
171 /* This converts a Lisp symbol to a server Atom, avoiding a server
172 roundtrip whenever possible. */
175 symbol_to_x_atom (dpyinfo
, display
, sym
)
176 struct x_display_info
*dpyinfo
;
181 if (NILP (sym
)) return 0;
182 if (EQ (sym
, QPRIMARY
)) return XA_PRIMARY
;
183 if (EQ (sym
, QSECONDARY
)) return XA_SECONDARY
;
184 if (EQ (sym
, QSTRING
)) return XA_STRING
;
185 if (EQ (sym
, QINTEGER
)) return XA_INTEGER
;
186 if (EQ (sym
, QATOM
)) return XA_ATOM
;
187 if (EQ (sym
, QCLIPBOARD
)) return dpyinfo
->Xatom_CLIPBOARD
;
188 if (EQ (sym
, QTIMESTAMP
)) return dpyinfo
->Xatom_TIMESTAMP
;
189 if (EQ (sym
, QTEXT
)) return dpyinfo
->Xatom_TEXT
;
190 if (EQ (sym
, QCOMPOUND_TEXT
)) return dpyinfo
->Xatom_COMPOUND_TEXT
;
191 if (EQ (sym
, QUTF8_STRING
)) return dpyinfo
->Xatom_UTF8_STRING
;
192 if (EQ (sym
, QDELETE
)) return dpyinfo
->Xatom_DELETE
;
193 if (EQ (sym
, QMULTIPLE
)) return dpyinfo
->Xatom_MULTIPLE
;
194 if (EQ (sym
, QINCR
)) return dpyinfo
->Xatom_INCR
;
195 if (EQ (sym
, QEMACS_TMP
)) return dpyinfo
->Xatom_EMACS_TMP
;
196 if (EQ (sym
, QTARGETS
)) return dpyinfo
->Xatom_TARGETS
;
197 if (EQ (sym
, QNULL
)) return dpyinfo
->Xatom_NULL
;
198 #ifdef CUT_BUFFER_SUPPORT
199 if (EQ (sym
, QCUT_BUFFER0
)) return XA_CUT_BUFFER0
;
200 if (EQ (sym
, QCUT_BUFFER1
)) return XA_CUT_BUFFER1
;
201 if (EQ (sym
, QCUT_BUFFER2
)) return XA_CUT_BUFFER2
;
202 if (EQ (sym
, QCUT_BUFFER3
)) return XA_CUT_BUFFER3
;
203 if (EQ (sym
, QCUT_BUFFER4
)) return XA_CUT_BUFFER4
;
204 if (EQ (sym
, QCUT_BUFFER5
)) return XA_CUT_BUFFER5
;
205 if (EQ (sym
, QCUT_BUFFER6
)) return XA_CUT_BUFFER6
;
206 if (EQ (sym
, QCUT_BUFFER7
)) return XA_CUT_BUFFER7
;
208 if (!SYMBOLP (sym
)) abort ();
210 TRACE1 (" XInternAtom %s", (char *) SDATA (SYMBOL_NAME (sym
)));
212 val
= XInternAtom (display
, (char *) SDATA (SYMBOL_NAME (sym
)), False
);
218 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
219 and calls to intern whenever possible. */
222 x_atom_to_symbol (dpy
, atom
)
226 struct x_display_info
*dpyinfo
;
245 #ifdef CUT_BUFFER_SUPPORT
265 dpyinfo
= x_display_info_for_display (dpy
);
266 if (atom
== dpyinfo
->Xatom_CLIPBOARD
)
268 if (atom
== dpyinfo
->Xatom_TIMESTAMP
)
270 if (atom
== dpyinfo
->Xatom_TEXT
)
272 if (atom
== dpyinfo
->Xatom_COMPOUND_TEXT
)
273 return QCOMPOUND_TEXT
;
274 if (atom
== dpyinfo
->Xatom_UTF8_STRING
)
276 if (atom
== dpyinfo
->Xatom_DELETE
)
278 if (atom
== dpyinfo
->Xatom_MULTIPLE
)
280 if (atom
== dpyinfo
->Xatom_INCR
)
282 if (atom
== dpyinfo
->Xatom_EMACS_TMP
)
284 if (atom
== dpyinfo
->Xatom_TARGETS
)
286 if (atom
== dpyinfo
->Xatom_NULL
)
290 str
= XGetAtomName (dpy
, atom
);
292 TRACE1 ("XGetAtomName --> %s", str
);
293 if (! str
) return Qnil
;
296 /* This was allocated by Xlib, so use XFree. */
302 /* Do protocol to assert ourself as a selection owner.
303 Update the Vselection_alist so that we can reply to later requests for
307 x_own_selection (selection_name
, selection_value
)
308 Lisp_Object selection_name
, selection_value
;
310 struct frame
*sf
= SELECTED_FRAME ();
311 Window selecting_window
= FRAME_X_WINDOW (sf
);
312 Display
*display
= FRAME_X_DISPLAY (sf
);
313 Time time
= last_event_timestamp
;
315 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
318 CHECK_SYMBOL (selection_name
);
319 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_name
);
322 count
= x_catch_errors (display
);
323 XSetSelectionOwner (display
, selection_atom
, selecting_window
, time
);
324 x_check_errors (display
, "Can't set selection: %s");
325 x_uncatch_errors (display
, count
);
328 /* Now update the local cache */
330 Lisp_Object selection_time
;
331 Lisp_Object selection_data
;
332 Lisp_Object prev_value
;
334 selection_time
= long_to_cons ((unsigned long) time
);
335 selection_data
= Fcons (selection_name
,
336 Fcons (selection_value
,
337 Fcons (selection_time
,
338 Fcons (selected_frame
, Qnil
))));
339 prev_value
= assq_no_quit (selection_name
, Vselection_alist
);
341 Vselection_alist
= Fcons (selection_data
, Vselection_alist
);
343 /* If we already owned the selection, remove the old selection data.
344 Perhaps we should destructively modify it instead.
345 Don't use Fdelq as that may QUIT. */
346 if (!NILP (prev_value
))
348 Lisp_Object rest
; /* we know it's not the CAR, so it's easy. */
349 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
350 if (EQ (prev_value
, Fcar (XCDR (rest
))))
352 XSETCDR (rest
, Fcdr (XCDR (rest
)));
359 /* Given a selection-name and desired type, look up our local copy of
360 the selection value and convert it to the type.
361 The value is nil or a string.
362 This function is used both for remote requests (LOCAL_REQUEST is zero)
363 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
365 This calls random Lisp code, and may signal or gc. */
368 x_get_local_selection (selection_symbol
, target_type
, local_request
)
369 Lisp_Object selection_symbol
, target_type
;
372 Lisp_Object local_value
;
373 Lisp_Object handler_fn
, value
, type
, check
;
376 local_value
= assq_no_quit (selection_symbol
, Vselection_alist
);
378 if (NILP (local_value
)) return Qnil
;
380 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
381 if (EQ (target_type
, QTIMESTAMP
))
384 value
= XCAR (XCDR (XCDR (local_value
)));
387 else if (EQ (target_type
, QDELETE
))
390 Fx_disown_selection_internal
392 XCAR (XCDR (XCDR (local_value
))));
397 #if 0 /* #### MULTIPLE doesn't work yet */
398 else if (CONSP (target_type
)
399 && XCAR (target_type
) == QMULTIPLE
)
404 pairs
= XCDR (target_type
);
405 size
= XVECTOR (pairs
)->size
;
406 /* If the target is MULTIPLE, then target_type looks like
407 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
408 We modify the second element of each pair in the vector and
409 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
411 for (i
= 0; i
< size
; i
++)
414 pair
= XVECTOR (pairs
)->contents
[i
];
415 XVECTOR (pair
)->contents
[1]
416 = x_get_local_selection (XVECTOR (pair
)->contents
[0],
417 XVECTOR (pair
)->contents
[1],
425 /* Don't allow a quit within the converter.
426 When the user types C-g, he would be surprised
427 if by luck it came during a converter. */
428 count
= SPECPDL_INDEX ();
429 specbind (Qinhibit_quit
, Qt
);
431 CHECK_SYMBOL (target_type
);
432 handler_fn
= Fcdr (Fassq (target_type
, Vselection_converter_alist
));
433 /* gcpro is not needed here since nothing but HANDLER_FN
434 is live, and that ought to be a symbol. */
436 if (!NILP (handler_fn
))
437 value
= call3 (handler_fn
,
438 selection_symbol
, (local_request
? Qnil
: target_type
),
439 XCAR (XCDR (local_value
)));
442 unbind_to (count
, Qnil
);
445 /* Make sure this value is of a type that we could transmit
446 to another X client. */
450 && SYMBOLP (XCAR (value
)))
452 check
= XCDR (value
);
460 /* Check for a value that cons_to_long could handle. */
461 else if (CONSP (check
)
462 && INTEGERP (XCAR (check
))
463 && (INTEGERP (XCDR (check
))
465 (CONSP (XCDR (check
))
466 && INTEGERP (XCAR (XCDR (check
)))
467 && NILP (XCDR (XCDR (check
))))))
472 Fcons (build_string ("invalid data returned by selection-conversion function"),
473 Fcons (handler_fn
, Fcons (value
, Qnil
))));
476 /* Subroutines of x_reply_selection_request. */
478 /* Send a SelectionNotify event to the requestor with property=None,
479 meaning we were unable to do what they wanted. */
482 x_decline_selection_request (event
)
483 struct input_event
*event
;
485 XSelectionEvent reply
;
488 reply
.type
= SelectionNotify
;
489 reply
.display
= SELECTION_EVENT_DISPLAY (event
);
490 reply
.requestor
= SELECTION_EVENT_REQUESTOR (event
);
491 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
492 reply
.time
= SELECTION_EVENT_TIME (event
);
493 reply
.target
= SELECTION_EVENT_TARGET (event
);
494 reply
.property
= None
;
496 /* The reason for the error may be that the receiver has
497 died in the meantime. Handle that case. */
499 count
= x_catch_errors (reply
.display
);
500 XSendEvent (reply
.display
, reply
.requestor
, False
, 0L, (XEvent
*) &reply
);
501 XFlush (reply
.display
);
502 x_uncatch_errors (reply
.display
, count
);
506 /* This is the selection request currently being processed.
507 It is set to zero when the request is fully processed. */
508 static struct input_event
*x_selection_current_request
;
510 /* Display info in x_selection_request. */
512 static struct x_display_info
*selection_request_dpyinfo
;
514 /* Used as an unwind-protect clause so that, if a selection-converter signals
515 an error, we tell the requester that we were unable to do what they wanted
516 before we throw to top-level or go into the debugger or whatever. */
519 x_selection_request_lisp_error (ignore
)
522 if (x_selection_current_request
!= 0
523 && selection_request_dpyinfo
->display
)
524 x_decline_selection_request (x_selection_current_request
);
529 /* This stuff is so that INCR selections are reentrant (that is, so we can
530 be servicing multiple INCR selection requests simultaneously.) I haven't
531 actually tested that yet. */
533 /* Keep a list of the property changes that are awaited. */
543 struct prop_location
*next
;
546 static struct prop_location
*expect_property_change ();
547 static void wait_for_property_change ();
548 static void unexpect_property_change ();
549 static int waiting_for_other_props_on_window ();
551 static int prop_location_identifier
;
553 static Lisp_Object property_change_reply
;
555 static struct prop_location
*property_change_reply_object
;
557 static struct prop_location
*property_change_wait_list
;
560 queue_selection_requests_unwind (frame
)
563 FRAME_PTR f
= XFRAME (frame
);
566 x_stop_queuing_selection_requests (FRAME_X_DISPLAY (f
));
570 /* Return some frame whose display info is DPYINFO.
571 Return nil if there is none. */
574 some_frame_on_display (dpyinfo
)
575 struct x_display_info
*dpyinfo
;
577 Lisp_Object list
, frame
;
579 FOR_EACH_FRAME (list
, frame
)
581 if (FRAME_X_DISPLAY_INFO (XFRAME (frame
)) == dpyinfo
)
588 /* Send the reply to a selection request event EVENT.
589 TYPE is the type of selection data requested.
590 DATA and SIZE describe the data to send, already converted.
591 FORMAT is the unit-size (in bits) of the data to be transmitted. */
594 x_reply_selection_request (event
, format
, data
, size
, type
)
595 struct input_event
*event
;
600 XSelectionEvent reply
;
601 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
602 Window window
= SELECTION_EVENT_REQUESTOR (event
);
604 int format_bytes
= format
/8;
605 int max_bytes
= SELECTION_QUANTUM (display
);
606 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
609 if (max_bytes
> MAX_SELECTION_QUANTUM
)
610 max_bytes
= MAX_SELECTION_QUANTUM
;
612 reply
.type
= SelectionNotify
;
613 reply
.display
= display
;
614 reply
.requestor
= window
;
615 reply
.selection
= SELECTION_EVENT_SELECTION (event
);
616 reply
.time
= SELECTION_EVENT_TIME (event
);
617 reply
.target
= SELECTION_EVENT_TARGET (event
);
618 reply
.property
= SELECTION_EVENT_PROPERTY (event
);
619 if (reply
.property
== None
)
620 reply
.property
= reply
.target
;
622 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */
624 count
= x_catch_errors (display
);
626 /* Store the data on the requested property.
627 If the selection is large, only store the first N bytes of it.
629 bytes_remaining
= size
* format_bytes
;
630 if (bytes_remaining
<= max_bytes
)
632 /* Send all the data at once, with minimal handshaking. */
633 TRACE1 ("Sending all %d bytes", bytes_remaining
);
634 XChangeProperty (display
, window
, reply
.property
, type
, format
,
635 PropModeReplace
, data
, size
);
636 /* At this point, the selection was successfully stored; ack it. */
637 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
641 /* Send an INCR selection. */
642 struct prop_location
*wait_object
;
646 frame
= some_frame_on_display (dpyinfo
);
648 /* If the display no longer has frames, we can't expect
649 to get many more selection requests from it, so don't
650 bother trying to queue them. */
653 x_start_queuing_selection_requests (display
);
655 record_unwind_protect (queue_selection_requests_unwind
,
659 if (x_window_to_frame (dpyinfo
, window
)) /* #### debug */
660 error ("Attempt to transfer an INCR to ourself!");
662 TRACE2 ("Start sending %d bytes incrementally (%s)",
663 bytes_remaining
, XGetAtomName (display
, reply
.property
));
664 wait_object
= expect_property_change (display
, window
, reply
.property
,
667 TRACE1 ("Set %s to number of bytes to send",
668 XGetAtomName (display
, reply
.property
));
669 XChangeProperty (display
, window
, reply
.property
, dpyinfo
->Xatom_INCR
,
671 (unsigned char *) &bytes_remaining
, 1);
672 XSelectInput (display
, window
, PropertyChangeMask
);
674 /* Tell 'em the INCR data is there... */
675 TRACE0 ("Send SelectionNotify event");
676 XSendEvent (display
, window
, False
, 0L, (XEvent
*) &reply
);
679 had_errors
= x_had_errors_p (display
);
682 /* First, wait for the requester to ack by deleting the property.
683 This can run random lisp code (process handlers) or signal. */
686 TRACE1 ("Waiting for ACK (deletion of %s)",
687 XGetAtomName (display
, reply
.property
));
688 wait_for_property_change (wait_object
);
692 while (bytes_remaining
)
694 int i
= ((bytes_remaining
< max_bytes
)
701 = expect_property_change (display
, window
, reply
.property
,
704 TRACE1 ("Sending increment of %d bytes", i
);
705 TRACE1 ("Set %s to increment data",
706 XGetAtomName (display
, reply
.property
));
708 /* Append the next chunk of data to the property. */
709 XChangeProperty (display
, window
, reply
.property
, type
, format
,
710 PropModeAppend
, data
, i
/ format_bytes
);
711 bytes_remaining
-= i
;
714 had_errors
= x_had_errors_p (display
);
720 /* Now wait for the requester to ack this chunk by deleting the
721 property. This can run random lisp code or signal. */
722 TRACE1 ("Waiting for increment ACK (deletion of %s)",
723 XGetAtomName (display
, reply
.property
));
724 wait_for_property_change (wait_object
);
727 /* Now write a zero-length chunk to the property to tell the
728 requester that we're done. */
730 if (! waiting_for_other_props_on_window (display
, window
))
731 XSelectInput (display
, window
, 0L);
733 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
734 XGetAtomName (display
, reply
.property
));
735 XChangeProperty (display
, window
, reply
.property
, type
, format
,
736 PropModeReplace
, data
, 0);
737 TRACE0 ("Done sending incrementally");
740 /* rms, 2003-01-03: I think I have fixed this bug. */
741 /* The window we're communicating with may have been deleted
742 in the meantime (that's a real situation from a bug report).
743 In this case, there may be events in the event queue still
744 refering to the deleted window, and we'll get a BadWindow error
745 in XTread_socket when processing the events. I don't have
746 an idea how to fix that. gerd, 2001-01-98. */
747 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
748 delivered before uncatch errors. */
749 XSync (display
, False
);
752 /* GTK queues events in addition to the queue in Xlib. So we
753 UNBLOCK to enter the event loop and get possible errors delivered,
754 and then BLOCK again because x_uncatch_errors requires it. */
756 x_uncatch_errors (display
, count
);
760 /* Handle a SelectionRequest event EVENT.
761 This is called from keyboard.c when such an event is found in the queue. */
764 x_handle_selection_request (event
)
765 struct input_event
*event
;
767 struct gcpro gcpro1
, gcpro2
, gcpro3
;
768 Lisp_Object local_selection_data
;
769 Lisp_Object selection_symbol
;
770 Lisp_Object target_symbol
;
771 Lisp_Object converted_selection
;
772 Time local_selection_time
;
773 Lisp_Object successful_p
;
775 struct x_display_info
*dpyinfo
776 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event
));
778 local_selection_data
= Qnil
;
779 target_symbol
= Qnil
;
780 converted_selection
= Qnil
;
783 GCPRO3 (local_selection_data
, converted_selection
, target_symbol
);
785 selection_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
786 SELECTION_EVENT_SELECTION (event
));
788 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
790 if (NILP (local_selection_data
))
792 /* Someone asked for the selection, but we don't have it any more.
794 x_decline_selection_request (event
);
798 local_selection_time
= (Time
)
799 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
801 if (SELECTION_EVENT_TIME (event
) != CurrentTime
802 && local_selection_time
> SELECTION_EVENT_TIME (event
))
804 /* Someone asked for the selection, and we have one, but not the one
807 x_decline_selection_request (event
);
811 x_selection_current_request
= event
;
812 count
= SPECPDL_INDEX ();
813 selection_request_dpyinfo
= dpyinfo
;
814 record_unwind_protect (x_selection_request_lisp_error
, Qnil
);
816 target_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
817 SELECTION_EVENT_TARGET (event
));
819 #if 0 /* #### MULTIPLE doesn't work yet */
820 if (EQ (target_symbol
, QMULTIPLE
))
821 target_symbol
= fetch_multiple_target (event
);
824 /* Convert lisp objects back into binary data */
827 = x_get_local_selection (selection_symbol
, target_symbol
, 0);
829 if (! NILP (converted_selection
))
837 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event
),
839 &data
, &type
, &size
, &format
, &nofree
);
841 x_reply_selection_request (event
, format
, data
, size
, type
);
844 /* Indicate we have successfully processed this event. */
845 x_selection_current_request
= 0;
847 /* Use xfree, not XFree, because lisp_data_to_selection_data
848 calls xmalloc itself. */
852 unbind_to (count
, Qnil
);
856 /* Let random lisp code notice that the selection has been asked for. */
859 rest
= Vx_sent_selection_hooks
;
860 if (!EQ (rest
, Qunbound
))
861 for (; CONSP (rest
); rest
= Fcdr (rest
))
862 call3 (Fcar (rest
), selection_symbol
, target_symbol
, successful_p
);
868 /* Handle a SelectionClear event EVENT, which indicates that some
869 client cleared out our previously asserted selection.
870 This is called from keyboard.c when such an event is found in the queue. */
873 x_handle_selection_clear (event
)
874 struct input_event
*event
;
876 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
877 Atom selection
= SELECTION_EVENT_SELECTION (event
);
878 Time changed_owner_time
= SELECTION_EVENT_TIME (event
);
880 Lisp_Object selection_symbol
, local_selection_data
;
881 Time local_selection_time
;
882 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
883 struct x_display_info
*t_dpyinfo
;
885 /* If the new selection owner is also Emacs,
886 don't clear the new selection. */
888 /* Check each display on the same terminal,
889 to see if this Emacs job now owns the selection
890 through that display. */
891 for (t_dpyinfo
= x_display_list
; t_dpyinfo
; t_dpyinfo
= t_dpyinfo
->next
)
892 if (t_dpyinfo
->kboard
== dpyinfo
->kboard
)
895 = XGetSelectionOwner (t_dpyinfo
->display
, selection
);
896 if (x_window_to_frame (t_dpyinfo
, owner_window
) != 0)
904 selection_symbol
= x_atom_to_symbol (display
, selection
);
906 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
908 /* Well, we already believe that we don't own it, so that's just fine. */
909 if (NILP (local_selection_data
)) return;
911 local_selection_time
= (Time
)
912 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
914 /* This SelectionClear is for a selection that we no longer own, so we can
915 disregard it. (That is, we have reasserted the selection since this
916 request was generated.) */
918 if (changed_owner_time
!= CurrentTime
919 && local_selection_time
> changed_owner_time
)
922 /* Otherwise, we're really honest and truly being told to drop it.
923 Don't use Fdelq as that may QUIT;. */
925 if (EQ (local_selection_data
, Fcar (Vselection_alist
)))
926 Vselection_alist
= Fcdr (Vselection_alist
);
930 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
931 if (EQ (local_selection_data
, Fcar (XCDR (rest
))))
933 XSETCDR (rest
, Fcdr (XCDR (rest
)));
938 /* Let random lisp code notice that the selection has been stolen. */
942 rest
= Vx_lost_selection_hooks
;
943 if (!EQ (rest
, Qunbound
))
945 for (; CONSP (rest
); rest
= Fcdr (rest
))
946 call1 (Fcar (rest
), selection_symbol
);
947 prepare_menu_bars ();
948 redisplay_preserve_echo_area (20);
953 /* Clear all selections that were made from frame F.
954 We do this when about to delete a frame. */
957 x_clear_frame_selections (f
)
963 XSETFRAME (frame
, f
);
965 /* Otherwise, we're really honest and truly being told to drop it.
966 Don't use Fdelq as that may QUIT;. */
968 /* Delete elements from the beginning of Vselection_alist. */
969 while (!NILP (Vselection_alist
)
970 && EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist
)))))))
972 /* Let random Lisp code notice that the selection has been stolen. */
973 Lisp_Object hooks
, selection_symbol
;
975 hooks
= Vx_lost_selection_hooks
;
976 selection_symbol
= Fcar (Fcar (Vselection_alist
));
978 if (!EQ (hooks
, Qunbound
))
980 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
981 call1 (Fcar (hooks
), selection_symbol
);
982 #if 0 /* This can crash when deleting a frame
983 from x_connection_closed. Anyway, it seems unnecessary;
984 something else should cause a redisplay. */
985 redisplay_preserve_echo_area (21);
989 Vselection_alist
= Fcdr (Vselection_alist
);
992 /* Delete elements after the beginning of Vselection_alist. */
993 for (rest
= Vselection_alist
; !NILP (rest
); rest
= Fcdr (rest
))
994 if (EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest
))))))))
996 /* Let random Lisp code notice that the selection has been stolen. */
997 Lisp_Object hooks
, selection_symbol
;
999 hooks
= Vx_lost_selection_hooks
;
1000 selection_symbol
= Fcar (Fcar (XCDR (rest
)));
1002 if (!EQ (hooks
, Qunbound
))
1004 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
1005 call1 (Fcar (hooks
), selection_symbol
);
1006 #if 0 /* See above */
1007 redisplay_preserve_echo_area (22);
1010 XSETCDR (rest
, Fcdr (XCDR (rest
)));
1015 /* Nonzero if any properties for DISPLAY and WINDOW
1016 are on the list of what we are waiting for. */
1019 waiting_for_other_props_on_window (display
, window
)
1023 struct prop_location
*rest
= property_change_wait_list
;
1025 if (rest
->display
== display
&& rest
->window
== window
)
1032 /* Add an entry to the list of property changes we are waiting for.
1033 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1034 The return value is a number that uniquely identifies
1035 this awaited property change. */
1037 static struct prop_location
*
1038 expect_property_change (display
, window
, property
, state
)
1044 struct prop_location
*pl
= (struct prop_location
*) xmalloc (sizeof *pl
);
1045 pl
->identifier
= ++prop_location_identifier
;
1046 pl
->display
= display
;
1047 pl
->window
= window
;
1048 pl
->property
= property
;
1049 pl
->desired_state
= state
;
1050 pl
->next
= property_change_wait_list
;
1052 property_change_wait_list
= pl
;
1056 /* Delete an entry from the list of property changes we are waiting for.
1057 IDENTIFIER is the number that uniquely identifies the entry. */
1060 unexpect_property_change (location
)
1061 struct prop_location
*location
;
1063 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1066 if (rest
== location
)
1069 prev
->next
= rest
->next
;
1071 property_change_wait_list
= rest
->next
;
1080 /* Remove the property change expectation element for IDENTIFIER. */
1083 wait_for_property_change_unwind (identifierval
)
1084 Lisp_Object identifierval
;
1086 unexpect_property_change ((struct prop_location
*)
1087 (XFASTINT (XCAR (identifierval
)) << 16
1088 | XFASTINT (XCDR (identifierval
))));
1092 /* Actually wait for a property change.
1093 IDENTIFIER should be the value that expect_property_change returned. */
1096 wait_for_property_change (location
)
1097 struct prop_location
*location
;
1100 int count
= SPECPDL_INDEX ();
1103 tem
= Fcons (Qnil
, Qnil
);
1104 XSETCARFASTINT (tem
, (EMACS_UINT
)location
>> 16);
1105 XSETCDRFASTINT (tem
, (EMACS_UINT
)location
& 0xffff);
1107 /* Make sure to do unexpect_property_change if we quit or err. */
1108 record_unwind_protect (wait_for_property_change_unwind
, tem
);
1110 XSETCAR (property_change_reply
, Qnil
);
1112 property_change_reply_object
= location
;
1113 /* If the event we are waiting for arrives beyond here, it will set
1114 property_change_reply, because property_change_reply_object says so. */
1115 if (! location
->arrived
)
1117 secs
= x_selection_timeout
/ 1000;
1118 usecs
= (x_selection_timeout
% 1000) * 1000;
1119 TRACE2 (" Waiting %d secs, %d usecs", secs
, usecs
);
1120 wait_reading_process_output (secs
, usecs
, 0, 0,
1121 property_change_reply
, NULL
, 0);
1123 if (NILP (XCAR (property_change_reply
)))
1125 TRACE0 (" Timed out");
1126 error ("Timed out waiting for property-notify event");
1130 unbind_to (count
, Qnil
);
1133 /* Called from XTread_socket in response to a PropertyNotify event. */
1136 x_handle_property_notify (event
)
1137 XPropertyEvent
*event
;
1139 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1143 if (rest
->property
== event
->atom
1144 && rest
->window
== event
->window
1145 && rest
->display
== event
->display
1146 && rest
->desired_state
== event
->state
)
1148 TRACE2 ("Expected %s of property %s",
1149 (event
->state
== PropertyDelete
? "deletion" : "change"),
1150 XGetAtomName (event
->display
, event
->atom
));
1154 /* If this is the one wait_for_property_change is waiting for,
1155 tell it to wake up. */
1156 if (rest
== property_change_reply_object
)
1157 XSETCAR (property_change_reply
, Qt
);
1160 prev
->next
= rest
->next
;
1162 property_change_wait_list
= rest
->next
;
1174 #if 0 /* #### MULTIPLE doesn't work yet */
1177 fetch_multiple_target (event
)
1178 XSelectionRequestEvent
*event
;
1180 Display
*display
= event
->display
;
1181 Window window
= event
->requestor
;
1182 Atom target
= event
->target
;
1183 Atom selection_atom
= event
->selection
;
1188 x_get_window_property_as_lisp_data (display
, window
, target
,
1189 QMULTIPLE
, selection_atom
));
1193 copy_multiple_data (obj
)
1200 return Fcons (XCAR (obj
), copy_multiple_data (XCDR (obj
)));
1203 vec
= Fmake_vector (size
= XVECTOR (obj
)->size
, Qnil
);
1204 for (i
= 0; i
< size
; i
++)
1206 Lisp_Object vec2
= XVECTOR (obj
)->contents
[i
];
1207 CHECK_VECTOR (vec2
);
1208 if (XVECTOR (vec2
)->size
!= 2)
1209 /* ??? Confusing error message */
1210 Fsignal (Qerror
, Fcons (build_string ("vectors must be of length 2"),
1211 Fcons (vec2
, Qnil
)));
1212 XVECTOR (vec
)->contents
[i
] = Fmake_vector (2, Qnil
);
1213 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[0]
1214 = XVECTOR (vec2
)->contents
[0];
1215 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[1]
1216 = XVECTOR (vec2
)->contents
[1];
1224 /* Variables for communication with x_handle_selection_notify. */
1225 static Atom reading_which_selection
;
1226 static Lisp_Object reading_selection_reply
;
1227 static Window reading_selection_window
;
1229 /* Do protocol to read selection-data from the server.
1230 Converts this to Lisp data and returns it. */
1233 x_get_foreign_selection (selection_symbol
, target_type
, time_stamp
)
1234 Lisp_Object selection_symbol
, target_type
, time_stamp
;
1236 struct frame
*sf
= SELECTED_FRAME ();
1237 Window requestor_window
= FRAME_X_WINDOW (sf
);
1238 Display
*display
= FRAME_X_DISPLAY (sf
);
1239 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1240 Time requestor_time
= last_event_timestamp
;
1241 Atom target_property
= dpyinfo
->Xatom_EMACS_TMP
;
1242 Atom selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_symbol
);
1248 if (CONSP (target_type
))
1249 type_atom
= symbol_to_x_atom (dpyinfo
, display
, XCAR (target_type
));
1251 type_atom
= symbol_to_x_atom (dpyinfo
, display
, target_type
);
1253 if (! NILP (time_stamp
))
1255 if (CONSP (time_stamp
))
1256 requestor_time
= (Time
) cons_to_long (time_stamp
);
1257 else if (INTEGERP (time_stamp
))
1258 requestor_time
= (Time
) XUINT (time_stamp
);
1259 else if (FLOATP (time_stamp
))
1260 requestor_time
= (Time
) XFLOAT (time_stamp
);
1262 error ("TIME_STAMP must be cons or number");
1267 count
= x_catch_errors (display
);
1269 TRACE2 ("Get selection %s, type %s",
1270 XGetAtomName (display
, type_atom
),
1271 XGetAtomName (display
, target_property
));
1273 XConvertSelection (display
, selection_atom
, type_atom
, target_property
,
1274 requestor_window
, requestor_time
);
1277 /* Prepare to block until the reply has been read. */
1278 reading_selection_window
= requestor_window
;
1279 reading_which_selection
= selection_atom
;
1280 XSETCAR (reading_selection_reply
, Qnil
);
1282 frame
= some_frame_on_display (dpyinfo
);
1284 /* If the display no longer has frames, we can't expect
1285 to get many more selection requests from it, so don't
1286 bother trying to queue them. */
1289 x_start_queuing_selection_requests (display
);
1291 record_unwind_protect (queue_selection_requests_unwind
,
1296 /* This allows quits. Also, don't wait forever. */
1297 secs
= x_selection_timeout
/ 1000;
1298 usecs
= (x_selection_timeout
% 1000) * 1000;
1299 TRACE1 (" Start waiting %d secs for SelectionNotify", secs
);
1300 wait_reading_process_output (secs
, usecs
, 0, 0,
1301 reading_selection_reply
, NULL
, 0);
1302 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply
)));
1305 x_check_errors (display
, "Cannot get selection: %s");
1306 x_uncatch_errors (display
, count
);
1309 if (NILP (XCAR (reading_selection_reply
)))
1310 error ("Timed out waiting for reply from selection owner");
1311 if (EQ (XCAR (reading_selection_reply
), Qlambda
))
1312 error ("No `%s' selection", SDATA (SYMBOL_NAME (selection_symbol
)));
1314 /* Otherwise, the selection is waiting for us on the requested property. */
1316 x_get_window_property_as_lisp_data (display
, requestor_window
,
1317 target_property
, target_type
,
1321 /* Subroutines of x_get_window_property_as_lisp_data */
1323 /* Use xfree, not XFree, to free the data obtained with this function. */
1326 x_get_window_property (display
, window
, property
, data_ret
, bytes_ret
,
1327 actual_type_ret
, actual_format_ret
, actual_size_ret
,
1332 unsigned char **data_ret
;
1334 Atom
*actual_type_ret
;
1335 int *actual_format_ret
;
1336 unsigned long *actual_size_ret
;
1340 unsigned long bytes_remaining
;
1342 unsigned char *tmp_data
= 0;
1344 int buffer_size
= SELECTION_QUANTUM (display
);
1346 if (buffer_size
> MAX_SELECTION_QUANTUM
)
1347 buffer_size
= MAX_SELECTION_QUANTUM
;
1351 /* First probe the thing to find out how big it is. */
1352 result
= XGetWindowProperty (display
, window
, property
,
1353 0L, 0L, False
, AnyPropertyType
,
1354 actual_type_ret
, actual_format_ret
,
1356 &bytes_remaining
, &tmp_data
);
1357 if (result
!= Success
)
1365 /* This was allocated by Xlib, so use XFree. */
1366 XFree ((char *) tmp_data
);
1368 if (*actual_type_ret
== None
|| *actual_format_ret
== 0)
1374 total_size
= bytes_remaining
+ 1;
1375 *data_ret
= (unsigned char *) xmalloc (total_size
);
1377 /* Now read, until we've gotten it all. */
1378 while (bytes_remaining
)
1380 #ifdef TRACE_SELECTION
1381 int last
= bytes_remaining
;
1384 = XGetWindowProperty (display
, window
, property
,
1385 (long)offset
/4, (long)buffer_size
/4,
1388 actual_type_ret
, actual_format_ret
,
1389 actual_size_ret
, &bytes_remaining
, &tmp_data
);
1391 TRACE2 ("Read %ld bytes from property %s",
1392 last
- bytes_remaining
,
1393 XGetAtomName (display
, property
));
1395 /* If this doesn't return Success at this point, it means that
1396 some clod deleted the selection while we were in the midst of
1397 reading it. Deal with that, I guess.... */
1398 if (result
!= Success
)
1400 *actual_size_ret
*= *actual_format_ret
/ 8;
1401 bcopy (tmp_data
, (*data_ret
) + offset
, *actual_size_ret
);
1402 offset
+= *actual_size_ret
;
1404 /* This was allocated by Xlib, so use XFree. */
1405 XFree ((char *) tmp_data
);
1410 *bytes_ret
= offset
;
1413 /* Use xfree, not XFree, to free the data obtained with this function. */
1416 receive_incremental_selection (display
, window
, property
, target_type
,
1417 min_size_bytes
, data_ret
, size_bytes_ret
,
1418 type_ret
, format_ret
, size_ret
)
1422 Lisp_Object target_type
; /* for error messages only */
1423 unsigned int min_size_bytes
;
1424 unsigned char **data_ret
;
1425 int *size_bytes_ret
;
1427 unsigned long *size_ret
;
1431 struct prop_location
*wait_object
;
1432 *size_bytes_ret
= min_size_bytes
;
1433 *data_ret
= (unsigned char *) xmalloc (*size_bytes_ret
);
1435 TRACE1 ("Read %d bytes incrementally", min_size_bytes
);
1437 /* At this point, we have read an INCR property.
1438 Delete the property to ack it.
1439 (But first, prepare to receive the next event in this handshake.)
1441 Now, we must loop, waiting for the sending window to put a value on
1442 that property, then reading the property, then deleting it to ack.
1443 We are done when the sender places a property of length 0.
1446 XSelectInput (display
, window
, STANDARD_EVENT_SET
| PropertyChangeMask
);
1447 TRACE1 (" Delete property %s",
1448 XSYMBOL (x_atom_to_symbol (display
, property
))->name
->data
);
1449 XDeleteProperty (display
, window
, property
);
1450 TRACE1 (" Expect new value of property %s",
1451 XSYMBOL (x_atom_to_symbol (display
, property
))->name
->data
);
1452 wait_object
= expect_property_change (display
, window
, property
,
1459 unsigned char *tmp_data
;
1462 TRACE0 (" Wait for property change");
1463 wait_for_property_change (wait_object
);
1465 /* expect it again immediately, because x_get_window_property may
1466 .. no it won't, I don't get it.
1467 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1468 TRACE0 (" Get property value");
1469 x_get_window_property (display
, window
, property
,
1470 &tmp_data
, &tmp_size_bytes
,
1471 type_ret
, format_ret
, size_ret
, 1);
1473 TRACE1 (" Read increment of %d bytes", tmp_size_bytes
);
1475 if (tmp_size_bytes
== 0) /* we're done */
1477 TRACE0 ("Done reading incrementally");
1479 if (! waiting_for_other_props_on_window (display
, window
))
1480 XSelectInput (display
, window
, STANDARD_EVENT_SET
);
1481 unexpect_property_change (wait_object
);
1482 /* Use xfree, not XFree, because x_get_window_property
1483 calls xmalloc itself. */
1484 if (tmp_data
) xfree (tmp_data
);
1489 TRACE1 (" ACK by deleting property %s",
1490 XGetAtomName (display
, property
));
1491 XDeleteProperty (display
, window
, property
);
1492 wait_object
= expect_property_change (display
, window
, property
,
1497 if (*size_bytes_ret
< offset
+ tmp_size_bytes
)
1499 *size_bytes_ret
= offset
+ tmp_size_bytes
;
1500 *data_ret
= (unsigned char *) xrealloc (*data_ret
, *size_bytes_ret
);
1503 bcopy (tmp_data
, (*data_ret
) + offset
, tmp_size_bytes
);
1504 offset
+= tmp_size_bytes
;
1506 /* Use xfree, not XFree, because x_get_window_property
1507 calls xmalloc itself. */
1513 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1514 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1515 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1518 x_get_window_property_as_lisp_data (display
, window
, property
, target_type
,
1523 Lisp_Object target_type
; /* for error messages only */
1524 Atom selection_atom
; /* for error messages only */
1528 unsigned long actual_size
;
1529 unsigned char *data
= 0;
1532 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1534 TRACE0 ("Reading selection data");
1536 x_get_window_property (display
, window
, property
, &data
, &bytes
,
1537 &actual_type
, &actual_format
, &actual_size
, 1);
1540 int there_is_a_selection_owner
;
1542 there_is_a_selection_owner
1543 = XGetSelectionOwner (display
, selection_atom
);
1546 there_is_a_selection_owner
1547 ? Fcons (build_string ("selection owner couldn't convert"),
1549 ? Fcons (target_type
,
1550 Fcons (x_atom_to_symbol (display
,
1553 : Fcons (target_type
, Qnil
))
1554 : Fcons (build_string ("no selection"),
1555 Fcons (x_atom_to_symbol (display
,
1560 if (actual_type
== dpyinfo
->Xatom_INCR
)
1562 /* That wasn't really the data, just the beginning. */
1564 unsigned int min_size_bytes
= * ((unsigned int *) data
);
1566 /* Use xfree, not XFree, because x_get_window_property
1567 calls xmalloc itself. */
1568 xfree ((char *) data
);
1570 receive_incremental_selection (display
, window
, property
, target_type
,
1571 min_size_bytes
, &data
, &bytes
,
1572 &actual_type
, &actual_format
,
1577 TRACE1 (" Delete property %s", XGetAtomName (display
, property
));
1578 XDeleteProperty (display
, window
, property
);
1582 /* It's been read. Now convert it to a lisp object in some semi-rational
1584 val
= selection_data_to_lisp_data (display
, data
, bytes
,
1585 actual_type
, actual_format
);
1587 /* Use xfree, not XFree, because x_get_window_property
1588 calls xmalloc itself. */
1589 xfree ((char *) data
);
1593 /* These functions convert from the selection data read from the server into
1594 something that we can use from Lisp, and vice versa.
1596 Type: Format: Size: Lisp Type:
1597 ----- ------- ----- -----------
1600 ATOM 32 > 1 Vector of Symbols
1602 * 16 > 1 Vector of Integers
1603 * 32 1 if <=16 bits: Integer
1604 if > 16 bits: Cons of top16, bot16
1605 * 32 > 1 Vector of the above
1607 When converting a Lisp number to C, it is assumed to be of format 16 if
1608 it is an integer, and of format 32 if it is a cons of two integers.
1610 When converting a vector of numbers from Lisp to C, it is assumed to be
1611 of format 16 if every element in the vector is an integer, and is assumed
1612 to be of format 32 if any element is a cons of two integers.
1614 When converting an object to C, it may be of the form (SYMBOL . <data>)
1615 where SYMBOL is what we should claim that the type is. Format and
1616 representation are as above. */
1621 selection_data_to_lisp_data (display
, data
, size
, type
, format
)
1623 unsigned char *data
;
1627 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1629 if (type
== dpyinfo
->Xatom_NULL
)
1632 /* Convert any 8-bit data to a string, for compactness. */
1633 else if (format
== 8)
1635 Lisp_Object str
, lispy_type
;
1637 str
= make_unibyte_string ((char *) data
, size
);
1638 /* Indicate that this string is from foreign selection by a text
1639 property `foreign-selection' so that the caller of
1640 x-get-selection-internal (usually x-get-selection) can know
1641 that the string must be decode. */
1642 if (type
== dpyinfo
->Xatom_COMPOUND_TEXT
)
1643 lispy_type
= QCOMPOUND_TEXT
;
1644 else if (type
== dpyinfo
->Xatom_UTF8_STRING
)
1645 lispy_type
= QUTF8_STRING
;
1647 lispy_type
= QSTRING
;
1648 Fput_text_property (make_number (0), make_number (size
),
1649 Qforeign_selection
, lispy_type
, str
);
1652 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1653 a vector of symbols.
1655 else if (type
== XA_ATOM
)
1658 if (size
== sizeof (Atom
))
1659 return x_atom_to_symbol (display
, *((Atom
*) data
));
1662 Lisp_Object v
= Fmake_vector (make_number (size
/ sizeof (Atom
)),
1664 for (i
= 0; i
< size
/ sizeof (Atom
); i
++)
1665 Faset (v
, make_number (i
),
1666 x_atom_to_symbol (display
, ((Atom
*) data
) [i
]));
1671 /* Convert a single 16 or small 32 bit number to a Lisp_Int.
1672 If the number is > 16 bits, convert it to a cons of integers,
1673 16 bits in each half.
1675 else if (format
== 32 && size
== sizeof (int))
1676 return long_to_cons (((unsigned int *) data
) [0]);
1677 else if (format
== 16 && size
== sizeof (short))
1678 return make_number ((int) (((unsigned short *) data
) [0]));
1680 /* Convert any other kind of data to a vector of numbers, represented
1681 as above (as an integer, or a cons of two 16 bit integers.)
1683 else if (format
== 16)
1687 v
= Fmake_vector (make_number (size
/ 2), make_number (0));
1688 for (i
= 0; i
< size
/ 2; i
++)
1690 int j
= (int) ((unsigned short *) data
) [i
];
1691 Faset (v
, make_number (i
), make_number (j
));
1698 Lisp_Object v
= Fmake_vector (make_number (size
/ 4), make_number (0));
1699 for (i
= 0; i
< size
/ 4; i
++)
1701 unsigned int j
= ((unsigned int *) data
) [i
];
1702 Faset (v
, make_number (i
), long_to_cons (j
));
1709 /* Use xfree, not XFree, to free the data obtained with this function. */
1712 lisp_data_to_selection_data (display
, obj
,
1713 data_ret
, type_ret
, size_ret
,
1714 format_ret
, nofree_ret
)
1717 unsigned char **data_ret
;
1719 unsigned int *size_ret
;
1723 Lisp_Object type
= Qnil
;
1724 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1728 if (CONSP (obj
) && SYMBOLP (XCAR (obj
)))
1732 if (CONSP (obj
) && NILP (XCDR (obj
)))
1736 if (EQ (obj
, QNULL
) || (EQ (type
, QNULL
)))
1737 { /* This is not the same as declining */
1743 else if (STRINGP (obj
))
1745 xassert (! STRING_MULTIBYTE (obj
));
1749 *size_ret
= SBYTES (obj
);
1750 *data_ret
= SDATA (obj
);
1753 else if (SYMBOLP (obj
))
1757 *data_ret
= (unsigned char *) xmalloc (sizeof (Atom
) + 1);
1758 (*data_ret
) [sizeof (Atom
)] = 0;
1759 (*(Atom
**) data_ret
) [0] = symbol_to_x_atom (dpyinfo
, display
, obj
);
1760 if (NILP (type
)) type
= QATOM
;
1762 else if (INTEGERP (obj
)
1763 && XINT (obj
) < 0xFFFF
1764 && XINT (obj
) > -0xFFFF)
1768 *data_ret
= (unsigned char *) xmalloc (sizeof (short) + 1);
1769 (*data_ret
) [sizeof (short)] = 0;
1770 (*(short **) data_ret
) [0] = (short) XINT (obj
);
1771 if (NILP (type
)) type
= QINTEGER
;
1773 else if (INTEGERP (obj
)
1774 || (CONSP (obj
) && INTEGERP (XCAR (obj
))
1775 && (INTEGERP (XCDR (obj
))
1776 || (CONSP (XCDR (obj
))
1777 && INTEGERP (XCAR (XCDR (obj
)))))))
1781 *data_ret
= (unsigned char *) xmalloc (sizeof (long) + 1);
1782 (*data_ret
) [sizeof (long)] = 0;
1783 (*(unsigned long **) data_ret
) [0] = cons_to_long (obj
);
1784 if (NILP (type
)) type
= QINTEGER
;
1786 else if (VECTORP (obj
))
1788 /* Lisp_Vectors may represent a set of ATOMs;
1789 a set of 16 or 32 bit INTEGERs;
1790 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1794 if (SYMBOLP (XVECTOR (obj
)->contents
[0]))
1795 /* This vector is an ATOM set */
1797 if (NILP (type
)) type
= QATOM
;
1798 *size_ret
= XVECTOR (obj
)->size
;
1800 *data_ret
= (unsigned char *) xmalloc ((*size_ret
) * sizeof (Atom
));
1801 for (i
= 0; i
< *size_ret
; i
++)
1802 if (SYMBOLP (XVECTOR (obj
)->contents
[i
]))
1803 (*(Atom
**) data_ret
) [i
]
1804 = symbol_to_x_atom (dpyinfo
, display
, XVECTOR (obj
)->contents
[i
]);
1806 Fsignal (Qerror
, /* Qselection_error */
1808 ("all elements of selection vector must have same type"),
1809 Fcons (obj
, Qnil
)));
1811 #if 0 /* #### MULTIPLE doesn't work yet */
1812 else if (VECTORP (XVECTOR (obj
)->contents
[0]))
1813 /* This vector is an ATOM_PAIR set */
1815 if (NILP (type
)) type
= QATOM_PAIR
;
1816 *size_ret
= XVECTOR (obj
)->size
;
1818 *data_ret
= (unsigned char *)
1819 xmalloc ((*size_ret
) * sizeof (Atom
) * 2);
1820 for (i
= 0; i
< *size_ret
; i
++)
1821 if (VECTORP (XVECTOR (obj
)->contents
[i
]))
1823 Lisp_Object pair
= XVECTOR (obj
)->contents
[i
];
1824 if (XVECTOR (pair
)->size
!= 2)
1827 ("elements of the vector must be vectors of exactly two elements"),
1828 Fcons (pair
, Qnil
)));
1830 (*(Atom
**) data_ret
) [i
* 2]
1831 = symbol_to_x_atom (dpyinfo
, display
,
1832 XVECTOR (pair
)->contents
[0]);
1833 (*(Atom
**) data_ret
) [(i
* 2) + 1]
1834 = symbol_to_x_atom (dpyinfo
, display
,
1835 XVECTOR (pair
)->contents
[1]);
1840 ("all elements of the vector must be of the same type"),
1841 Fcons (obj
, Qnil
)));
1846 /* This vector is an INTEGER set, or something like it */
1848 *size_ret
= XVECTOR (obj
)->size
;
1849 if (NILP (type
)) type
= QINTEGER
;
1851 for (i
= 0; i
< *size_ret
; i
++)
1852 if (CONSP (XVECTOR (obj
)->contents
[i
]))
1854 else if (!INTEGERP (XVECTOR (obj
)->contents
[i
]))
1855 Fsignal (Qerror
, /* Qselection_error */
1857 ("elements of selection vector must be integers or conses of integers"),
1858 Fcons (obj
, Qnil
)));
1860 *data_ret
= (unsigned char *) xmalloc (*size_ret
* (*format_ret
/8));
1861 for (i
= 0; i
< *size_ret
; i
++)
1862 if (*format_ret
== 32)
1863 (*((unsigned long **) data_ret
)) [i
]
1864 = cons_to_long (XVECTOR (obj
)->contents
[i
]);
1866 (*((unsigned short **) data_ret
)) [i
]
1867 = (unsigned short) cons_to_long (XVECTOR (obj
)->contents
[i
]);
1871 Fsignal (Qerror
, /* Qselection_error */
1872 Fcons (build_string ("unrecognised selection data"),
1873 Fcons (obj
, Qnil
)));
1875 *type_ret
= symbol_to_x_atom (dpyinfo
, display
, type
);
1879 clean_local_selection_data (obj
)
1883 && INTEGERP (XCAR (obj
))
1884 && CONSP (XCDR (obj
))
1885 && INTEGERP (XCAR (XCDR (obj
)))
1886 && NILP (XCDR (XCDR (obj
))))
1887 obj
= Fcons (XCAR (obj
), XCDR (obj
));
1890 && INTEGERP (XCAR (obj
))
1891 && INTEGERP (XCDR (obj
)))
1893 if (XINT (XCAR (obj
)) == 0)
1895 if (XINT (XCAR (obj
)) == -1)
1896 return make_number (- XINT (XCDR (obj
)));
1901 int size
= XVECTOR (obj
)->size
;
1904 return clean_local_selection_data (XVECTOR (obj
)->contents
[0]);
1905 copy
= Fmake_vector (make_number (size
), Qnil
);
1906 for (i
= 0; i
< size
; i
++)
1907 XVECTOR (copy
)->contents
[i
]
1908 = clean_local_selection_data (XVECTOR (obj
)->contents
[i
]);
1914 /* Called from XTread_socket to handle SelectionNotify events.
1915 If it's the selection we are waiting for, stop waiting
1916 by setting the car of reading_selection_reply to non-nil.
1917 We store t there if the reply is successful, lambda if not. */
1920 x_handle_selection_notify (event
)
1921 XSelectionEvent
*event
;
1923 if (event
->requestor
!= reading_selection_window
)
1925 if (event
->selection
!= reading_which_selection
)
1928 TRACE0 ("Received SelectionNotify");
1929 XSETCAR (reading_selection_reply
,
1930 (event
->property
!= 0 ? Qt
: Qlambda
));
1934 DEFUN ("x-own-selection-internal", Fx_own_selection_internal
,
1935 Sx_own_selection_internal
, 2, 2, 0,
1936 doc
: /* Assert an X selection of the given TYPE with the given VALUE.
1937 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1938 \(Those are literal upper-case symbol names, since that's what X expects.)
1939 VALUE is typically a string, or a cons of two markers, but may be
1940 anything that the functions on `selection-converter-alist' know about. */)
1941 (selection_name
, selection_value
)
1942 Lisp_Object selection_name
, selection_value
;
1945 CHECK_SYMBOL (selection_name
);
1946 if (NILP (selection_value
)) error ("selection-value may not be nil");
1947 x_own_selection (selection_name
, selection_value
);
1948 return selection_value
;
1952 /* Request the selection value from the owner. If we are the owner,
1953 simply return our selection value. If we are not the owner, this
1954 will block until all of the data has arrived. */
1956 DEFUN ("x-get-selection-internal", Fx_get_selection_internal
,
1957 Sx_get_selection_internal
, 2, 3, 0,
1958 doc
: /* Return text selected from some X window.
1959 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
1960 \(Those are literal upper-case symbol names, since that's what X expects.)
1961 TYPE is the type of data desired, typically `STRING'.
1962 TIME_STAMP is the time to use in the XConvertSelection call for foreign
1963 selections. If omitted, defaults to the time for the last event. */)
1964 (selection_symbol
, target_type
, time_stamp
)
1965 Lisp_Object selection_symbol
, target_type
, time_stamp
;
1967 Lisp_Object val
= Qnil
;
1968 struct gcpro gcpro1
, gcpro2
;
1969 GCPRO2 (target_type
, val
); /* we store newly consed data into these */
1971 CHECK_SYMBOL (selection_symbol
);
1973 #if 0 /* #### MULTIPLE doesn't work yet */
1974 if (CONSP (target_type
)
1975 && XCAR (target_type
) == QMULTIPLE
)
1977 CHECK_VECTOR (XCDR (target_type
));
1978 /* So we don't destructively modify this... */
1979 target_type
= copy_multiple_data (target_type
);
1983 CHECK_SYMBOL (target_type
);
1985 val
= x_get_local_selection (selection_symbol
, target_type
, 1);
1989 val
= x_get_foreign_selection (selection_symbol
, target_type
, time_stamp
);
1994 && SYMBOLP (XCAR (val
)))
1997 if (CONSP (val
) && NILP (XCDR (val
)))
2000 val
= clean_local_selection_data (val
);
2006 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal
,
2007 Sx_disown_selection_internal
, 1, 2, 0,
2008 doc
: /* If we own the selection SELECTION, disown it.
2009 Disowning it means there is no such selection. */)
2011 Lisp_Object selection
;
2015 Atom selection_atom
;
2016 struct selection_input_event event
;
2018 struct x_display_info
*dpyinfo
;
2019 struct frame
*sf
= SELECTED_FRAME ();
2022 display
= FRAME_X_DISPLAY (sf
);
2023 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2024 CHECK_SYMBOL (selection
);
2026 timestamp
= last_event_timestamp
;
2028 timestamp
= cons_to_long (time
);
2030 if (NILP (assq_no_quit (selection
, Vselection_alist
)))
2031 return Qnil
; /* Don't disown the selection when we're not the owner. */
2033 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection
);
2036 XSetSelectionOwner (display
, selection_atom
, None
, timestamp
);
2039 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2040 generated for a window which owns the selection when that window sets
2041 the selection owner to None. The NCD server does, the MIT Sun4 server
2042 doesn't. So we synthesize one; this means we might get two, but
2043 that's ok, because the second one won't have any effect. */
2044 SELECTION_EVENT_DISPLAY (&event
) = display
;
2045 SELECTION_EVENT_SELECTION (&event
) = selection_atom
;
2046 SELECTION_EVENT_TIME (&event
) = timestamp
;
2047 x_handle_selection_clear ((struct input_event
*) &event
);
2052 /* Get rid of all the selections in buffer BUFFER.
2053 This is used when we kill a buffer. */
2056 x_disown_buffer_selections (buffer
)
2060 struct buffer
*buf
= XBUFFER (buffer
);
2062 for (tail
= Vselection_alist
; CONSP (tail
); tail
= XCDR (tail
))
2064 Lisp_Object elt
, value
;
2067 if (CONSP (value
) && MARKERP (XCAR (value
))
2068 && XMARKER (XCAR (value
))->buffer
== buf
)
2069 Fx_disown_selection_internal (XCAR (elt
), Qnil
);
2073 DEFUN ("x-selection-owner-p", Fx_selection_owner_p
, Sx_selection_owner_p
,
2075 doc
: /* Whether the current Emacs process owns the given X Selection.
2076 The arg should be the name of the selection in question, typically one of
2077 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2078 \(Those are literal upper-case symbol names, since that's what X expects.)
2079 For convenience, the symbol nil is the same as `PRIMARY',
2080 and t is the same as `SECONDARY'. */)
2082 Lisp_Object selection
;
2085 CHECK_SYMBOL (selection
);
2086 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2087 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2089 if (NILP (Fassq (selection
, Vselection_alist
)))
2094 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
2096 doc
: /* Whether there is an owner for the given X Selection.
2097 The arg should be the name of the selection in question, typically one of
2098 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2099 \(Those are literal upper-case symbol names, since that's what X expects.)
2100 For convenience, the symbol nil is the same as `PRIMARY',
2101 and t is the same as `SECONDARY'. */)
2103 Lisp_Object selection
;
2108 struct frame
*sf
= SELECTED_FRAME ();
2110 /* It should be safe to call this before we have an X frame. */
2111 if (! FRAME_X_P (sf
))
2114 dpy
= FRAME_X_DISPLAY (sf
);
2115 CHECK_SYMBOL (selection
);
2116 if (!NILP (Fx_selection_owner_p (selection
)))
2118 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2119 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2120 atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
), dpy
, selection
);
2124 owner
= XGetSelectionOwner (dpy
, atom
);
2126 return (owner
? Qt
: Qnil
);
2130 #ifdef CUT_BUFFER_SUPPORT
2132 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */
2134 initialize_cut_buffers (display
, window
)
2138 unsigned char *data
= (unsigned char *) "";
2140 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \
2141 PropModeAppend, data, 0)
2142 FROB (XA_CUT_BUFFER0
);
2143 FROB (XA_CUT_BUFFER1
);
2144 FROB (XA_CUT_BUFFER2
);
2145 FROB (XA_CUT_BUFFER3
);
2146 FROB (XA_CUT_BUFFER4
);
2147 FROB (XA_CUT_BUFFER5
);
2148 FROB (XA_CUT_BUFFER6
);
2149 FROB (XA_CUT_BUFFER7
);
2155 #define CHECK_CUT_BUFFER(symbol) \
2156 { CHECK_SYMBOL ((symbol)); \
2157 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \
2158 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \
2159 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \
2160 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \
2162 Fcons (build_string ("doesn't name a cut buffer"), \
2163 Fcons ((symbol), Qnil))); \
2166 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal
,
2167 Sx_get_cut_buffer_internal
, 1, 1, 0,
2168 doc
: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */)
2174 unsigned char *data
;
2181 struct x_display_info
*dpyinfo
;
2182 struct frame
*sf
= SELECTED_FRAME ();
2185 display
= FRAME_X_DISPLAY (sf
);
2186 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2187 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2188 CHECK_CUT_BUFFER (buffer
);
2189 buffer_atom
= symbol_to_x_atom (dpyinfo
, display
, buffer
);
2191 x_get_window_property (display
, window
, buffer_atom
, &data
, &bytes
,
2192 &type
, &format
, &size
, 0);
2193 if (!data
|| !format
)
2196 if (format
!= 8 || type
!= XA_STRING
)
2198 Fcons (build_string ("cut buffer doesn't contain 8-bit data"),
2199 Fcons (x_atom_to_symbol (display
, type
),
2200 Fcons (make_number (format
), Qnil
))));
2202 ret
= (bytes
? make_string ((char *) data
, bytes
) : Qnil
);
2203 /* Use xfree, not XFree, because x_get_window_property
2204 calls xmalloc itself. */
2210 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal
,
2211 Sx_store_cut_buffer_internal
, 2, 2, 0,
2212 doc
: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */)
2214 Lisp_Object buffer
, string
;
2218 unsigned char *data
;
2220 int bytes_remaining
;
2223 struct frame
*sf
= SELECTED_FRAME ();
2226 display
= FRAME_X_DISPLAY (sf
);
2227 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2229 max_bytes
= SELECTION_QUANTUM (display
);
2230 if (max_bytes
> MAX_SELECTION_QUANTUM
)
2231 max_bytes
= MAX_SELECTION_QUANTUM
;
2233 CHECK_CUT_BUFFER (buffer
);
2234 CHECK_STRING (string
);
2235 buffer_atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
),
2237 data
= (unsigned char *) SDATA (string
);
2238 bytes
= SBYTES (string
);
2239 bytes_remaining
= bytes
;
2241 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2243 initialize_cut_buffers (display
, window
);
2244 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2249 /* Don't mess up with an empty value. */
2250 if (!bytes_remaining
)
2251 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2252 PropModeReplace
, data
, 0);
2254 while (bytes_remaining
)
2256 int chunk
= (bytes_remaining
< max_bytes
2257 ? bytes_remaining
: max_bytes
);
2258 XChangeProperty (display
, window
, buffer_atom
, XA_STRING
, 8,
2259 (bytes_remaining
== bytes
2264 bytes_remaining
-= chunk
;
2271 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal
,
2272 Sx_rotate_cut_buffers_internal
, 1, 1, 0,
2273 doc
: /* Rotate the values of the cut buffers by the given number of step.
2274 Positive means shift the values forward, negative means backward. */)
2281 struct frame
*sf
= SELECTED_FRAME ();
2284 display
= FRAME_X_DISPLAY (sf
);
2285 window
= RootWindow (display
, 0); /* Cut buffers are on screen 0 */
2289 if (! FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
)
2291 initialize_cut_buffers (display
, window
);
2292 FRAME_X_DISPLAY_INFO (sf
)->cut_buffers_initialized
= 1;
2295 props
[0] = XA_CUT_BUFFER0
;
2296 props
[1] = XA_CUT_BUFFER1
;
2297 props
[2] = XA_CUT_BUFFER2
;
2298 props
[3] = XA_CUT_BUFFER3
;
2299 props
[4] = XA_CUT_BUFFER4
;
2300 props
[5] = XA_CUT_BUFFER5
;
2301 props
[6] = XA_CUT_BUFFER6
;
2302 props
[7] = XA_CUT_BUFFER7
;
2304 XRotateWindowProperties (display
, window
, props
, 8, XINT (n
));
2311 /***********************************************************************
2312 Drag and drop support
2313 ***********************************************************************/
2314 /* Check that lisp values are of correct type for x_fill_property_data.
2315 That is, number, string or a cons with two numbers (low and high 16
2316 bit parts of a 32 bit number). */
2319 x_check_property_data (data
)
2325 for (iter
= data
; CONSP (iter
) && size
!= -1; iter
= XCDR (iter
), ++size
)
2327 Lisp_Object o
= XCAR (iter
);
2329 if (! NUMBERP (o
) && ! STRINGP (o
) && ! CONSP (o
))
2331 else if (CONSP (o
) &&
2332 (! NUMBERP (XCAR (o
)) || ! NUMBERP (XCDR (o
))))
2339 /* Convert lisp values to a C array. Values may be a number, a string
2340 which is taken as an X atom name and converted to the atom value, or
2341 a cons containing the two 16 bit parts of a 32 bit number.
2343 DPY is the display use to look up X atoms.
2344 DATA is a Lisp list of values to be converted.
2345 RET is the C array that contains the converted values. It is assumed
2346 it is big enough to hol all values.
2347 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2348 be stored in RET. */
2351 x_fill_property_data (dpy
, data
, ret
, format
)
2358 CARD32
*d32
= (CARD32
*) ret
;
2359 CARD16
*d16
= (CARD16
*) ret
;
2360 CARD8
*d08
= (CARD8
*) ret
;
2363 for (iter
= data
; CONSP (iter
); iter
= XCDR (iter
))
2365 Lisp_Object o
= XCAR (iter
);
2368 val
= (CARD32
) XFASTINT (o
);
2369 else if (FLOATP (o
))
2370 val
= (CARD32
) XFLOAT (o
);
2372 val
= (CARD32
) cons_to_long (o
);
2373 else if (STRINGP (o
))
2376 val
= XInternAtom (dpy
, (char *) SDATA (o
), False
);
2380 error ("Wrong type, must be string, number or cons");
2383 *d08
++ = (CARD8
) val
;
2384 else if (format
== 16)
2385 *d16
++ = (CARD16
) val
;
2391 /* Convert an array of C values to a Lisp list.
2392 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2393 DATA is a C array of values to be converted.
2394 TYPE is the type of the data. Only XA_ATOM is special, it converts
2395 each number in DATA to its corresponfing X atom as a symbol.
2396 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2398 SIZE is the number of elements in DATA.
2400 Also see comment for selection_data_to_lisp_data above. */
2403 x_property_data_to_lisp (f
, data
, type
, format
, size
)
2405 unsigned char *data
;
2410 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f
),
2411 data
, size
*format
/8, type
, format
);
2414 /* Get the mouse position frame relative coordinates. */
2417 mouse_position_for_drop (f
, x
, y
)
2422 Window root
, dummy_window
;
2427 XQueryPointer (FRAME_X_DISPLAY (f
),
2428 DefaultRootWindow (FRAME_X_DISPLAY (f
)),
2430 /* The root window which contains the pointer. */
2433 /* Window pointer is on, not used */
2436 /* The position on that root window. */
2439 /* x/y in dummy_window coordinates, not used. */
2442 /* Modifier keys and pointer buttons, about which
2444 (unsigned int *) &dummy
);
2447 /* Absolute to relative. */
2448 *x
-= f
->left_pos
+ FRAME_OUTER_TO_INNER_DIFF_X (f
);
2449 *y
-= f
->top_pos
+ FRAME_OUTER_TO_INNER_DIFF_Y (f
);
2454 DEFUN ("x-get-atom-name", Fx_get_atom_name
,
2455 Sx_get_atom_name
, 1, 2, 0,
2456 doc
: /* Return the X atom name for VALUE as a string.
2457 VALUE may be a number or a cons where the car is the upper 16 bits and
2458 the cdr is the lower 16 bits of a 32 bit value.
2459 Use the display for FRAME or the current frame if FRAME is not given or nil.
2461 If the value is 0 or the atom is not known, return the empty string. */)
2463 Lisp_Object value
, frame
;
2465 struct frame
*f
= check_x_frame (frame
);
2467 Lisp_Object ret
= Qnil
;
2469 Display
*dpy
= FRAME_X_DISPLAY (f
);
2472 if (INTEGERP (value
))
2473 atom
= (Atom
) XUINT (value
);
2474 else if (FLOATP (value
))
2475 atom
= (Atom
) XFLOAT (value
);
2476 else if (CONSP (value
))
2477 atom
= (Atom
) cons_to_long (value
);
2479 error ("Wrong type, value must be number or cons");
2482 count
= x_catch_errors (dpy
);
2484 name
= atom
? XGetAtomName (dpy
, atom
) : "";
2486 if (! x_had_errors_p (dpy
))
2487 ret
= make_string (name
, strlen (name
));
2489 x_uncatch_errors (dpy
, count
);
2491 if (atom
&& name
) XFree (name
);
2492 if (NILP (ret
)) ret
= make_string ("", 0);
2499 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT.
2500 TODO: Check if this client event really is a DND event? */
2503 x_handle_dnd_message (f
, event
, dpyinfo
, bufp
)
2505 XClientMessageEvent
*event
;
2506 struct x_display_info
*dpyinfo
;
2507 struct input_event
*bufp
;
2511 unsigned long size
= (8*sizeof (event
->data
))/event
->format
;
2514 XSETFRAME (frame
, f
);
2516 vec
= Fmake_vector (make_number (4), Qnil
);
2517 AREF (vec
, 0) = SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f
),
2518 event
->message_type
));
2519 AREF (vec
, 1) = frame
;
2520 AREF (vec
, 2) = make_number (event
->format
);
2521 AREF (vec
, 3) = x_property_data_to_lisp (f
,
2523 event
->message_type
,
2527 mouse_position_for_drop (f
, &x
, &y
);
2528 bufp
->kind
= DRAG_N_DROP_EVENT
;
2529 bufp
->frame_or_window
= Fcons (frame
, vec
);
2530 bufp
->timestamp
= CurrentTime
;
2531 bufp
->x
= make_number (x
);
2532 bufp
->y
= make_number (y
);
2534 bufp
->modifiers
= 0;
2539 DEFUN ("x-send-client-message", Fx_send_client_event
,
2540 Sx_send_client_message
, 6, 6, 0,
2541 doc
: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2543 For DISPLAY, specify either a frame or a display name (a string).
2544 If DISPLAY is nil, that stands for the selected frame's display.
2545 DEST may be a number, in which case it is a Window id. The value 0 may
2546 be used to send to the root window of the DISPLAY.
2547 If DEST is a cons, it is converted to a 32 bit number
2548 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2549 number is then used as a window id.
2550 If DEST is a frame the event is sent to the outer window of that frame.
2551 Nil means the currently selected frame.
2552 If DEST is the string "PointerWindow" the event is sent to the window that
2553 contains the pointer. If DEST is the string "InputFocus" the event is
2554 sent to the window that has the input focus.
2555 FROM is the frame sending the event. Use nil for currently selected frame.
2556 MESSAGE-TYPE is the name of an Atom as a string.
2557 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2558 bits. VALUES is a list of numbers, cons and/or strings containing the values
2559 to send. If a value is a string, it is converted to an Atom and the value of
2560 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2561 with the high 16 bits from the car and the lower 16 bit from the cdr.
2562 If more values than fits into the event is given, the excessive values
2564 (display
, dest
, from
, message_type
, format
, values
)
2565 Lisp_Object display
, dest
, from
, message_type
, format
, values
;
2567 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
2572 struct frame
*f
= check_x_frame (from
);
2576 CHECK_STRING (message_type
);
2577 CHECK_NUMBER (format
);
2578 CHECK_CONS (values
);
2580 if (x_check_property_data (values
) == -1)
2581 error ("Bad data in VALUES, must be number, cons or string");
2583 event
.xclient
.type
= ClientMessage
;
2584 event
.xclient
.format
= XFASTINT (format
);
2586 if (event
.xclient
.format
!= 8 && event
.xclient
.format
!= 16
2587 && event
.xclient
.format
!= 32)
2588 error ("FORMAT must be one of 8, 16 or 32");
2590 if (FRAMEP (dest
) || NILP (dest
))
2592 struct frame
*fdest
= check_x_frame (dest
);
2593 wdest
= FRAME_OUTER_WINDOW (fdest
);
2595 else if (STRINGP (dest
))
2597 if (strcmp (SDATA (dest
), "PointerWindow") == 0)
2598 wdest
= PointerWindow
;
2599 else if (strcmp (SDATA (dest
), "InputFocus") == 0)
2602 error ("DEST as a string must be one of PointerWindow or InputFocus");
2604 else if (INTEGERP (dest
))
2605 wdest
= (Window
) XFASTINT (dest
);
2606 else if (FLOATP (dest
))
2607 wdest
= (Window
) XFLOAT (dest
);
2608 else if (CONSP (dest
))
2610 if (! NUMBERP (XCAR (dest
)) || ! NUMBERP (XCDR (dest
)))
2611 error ("Both car and cdr for DEST must be numbers");
2613 wdest
= (Window
) cons_to_long (dest
);
2616 error ("DEST must be a frame, nil, string, number or cons");
2618 if (wdest
== 0) wdest
= dpyinfo
->root_window
;
2619 to_root
= wdest
== dpyinfo
->root_window
;
2621 for (cons
= values
, size
= 0; CONSP (cons
); cons
= XCDR (cons
), ++size
)
2626 event
.xclient
.message_type
2627 = XInternAtom (dpyinfo
->display
, SDATA (message_type
), False
);
2628 event
.xclient
.display
= dpyinfo
->display
;
2630 /* Some clients (metacity for example) expects sending window to be here
2631 when sending to the root window. */
2632 event
.xclient
.window
= to_root
? FRAME_OUTER_WINDOW (f
) : wdest
;
2634 memset (event
.xclient
.data
.b
, 0, sizeof (event
.xclient
.data
.b
));
2635 x_fill_property_data (dpyinfo
->display
, values
, event
.xclient
.data
.b
,
2636 event
.xclient
.format
);
2638 /* If event mask is 0 the event is sent to the client that created
2639 the destination window. But if we are sending to the root window,
2640 there is no such client. Then we set the event mask to 0xffff. The
2641 event then goes to clients selecting for events on the root window. */
2642 count
= x_catch_errors (dpyinfo
->display
);
2644 int propagate
= to_root
? False
: True
;
2645 unsigned mask
= to_root
? 0xffff : 0;
2646 XSendEvent (dpyinfo
->display
, wdest
, propagate
, mask
, &event
);
2647 XFlush (dpyinfo
->display
);
2649 x_uncatch_errors (dpyinfo
->display
, count
);
2659 defsubr (&Sx_get_selection_internal
);
2660 defsubr (&Sx_own_selection_internal
);
2661 defsubr (&Sx_disown_selection_internal
);
2662 defsubr (&Sx_selection_owner_p
);
2663 defsubr (&Sx_selection_exists_p
);
2665 #ifdef CUT_BUFFER_SUPPORT
2666 defsubr (&Sx_get_cut_buffer_internal
);
2667 defsubr (&Sx_store_cut_buffer_internal
);
2668 defsubr (&Sx_rotate_cut_buffers_internal
);
2671 defsubr (&Sx_get_atom_name
);
2672 defsubr (&Sx_send_client_message
);
2674 reading_selection_reply
= Fcons (Qnil
, Qnil
);
2675 staticpro (&reading_selection_reply
);
2676 reading_selection_window
= 0;
2677 reading_which_selection
= 0;
2679 property_change_wait_list
= 0;
2680 prop_location_identifier
= 0;
2681 property_change_reply
= Fcons (Qnil
, Qnil
);
2682 staticpro (&property_change_reply
);
2684 Vselection_alist
= Qnil
;
2685 staticpro (&Vselection_alist
);
2687 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist
,
2688 doc
: /* An alist associating X Windows selection-types with functions.
2689 These functions are called to convert the selection, with three args:
2690 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2691 a desired type to which the selection should be converted;
2692 and the local selection value (whatever was given to `x-own-selection').
2694 The function should return the value to send to the X server
2695 \(typically a string). A return value of nil
2696 means that the conversion could not be done.
2697 A return value which is the symbol `NULL'
2698 means that a side-effect was executed,
2699 and there is no meaningful selection value. */);
2700 Vselection_converter_alist
= Qnil
;
2702 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks
,
2703 doc
: /* A list of functions to be called when Emacs loses an X selection.
2704 \(This happens when some other X client makes its own selection
2705 or when a Lisp program explicitly clears the selection.)
2706 The functions are called with one argument, the selection type
2707 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2708 Vx_lost_selection_hooks
= Qnil
;
2710 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks
,
2711 doc
: /* A list of functions to be called when Emacs answers a selection request.
2712 The functions are called with four arguments:
2713 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2714 - the selection-type which Emacs was asked to convert the
2715 selection into before sending (for example, `STRING' or `LENGTH');
2716 - a flag indicating success or failure for responding to the request.
2717 We might have failed (and declined the request) for any number of reasons,
2718 including being asked for a selection that we no longer own, or being asked
2719 to convert into a type that we don't know about or that is inappropriate.
2720 This hook doesn't let you change the behavior of Emacs's selection replies,
2721 it merely informs you that they have happened. */);
2722 Vx_sent_selection_hooks
= Qnil
;
2724 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system
,
2725 doc
: /* Coding system for communicating with other X clients.
2726 When sending or receiving text via cut_buffer, selection, and clipboard,
2727 the text is encoded or decoded by this coding system.
2728 The default value is `compound-text-with-extensions'. */);
2729 Vselection_coding_system
= intern ("compound-text-with-extensions");
2731 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system
,
2732 doc
: /* Coding system for the next communication with other X clients.
2733 Usually, `selection-coding-system' is used for communicating with
2734 other X clients. But, if this variable is set, it is used for the
2735 next communication only. After the communication, this variable is
2737 Vnext_selection_coding_system
= Qnil
;
2739 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout
,
2740 doc
: /* Number of milliseconds to wait for a selection reply.
2741 If the selection owner doesn't reply in this time, we give up.
2742 A value of 0 means wait as long as necessary. This is initialized from the
2743 \"*selectionTimeout\" resource. */);
2744 x_selection_timeout
= 0;
2746 QPRIMARY
= intern ("PRIMARY"); staticpro (&QPRIMARY
);
2747 QSECONDARY
= intern ("SECONDARY"); staticpro (&QSECONDARY
);
2748 QSTRING
= intern ("STRING"); staticpro (&QSTRING
);
2749 QINTEGER
= intern ("INTEGER"); staticpro (&QINTEGER
);
2750 QCLIPBOARD
= intern ("CLIPBOARD"); staticpro (&QCLIPBOARD
);
2751 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2752 QTEXT
= intern ("TEXT"); staticpro (&QTEXT
);
2753 QCOMPOUND_TEXT
= intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT
);
2754 QUTF8_STRING
= intern ("UTF8_STRING"); staticpro (&QUTF8_STRING
);
2755 QTIMESTAMP
= intern ("TIMESTAMP"); staticpro (&QTIMESTAMP
);
2756 QDELETE
= intern ("DELETE"); staticpro (&QDELETE
);
2757 QMULTIPLE
= intern ("MULTIPLE"); staticpro (&QMULTIPLE
);
2758 QINCR
= intern ("INCR"); staticpro (&QINCR
);
2759 QEMACS_TMP
= intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP
);
2760 QTARGETS
= intern ("TARGETS"); staticpro (&QTARGETS
);
2761 QATOM
= intern ("ATOM"); staticpro (&QATOM
);
2762 QATOM_PAIR
= intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR
);
2763 QNULL
= intern ("NULL"); staticpro (&QNULL
);
2764 Qcompound_text_with_extensions
= intern ("compound-text-with-extensions");
2765 staticpro (&Qcompound_text_with_extensions
);
2767 #ifdef CUT_BUFFER_SUPPORT
2768 QCUT_BUFFER0
= intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0
);
2769 QCUT_BUFFER1
= intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1
);
2770 QCUT_BUFFER2
= intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2
);
2771 QCUT_BUFFER3
= intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3
);
2772 QCUT_BUFFER4
= intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4
);
2773 QCUT_BUFFER5
= intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5
);
2774 QCUT_BUFFER6
= intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6
);
2775 QCUT_BUFFER7
= intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7
);
2778 Qforeign_selection
= intern ("foreign-selection");
2779 staticpro (&Qforeign_selection
);
2782 /* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236
2783 (do not change this comment) */