1 /* X Selection processing for Emacs.
2 Copyright (C) 1993-1997, 2000-2011 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
20 /* Rewritten by jwz */
23 #include <stdio.h> /* termhooks.h needs this */
26 #ifdef HAVE_SYS_TYPES_H
27 #include <sys/types.h>
33 #include "xterm.h" /* for all of the X includes */
34 #include "dispextern.h" /* frame.h seems to want this */
35 #include "frame.h" /* Need this to get the X window of selected_frame */
36 #include "blockinput.h"
39 #include "termhooks.h"
41 #include "character.h"
43 #include <X11/Xproto.h>
47 static Lisp_Object
x_atom_to_symbol (Display
*dpy
, Atom atom
);
48 static Atom
symbol_to_x_atom (struct x_display_info
*, Display
*,
50 static void x_own_selection (Lisp_Object
, Lisp_Object
);
51 static Lisp_Object
x_get_local_selection (Lisp_Object
, Lisp_Object
, int);
52 static void x_decline_selection_request (struct input_event
*);
53 static Lisp_Object
x_selection_request_lisp_error (Lisp_Object
);
54 static Lisp_Object
queue_selection_requests_unwind (Lisp_Object
);
55 static Lisp_Object
some_frame_on_display (struct x_display_info
*);
56 static Lisp_Object
x_catch_errors_unwind (Lisp_Object
);
57 static void x_reply_selection_request (struct input_event
*, int,
58 unsigned char *, int, Atom
);
59 static int waiting_for_other_props_on_window (Display
*, Window
);
60 static struct prop_location
*expect_property_change (Display
*, Window
,
62 static void unexpect_property_change (struct prop_location
*);
63 static Lisp_Object
wait_for_property_change_unwind (Lisp_Object
);
64 static void wait_for_property_change (struct prop_location
*);
65 static Lisp_Object
x_get_foreign_selection (Lisp_Object
,
68 static void x_get_window_property (Display
*, Window
, Atom
,
69 unsigned char **, int *,
70 Atom
*, int *, unsigned long *, int);
71 static void receive_incremental_selection (Display
*, Window
, Atom
,
72 Lisp_Object
, unsigned,
73 unsigned char **, int *,
74 Atom
*, int *, unsigned long *);
75 static Lisp_Object
x_get_window_property_as_lisp_data (Display
*,
78 static Lisp_Object
selection_data_to_lisp_data (Display
*,
79 const unsigned char *,
81 static void lisp_data_to_selection_data (Display
*, Lisp_Object
,
82 unsigned char **, Atom
*,
83 unsigned *, int *, int *);
84 static Lisp_Object
clean_local_selection_data (Lisp_Object
);
86 /* Printing traces to stderr. */
88 #ifdef TRACE_SELECTION
90 fprintf (stderr, "%d: " fmt "\n", getpid ())
91 #define TRACE1(fmt, a0) \
92 fprintf (stderr, "%d: " fmt "\n", getpid (), a0)
93 #define TRACE2(fmt, a0, a1) \
94 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1)
95 #define TRACE3(fmt, a0, a1, a2) \
96 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1, a2)
98 #define TRACE0(fmt) (void) 0
99 #define TRACE1(fmt, a0) (void) 0
100 #define TRACE2(fmt, a0, a1) (void) 0
104 static Lisp_Object QSECONDARY
, QSTRING
, QINTEGER
, QCLIPBOARD
, QTIMESTAMP
,
105 QTEXT
, QDELETE
, QMULTIPLE
, QINCR
, QEMACS_TMP
, QTARGETS
, QATOM
, QNULL
,
108 static Lisp_Object QCOMPOUND_TEXT
; /* This is a type of selection. */
109 static Lisp_Object QUTF8_STRING
; /* This is a type of selection. */
111 static Lisp_Object Qcompound_text_with_extensions
;
113 static Lisp_Object Qforeign_selection
;
115 /* If this is a smaller number than the max-request-size of the display,
116 emacs will use INCR selection transfer when the selection is larger
117 than this. The max-request-size is usually around 64k, so if you want
118 emacs to use incremental selection transfers when the selection is
119 smaller than that, set this. I added this mostly for debugging the
120 incremental transfer stuff, but it might improve server performance. */
121 #define MAX_SELECTION_QUANTUM 0xFFFFFF
123 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100)
125 /* This is an association list whose elements are of the form
126 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME)
127 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom.
128 SELECTION-VALUE is the value that emacs owns for that selection.
129 It may be any kind of Lisp object.
130 SELECTION-TIMESTAMP is the time at which emacs began owning this selection,
131 as a cons of two 16-bit numbers (making a 32 bit time.)
132 FRAME is the frame for which we made the selection.
133 If there is an entry in this alist, then it can be assumed that Emacs owns
135 The only (eq) parts of this list that are visible from Lisp are the
137 static Lisp_Object Vselection_alist
;
141 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later
144 struct selection_event_queue
146 struct input_event event
;
147 struct selection_event_queue
*next
;
150 static struct selection_event_queue
*selection_queue
;
152 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */
154 static int x_queue_selection_requests
;
156 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */
159 x_queue_event (struct input_event
*event
)
161 struct selection_event_queue
*queue_tmp
;
163 /* Don't queue repeated requests.
164 This only happens for large requests which uses the incremental protocol. */
165 for (queue_tmp
= selection_queue
; queue_tmp
; queue_tmp
= queue_tmp
->next
)
167 if (!memcmp (&queue_tmp
->event
, event
, sizeof (*event
)))
169 TRACE1 ("DECLINE DUP SELECTION EVENT %p", queue_tmp
);
170 x_decline_selection_request (event
);
176 = (struct selection_event_queue
*) xmalloc (sizeof (struct selection_event_queue
));
178 if (queue_tmp
!= NULL
)
180 TRACE1 ("QUEUE SELECTION EVENT %p", queue_tmp
);
181 queue_tmp
->event
= *event
;
182 queue_tmp
->next
= selection_queue
;
183 selection_queue
= queue_tmp
;
187 /* Start queuing SELECTION_REQUEST_EVENT events. */
190 x_start_queuing_selection_requests (void)
192 if (x_queue_selection_requests
)
195 x_queue_selection_requests
++;
196 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests
);
199 /* Stop queuing SELECTION_REQUEST_EVENT events. */
202 x_stop_queuing_selection_requests (void)
204 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests
);
205 --x_queue_selection_requests
;
207 /* Take all the queued events and put them back
208 so that they get processed afresh. */
210 while (selection_queue
!= NULL
)
212 struct selection_event_queue
*queue_tmp
= selection_queue
;
213 TRACE1 ("RESTORE SELECTION EVENT %p", queue_tmp
);
214 kbd_buffer_unget_event (&queue_tmp
->event
);
215 selection_queue
= queue_tmp
->next
;
216 xfree ((char *)queue_tmp
);
221 /* This converts a Lisp symbol to a server Atom, avoiding a server
222 roundtrip whenever possible. */
225 symbol_to_x_atom (struct x_display_info
*dpyinfo
, Display
*display
, Lisp_Object sym
)
228 if (NILP (sym
)) return 0;
229 if (EQ (sym
, QPRIMARY
)) return XA_PRIMARY
;
230 if (EQ (sym
, QSECONDARY
)) return XA_SECONDARY
;
231 if (EQ (sym
, QSTRING
)) return XA_STRING
;
232 if (EQ (sym
, QINTEGER
)) return XA_INTEGER
;
233 if (EQ (sym
, QATOM
)) return XA_ATOM
;
234 if (EQ (sym
, QCLIPBOARD
)) return dpyinfo
->Xatom_CLIPBOARD
;
235 if (EQ (sym
, QTIMESTAMP
)) return dpyinfo
->Xatom_TIMESTAMP
;
236 if (EQ (sym
, QTEXT
)) return dpyinfo
->Xatom_TEXT
;
237 if (EQ (sym
, QCOMPOUND_TEXT
)) return dpyinfo
->Xatom_COMPOUND_TEXT
;
238 if (EQ (sym
, QUTF8_STRING
)) return dpyinfo
->Xatom_UTF8_STRING
;
239 if (EQ (sym
, QDELETE
)) return dpyinfo
->Xatom_DELETE
;
240 if (EQ (sym
, QMULTIPLE
)) return dpyinfo
->Xatom_MULTIPLE
;
241 if (EQ (sym
, QINCR
)) return dpyinfo
->Xatom_INCR
;
242 if (EQ (sym
, QEMACS_TMP
)) return dpyinfo
->Xatom_EMACS_TMP
;
243 if (EQ (sym
, QTARGETS
)) return dpyinfo
->Xatom_TARGETS
;
244 if (EQ (sym
, QNULL
)) return dpyinfo
->Xatom_NULL
;
245 if (!SYMBOLP (sym
)) abort ();
247 TRACE1 (" XInternAtom %s", SSDATA (SYMBOL_NAME (sym
)));
249 val
= XInternAtom (display
, SSDATA (SYMBOL_NAME (sym
)), False
);
255 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips
256 and calls to intern whenever possible. */
259 x_atom_to_symbol (Display
*dpy
, Atom atom
)
261 struct x_display_info
*dpyinfo
;
282 dpyinfo
= x_display_info_for_display (dpy
);
283 if (atom
== dpyinfo
->Xatom_CLIPBOARD
)
285 if (atom
== dpyinfo
->Xatom_TIMESTAMP
)
287 if (atom
== dpyinfo
->Xatom_TEXT
)
289 if (atom
== dpyinfo
->Xatom_COMPOUND_TEXT
)
290 return QCOMPOUND_TEXT
;
291 if (atom
== dpyinfo
->Xatom_UTF8_STRING
)
293 if (atom
== dpyinfo
->Xatom_DELETE
)
295 if (atom
== dpyinfo
->Xatom_MULTIPLE
)
297 if (atom
== dpyinfo
->Xatom_INCR
)
299 if (atom
== dpyinfo
->Xatom_EMACS_TMP
)
301 if (atom
== dpyinfo
->Xatom_TARGETS
)
303 if (atom
== dpyinfo
->Xatom_NULL
)
307 str
= XGetAtomName (dpy
, atom
);
309 TRACE1 ("XGetAtomName --> %s", str
);
310 if (! str
) return Qnil
;
313 /* This was allocated by Xlib, so use XFree. */
319 /* Do protocol to assert ourself as a selection owner.
320 Update the Vselection_alist so that we can reply to later requests for
324 x_own_selection (Lisp_Object selection_name
, Lisp_Object selection_value
)
326 struct frame
*sf
= SELECTED_FRAME ();
327 Window selecting_window
;
329 Time timestamp
= last_event_timestamp
;
331 struct x_display_info
*dpyinfo
;
333 if (! FRAME_X_P (sf
))
336 selecting_window
= FRAME_X_WINDOW (sf
);
337 display
= FRAME_X_DISPLAY (sf
);
338 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
340 CHECK_SYMBOL (selection_name
);
341 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_name
);
344 x_catch_errors (display
);
345 XSetSelectionOwner (display
, selection_atom
, selecting_window
, timestamp
);
346 x_check_errors (display
, "Can't set selection: %s");
350 /* Now update the local cache */
352 Lisp_Object selection_time
;
353 Lisp_Object selection_data
;
354 Lisp_Object prev_value
;
356 selection_time
= long_to_cons (timestamp
);
357 selection_data
= list4 (selection_name
, selection_value
,
358 selection_time
, selected_frame
);
359 prev_value
= assq_no_quit (selection_name
, Vselection_alist
);
361 Vselection_alist
= Fcons (selection_data
, Vselection_alist
);
363 /* If we already owned the selection, remove the old selection data.
364 Perhaps we should destructively modify it instead.
365 Don't use Fdelq as that may QUIT. */
366 if (!NILP (prev_value
))
368 Lisp_Object rest
; /* we know it's not the CAR, so it's easy. */
369 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
370 if (EQ (prev_value
, Fcar (XCDR (rest
))))
372 XSETCDR (rest
, Fcdr (XCDR (rest
)));
379 /* Given a selection-name and desired type, look up our local copy of
380 the selection value and convert it to the type.
381 The value is nil or a string.
382 This function is used both for remote requests (LOCAL_REQUEST is zero)
383 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero).
385 This calls random Lisp code, and may signal or gc. */
388 x_get_local_selection (Lisp_Object selection_symbol
, Lisp_Object target_type
, int local_request
)
390 Lisp_Object local_value
;
391 Lisp_Object handler_fn
, value
, check
;
394 local_value
= assq_no_quit (selection_symbol
, Vselection_alist
);
396 if (NILP (local_value
)) return Qnil
;
398 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */
399 if (EQ (target_type
, QTIMESTAMP
))
402 value
= XCAR (XCDR (XCDR (local_value
)));
404 #if 0 /* #### MULTIPLE doesn't work yet */
405 else if (CONSP (target_type
)
406 && XCAR (target_type
) == QMULTIPLE
)
411 pairs
= XCDR (target_type
);
412 size
= ASIZE (pairs
);
413 /* If the target is MULTIPLE, then target_type looks like
414 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
415 We modify the second element of each pair in the vector and
416 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
418 for (i
= 0; i
< size
; i
++)
421 pair
= XVECTOR (pairs
)->contents
[i
];
422 XVECTOR (pair
)->contents
[1]
423 = x_get_local_selection (XVECTOR (pair
)->contents
[0],
424 XVECTOR (pair
)->contents
[1],
432 /* Don't allow a quit within the converter.
433 When the user types C-g, he would be surprised
434 if by luck it came during a converter. */
435 count
= SPECPDL_INDEX ();
436 specbind (Qinhibit_quit
, Qt
);
438 CHECK_SYMBOL (target_type
);
439 handler_fn
= Fcdr (Fassq (target_type
, Vselection_converter_alist
));
440 /* gcpro is not needed here since nothing but HANDLER_FN
441 is live, and that ought to be a symbol. */
443 if (!NILP (handler_fn
))
444 value
= call3 (handler_fn
,
445 selection_symbol
, (local_request
? Qnil
: target_type
),
446 XCAR (XCDR (local_value
)));
449 unbind_to (count
, Qnil
);
452 /* Make sure this value is of a type that we could transmit
453 to another X client. */
457 && SYMBOLP (XCAR (value
)))
458 check
= XCDR (value
);
466 /* Check for a value that cons_to_long could handle. */
467 else if (CONSP (check
)
468 && INTEGERP (XCAR (check
))
469 && (INTEGERP (XCDR (check
))
471 (CONSP (XCDR (check
))
472 && INTEGERP (XCAR (XCDR (check
)))
473 && NILP (XCDR (XCDR (check
))))))
476 signal_error ("Invalid data returned by selection-conversion function",
477 list2 (handler_fn
, value
));
480 /* Subroutines of x_reply_selection_request. */
482 /* Send a SelectionNotify event to the requestor with property=None,
483 meaning we were unable to do what they wanted. */
486 x_decline_selection_request (struct input_event
*event
)
489 XSelectionEvent
*reply
= &(reply_base
.xselection
);
491 reply
->type
= SelectionNotify
;
492 reply
->display
= SELECTION_EVENT_DISPLAY (event
);
493 reply
->requestor
= SELECTION_EVENT_REQUESTOR (event
);
494 reply
->selection
= SELECTION_EVENT_SELECTION (event
);
495 reply
->time
= SELECTION_EVENT_TIME (event
);
496 reply
->target
= SELECTION_EVENT_TARGET (event
);
497 reply
->property
= None
;
499 /* The reason for the error may be that the receiver has
500 died in the meantime. Handle that case. */
502 x_catch_errors (reply
->display
);
503 XSendEvent (reply
->display
, reply
->requestor
, False
, 0L, &reply_base
);
504 XFlush (reply
->display
);
509 /* This is the selection request currently being processed.
510 It is set to zero when the request is fully processed. */
511 static struct input_event
*x_selection_current_request
;
513 /* Display info in x_selection_request. */
515 static struct x_display_info
*selection_request_dpyinfo
;
517 /* Used as an unwind-protect clause so that, if a selection-converter signals
518 an error, we tell the requester that we were unable to do what they wanted
519 before we throw to top-level or go into the debugger or whatever. */
522 x_selection_request_lisp_error (Lisp_Object ignore
)
524 if (x_selection_current_request
!= 0
525 && selection_request_dpyinfo
->display
)
526 x_decline_selection_request (x_selection_current_request
);
531 x_catch_errors_unwind (Lisp_Object dummy
)
540 /* This stuff is so that INCR selections are reentrant (that is, so we can
541 be servicing multiple INCR selection requests simultaneously.) I haven't
542 actually tested that yet. */
544 /* Keep a list of the property changes that are awaited. */
554 struct prop_location
*next
;
557 static struct prop_location
*expect_property_change (Display
*display
, Window window
, Atom property
, int state
);
558 static void wait_for_property_change (struct prop_location
*location
);
559 static void unexpect_property_change (struct prop_location
*location
);
560 static int waiting_for_other_props_on_window (Display
*display
, Window window
);
562 static int prop_location_identifier
;
564 static Lisp_Object property_change_reply
;
566 static struct prop_location
*property_change_reply_object
;
568 static struct prop_location
*property_change_wait_list
;
571 queue_selection_requests_unwind (Lisp_Object tem
)
573 x_stop_queuing_selection_requests ();
577 /* Return some frame whose display info is DPYINFO.
578 Return nil if there is none. */
581 some_frame_on_display (struct x_display_info
*dpyinfo
)
583 Lisp_Object list
, frame
;
585 FOR_EACH_FRAME (list
, frame
)
587 if (FRAME_X_P (XFRAME (frame
))
588 && FRAME_X_DISPLAY_INFO (XFRAME (frame
)) == dpyinfo
)
595 /* Send the reply to a selection request event EVENT.
596 TYPE is the type of selection data requested.
597 DATA and SIZE describe the data to send, already converted.
598 FORMAT is the unit-size (in bits) of the data to be transmitted. */
600 #ifdef TRACE_SELECTION
601 static int x_reply_selection_request_cnt
;
602 #endif /* TRACE_SELECTION */
605 x_reply_selection_request (struct input_event
*event
, int format
, unsigned char *data
, int size
, Atom type
)
608 XSelectionEvent
*reply
= &(reply_base
.xselection
);
609 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
610 Window window
= SELECTION_EVENT_REQUESTOR (event
);
612 int format_bytes
= format
/8;
613 int max_bytes
= SELECTION_QUANTUM (display
);
614 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
615 int count
= SPECPDL_INDEX ();
617 if (max_bytes
> MAX_SELECTION_QUANTUM
)
618 max_bytes
= MAX_SELECTION_QUANTUM
;
620 reply
->type
= SelectionNotify
;
621 reply
->display
= display
;
622 reply
->requestor
= window
;
623 reply
->selection
= SELECTION_EVENT_SELECTION (event
);
624 reply
->time
= SELECTION_EVENT_TIME (event
);
625 reply
->target
= SELECTION_EVENT_TARGET (event
);
626 reply
->property
= SELECTION_EVENT_PROPERTY (event
);
627 if (reply
->property
== None
)
628 reply
->property
= reply
->target
;
631 /* The protected block contains wait_for_property_change, which can
632 run random lisp code (process handlers) or signal. Therefore, we
633 put the x_uncatch_errors call in an unwind. */
634 record_unwind_protect (x_catch_errors_unwind
, Qnil
);
635 x_catch_errors (display
);
637 #ifdef TRACE_SELECTION
639 char *sel
= XGetAtomName (display
, reply
->selection
);
640 char *tgt
= XGetAtomName (display
, reply
->target
);
641 TRACE3 ("%s, target %s (%d)", sel
, tgt
, ++x_reply_selection_request_cnt
);
642 if (sel
) XFree (sel
);
643 if (tgt
) XFree (tgt
);
645 #endif /* TRACE_SELECTION */
647 /* Store the data on the requested property.
648 If the selection is large, only store the first N bytes of it.
650 bytes_remaining
= size
* format_bytes
;
651 if (bytes_remaining
<= max_bytes
)
653 /* Send all the data at once, with minimal handshaking. */
654 TRACE1 ("Sending all %d bytes", bytes_remaining
);
655 XChangeProperty (display
, window
, reply
->property
, type
, format
,
656 PropModeReplace
, data
, size
);
657 /* At this point, the selection was successfully stored; ack it. */
658 XSendEvent (display
, window
, False
, 0L, &reply_base
);
662 /* Send an INCR selection. */
663 struct prop_location
*wait_object
;
667 frame
= some_frame_on_display (dpyinfo
);
669 /* If the display no longer has frames, we can't expect
670 to get many more selection requests from it, so don't
671 bother trying to queue them. */
674 x_start_queuing_selection_requests ();
676 record_unwind_protect (queue_selection_requests_unwind
,
680 if (x_window_to_frame (dpyinfo
, window
)) /* #### debug */
681 error ("Attempt to transfer an INCR to ourself!");
683 TRACE2 ("Start sending %d bytes incrementally (%s)",
684 bytes_remaining
, XGetAtomName (display
, reply
->property
));
685 wait_object
= expect_property_change (display
, window
, reply
->property
,
688 TRACE1 ("Set %s to number of bytes to send",
689 XGetAtomName (display
, reply
->property
));
691 /* XChangeProperty expects an array of long even if long is more than
695 value
[0] = bytes_remaining
;
696 XChangeProperty (display
, window
, reply
->property
, dpyinfo
->Xatom_INCR
,
698 (unsigned char *) value
, 1);
701 XSelectInput (display
, window
, PropertyChangeMask
);
703 /* Tell 'em the INCR data is there... */
704 TRACE0 ("Send SelectionNotify event");
705 XSendEvent (display
, window
, False
, 0L, &reply_base
);
708 had_errors
= x_had_errors_p (display
);
711 /* First, wait for the requester to ack by deleting the property.
712 This can run random lisp code (process handlers) or signal. */
715 TRACE1 ("Waiting for ACK (deletion of %s)",
716 XGetAtomName (display
, reply
->property
));
717 wait_for_property_change (wait_object
);
720 unexpect_property_change (wait_object
);
723 while (bytes_remaining
)
725 int i
= ((bytes_remaining
< max_bytes
)
727 : max_bytes
) / format_bytes
;
732 = expect_property_change (display
, window
, reply
->property
,
735 TRACE1 ("Sending increment of %d elements", i
);
736 TRACE1 ("Set %s to increment data",
737 XGetAtomName (display
, reply
->property
));
739 /* Append the next chunk of data to the property. */
740 XChangeProperty (display
, window
, reply
->property
, type
, format
,
741 PropModeAppend
, data
, i
);
742 bytes_remaining
-= i
* format_bytes
;
744 data
+= i
* sizeof (long);
746 data
+= i
* format_bytes
;
748 had_errors
= x_had_errors_p (display
);
754 /* Now wait for the requester to ack this chunk by deleting the
755 property. This can run random lisp code or signal. */
756 TRACE1 ("Waiting for increment ACK (deletion of %s)",
757 XGetAtomName (display
, reply
->property
));
758 wait_for_property_change (wait_object
);
761 /* Now write a zero-length chunk to the property to tell the
762 requester that we're done. */
764 if (! waiting_for_other_props_on_window (display
, window
))
765 XSelectInput (display
, window
, 0L);
767 TRACE1 ("Set %s to a 0-length chunk to indicate EOF",
768 XGetAtomName (display
, reply
->property
));
769 XChangeProperty (display
, window
, reply
->property
, type
, format
,
770 PropModeReplace
, data
, 0);
771 TRACE0 ("Done sending incrementally");
774 /* rms, 2003-01-03: I think I have fixed this bug. */
775 /* The window we're communicating with may have been deleted
776 in the meantime (that's a real situation from a bug report).
777 In this case, there may be events in the event queue still
778 refering to the deleted window, and we'll get a BadWindow error
779 in XTread_socket when processing the events. I don't have
780 an idea how to fix that. gerd, 2001-01-98. */
781 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are
782 delivered before uncatch errors. */
783 XSync (display
, False
);
786 /* GTK queues events in addition to the queue in Xlib. So we
787 UNBLOCK to enter the event loop and get possible errors delivered,
788 and then BLOCK again because x_uncatch_errors requires it. */
790 /* This calls x_uncatch_errors. */
791 unbind_to (count
, Qnil
);
795 /* Handle a SelectionRequest event EVENT.
796 This is called from keyboard.c when such an event is found in the queue. */
799 x_handle_selection_request (struct input_event
*event
)
801 struct gcpro gcpro1
, gcpro2
, gcpro3
;
802 Lisp_Object local_selection_data
;
803 Lisp_Object selection_symbol
;
804 Lisp_Object target_symbol
;
805 Lisp_Object converted_selection
;
806 Time local_selection_time
;
807 Lisp_Object successful_p
;
809 struct x_display_info
*dpyinfo
810 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event
));
812 TRACE2 ("x_handle_selection_request, from=0x%08lx time=%lu",
813 (unsigned long) SELECTION_EVENT_REQUESTOR (event
),
814 (unsigned long) SELECTION_EVENT_TIME (event
));
816 local_selection_data
= Qnil
;
817 target_symbol
= Qnil
;
818 converted_selection
= Qnil
;
821 GCPRO3 (local_selection_data
, converted_selection
, target_symbol
);
823 selection_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
824 SELECTION_EVENT_SELECTION (event
));
826 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
828 if (NILP (local_selection_data
))
830 /* Someone asked for the selection, but we don't have it any more.
832 x_decline_selection_request (event
);
836 local_selection_time
= (Time
)
837 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
839 if (SELECTION_EVENT_TIME (event
) != CurrentTime
840 && local_selection_time
> SELECTION_EVENT_TIME (event
))
842 /* Someone asked for the selection, and we have one, but not the one
845 x_decline_selection_request (event
);
849 x_selection_current_request
= event
;
850 count
= SPECPDL_INDEX ();
851 selection_request_dpyinfo
= dpyinfo
;
852 record_unwind_protect (x_selection_request_lisp_error
, Qnil
);
854 target_symbol
= x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event
),
855 SELECTION_EVENT_TARGET (event
));
857 #if 0 /* #### MULTIPLE doesn't work yet */
858 if (EQ (target_symbol
, QMULTIPLE
))
859 target_symbol
= fetch_multiple_target (event
);
862 /* Convert lisp objects back into binary data */
865 = x_get_local_selection (selection_symbol
, target_symbol
, 0);
867 if (! NILP (converted_selection
))
875 if (CONSP (converted_selection
) && NILP (XCDR (converted_selection
)))
877 x_decline_selection_request (event
);
881 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event
),
883 &data
, &type
, &size
, &format
, &nofree
);
885 x_reply_selection_request (event
, format
, data
, size
, type
);
888 /* Indicate we have successfully processed this event. */
889 x_selection_current_request
= 0;
891 /* Use xfree, not XFree, because lisp_data_to_selection_data
892 calls xmalloc itself. */
898 unbind_to (count
, Qnil
);
902 /* Let random lisp code notice that the selection has been asked for. */
905 rest
= Vx_sent_selection_functions
;
906 if (!EQ (rest
, Qunbound
))
907 for (; CONSP (rest
); rest
= Fcdr (rest
))
908 call3 (Fcar (rest
), selection_symbol
, target_symbol
, successful_p
);
914 /* Handle a SelectionClear event EVENT, which indicates that some
915 client cleared out our previously asserted selection.
916 This is called from keyboard.c when such an event is found in the queue. */
919 x_handle_selection_clear (struct input_event
*event
)
921 Display
*display
= SELECTION_EVENT_DISPLAY (event
);
922 Atom selection
= SELECTION_EVENT_SELECTION (event
);
923 Time changed_owner_time
= SELECTION_EVENT_TIME (event
);
925 Lisp_Object selection_symbol
, local_selection_data
;
926 Time local_selection_time
;
927 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
928 struct x_display_info
*t_dpyinfo
;
930 TRACE0 ("x_handle_selection_clear");
932 /* If the new selection owner is also Emacs,
933 don't clear the new selection. */
935 /* Check each display on the same terminal,
936 to see if this Emacs job now owns the selection
937 through that display. */
938 for (t_dpyinfo
= x_display_list
; t_dpyinfo
; t_dpyinfo
= t_dpyinfo
->next
)
939 if (t_dpyinfo
->terminal
->kboard
== dpyinfo
->terminal
->kboard
)
942 = XGetSelectionOwner (t_dpyinfo
->display
, selection
);
943 if (x_window_to_frame (t_dpyinfo
, owner_window
) != 0)
951 selection_symbol
= x_atom_to_symbol (display
, selection
);
953 local_selection_data
= assq_no_quit (selection_symbol
, Vselection_alist
);
955 /* Well, we already believe that we don't own it, so that's just fine. */
956 if (NILP (local_selection_data
)) return;
958 local_selection_time
= (Time
)
959 cons_to_long (XCAR (XCDR (XCDR (local_selection_data
))));
961 /* This SelectionClear is for a selection that we no longer own, so we can
962 disregard it. (That is, we have reasserted the selection since this
963 request was generated.) */
965 if (changed_owner_time
!= CurrentTime
966 && local_selection_time
> changed_owner_time
)
969 /* Otherwise, we're really honest and truly being told to drop it.
970 Don't use Fdelq as that may QUIT;. */
972 if (EQ (local_selection_data
, Fcar (Vselection_alist
)))
973 Vselection_alist
= Fcdr (Vselection_alist
);
977 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
978 if (EQ (local_selection_data
, Fcar (XCDR (rest
))))
980 XSETCDR (rest
, Fcdr (XCDR (rest
)));
985 /* Let random lisp code notice that the selection has been stolen. */
989 rest
= Vx_lost_selection_functions
;
990 if (!EQ (rest
, Qunbound
))
992 for (; CONSP (rest
); rest
= Fcdr (rest
))
993 call1 (Fcar (rest
), selection_symbol
);
994 prepare_menu_bars ();
995 redisplay_preserve_echo_area (20);
1001 x_handle_selection_event (struct input_event
*event
)
1003 TRACE0 ("x_handle_selection_event");
1005 if (event
->kind
== SELECTION_REQUEST_EVENT
)
1007 if (x_queue_selection_requests
)
1008 x_queue_event (event
);
1010 x_handle_selection_request (event
);
1013 x_handle_selection_clear (event
);
1017 /* Clear all selections that were made from frame F.
1018 We do this when about to delete a frame. */
1021 x_clear_frame_selections (FRAME_PTR f
)
1026 XSETFRAME (frame
, f
);
1028 /* Otherwise, we're really honest and truly being told to drop it.
1029 Don't use Fdelq as that may QUIT;. */
1031 /* Delete elements from the beginning of Vselection_alist. */
1032 while (!NILP (Vselection_alist
)
1033 && EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist
)))))))
1035 /* Let random Lisp code notice that the selection has been stolen. */
1036 Lisp_Object hooks
, selection_symbol
;
1038 hooks
= Vx_lost_selection_functions
;
1039 selection_symbol
= Fcar (Fcar (Vselection_alist
));
1041 if (!EQ (hooks
, Qunbound
))
1043 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
1044 call1 (Fcar (hooks
), selection_symbol
);
1045 #if 0 /* This can crash when deleting a frame
1046 from x_connection_closed. Anyway, it seems unnecessary;
1047 something else should cause a redisplay. */
1048 redisplay_preserve_echo_area (21);
1052 Vselection_alist
= Fcdr (Vselection_alist
);
1055 /* Delete elements after the beginning of Vselection_alist. */
1056 for (rest
= Vselection_alist
; CONSP (rest
); rest
= XCDR (rest
))
1057 if (EQ (frame
, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest
))))))))
1059 /* Let random Lisp code notice that the selection has been stolen. */
1060 Lisp_Object hooks
, selection_symbol
;
1062 hooks
= Vx_lost_selection_functions
;
1063 selection_symbol
= Fcar (Fcar (XCDR (rest
)));
1065 if (!EQ (hooks
, Qunbound
))
1067 for (; CONSP (hooks
); hooks
= Fcdr (hooks
))
1068 call1 (Fcar (hooks
), selection_symbol
);
1069 #if 0 /* See above */
1070 redisplay_preserve_echo_area (22);
1073 XSETCDR (rest
, Fcdr (XCDR (rest
)));
1078 /* Nonzero if any properties for DISPLAY and WINDOW
1079 are on the list of what we are waiting for. */
1082 waiting_for_other_props_on_window (Display
*display
, Window window
)
1084 struct prop_location
*rest
= property_change_wait_list
;
1086 if (rest
->display
== display
&& rest
->window
== window
)
1093 /* Add an entry to the list of property changes we are waiting for.
1094 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for.
1095 The return value is a number that uniquely identifies
1096 this awaited property change. */
1098 static struct prop_location
*
1099 expect_property_change (Display
*display
, Window window
, Atom property
, int state
)
1101 struct prop_location
*pl
= (struct prop_location
*) xmalloc (sizeof *pl
);
1102 pl
->identifier
= ++prop_location_identifier
;
1103 pl
->display
= display
;
1104 pl
->window
= window
;
1105 pl
->property
= property
;
1106 pl
->desired_state
= state
;
1107 pl
->next
= property_change_wait_list
;
1109 property_change_wait_list
= pl
;
1113 /* Delete an entry from the list of property changes we are waiting for.
1114 IDENTIFIER is the number that uniquely identifies the entry. */
1117 unexpect_property_change (struct prop_location
*location
)
1119 struct prop_location
*prev
= 0, *rest
= property_change_wait_list
;
1122 if (rest
== location
)
1125 prev
->next
= rest
->next
;
1127 property_change_wait_list
= rest
->next
;
1136 /* Remove the property change expectation element for IDENTIFIER. */
1139 wait_for_property_change_unwind (Lisp_Object loc
)
1141 struct prop_location
*location
= XSAVE_VALUE (loc
)->pointer
;
1143 unexpect_property_change (location
);
1144 if (location
== property_change_reply_object
)
1145 property_change_reply_object
= 0;
1149 /* Actually wait for a property change.
1150 IDENTIFIER should be the value that expect_property_change returned. */
1153 wait_for_property_change (struct prop_location
*location
)
1156 int count
= SPECPDL_INDEX ();
1158 if (property_change_reply_object
)
1161 /* Make sure to do unexpect_property_change if we quit or err. */
1162 record_unwind_protect (wait_for_property_change_unwind
,
1163 make_save_value (location
, 0));
1165 XSETCAR (property_change_reply
, Qnil
);
1166 property_change_reply_object
= location
;
1168 /* If the event we are waiting for arrives beyond here, it will set
1169 property_change_reply, because property_change_reply_object says so. */
1170 if (! location
->arrived
)
1172 secs
= x_selection_timeout
/ 1000;
1173 usecs
= (x_selection_timeout
% 1000) * 1000;
1174 TRACE2 (" Waiting %d secs, %d usecs", secs
, usecs
);
1175 wait_reading_process_output (secs
, usecs
, 0, 0,
1176 property_change_reply
, NULL
, 0);
1178 if (NILP (XCAR (property_change_reply
)))
1180 TRACE0 (" Timed out");
1181 error ("Timed out waiting for property-notify event");
1185 unbind_to (count
, Qnil
);
1188 /* Called from XTread_socket in response to a PropertyNotify event. */
1191 x_handle_property_notify (XPropertyEvent
*event
)
1193 struct prop_location
*rest
;
1195 for (rest
= property_change_wait_list
; rest
; rest
= rest
->next
)
1198 && rest
->property
== event
->atom
1199 && rest
->window
== event
->window
1200 && rest
->display
== event
->display
1201 && rest
->desired_state
== event
->state
)
1203 TRACE2 ("Expected %s of property %s",
1204 (event
->state
== PropertyDelete
? "deletion" : "change"),
1205 XGetAtomName (event
->display
, event
->atom
));
1209 /* If this is the one wait_for_property_change is waiting for,
1210 tell it to wake up. */
1211 if (rest
== property_change_reply_object
)
1212 XSETCAR (property_change_reply
, Qt
);
1221 #if 0 /* #### MULTIPLE doesn't work yet */
1224 fetch_multiple_target (event
)
1225 XSelectionRequestEvent
*event
;
1227 Display
*display
= event
->display
;
1228 Window window
= event
->requestor
;
1229 Atom target
= event
->target
;
1230 Atom selection_atom
= event
->selection
;
1235 x_get_window_property_as_lisp_data (display
, window
, target
,
1236 QMULTIPLE
, selection_atom
));
1240 copy_multiple_data (obj
)
1247 return Fcons (XCAR (obj
), copy_multiple_data (XCDR (obj
)));
1250 vec
= Fmake_vector (size
= ASIZE (obj
), Qnil
);
1251 for (i
= 0; i
< size
; i
++)
1253 Lisp_Object vec2
= XVECTOR (obj
)->contents
[i
];
1254 CHECK_VECTOR (vec2
);
1255 if (ASIZE (vec2
) != 2)
1256 /* ??? Confusing error message */
1257 signal_error ("Vectors must be of length 2", vec2
);
1258 XVECTOR (vec
)->contents
[i
] = Fmake_vector (2, Qnil
);
1259 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[0]
1260 = XVECTOR (vec2
)->contents
[0];
1261 XVECTOR (XVECTOR (vec
)->contents
[i
])->contents
[1]
1262 = XVECTOR (vec2
)->contents
[1];
1270 /* Variables for communication with x_handle_selection_notify. */
1271 static Atom reading_which_selection
;
1272 static Lisp_Object reading_selection_reply
;
1273 static Window reading_selection_window
;
1275 /* Do protocol to read selection-data from the server.
1276 Converts this to Lisp data and returns it. */
1279 x_get_foreign_selection (Lisp_Object selection_symbol
, Lisp_Object target_type
, Lisp_Object time_stamp
)
1281 struct frame
*sf
= SELECTED_FRAME ();
1282 Window requestor_window
;
1284 struct x_display_info
*dpyinfo
;
1285 Time requestor_time
= last_event_timestamp
;
1286 Atom target_property
;
1287 Atom selection_atom
;
1290 int count
= SPECPDL_INDEX ();
1293 if (! FRAME_X_P (sf
))
1296 requestor_window
= FRAME_X_WINDOW (sf
);
1297 display
= FRAME_X_DISPLAY (sf
);
1298 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
1299 target_property
= dpyinfo
->Xatom_EMACS_TMP
;
1300 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection_symbol
);
1302 if (CONSP (target_type
))
1303 type_atom
= symbol_to_x_atom (dpyinfo
, display
, XCAR (target_type
));
1305 type_atom
= symbol_to_x_atom (dpyinfo
, display
, target_type
);
1307 if (! NILP (time_stamp
))
1309 if (CONSP (time_stamp
))
1310 requestor_time
= (Time
) cons_to_long (time_stamp
);
1311 else if (INTEGERP (time_stamp
))
1312 requestor_time
= (Time
) XUINT (time_stamp
);
1313 else if (FLOATP (time_stamp
))
1314 requestor_time
= (Time
) XFLOAT_DATA (time_stamp
);
1316 error ("TIME_STAMP must be cons or number");
1321 /* The protected block contains wait_reading_process_output, which
1322 can run random lisp code (process handlers) or signal.
1323 Therefore, we put the x_uncatch_errors call in an unwind. */
1324 record_unwind_protect (x_catch_errors_unwind
, Qnil
);
1325 x_catch_errors (display
);
1327 TRACE2 ("Get selection %s, type %s",
1328 XGetAtomName (display
, type_atom
),
1329 XGetAtomName (display
, target_property
));
1331 XConvertSelection (display
, selection_atom
, type_atom
, target_property
,
1332 requestor_window
, requestor_time
);
1335 /* Prepare to block until the reply has been read. */
1336 reading_selection_window
= requestor_window
;
1337 reading_which_selection
= selection_atom
;
1338 XSETCAR (reading_selection_reply
, Qnil
);
1340 frame
= some_frame_on_display (dpyinfo
);
1342 /* If the display no longer has frames, we can't expect
1343 to get many more selection requests from it, so don't
1344 bother trying to queue them. */
1347 x_start_queuing_selection_requests ();
1349 record_unwind_protect (queue_selection_requests_unwind
,
1354 /* This allows quits. Also, don't wait forever. */
1355 secs
= x_selection_timeout
/ 1000;
1356 usecs
= (x_selection_timeout
% 1000) * 1000;
1357 TRACE1 (" Start waiting %d secs for SelectionNotify", secs
);
1358 wait_reading_process_output (secs
, usecs
, 0, 0,
1359 reading_selection_reply
, NULL
, 0);
1360 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply
)));
1363 if (x_had_errors_p (display
))
1364 error ("Cannot get selection");
1365 /* This calls x_uncatch_errors. */
1366 unbind_to (count
, Qnil
);
1369 if (NILP (XCAR (reading_selection_reply
)))
1370 error ("Timed out waiting for reply from selection owner");
1371 if (EQ (XCAR (reading_selection_reply
), Qlambda
))
1374 /* Otherwise, the selection is waiting for us on the requested property. */
1376 x_get_window_property_as_lisp_data (display
, requestor_window
,
1377 target_property
, target_type
,
1381 /* Subroutines of x_get_window_property_as_lisp_data */
1383 /* Use xfree, not XFree, to free the data obtained with this function. */
1386 x_get_window_property (Display
*display
, Window window
, Atom property
,
1387 unsigned char **data_ret
, int *bytes_ret
,
1388 Atom
*actual_type_ret
, int *actual_format_ret
,
1389 unsigned long *actual_size_ret
, int delete_p
)
1392 unsigned long bytes_remaining
;
1394 unsigned char *tmp_data
= 0;
1396 int buffer_size
= SELECTION_QUANTUM (display
);
1398 if (buffer_size
> MAX_SELECTION_QUANTUM
)
1399 buffer_size
= MAX_SELECTION_QUANTUM
;
1403 /* First probe the thing to find out how big it is. */
1404 result
= XGetWindowProperty (display
, window
, property
,
1405 0L, 0L, False
, AnyPropertyType
,
1406 actual_type_ret
, actual_format_ret
,
1408 &bytes_remaining
, &tmp_data
);
1409 if (result
!= Success
)
1417 /* This was allocated by Xlib, so use XFree. */
1418 XFree ((char *) tmp_data
);
1420 if (*actual_type_ret
== None
|| *actual_format_ret
== 0)
1426 total_size
= bytes_remaining
+ 1;
1427 *data_ret
= (unsigned char *) xmalloc (total_size
);
1429 /* Now read, until we've gotten it all. */
1430 while (bytes_remaining
)
1432 #ifdef TRACE_SELECTION
1433 unsigned long last
= bytes_remaining
;
1436 = XGetWindowProperty (display
, window
, property
,
1437 (long)offset
/4, (long)buffer_size
/4,
1440 actual_type_ret
, actual_format_ret
,
1441 actual_size_ret
, &bytes_remaining
, &tmp_data
);
1443 TRACE2 ("Read %lu bytes from property %s",
1444 last
- bytes_remaining
,
1445 XGetAtomName (display
, property
));
1447 /* If this doesn't return Success at this point, it means that
1448 some clod deleted the selection while we were in the midst of
1449 reading it. Deal with that, I guess.... */
1450 if (result
!= Success
)
1453 /* The man page for XGetWindowProperty says:
1454 "If the returned format is 32, the returned data is represented
1455 as a long array and should be cast to that type to obtain the
1457 This applies even if long is more than 32 bits, the X library
1458 converts from 32 bit elements received from the X server to long
1459 and passes the long array to us. Thus, for that case memcpy can not
1460 be used. We convert to a 32 bit type here, because so much code
1463 The bytes and offsets passed to XGetWindowProperty refers to the
1464 property and those are indeed in 32 bit quantities if format is 32. */
1466 if (32 < BITS_PER_LONG
&& *actual_format_ret
== 32)
1469 int *idata
= (int *) ((*data_ret
) + offset
);
1470 long *ldata
= (long *) tmp_data
;
1472 for (i
= 0; i
< *actual_size_ret
; ++i
)
1474 idata
[i
]= (int) ldata
[i
];
1480 *actual_size_ret
*= *actual_format_ret
/ 8;
1481 memcpy ((*data_ret
) + offset
, tmp_data
, *actual_size_ret
);
1482 offset
+= *actual_size_ret
;
1485 /* This was allocated by Xlib, so use XFree. */
1486 XFree ((char *) tmp_data
);
1491 *bytes_ret
= offset
;
1494 /* Use xfree, not XFree, to free the data obtained with this function. */
1497 receive_incremental_selection (Display
*display
, Window window
, Atom property
,
1498 Lisp_Object target_type
,
1499 unsigned int min_size_bytes
,
1500 unsigned char **data_ret
, int *size_bytes_ret
,
1501 Atom
*type_ret
, int *format_ret
,
1502 unsigned long *size_ret
)
1505 struct prop_location
*wait_object
;
1506 *size_bytes_ret
= min_size_bytes
;
1507 *data_ret
= (unsigned char *) xmalloc (*size_bytes_ret
);
1509 TRACE1 ("Read %d bytes incrementally", min_size_bytes
);
1511 /* At this point, we have read an INCR property.
1512 Delete the property to ack it.
1513 (But first, prepare to receive the next event in this handshake.)
1515 Now, we must loop, waiting for the sending window to put a value on
1516 that property, then reading the property, then deleting it to ack.
1517 We are done when the sender places a property of length 0.
1520 XSelectInput (display
, window
, STANDARD_EVENT_SET
| PropertyChangeMask
);
1521 TRACE1 (" Delete property %s",
1522 SDATA (SYMBOL_NAME (x_atom_to_symbol (display
, property
))));
1523 XDeleteProperty (display
, window
, property
);
1524 TRACE1 (" Expect new value of property %s",
1525 SDATA (SYMBOL_NAME (x_atom_to_symbol (display
, property
))));
1526 wait_object
= expect_property_change (display
, window
, property
,
1533 unsigned char *tmp_data
;
1536 TRACE0 (" Wait for property change");
1537 wait_for_property_change (wait_object
);
1539 /* expect it again immediately, because x_get_window_property may
1540 .. no it won't, I don't get it.
1541 .. Ok, I get it now, the Xt code that implements INCR is broken. */
1542 TRACE0 (" Get property value");
1543 x_get_window_property (display
, window
, property
,
1544 &tmp_data
, &tmp_size_bytes
,
1545 type_ret
, format_ret
, size_ret
, 1);
1547 TRACE1 (" Read increment of %d bytes", tmp_size_bytes
);
1549 if (tmp_size_bytes
== 0) /* we're done */
1551 TRACE0 ("Done reading incrementally");
1553 if (! waiting_for_other_props_on_window (display
, window
))
1554 XSelectInput (display
, window
, STANDARD_EVENT_SET
);
1555 /* Use xfree, not XFree, because x_get_window_property
1556 calls xmalloc itself. */
1562 TRACE1 (" ACK by deleting property %s",
1563 XGetAtomName (display
, property
));
1564 XDeleteProperty (display
, window
, property
);
1565 wait_object
= expect_property_change (display
, window
, property
,
1570 if (*size_bytes_ret
< offset
+ tmp_size_bytes
)
1572 *size_bytes_ret
= offset
+ tmp_size_bytes
;
1573 *data_ret
= (unsigned char *) xrealloc (*data_ret
, *size_bytes_ret
);
1576 memcpy ((*data_ret
) + offset
, tmp_data
, tmp_size_bytes
);
1577 offset
+= tmp_size_bytes
;
1579 /* Use xfree, not XFree, because x_get_window_property
1580 calls xmalloc itself. */
1586 /* Once a requested selection is "ready" (we got a SelectionNotify event),
1587 fetch value from property PROPERTY of X window WINDOW on display DISPLAY.
1588 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */
1591 x_get_window_property_as_lisp_data (Display
*display
, Window window
,
1593 Lisp_Object target_type
,
1594 Atom selection_atom
)
1598 unsigned long actual_size
;
1599 unsigned char *data
= 0;
1602 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1604 TRACE0 ("Reading selection data");
1606 x_get_window_property (display
, window
, property
, &data
, &bytes
,
1607 &actual_type
, &actual_format
, &actual_size
, 1);
1610 int there_is_a_selection_owner
;
1612 there_is_a_selection_owner
1613 = XGetSelectionOwner (display
, selection_atom
);
1615 if (there_is_a_selection_owner
)
1616 signal_error ("Selection owner couldn't convert",
1618 ? list2 (target_type
,
1619 x_atom_to_symbol (display
, actual_type
))
1622 signal_error ("No selection",
1623 x_atom_to_symbol (display
, selection_atom
));
1626 if (actual_type
== dpyinfo
->Xatom_INCR
)
1628 /* That wasn't really the data, just the beginning. */
1630 unsigned int min_size_bytes
= * ((unsigned int *) data
);
1632 /* Use xfree, not XFree, because x_get_window_property
1633 calls xmalloc itself. */
1634 xfree ((char *) data
);
1636 receive_incremental_selection (display
, window
, property
, target_type
,
1637 min_size_bytes
, &data
, &bytes
,
1638 &actual_type
, &actual_format
,
1643 TRACE1 (" Delete property %s", XGetAtomName (display
, property
));
1644 XDeleteProperty (display
, window
, property
);
1648 /* It's been read. Now convert it to a lisp object in some semi-rational
1650 val
= selection_data_to_lisp_data (display
, data
, bytes
,
1651 actual_type
, actual_format
);
1653 /* Use xfree, not XFree, because x_get_window_property
1654 calls xmalloc itself. */
1655 xfree ((char *) data
);
1659 /* These functions convert from the selection data read from the server into
1660 something that we can use from Lisp, and vice versa.
1662 Type: Format: Size: Lisp Type:
1663 ----- ------- ----- -----------
1666 ATOM 32 > 1 Vector of Symbols
1668 * 16 > 1 Vector of Integers
1669 * 32 1 if <=16 bits: Integer
1670 if > 16 bits: Cons of top16, bot16
1671 * 32 > 1 Vector of the above
1673 When converting a Lisp number to C, it is assumed to be of format 16 if
1674 it is an integer, and of format 32 if it is a cons of two integers.
1676 When converting a vector of numbers from Lisp to C, it is assumed to be
1677 of format 16 if every element in the vector is an integer, and is assumed
1678 to be of format 32 if any element is a cons of two integers.
1680 When converting an object to C, it may be of the form (SYMBOL . <data>)
1681 where SYMBOL is what we should claim that the type is. Format and
1682 representation are as above.
1684 Important: When format is 32, data should contain an array of int,
1685 not an array of long as the X library returns. This makes a difference
1686 when sizeof(long) != sizeof(int). */
1691 selection_data_to_lisp_data (Display
*display
, const unsigned char *data
,
1692 int size
, Atom type
, int format
)
1694 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1696 if (type
== dpyinfo
->Xatom_NULL
)
1699 /* Convert any 8-bit data to a string, for compactness. */
1700 else if (format
== 8)
1702 Lisp_Object str
, lispy_type
;
1704 str
= make_unibyte_string ((char *) data
, size
);
1705 /* Indicate that this string is from foreign selection by a text
1706 property `foreign-selection' so that the caller of
1707 x-get-selection-internal (usually x-get-selection) can know
1708 that the string must be decode. */
1709 if (type
== dpyinfo
->Xatom_COMPOUND_TEXT
)
1710 lispy_type
= QCOMPOUND_TEXT
;
1711 else if (type
== dpyinfo
->Xatom_UTF8_STRING
)
1712 lispy_type
= QUTF8_STRING
;
1714 lispy_type
= QSTRING
;
1715 Fput_text_property (make_number (0), make_number (size
),
1716 Qforeign_selection
, lispy_type
, str
);
1719 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1720 a vector of symbols.
1722 else if (type
== XA_ATOM
)
1725 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8.
1726 But the callers of these function has made sure the data for
1727 format == 32 is an array of int. Thus, use int instead
1729 int *idata
= (int *) data
;
1731 if (size
== sizeof (int))
1732 return x_atom_to_symbol (display
, (Atom
) idata
[0]);
1735 Lisp_Object v
= Fmake_vector (make_number (size
/ sizeof (int)),
1737 for (i
= 0; i
< size
/ sizeof (int); i
++)
1738 Faset (v
, make_number (i
),
1739 x_atom_to_symbol (display
, (Atom
) idata
[i
]));
1744 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int.
1745 If the number is 32 bits and won't fit in a Lisp_Int,
1746 convert it to a cons of integers, 16 bits in each half.
1748 else if (format
== 32 && size
== sizeof (int))
1749 return long_to_cons (((unsigned int *) data
) [0]);
1750 else if (format
== 16 && size
== sizeof (short))
1751 return make_number ((int) (((unsigned short *) data
) [0]));
1753 /* Convert any other kind of data to a vector of numbers, represented
1754 as above (as an integer, or a cons of two 16 bit integers.)
1756 else if (format
== 16)
1760 v
= Fmake_vector (make_number (size
/ 2), make_number (0));
1761 for (i
= 0; i
< size
/ 2; i
++)
1763 int j
= (int) ((unsigned short *) data
) [i
];
1764 Faset (v
, make_number (i
), make_number (j
));
1771 Lisp_Object v
= Fmake_vector (make_number (size
/ 4), make_number (0));
1772 for (i
= 0; i
< size
/ 4; i
++)
1774 unsigned int j
= ((unsigned int *) data
) [i
];
1775 Faset (v
, make_number (i
), long_to_cons (j
));
1782 /* Use xfree, not XFree, to free the data obtained with this function. */
1785 lisp_data_to_selection_data (Display
*display
, Lisp_Object obj
,
1786 unsigned char **data_ret
, Atom
*type_ret
,
1787 unsigned int *size_ret
,
1788 int *format_ret
, int *nofree_ret
)
1790 Lisp_Object type
= Qnil
;
1791 struct x_display_info
*dpyinfo
= x_display_info_for_display (display
);
1795 if (CONSP (obj
) && SYMBOLP (XCAR (obj
)))
1799 if (CONSP (obj
) && NILP (XCDR (obj
)))
1803 if (EQ (obj
, QNULL
) || (EQ (type
, QNULL
)))
1804 { /* This is not the same as declining */
1810 else if (STRINGP (obj
))
1812 if (SCHARS (obj
) < SBYTES (obj
))
1813 /* OBJ is a multibyte string containing a non-ASCII char. */
1814 signal_error ("Non-ASCII string must be encoded in advance", obj
);
1818 *size_ret
= SBYTES (obj
);
1819 *data_ret
= SDATA (obj
);
1822 else if (SYMBOLP (obj
))
1826 *data_ret
= (unsigned char *) xmalloc (sizeof (Atom
) + 1);
1827 (*data_ret
) [sizeof (Atom
)] = 0;
1828 (*(Atom
**) data_ret
) [0] = symbol_to_x_atom (dpyinfo
, display
, obj
);
1829 if (NILP (type
)) type
= QATOM
;
1831 else if (INTEGERP (obj
)
1832 && XINT (obj
) < 0xFFFF
1833 && XINT (obj
) > -0xFFFF)
1837 *data_ret
= (unsigned char *) xmalloc (sizeof (short) + 1);
1838 (*data_ret
) [sizeof (short)] = 0;
1839 (*(short **) data_ret
) [0] = (short) XINT (obj
);
1840 if (NILP (type
)) type
= QINTEGER
;
1842 else if (INTEGERP (obj
)
1843 || (CONSP (obj
) && INTEGERP (XCAR (obj
))
1844 && (INTEGERP (XCDR (obj
))
1845 || (CONSP (XCDR (obj
))
1846 && INTEGERP (XCAR (XCDR (obj
)))))))
1850 *data_ret
= (unsigned char *) xmalloc (sizeof (long) + 1);
1851 (*data_ret
) [sizeof (long)] = 0;
1852 (*(unsigned long **) data_ret
) [0] = cons_to_long (obj
);
1853 if (NILP (type
)) type
= QINTEGER
;
1855 else if (VECTORP (obj
))
1857 /* Lisp_Vectors may represent a set of ATOMs;
1858 a set of 16 or 32 bit INTEGERs;
1859 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...]
1863 if (SYMBOLP (XVECTOR (obj
)->contents
[0]))
1864 /* This vector is an ATOM set */
1866 if (NILP (type
)) type
= QATOM
;
1867 *size_ret
= ASIZE (obj
);
1869 *data_ret
= (unsigned char *) xmalloc ((*size_ret
) * sizeof (Atom
));
1870 for (i
= 0; i
< *size_ret
; i
++)
1871 if (SYMBOLP (XVECTOR (obj
)->contents
[i
]))
1872 (*(Atom
**) data_ret
) [i
]
1873 = symbol_to_x_atom (dpyinfo
, display
, XVECTOR (obj
)->contents
[i
]);
1875 signal_error ("All elements of selection vector must have same type", obj
);
1877 #if 0 /* #### MULTIPLE doesn't work yet */
1878 else if (VECTORP (XVECTOR (obj
)->contents
[0]))
1879 /* This vector is an ATOM_PAIR set */
1881 if (NILP (type
)) type
= QATOM_PAIR
;
1882 *size_ret
= ASIZE (obj
);
1884 *data_ret
= (unsigned char *)
1885 xmalloc ((*size_ret
) * sizeof (Atom
) * 2);
1886 for (i
= 0; i
< *size_ret
; i
++)
1887 if (VECTORP (XVECTOR (obj
)->contents
[i
]))
1889 Lisp_Object pair
= XVECTOR (obj
)->contents
[i
];
1890 if (ASIZE (pair
) != 2)
1892 "Elements of the vector must be vectors of exactly two elements",
1895 (*(Atom
**) data_ret
) [i
* 2]
1896 = symbol_to_x_atom (dpyinfo
, display
,
1897 XVECTOR (pair
)->contents
[0]);
1898 (*(Atom
**) data_ret
) [(i
* 2) + 1]
1899 = symbol_to_x_atom (dpyinfo
, display
,
1900 XVECTOR (pair
)->contents
[1]);
1903 signal_error ("All elements of the vector must be of the same type",
1909 /* This vector is an INTEGER set, or something like it */
1912 *size_ret
= ASIZE (obj
);
1913 if (NILP (type
)) type
= QINTEGER
;
1915 for (i
= 0; i
< *size_ret
; i
++)
1916 if (CONSP (XVECTOR (obj
)->contents
[i
]))
1918 else if (!INTEGERP (XVECTOR (obj
)->contents
[i
]))
1919 signal_error (/* Qselection_error */
1920 "Elements of selection vector must be integers or conses of integers",
1923 /* Use sizeof(long) even if it is more than 32 bits. See comment
1924 in x_get_window_property and x_fill_property_data. */
1926 if (*format_ret
== 32) data_size
= sizeof(long);
1927 *data_ret
= (unsigned char *) xmalloc (*size_ret
* data_size
);
1928 for (i
= 0; i
< *size_ret
; i
++)
1929 if (*format_ret
== 32)
1930 (*((unsigned long **) data_ret
)) [i
]
1931 = cons_to_long (XVECTOR (obj
)->contents
[i
]);
1933 (*((unsigned short **) data_ret
)) [i
]
1934 = (unsigned short) cons_to_long (XVECTOR (obj
)->contents
[i
]);
1938 signal_error (/* Qselection_error */ "Unrecognized selection data", obj
);
1940 *type_ret
= symbol_to_x_atom (dpyinfo
, display
, type
);
1944 clean_local_selection_data (Lisp_Object obj
)
1947 && INTEGERP (XCAR (obj
))
1948 && CONSP (XCDR (obj
))
1949 && INTEGERP (XCAR (XCDR (obj
)))
1950 && NILP (XCDR (XCDR (obj
))))
1951 obj
= Fcons (XCAR (obj
), XCDR (obj
));
1954 && INTEGERP (XCAR (obj
))
1955 && INTEGERP (XCDR (obj
)))
1957 if (XINT (XCAR (obj
)) == 0)
1959 if (XINT (XCAR (obj
)) == -1)
1960 return make_number (- XINT (XCDR (obj
)));
1965 int size
= ASIZE (obj
);
1968 return clean_local_selection_data (XVECTOR (obj
)->contents
[0]);
1969 copy
= Fmake_vector (make_number (size
), Qnil
);
1970 for (i
= 0; i
< size
; i
++)
1971 XVECTOR (copy
)->contents
[i
]
1972 = clean_local_selection_data (XVECTOR (obj
)->contents
[i
]);
1978 /* Called from XTread_socket to handle SelectionNotify events.
1979 If it's the selection we are waiting for, stop waiting
1980 by setting the car of reading_selection_reply to non-nil.
1981 We store t there if the reply is successful, lambda if not. */
1984 x_handle_selection_notify (XSelectionEvent
*event
)
1986 if (event
->requestor
!= reading_selection_window
)
1988 if (event
->selection
!= reading_which_selection
)
1991 TRACE0 ("Received SelectionNotify");
1992 XSETCAR (reading_selection_reply
,
1993 (event
->property
!= 0 ? Qt
: Qlambda
));
1997 DEFUN ("x-own-selection-internal", Fx_own_selection_internal
,
1998 Sx_own_selection_internal
, 2, 2, 0,
1999 doc
: /* Assert an X selection of type SELECTION and value VALUE.
2000 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2001 \(Those are literal upper-case symbol names, since that's what X expects.)
2002 VALUE is typically a string, or a cons of two markers, but may be
2003 anything that the functions on `selection-converter-alist' know about. */)
2004 (Lisp_Object selection
, Lisp_Object value
)
2007 CHECK_SYMBOL (selection
);
2008 if (NILP (value
)) error ("VALUE may not be nil");
2009 x_own_selection (selection
, value
);
2014 /* Request the selection value from the owner. If we are the owner,
2015 simply return our selection value. If we are not the owner, this
2016 will block until all of the data has arrived. */
2018 DEFUN ("x-get-selection-internal", Fx_get_selection_internal
,
2019 Sx_get_selection_internal
, 2, 3, 0,
2020 doc
: /* Return text selected from some X window.
2021 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2022 \(Those are literal upper-case symbol names, since that's what X expects.)
2023 TYPE is the type of data desired, typically `STRING'.
2024 TIME_STAMP is the time to use in the XConvertSelection call for foreign
2025 selections. If omitted, defaults to the time for the last event. */)
2026 (Lisp_Object selection_symbol
, Lisp_Object target_type
, Lisp_Object time_stamp
)
2028 Lisp_Object val
= Qnil
;
2029 struct gcpro gcpro1
, gcpro2
;
2030 GCPRO2 (target_type
, val
); /* we store newly consed data into these */
2032 CHECK_SYMBOL (selection_symbol
);
2034 #if 0 /* #### MULTIPLE doesn't work yet */
2035 if (CONSP (target_type
)
2036 && XCAR (target_type
) == QMULTIPLE
)
2038 CHECK_VECTOR (XCDR (target_type
));
2039 /* So we don't destructively modify this... */
2040 target_type
= copy_multiple_data (target_type
);
2044 CHECK_SYMBOL (target_type
);
2046 val
= x_get_local_selection (selection_symbol
, target_type
, 1);
2049 RETURN_UNGCPRO (x_get_foreign_selection (selection_symbol
,
2050 target_type
, time_stamp
));
2052 if (CONSP (val
) && SYMBOLP (XCAR (val
)))
2055 if (CONSP (val
) && NILP (XCDR (val
)))
2058 RETURN_UNGCPRO (clean_local_selection_data (val
));
2061 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal
,
2062 Sx_disown_selection_internal
, 1, 2, 0,
2063 doc
: /* If we own the selection SELECTION, disown it.
2064 Disowning it means there is no such selection. */)
2065 (Lisp_Object selection
, Lisp_Object time_object
)
2068 Atom selection_atom
;
2070 struct selection_input_event sie
;
2071 struct input_event ie
;
2074 struct x_display_info
*dpyinfo
;
2075 struct frame
*sf
= SELECTED_FRAME ();
2078 if (! FRAME_X_P (sf
))
2081 display
= FRAME_X_DISPLAY (sf
);
2082 dpyinfo
= FRAME_X_DISPLAY_INFO (sf
);
2083 CHECK_SYMBOL (selection
);
2084 if (NILP (time_object
))
2085 timestamp
= last_event_timestamp
;
2087 timestamp
= cons_to_long (time_object
);
2089 if (NILP (assq_no_quit (selection
, Vselection_alist
)))
2090 return Qnil
; /* Don't disown the selection when we're not the owner. */
2092 selection_atom
= symbol_to_x_atom (dpyinfo
, display
, selection
);
2095 XSetSelectionOwner (display
, selection_atom
, None
, timestamp
);
2098 /* It doesn't seem to be guaranteed that a SelectionClear event will be
2099 generated for a window which owns the selection when that window sets
2100 the selection owner to None. The NCD server does, the MIT Sun4 server
2101 doesn't. So we synthesize one; this means we might get two, but
2102 that's ok, because the second one won't have any effect. */
2103 SELECTION_EVENT_DISPLAY (&event
.sie
) = display
;
2104 SELECTION_EVENT_SELECTION (&event
.sie
) = selection_atom
;
2105 SELECTION_EVENT_TIME (&event
.sie
) = timestamp
;
2106 x_handle_selection_clear (&event
.ie
);
2111 DEFUN ("x-selection-owner-p", Fx_selection_owner_p
, Sx_selection_owner_p
,
2113 doc
: /* Whether the current Emacs process owns the given X Selection.
2114 The arg should be the name of the selection in question, typically one of
2115 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2116 \(Those are literal upper-case symbol names, since that's what X expects.)
2117 For convenience, the symbol nil is the same as `PRIMARY',
2118 and t is the same as `SECONDARY'. */)
2119 (Lisp_Object selection
)
2122 CHECK_SYMBOL (selection
);
2123 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2124 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2126 if (NILP (Fassq (selection
, Vselection_alist
)))
2131 DEFUN ("x-selection-exists-p", Fx_selection_exists_p
, Sx_selection_exists_p
,
2133 doc
: /* Whether there is an owner for the given X Selection.
2134 The arg should be the name of the selection in question, typically one of
2135 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
2136 \(Those are literal upper-case symbol names, since that's what X expects.)
2137 For convenience, the symbol nil is the same as `PRIMARY',
2138 and t is the same as `SECONDARY'. */)
2139 (Lisp_Object selection
)
2144 struct frame
*sf
= SELECTED_FRAME ();
2146 /* It should be safe to call this before we have an X frame. */
2147 if (! FRAME_X_P (sf
))
2150 dpy
= FRAME_X_DISPLAY (sf
);
2151 CHECK_SYMBOL (selection
);
2152 if (!NILP (Fx_selection_owner_p (selection
)))
2154 if (EQ (selection
, Qnil
)) selection
= QPRIMARY
;
2155 if (EQ (selection
, Qt
)) selection
= QSECONDARY
;
2156 atom
= symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf
), dpy
, selection
);
2160 owner
= XGetSelectionOwner (dpy
, atom
);
2162 return (owner
? Qt
: Qnil
);
2166 /***********************************************************************
2167 Drag and drop support
2168 ***********************************************************************/
2169 /* Check that lisp values are of correct type for x_fill_property_data.
2170 That is, number, string or a cons with two numbers (low and high 16
2171 bit parts of a 32 bit number). Return the number of items in DATA,
2172 or -1 if there is an error. */
2175 x_check_property_data (Lisp_Object data
)
2180 for (iter
= data
; CONSP (iter
); iter
= XCDR (iter
))
2182 Lisp_Object o
= XCAR (iter
);
2184 if (! NUMBERP (o
) && ! STRINGP (o
) && ! CONSP (o
))
2186 else if (CONSP (o
) &&
2187 (! NUMBERP (XCAR (o
)) || ! NUMBERP (XCDR (o
))))
2195 /* Convert lisp values to a C array. Values may be a number, a string
2196 which is taken as an X atom name and converted to the atom value, or
2197 a cons containing the two 16 bit parts of a 32 bit number.
2199 DPY is the display use to look up X atoms.
2200 DATA is a Lisp list of values to be converted.
2201 RET is the C array that contains the converted values. It is assumed
2202 it is big enough to hold all values.
2203 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to
2204 be stored in RET. Note that long is used for 32 even if long is more
2205 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and
2206 XClientMessageEvent). */
2209 x_fill_property_data (Display
*dpy
, Lisp_Object data
, void *ret
, int format
)
2212 long *d32
= (long *) ret
;
2213 short *d16
= (short *) ret
;
2214 char *d08
= (char *) ret
;
2217 for (iter
= data
; CONSP (iter
); iter
= XCDR (iter
))
2219 Lisp_Object o
= XCAR (iter
);
2222 val
= (long) XFASTINT (o
);
2223 else if (FLOATP (o
))
2224 val
= (long) XFLOAT_DATA (o
);
2226 val
= (long) cons_to_long (o
);
2227 else if (STRINGP (o
))
2230 val
= (long) XInternAtom (dpy
, SSDATA (o
), False
);
2234 error ("Wrong type, must be string, number or cons");
2237 *d08
++ = (char) val
;
2238 else if (format
== 16)
2239 *d16
++ = (short) val
;
2245 /* Convert an array of C values to a Lisp list.
2246 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM.
2247 DATA is a C array of values to be converted.
2248 TYPE is the type of the data. Only XA_ATOM is special, it converts
2249 each number in DATA to its corresponfing X atom as a symbol.
2250 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to
2252 SIZE is the number of elements in DATA.
2254 Important: When format is 32, data should contain an array of int,
2255 not an array of long as the X library returns. This makes a difference
2256 when sizeof(long) != sizeof(int).
2258 Also see comment for selection_data_to_lisp_data above. */
2261 x_property_data_to_lisp (struct frame
*f
, const unsigned char *data
,
2262 Atom type
, int format
, long unsigned int size
)
2264 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f
),
2265 data
, size
*format
/8, type
, format
);
2268 /* Get the mouse position in frame relative coordinates. */
2271 mouse_position_for_drop (FRAME_PTR f
, int *x
, int *y
)
2273 Window root
, dummy_window
;
2278 XQueryPointer (FRAME_X_DISPLAY (f
),
2279 DefaultRootWindow (FRAME_X_DISPLAY (f
)),
2281 /* The root window which contains the pointer. */
2284 /* Window pointer is on, not used */
2287 /* The position on that root window. */
2290 /* x/y in dummy_window coordinates, not used. */
2293 /* Modifier keys and pointer buttons, about which
2295 (unsigned int *) &dummy
);
2298 /* Absolute to relative. */
2299 *x
-= f
->left_pos
+ FRAME_OUTER_TO_INNER_DIFF_X (f
);
2300 *y
-= f
->top_pos
+ FRAME_OUTER_TO_INNER_DIFF_Y (f
);
2305 DEFUN ("x-get-atom-name", Fx_get_atom_name
,
2306 Sx_get_atom_name
, 1, 2, 0,
2307 doc
: /* Return the X atom name for VALUE as a string.
2308 VALUE may be a number or a cons where the car is the upper 16 bits and
2309 the cdr is the lower 16 bits of a 32 bit value.
2310 Use the display for FRAME or the current frame if FRAME is not given or nil.
2312 If the value is 0 or the atom is not known, return the empty string. */)
2313 (Lisp_Object value
, Lisp_Object frame
)
2315 struct frame
*f
= check_x_frame (frame
);
2318 Lisp_Object ret
= Qnil
;
2319 Display
*dpy
= FRAME_X_DISPLAY (f
);
2323 if (INTEGERP (value
))
2324 atom
= (Atom
) XUINT (value
);
2325 else if (FLOATP (value
))
2326 atom
= (Atom
) XFLOAT_DATA (value
);
2327 else if (CONSP (value
))
2328 atom
= (Atom
) cons_to_long (value
);
2330 error ("Wrong type, value must be number or cons");
2333 x_catch_errors (dpy
);
2334 name
= atom
? XGetAtomName (dpy
, atom
) : empty
;
2335 had_errors
= x_had_errors_p (dpy
);
2336 x_uncatch_errors ();
2339 ret
= make_string (name
, strlen (name
));
2341 if (atom
&& name
) XFree (name
);
2342 if (NILP (ret
)) ret
= empty_unibyte_string
;
2349 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom
,
2350 Sx_register_dnd_atom
, 1, 2, 0,
2351 doc
: /* Request that dnd events are made for ClientMessages with ATOM.
2352 ATOM can be a symbol or a string. The ATOM is interned on the display that
2353 FRAME is on. If FRAME is nil, the selected frame is used. */)
2354 (Lisp_Object atom
, Lisp_Object frame
)
2357 struct frame
*f
= check_x_frame (frame
);
2359 struct x_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
2363 x_atom
= symbol_to_x_atom (dpyinfo
, FRAME_X_DISPLAY (f
), atom
);
2364 else if (STRINGP (atom
))
2367 x_atom
= XInternAtom (FRAME_X_DISPLAY (f
), SSDATA (atom
), False
);
2371 error ("ATOM must be a symbol or a string");
2373 for (i
= 0; i
< dpyinfo
->x_dnd_atoms_length
; ++i
)
2374 if (dpyinfo
->x_dnd_atoms
[i
] == x_atom
)
2377 if (dpyinfo
->x_dnd_atoms_length
== dpyinfo
->x_dnd_atoms_size
)
2379 dpyinfo
->x_dnd_atoms_size
*= 2;
2380 dpyinfo
->x_dnd_atoms
= xrealloc (dpyinfo
->x_dnd_atoms
,
2381 sizeof (*dpyinfo
->x_dnd_atoms
)
2382 * dpyinfo
->x_dnd_atoms_size
);
2385 dpyinfo
->x_dnd_atoms
[dpyinfo
->x_dnd_atoms_length
++] = x_atom
;
2389 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */
2392 x_handle_dnd_message (struct frame
*f
, XClientMessageEvent
*event
, struct x_display_info
*dpyinfo
, struct input_event
*bufp
)
2396 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */
2397 unsigned long size
= 160/event
->format
;
2399 unsigned char *data
= (unsigned char *) event
->data
.b
;
2403 for (i
= 0; i
< dpyinfo
->x_dnd_atoms_length
; ++i
)
2404 if (dpyinfo
->x_dnd_atoms
[i
] == event
->message_type
) break;
2406 if (i
== dpyinfo
->x_dnd_atoms_length
) return 0;
2408 XSETFRAME (frame
, f
);
2410 /* On a 64 bit machine, the event->data.l array members are 64 bits (long),
2411 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data)
2412 function expects them to be of size int (i.e. 32). So to be able to
2413 use that function, put the data in the form it expects if format is 32. */
2415 if (32 < BITS_PER_LONG
&& event
->format
== 32)
2417 for (i
= 0; i
< 5; ++i
) /* There are only 5 longs in a ClientMessage. */
2418 idata
[i
] = (int) event
->data
.l
[i
];
2419 data
= (unsigned char *) idata
;
2422 vec
= Fmake_vector (make_number (4), Qnil
);
2423 ASET (vec
, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f
),
2424 event
->message_type
)));
2425 ASET (vec
, 1, frame
);
2426 ASET (vec
, 2, make_number (event
->format
));
2427 ASET (vec
, 3, x_property_data_to_lisp (f
,
2429 event
->message_type
,
2433 mouse_position_for_drop (f
, &x
, &y
);
2434 bufp
->kind
= DRAG_N_DROP_EVENT
;
2435 bufp
->frame_or_window
= frame
;
2436 bufp
->timestamp
= CurrentTime
;
2437 bufp
->x
= make_number (x
);
2438 bufp
->y
= make_number (y
);
2440 bufp
->modifiers
= 0;
2445 DEFUN ("x-send-client-message", Fx_send_client_event
,
2446 Sx_send_client_message
, 6, 6, 0,
2447 doc
: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY.
2449 For DISPLAY, specify either a frame or a display name (a string).
2450 If DISPLAY is nil, that stands for the selected frame's display.
2451 DEST may be a number, in which case it is a Window id. The value 0 may
2452 be used to send to the root window of the DISPLAY.
2453 If DEST is a cons, it is converted to a 32 bit number
2454 with the high 16 bits from the car and the lower 16 bit from the cdr. That
2455 number is then used as a window id.
2456 If DEST is a frame the event is sent to the outer window of that frame.
2457 A value of nil means the currently selected frame.
2458 If DEST is the string "PointerWindow" the event is sent to the window that
2459 contains the pointer. If DEST is the string "InputFocus" the event is
2460 sent to the window that has the input focus.
2461 FROM is the frame sending the event. Use nil for currently selected frame.
2462 MESSAGE-TYPE is the name of an Atom as a string.
2463 FORMAT must be one of 8, 16 or 32 and determines the size of the values in
2464 bits. VALUES is a list of numbers, cons and/or strings containing the values
2465 to send. If a value is a string, it is converted to an Atom and the value of
2466 the Atom is sent. If a value is a cons, it is converted to a 32 bit number
2467 with the high 16 bits from the car and the lower 16 bit from the cdr.
2468 If more values than fits into the event is given, the excessive values
2470 (Lisp_Object display
, Lisp_Object dest
, Lisp_Object from
, Lisp_Object message_type
, Lisp_Object format
, Lisp_Object values
)
2472 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
2474 CHECK_STRING (message_type
);
2475 x_send_client_event(display
, dest
, from
,
2476 XInternAtom (dpyinfo
->display
,
2477 SSDATA (message_type
),
2485 x_send_client_event (Lisp_Object display
, Lisp_Object dest
, Lisp_Object from
, Atom message_type
, Lisp_Object format
, Lisp_Object values
)
2487 struct x_display_info
*dpyinfo
= check_x_display_info (display
);
2490 struct frame
*f
= check_x_frame (from
);
2493 CHECK_NUMBER (format
);
2494 CHECK_CONS (values
);
2496 if (x_check_property_data (values
) == -1)
2497 error ("Bad data in VALUES, must be number, cons or string");
2499 event
.xclient
.type
= ClientMessage
;
2500 event
.xclient
.format
= XFASTINT (format
);
2502 if (event
.xclient
.format
!= 8 && event
.xclient
.format
!= 16
2503 && event
.xclient
.format
!= 32)
2504 error ("FORMAT must be one of 8, 16 or 32");
2506 if (FRAMEP (dest
) || NILP (dest
))
2508 struct frame
*fdest
= check_x_frame (dest
);
2509 wdest
= FRAME_OUTER_WINDOW (fdest
);
2511 else if (STRINGP (dest
))
2513 if (strcmp (SSDATA (dest
), "PointerWindow") == 0)
2514 wdest
= PointerWindow
;
2515 else if (strcmp (SSDATA (dest
), "InputFocus") == 0)
2518 error ("DEST as a string must be one of PointerWindow or InputFocus");
2520 else if (INTEGERP (dest
))
2521 wdest
= (Window
) XFASTINT (dest
);
2522 else if (FLOATP (dest
))
2523 wdest
= (Window
) XFLOAT_DATA (dest
);
2524 else if (CONSP (dest
))
2526 if (! NUMBERP (XCAR (dest
)) || ! NUMBERP (XCDR (dest
)))
2527 error ("Both car and cdr for DEST must be numbers");
2529 wdest
= (Window
) cons_to_long (dest
);
2532 error ("DEST must be a frame, nil, string, number or cons");
2534 if (wdest
== 0) wdest
= dpyinfo
->root_window
;
2535 to_root
= wdest
== dpyinfo
->root_window
;
2539 event
.xclient
.message_type
= message_type
;
2540 event
.xclient
.display
= dpyinfo
->display
;
2542 /* Some clients (metacity for example) expects sending window to be here
2543 when sending to the root window. */
2544 event
.xclient
.window
= to_root
? FRAME_OUTER_WINDOW (f
) : wdest
;
2547 memset (event
.xclient
.data
.b
, 0, sizeof (event
.xclient
.data
.b
));
2548 x_fill_property_data (dpyinfo
->display
, values
, event
.xclient
.data
.b
,
2549 event
.xclient
.format
);
2551 /* If event mask is 0 the event is sent to the client that created
2552 the destination window. But if we are sending to the root window,
2553 there is no such client. Then we set the event mask to 0xffff. The
2554 event then goes to clients selecting for events on the root window. */
2555 x_catch_errors (dpyinfo
->display
);
2557 int propagate
= to_root
? False
: True
;
2558 unsigned mask
= to_root
? 0xffff : 0;
2559 XSendEvent (dpyinfo
->display
, wdest
, propagate
, mask
, &event
);
2560 XFlush (dpyinfo
->display
);
2562 x_uncatch_errors ();
2568 syms_of_xselect (void)
2570 defsubr (&Sx_get_selection_internal
);
2571 defsubr (&Sx_own_selection_internal
);
2572 defsubr (&Sx_disown_selection_internal
);
2573 defsubr (&Sx_selection_owner_p
);
2574 defsubr (&Sx_selection_exists_p
);
2576 defsubr (&Sx_get_atom_name
);
2577 defsubr (&Sx_send_client_message
);
2578 defsubr (&Sx_register_dnd_atom
);
2580 reading_selection_reply
= Fcons (Qnil
, Qnil
);
2581 staticpro (&reading_selection_reply
);
2582 reading_selection_window
= 0;
2583 reading_which_selection
= 0;
2585 property_change_wait_list
= 0;
2586 prop_location_identifier
= 0;
2587 property_change_reply
= Fcons (Qnil
, Qnil
);
2588 staticpro (&property_change_reply
);
2590 Vselection_alist
= Qnil
;
2591 staticpro (&Vselection_alist
);
2593 DEFVAR_LISP ("selection-converter-alist", Vselection_converter_alist
,
2594 doc
: /* An alist associating X Windows selection-types with functions.
2595 These functions are called to convert the selection, with three args:
2596 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2597 a desired type to which the selection should be converted;
2598 and the local selection value (whatever was given to `x-own-selection').
2600 The function should return the value to send to the X server
2601 \(typically a string). A return value of nil
2602 means that the conversion could not be done.
2603 A return value which is the symbol `NULL'
2604 means that a side-effect was executed,
2605 and there is no meaningful selection value. */);
2606 Vselection_converter_alist
= Qnil
;
2608 DEFVAR_LISP ("x-lost-selection-functions", Vx_lost_selection_functions
,
2609 doc
: /* A list of functions to be called when Emacs loses an X selection.
2610 \(This happens when some other X client makes its own selection
2611 or when a Lisp program explicitly clears the selection.)
2612 The functions are called with one argument, the selection type
2613 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */);
2614 Vx_lost_selection_functions
= Qnil
;
2616 DEFVAR_LISP ("x-sent-selection-functions", Vx_sent_selection_functions
,
2617 doc
: /* A list of functions to be called when Emacs answers a selection request.
2618 The functions are called with four arguments:
2619 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');
2620 - the selection-type which Emacs was asked to convert the
2621 selection into before sending (for example, `STRING' or `LENGTH');
2622 - a flag indicating success or failure for responding to the request.
2623 We might have failed (and declined the request) for any number of reasons,
2624 including being asked for a selection that we no longer own, or being asked
2625 to convert into a type that we don't know about or that is inappropriate.
2626 This hook doesn't let you change the behavior of Emacs's selection replies,
2627 it merely informs you that they have happened. */);
2628 Vx_sent_selection_functions
= Qnil
;
2630 DEFVAR_INT ("x-selection-timeout", x_selection_timeout
,
2631 doc
: /* Number of milliseconds to wait for a selection reply.
2632 If the selection owner doesn't reply in this time, we give up.
2633 A value of 0 means wait as long as necessary. This is initialized from the
2634 \"*selectionTimeout\" resource. */);
2635 x_selection_timeout
= 0;
2637 /* QPRIMARY is defined in keyboard.c. */
2638 DEFSYM (QSECONDARY
, "SECONDARY");
2639 DEFSYM (QSTRING
, "STRING");
2640 DEFSYM (QINTEGER
, "INTEGER");
2641 DEFSYM (QCLIPBOARD
, "CLIPBOARD");
2642 DEFSYM (QTIMESTAMP
, "TIMESTAMP");
2643 DEFSYM (QTEXT
, "TEXT");
2644 DEFSYM (QCOMPOUND_TEXT
, "COMPOUND_TEXT");
2645 DEFSYM (QUTF8_STRING
, "UTF8_STRING");
2646 DEFSYM (QDELETE
, "DELETE");
2647 DEFSYM (QMULTIPLE
, "MULTIPLE");
2648 DEFSYM (QINCR
, "INCR");
2649 DEFSYM (QEMACS_TMP
, "_EMACS_TMP_");
2650 DEFSYM (QTARGETS
, "TARGETS");
2651 DEFSYM (QATOM
, "ATOM");
2652 DEFSYM (QATOM_PAIR
, "ATOM_PAIR");
2653 DEFSYM (QNULL
, "NULL");
2654 DEFSYM (Qcompound_text_with_extensions
, "compound-text-with-extensions");
2655 DEFSYM (Qforeign_selection
, "foreign-selection");