Mercurial > emacs
annotate src/xselect.c @ 93762:46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Give up if glyph indices not supported. Use uniscribe obtained
ABC widths for individual metrics. Map glyph clusters back to
characters using fClusterStart flag. Return number of glyphs
produced, not chars processed.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Sun, 06 Apr 2008 01:04:45 +0000 |
parents | d1e53221c4aa |
children | 8971ddf55736 |
rev | line source |
---|---|
9617
3ea6ce042453
Log omitted from previous checkin:
Richard M. Stallman <rms@gnu.org>
parents:
9616
diff
changeset
|
1 /* X Selection processing for Emacs. |
64770
a0d1312ede66
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64252
diff
changeset
|
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003, |
79759 | 3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. |
2161 | 4 |
5 This file is part of GNU Emacs. | |
6 | |
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 | |
78260
922696f363b0
Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents:
76360
diff
changeset
|
9 the Free Software Foundation; either version 3, or (at your option) |
2161 | 10 any later version. |
11 | |
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. | |
16 | |
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 | |
64084 | 19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
20 Boston, MA 02110-1301, USA. */ | |
2161 | 21 |
2961 | 22 |
2161 | 23 /* Rewritten by jwz */ |
24 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4636
diff
changeset
|
25 #include <config.h> |
53818
a3c89ed1aac5
* xselect.c: Include stdio,h.
Jan Djärv <jan.h.d@swipnet.se>
parents:
53786
diff
changeset
|
26 #include <stdio.h> /* termhooks.h needs this */ |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
27 |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
28 #ifdef HAVE_SYS_TYPES_H |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
29 #include <sys/types.h> |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
30 #endif |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
31 #ifdef HAVE_UNISTD_H |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
32 #include <unistd.h> |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
33 #endif |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
34 |
2161 | 35 #include "lisp.h" |
36 #include "xterm.h" /* for all of the X includes */ | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
37 #include "dispextern.h" /* frame.h seems to want this */ |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
38 #include "frame.h" /* Need this to get the X window of selected_frame */ |
2439
b6c62e4abf59
Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents:
2372
diff
changeset
|
39 #include "blockinput.h" |
20104 | 40 #include "buffer.h" |
21514 | 41 #include "process.h" |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
42 #include "termhooks.h" |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
43 #include "keyboard.h" |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
44 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
45 #include <X11/Xproto.h> |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
46 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
47 struct prop_location; |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
48 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
49 static Lisp_Object x_atom_to_symbol P_ ((Display *dpy, Atom atom)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
50 static Atom symbol_to_x_atom P_ ((struct x_display_info *, Display *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
51 Lisp_Object)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
52 static void x_own_selection P_ ((Lisp_Object, Lisp_Object)); |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
53 static Lisp_Object x_get_local_selection P_ ((Lisp_Object, Lisp_Object, int)); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
54 static void x_decline_selection_request P_ ((struct input_event *)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
55 static Lisp_Object x_selection_request_lisp_error P_ ((Lisp_Object)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
56 static Lisp_Object queue_selection_requests_unwind P_ ((Lisp_Object)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
57 static Lisp_Object some_frame_on_display P_ ((struct x_display_info *)); |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
58 static Lisp_Object x_catch_errors_unwind P_ ((Lisp_Object)); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
59 static void x_reply_selection_request P_ ((struct input_event *, int, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
60 unsigned char *, int, Atom)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
61 static int waiting_for_other_props_on_window P_ ((Display *, Window)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
62 static struct prop_location *expect_property_change P_ ((Display *, Window, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
63 Atom, int)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
64 static void unexpect_property_change P_ ((struct prop_location *)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
65 static Lisp_Object wait_for_property_change_unwind P_ ((Lisp_Object)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
66 static void wait_for_property_change P_ ((struct prop_location *)); |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
67 static Lisp_Object x_get_foreign_selection P_ ((Lisp_Object, |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
68 Lisp_Object, |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
69 Lisp_Object)); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
70 static void x_get_window_property P_ ((Display *, Window, Atom, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
71 unsigned char **, int *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
72 Atom *, int *, unsigned long *, int)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
73 static void receive_incremental_selection P_ ((Display *, Window, Atom, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
74 Lisp_Object, unsigned, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
75 unsigned char **, int *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
76 Atom *, int *, unsigned long *)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
77 static Lisp_Object x_get_window_property_as_lisp_data P_ ((Display *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
78 Window, Atom, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
79 Lisp_Object, Atom)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
80 static Lisp_Object selection_data_to_lisp_data P_ ((Display *, unsigned char *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
81 int, Atom, int)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
82 static void lisp_data_to_selection_data P_ ((Display *, Lisp_Object, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
83 unsigned char **, Atom *, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
84 unsigned *, int *, int *)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
85 static Lisp_Object clean_local_selection_data P_ ((Lisp_Object)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
86 static void initialize_cut_buffers P_ ((Display *, Window)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
87 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
88 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
89 /* Printing traces to stderr. */ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
90 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
91 #ifdef TRACE_SELECTION |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
92 #define TRACE0(fmt) \ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
93 fprintf (stderr, "%d: " fmt "\n", getpid ()) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
94 #define TRACE1(fmt, a0) \ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
95 fprintf (stderr, "%d: " fmt "\n", getpid (), a0) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
96 #define TRACE2(fmt, a0, a1) \ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
97 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1) |
57948
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
98 #define TRACE3(fmt, a0, a1, a2) \ |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
99 fprintf (stderr, "%d: " fmt "\n", getpid (), a0, a1, a2) |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
100 #else |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
101 #define TRACE0(fmt) (void) 0 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
102 #define TRACE1(fmt, a0) (void) 0 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
103 #define TRACE2(fmt, a0, a1) (void) 0 |
57948
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
104 #define TRACE3(fmt, a0, a1) (void) 0 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
105 #endif |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
106 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
107 |
2161 | 108 #define CUT_BUFFER_SUPPORT |
109 | |
110 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP, | |
111 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL, | |
112 QATOM_PAIR; | |
113 | |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
114 Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */ |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
115 Lisp_Object QUTF8_STRING; /* This is a type of selection. */ |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
116 |
43559
244e1fe7e57f
(Qcompound_text_with_extensions): Renamed from Qcompound_text_no_extensions.
Eli Zaretskii <eliz@gnu.org>
parents:
43474
diff
changeset
|
117 Lisp_Object Qcompound_text_with_extensions; |
43454
0ccb9431ca7b
<Qcompound_text_with_extensions>: New variable.
Eli Zaretskii <eliz@gnu.org>
parents:
40656
diff
changeset
|
118 |
2161 | 119 #ifdef CUT_BUFFER_SUPPORT |
120 Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3, | |
121 QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7; | |
122 #endif | |
123 | |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
124 static Lisp_Object Vx_lost_selection_functions; |
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
125 static Lisp_Object Vx_sent_selection_functions; |
51598
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
126 static Lisp_Object Qforeign_selection; |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
127 |
2161 | 128 /* If this is a smaller number than the max-request-size of the display, |
129 emacs will use INCR selection transfer when the selection is larger | |
130 than this. The max-request-size is usually around 64k, so if you want | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
131 emacs to use incremental selection transfers when the selection is |
2161 | 132 smaller than that, set this. I added this mostly for debugging the |
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
133 incremental transfer stuff, but it might improve server performance. */ |
2161 | 134 #define MAX_SELECTION_QUANTUM 0xFFFFFF |
135 | |
2372
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
136 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100) |
2161 | 137 |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
138 /* The timestamp of the last input event Emacs received from the X server. */ |
15705
2f5c1df12e01
(last_event_timestamp): Declare, but don't define.
Karl Heuer <kwzh@gnu.org>
parents:
15585
diff
changeset
|
139 /* Defined in keyboard.c. */ |
2f5c1df12e01
(last_event_timestamp): Declare, but don't define.
Karl Heuer <kwzh@gnu.org>
parents:
15585
diff
changeset
|
140 extern unsigned long last_event_timestamp; |
2161 | 141 |
142 /* This is an association list whose elements are of the form | |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
143 ( SELECTION-NAME SELECTION-VALUE SELECTION-TIMESTAMP FRAME) |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
144 SELECTION-NAME is a lisp symbol, whose name is the name of an X Atom. |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
145 SELECTION-VALUE is the value that emacs owns for that selection. |
2161 | 146 It may be any kind of Lisp object. |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
147 SELECTION-TIMESTAMP is the time at which emacs began owning this selection, |
2161 | 148 as a cons of two 16-bit numbers (making a 32 bit time.) |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
149 FRAME is the frame for which we made the selection. |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
150 If there is an entry in this alist, then it can be assumed that Emacs owns |
2161 | 151 that selection. |
152 The only (eq) parts of this list that are visible from Lisp are the | |
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
153 selection-values. */ |
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
154 static Lisp_Object Vselection_alist; |
2161 | 155 |
156 /* This is an alist whose CARs are selection-types (whose names are the same | |
157 as the names of X Atoms) and whose CDRs are the names of Lisp functions to | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
158 call to convert the given Emacs selection value to a string representing |
2161 | 159 the given selection type. This is for Lisp-level extension of the emacs |
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
160 selection handling. */ |
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
161 static Lisp_Object Vselection_converter_alist; |
2161 | 162 |
163 /* If the selection owner takes too long to reply to a selection request, | |
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
164 we give up on it. This is in milliseconds (0 = no timeout.) */ |
43713
f92c4d87863a
Change defvar_int def and vars to use EMACS_INT instead of just int.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
43559
diff
changeset
|
165 static EMACS_INT x_selection_timeout; |
2161 | 166 |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
167 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
168 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
169 /* Define a queue to save up SELECTION_REQUEST_EVENT events for later |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
170 handling. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
171 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
172 struct selection_event_queue |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
173 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
174 struct input_event event; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
175 struct selection_event_queue *next; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
176 }; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
177 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
178 static struct selection_event_queue *selection_queue; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
179 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
180 /* Nonzero means queue up SELECTION_REQUEST_EVENT events. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
181 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
182 static int x_queue_selection_requests; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
183 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
184 /* Queue up an SELECTION_REQUEST_EVENT *EVENT, to be processed later. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
185 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
186 static void |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
187 x_queue_event (event) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
188 struct input_event *event; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
189 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
190 struct selection_event_queue *queue_tmp; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
191 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
192 /* Don't queue repeated requests. |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
193 This only happens for large requests which uses the incremental protocol. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
194 for (queue_tmp = selection_queue; queue_tmp; queue_tmp = queue_tmp->next) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
195 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
196 if (!bcmp (&queue_tmp->event, event, sizeof (*event))) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
197 { |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
198 TRACE1 ("DECLINE DUP SELECTION EVENT %08lx", (unsigned long)queue_tmp); |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
199 x_decline_selection_request (event); |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
200 return; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
201 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
202 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
203 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
204 queue_tmp |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
205 = (struct selection_event_queue *) xmalloc (sizeof (struct selection_event_queue)); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
206 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
207 if (queue_tmp != NULL) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
208 { |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
209 TRACE1 ("QUEUE SELECTION EVENT %08lx", (unsigned long)queue_tmp); |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
210 queue_tmp->event = *event; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
211 queue_tmp->next = selection_queue; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
212 selection_queue = queue_tmp; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
213 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
214 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
215 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
216 /* Start queuing SELECTION_REQUEST_EVENT events. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
217 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
218 static void |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
219 x_start_queuing_selection_requests () |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
220 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
221 if (x_queue_selection_requests) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
222 abort (); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
223 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
224 x_queue_selection_requests++; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
225 TRACE1 ("x_start_queuing_selection_requests %d", x_queue_selection_requests); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
226 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
227 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
228 /* Stop queuing SELECTION_REQUEST_EVENT events. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
229 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
230 static void |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
231 x_stop_queuing_selection_requests () |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
232 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
233 TRACE1 ("x_stop_queuing_selection_requests %d", x_queue_selection_requests); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
234 --x_queue_selection_requests; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
235 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
236 /* Take all the queued events and put them back |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
237 so that they get processed afresh. */ |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
238 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
239 while (selection_queue != NULL) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
240 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
241 struct selection_event_queue *queue_tmp = selection_queue; |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
242 TRACE1 ("RESTORE SELECTION EVENT %08lx", (unsigned long)queue_tmp); |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
243 kbd_buffer_unget_event (&queue_tmp->event); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
244 selection_queue = queue_tmp->next; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
245 xfree ((char *)queue_tmp); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
246 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
247 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
248 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
249 |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
250 /* This converts a Lisp symbol to a server Atom, avoiding a server |
2161 | 251 roundtrip whenever possible. */ |
252 | |
253 static Atom | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
254 symbol_to_x_atom (dpyinfo, display, sym) |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
255 struct x_display_info *dpyinfo; |
2161 | 256 Display *display; |
257 Lisp_Object sym; | |
258 { | |
259 Atom val; | |
260 if (NILP (sym)) return 0; | |
261 if (EQ (sym, QPRIMARY)) return XA_PRIMARY; | |
262 if (EQ (sym, QSECONDARY)) return XA_SECONDARY; | |
263 if (EQ (sym, QSTRING)) return XA_STRING; | |
264 if (EQ (sym, QINTEGER)) return XA_INTEGER; | |
265 if (EQ (sym, QATOM)) return XA_ATOM; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
266 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
267 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
268 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT; |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
269 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT; |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
270 if (EQ (sym, QUTF8_STRING)) return dpyinfo->Xatom_UTF8_STRING; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
271 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
272 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
273 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
274 if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
275 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS; |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
276 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL; |
2161 | 277 #ifdef CUT_BUFFER_SUPPORT |
278 if (EQ (sym, QCUT_BUFFER0)) return XA_CUT_BUFFER0; | |
279 if (EQ (sym, QCUT_BUFFER1)) return XA_CUT_BUFFER1; | |
280 if (EQ (sym, QCUT_BUFFER2)) return XA_CUT_BUFFER2; | |
281 if (EQ (sym, QCUT_BUFFER3)) return XA_CUT_BUFFER3; | |
282 if (EQ (sym, QCUT_BUFFER4)) return XA_CUT_BUFFER4; | |
283 if (EQ (sym, QCUT_BUFFER5)) return XA_CUT_BUFFER5; | |
284 if (EQ (sym, QCUT_BUFFER6)) return XA_CUT_BUFFER6; | |
285 if (EQ (sym, QCUT_BUFFER7)) return XA_CUT_BUFFER7; | |
286 #endif | |
287 if (!SYMBOLP (sym)) abort (); | |
288 | |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
289 TRACE1 (" XInternAtom %s", (char *) SDATA (SYMBOL_NAME (sym))); |
2161 | 290 BLOCK_INPUT; |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
291 val = XInternAtom (display, (char *) SDATA (SYMBOL_NAME (sym)), False); |
2161 | 292 UNBLOCK_INPUT; |
293 return val; | |
294 } | |
295 | |
296 | |
297 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips | |
298 and calls to intern whenever possible. */ | |
299 | |
300 static Lisp_Object | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
301 x_atom_to_symbol (dpy, atom) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
302 Display *dpy; |
2161 | 303 Atom atom; |
304 { | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
305 struct x_display_info *dpyinfo; |
2161 | 306 char *str; |
307 Lisp_Object val; | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
308 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
309 if (! atom) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
310 return Qnil; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
311 |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
312 switch (atom) |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
313 { |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
314 case XA_PRIMARY: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
315 return QPRIMARY; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
316 case XA_SECONDARY: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
317 return QSECONDARY; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
318 case XA_STRING: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
319 return QSTRING; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
320 case XA_INTEGER: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
321 return QINTEGER; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
322 case XA_ATOM: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
323 return QATOM; |
2161 | 324 #ifdef CUT_BUFFER_SUPPORT |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
325 case XA_CUT_BUFFER0: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
326 return QCUT_BUFFER0; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
327 case XA_CUT_BUFFER1: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
328 return QCUT_BUFFER1; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
329 case XA_CUT_BUFFER2: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
330 return QCUT_BUFFER2; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
331 case XA_CUT_BUFFER3: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
332 return QCUT_BUFFER3; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
333 case XA_CUT_BUFFER4: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
334 return QCUT_BUFFER4; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
335 case XA_CUT_BUFFER5: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
336 return QCUT_BUFFER5; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
337 case XA_CUT_BUFFER6: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
338 return QCUT_BUFFER6; |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
339 case XA_CUT_BUFFER7: |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
340 return QCUT_BUFFER7; |
2161 | 341 #endif |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
342 } |
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
343 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
344 dpyinfo = x_display_info_for_display (dpy); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
345 if (atom == dpyinfo->Xatom_CLIPBOARD) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
346 return QCLIPBOARD; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
347 if (atom == dpyinfo->Xatom_TIMESTAMP) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
348 return QTIMESTAMP; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
349 if (atom == dpyinfo->Xatom_TEXT) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
350 return QTEXT; |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
351 if (atom == dpyinfo->Xatom_COMPOUND_TEXT) |
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
352 return QCOMPOUND_TEXT; |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
353 if (atom == dpyinfo->Xatom_UTF8_STRING) |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
354 return QUTF8_STRING; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
355 if (atom == dpyinfo->Xatom_DELETE) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
356 return QDELETE; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
357 if (atom == dpyinfo->Xatom_MULTIPLE) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
358 return QMULTIPLE; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
359 if (atom == dpyinfo->Xatom_INCR) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
360 return QINCR; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
361 if (atom == dpyinfo->Xatom_EMACS_TMP) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
362 return QEMACS_TMP; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
363 if (atom == dpyinfo->Xatom_TARGETS) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
364 return QTARGETS; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
365 if (atom == dpyinfo->Xatom_NULL) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
366 return QNULL; |
2161 | 367 |
368 BLOCK_INPUT; | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
369 str = XGetAtomName (dpy, atom); |
2161 | 370 UNBLOCK_INPUT; |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
371 TRACE1 ("XGetAtomName --> %s", str); |
2161 | 372 if (! str) return Qnil; |
373 val = intern (str); | |
374 BLOCK_INPUT; | |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
375 /* This was allocated by Xlib, so use XFree. */ |
2161 | 376 XFree (str); |
377 UNBLOCK_INPUT; | |
378 return val; | |
379 } | |
2255
ff870650d188
(cons_to_long, long_to_cons): No longer static.
Richard M. Stallman <rms@gnu.org>
parents:
2169
diff
changeset
|
380 |
2161 | 381 /* Do protocol to assert ourself as a selection owner. |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
382 Update the Vselection_alist so that we can reply to later requests for |
2161 | 383 our selection. */ |
384 | |
385 static void | |
386 x_own_selection (selection_name, selection_value) | |
387 Lisp_Object selection_name, selection_value; | |
388 { | |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
389 struct frame *sf = SELECTED_FRAME (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
390 Window selecting_window; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
391 Display *display; |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
392 Time time = last_event_timestamp; |
2161 | 393 Atom selection_atom; |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
394 struct x_display_info *dpyinfo; |
2161 | 395 |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
396 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
397 return; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
398 |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
399 selecting_window = FRAME_X_WINDOW (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
400 display = FRAME_X_DISPLAY (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
401 dpyinfo = FRAME_X_DISPLAY_INFO (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
402 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
403 CHECK_SYMBOL (selection_name); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
404 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_name); |
2161 | 405 |
406 BLOCK_INPUT; | |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
407 x_catch_errors (display); |
2161 | 408 XSetSelectionOwner (display, selection_atom, selecting_window, time); |
9701
26a60dd57b6e
(x_own_selection, x_get_foreign_selection): Change calls
Richard M. Stallman <rms@gnu.org>
parents:
9691
diff
changeset
|
409 x_check_errors (display, "Can't set selection: %s"); |
69173
fdee8318ddc9
* xterm.h, xterm.c (x_uncatch_errors): Delete unneccessary
Chong Yidong <cyd@stupidchicken.com>
parents:
69152
diff
changeset
|
410 x_uncatch_errors (); |
2161 | 411 UNBLOCK_INPUT; |
412 | |
413 /* Now update the local cache */ | |
414 { | |
415 Lisp_Object selection_time; | |
416 Lisp_Object selection_data; | |
417 Lisp_Object prev_value; | |
418 | |
419 selection_time = long_to_cons ((unsigned long) time); | |
420 selection_data = Fcons (selection_name, | |
421 Fcons (selection_value, | |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
422 Fcons (selection_time, |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
423 Fcons (selected_frame, Qnil)))); |
2161 | 424 prev_value = assq_no_quit (selection_name, Vselection_alist); |
425 | |
426 Vselection_alist = Fcons (selection_data, Vselection_alist); | |
427 | |
428 /* If we already owned the selection, remove the old selection data. | |
429 Perhaps we should destructively modify it instead. | |
430 Don't use Fdelq as that may QUIT. */ | |
431 if (!NILP (prev_value)) | |
432 { | |
433 Lisp_Object rest; /* we know it's not the CAR, so it's easy. */ | |
85372
f7d19cfed7da
* xselect.c (x_own_selection, x_handle_selection_clear)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84496
diff
changeset
|
434 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest)) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
435 if (EQ (prev_value, Fcar (XCDR (rest)))) |
2161 | 436 { |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
437 XSETCDR (rest, Fcdr (XCDR (rest))); |
2161 | 438 break; |
439 } | |
440 } | |
441 } | |
442 } | |
443 | |
444 /* Given a selection-name and desired type, look up our local copy of | |
445 the selection value and convert it to the type. | |
446 The value is nil or a string. | |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
447 This function is used both for remote requests (LOCAL_REQUEST is zero) |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
448 and for local x-get-selection-internal (LOCAL_REQUEST is nonzero). |
2161 | 449 |
450 This calls random Lisp code, and may signal or gc. */ | |
451 | |
452 static Lisp_Object | |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
453 x_get_local_selection (selection_symbol, target_type, local_request) |
2161 | 454 Lisp_Object selection_symbol, target_type; |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
455 int local_request; |
2161 | 456 { |
457 Lisp_Object local_value; | |
458 Lisp_Object handler_fn, value, type, check; | |
459 int count; | |
460 | |
461 local_value = assq_no_quit (selection_symbol, Vselection_alist); | |
462 | |
463 if (NILP (local_value)) return Qnil; | |
464 | |
465 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */ | |
466 if (EQ (target_type, QTIMESTAMP)) | |
467 { | |
468 handler_fn = Qnil; | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
469 value = XCAR (XCDR (XCDR (local_value))); |
2161 | 470 } |
471 #if 0 | |
472 else if (EQ (target_type, QDELETE)) | |
473 { | |
474 handler_fn = Qnil; | |
475 Fx_disown_selection_internal | |
476 (selection_symbol, | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
477 XCAR (XCDR (XCDR (local_value)))); |
2161 | 478 value = QNULL; |
479 } | |
480 #endif | |
481 | |
482 #if 0 /* #### MULTIPLE doesn't work yet */ | |
483 else if (CONSP (target_type) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
484 && XCAR (target_type) == QMULTIPLE) |
2161 | 485 { |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
486 Lisp_Object pairs; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
487 int size; |
2161 | 488 int i; |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
489 pairs = XCDR (target_type); |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
490 size = XVECTOR (pairs)->size; |
2161 | 491 /* If the target is MULTIPLE, then target_type looks like |
492 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ]) | |
493 We modify the second element of each pair in the vector and | |
494 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ] | |
495 */ | |
496 for (i = 0; i < size; i++) | |
497 { | |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
498 Lisp_Object pair; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
499 pair = XVECTOR (pairs)->contents [i]; |
2161 | 500 XVECTOR (pair)->contents [1] |
501 = x_get_local_selection (XVECTOR (pair)->contents [0], | |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
502 XVECTOR (pair)->contents [1], |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
503 local_request); |
2161 | 504 } |
505 return pairs; | |
506 } | |
507 #endif | |
508 else | |
509 { | |
510 /* Don't allow a quit within the converter. | |
511 When the user types C-g, he would be surprised | |
512 if by luck it came during a converter. */ | |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
46285
diff
changeset
|
513 count = SPECPDL_INDEX (); |
2161 | 514 specbind (Qinhibit_quit, Qt); |
515 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
516 CHECK_SYMBOL (target_type); |
2161 | 517 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist)); |
50473
d89a8e99c73b
(x_handle_selection_request): Move UNGCPRO to very end.
Richard M. Stallman <rms@gnu.org>
parents:
50110
diff
changeset
|
518 /* gcpro is not needed here since nothing but HANDLER_FN |
d89a8e99c73b
(x_handle_selection_request): Move UNGCPRO to very end.
Richard M. Stallman <rms@gnu.org>
parents:
50110
diff
changeset
|
519 is live, and that ought to be a symbol. */ |
d89a8e99c73b
(x_handle_selection_request): Move UNGCPRO to very end.
Richard M. Stallman <rms@gnu.org>
parents:
50110
diff
changeset
|
520 |
3166
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
521 if (!NILP (handler_fn)) |
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
522 value = call3 (handler_fn, |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
523 selection_symbol, (local_request ? Qnil : target_type), |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
524 XCAR (XCDR (local_value))); |
3166
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
525 else |
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
526 value = Qnil; |
2161 | 527 unbind_to (count, Qnil); |
528 } | |
529 | |
530 /* Make sure this value is of a type that we could transmit | |
531 to another X client. */ | |
2169 | 532 |
2161 | 533 check = value; |
534 if (CONSP (value) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
535 && SYMBOLP (XCAR (value))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
536 type = XCAR (value), |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
537 check = XCDR (value); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
538 |
2161 | 539 if (STRINGP (check) |
540 || VECTORP (check) | |
541 || SYMBOLP (check) | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
542 || INTEGERP (check) |
2161 | 543 || NILP (value)) |
544 return value; | |
2169 | 545 /* Check for a value that cons_to_long could handle. */ |
2161 | 546 else if (CONSP (check) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
547 && INTEGERP (XCAR (check)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
548 && (INTEGERP (XCDR (check)) |
2161 | 549 || |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
550 (CONSP (XCDR (check)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
551 && INTEGERP (XCAR (XCDR (check))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
552 && NILP (XCDR (XCDR (check)))))) |
2161 | 553 return value; |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
554 |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
555 signal_error ("Invalid data returned by selection-conversion function", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
556 list2 (handler_fn, value)); |
2161 | 557 } |
558 | |
559 /* Subroutines of x_reply_selection_request. */ | |
560 | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
561 /* Send a SelectionNotify event to the requestor with property=None, |
2161 | 562 meaning we were unable to do what they wanted. */ |
563 | |
564 static void | |
565 x_decline_selection_request (event) | |
566 struct input_event *event; | |
567 { | |
568 XSelectionEvent reply; | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
569 |
2161 | 570 reply.type = SelectionNotify; |
571 reply.display = SELECTION_EVENT_DISPLAY (event); | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
572 reply.requestor = SELECTION_EVENT_REQUESTOR (event); |
2161 | 573 reply.selection = SELECTION_EVENT_SELECTION (event); |
574 reply.time = SELECTION_EVENT_TIME (event); | |
575 reply.target = SELECTION_EVENT_TARGET (event); | |
576 reply.property = None; | |
577 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
578 /* The reason for the error may be that the receiver has |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
579 died in the meantime. Handle that case. */ |
2161 | 580 BLOCK_INPUT; |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
581 x_catch_errors (reply.display); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
582 XSendEvent (reply.display, reply.requestor, False, 0L, (XEvent *) &reply); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
583 XFlush (reply.display); |
69173
fdee8318ddc9
* xterm.h, xterm.c (x_uncatch_errors): Delete unneccessary
Chong Yidong <cyd@stupidchicken.com>
parents:
69152
diff
changeset
|
584 x_uncatch_errors (); |
2161 | 585 UNBLOCK_INPUT; |
586 } | |
587 | |
588 /* This is the selection request currently being processed. | |
589 It is set to zero when the request is fully processed. */ | |
590 static struct input_event *x_selection_current_request; | |
591 | |
35237
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
592 /* Display info in x_selection_request. */ |
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
593 |
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
594 static struct x_display_info *selection_request_dpyinfo; |
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
595 |
2161 | 596 /* Used as an unwind-protect clause so that, if a selection-converter signals |
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
597 an error, we tell the requester that we were unable to do what they wanted |
2161 | 598 before we throw to top-level or go into the debugger or whatever. */ |
599 | |
600 static Lisp_Object | |
601 x_selection_request_lisp_error (ignore) | |
602 Lisp_Object ignore; | |
603 { | |
35237
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
604 if (x_selection_current_request != 0 |
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
605 && selection_request_dpyinfo->display) |
2161 | 606 x_decline_selection_request (x_selection_current_request); |
607 return Qnil; | |
608 } | |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
609 |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
610 static Lisp_Object |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
611 x_catch_errors_unwind (dummy) |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
612 Lisp_Object dummy; |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
613 { |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
614 BLOCK_INPUT; |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
615 x_uncatch_errors (); |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
616 UNBLOCK_INPUT; |
69282
a072ac3cca3f
(x_catch_errors_unwind): Fix missing return value.
Andreas Schwab <schwab@suse.de>
parents:
69209
diff
changeset
|
617 return Qnil; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
618 } |
2161 | 619 |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
620 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
621 /* This stuff is so that INCR selections are reentrant (that is, so we can |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
622 be servicing multiple INCR selection requests simultaneously.) I haven't |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
623 actually tested that yet. */ |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
624 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
625 /* Keep a list of the property changes that are awaited. */ |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
626 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
627 struct prop_location |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
628 { |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
629 int identifier; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
630 Display *display; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
631 Window window; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
632 Atom property; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
633 int desired_state; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
634 int arrived; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
635 struct prop_location *next; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
636 }; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
637 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
638 static struct prop_location *expect_property_change (); |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
639 static void wait_for_property_change (); |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
640 static void unexpect_property_change (); |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
641 static int waiting_for_other_props_on_window (); |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
642 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
643 static int prop_location_identifier; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
644 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
645 static Lisp_Object property_change_reply; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
646 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
647 static struct prop_location *property_change_reply_object; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
648 |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
649 static struct prop_location *property_change_wait_list; |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
650 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
651 static Lisp_Object |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
652 queue_selection_requests_unwind (tem) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
653 Lisp_Object tem; |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
654 { |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
655 x_stop_queuing_selection_requests (); |
11908
4f4034f45cbf
(queue_selection_requests_unwind): Add return value.
Karl Heuer <kwzh@gnu.org>
parents:
11881
diff
changeset
|
656 return Qnil; |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
657 } |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
658 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
659 /* Return some frame whose display info is DPYINFO. |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
660 Return nil if there is none. */ |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
661 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
662 static Lisp_Object |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
663 some_frame_on_display (dpyinfo) |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
664 struct x_display_info *dpyinfo; |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
665 { |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
666 Lisp_Object list, frame; |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
667 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
668 FOR_EACH_FRAME (list, frame) |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
669 { |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
670 if (FRAME_X_P (XFRAME (frame)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
671 && FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
672 return frame; |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
673 } |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
674 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
675 return Qnil; |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
676 } |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
677 |
2161 | 678 /* Send the reply to a selection request event EVENT. |
679 TYPE is the type of selection data requested. | |
680 DATA and SIZE describe the data to send, already converted. | |
681 FORMAT is the unit-size (in bits) of the data to be transmitted. */ | |
682 | |
78743
4c7b6a25a97b
(x_reply_selection_request) <cnt>: Move static variable to file scope.
Glenn Morris <rgm@gnu.org>
parents:
78401
diff
changeset
|
683 #ifdef TRACE_SELECTION |
78763
8110f4179a3a
(cnt): Rename to x_reply_selection_request_cnt for clarity.
Glenn Morris <rgm@gnu.org>
parents:
78743
diff
changeset
|
684 static int x_reply_selection_request_cnt; |
78743
4c7b6a25a97b
(x_reply_selection_request) <cnt>: Move static variable to file scope.
Glenn Morris <rgm@gnu.org>
parents:
78401
diff
changeset
|
685 #endif /* TRACE_SELECTION */ |
4c7b6a25a97b
(x_reply_selection_request) <cnt>: Move static variable to file scope.
Glenn Morris <rgm@gnu.org>
parents:
78401
diff
changeset
|
686 |
2161 | 687 static void |
688 x_reply_selection_request (event, format, data, size, type) | |
689 struct input_event *event; | |
690 int format, size; | |
691 unsigned char *data; | |
692 Atom type; | |
693 { | |
694 XSelectionEvent reply; | |
695 Display *display = SELECTION_EVENT_DISPLAY (event); | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
696 Window window = SELECTION_EVENT_REQUESTOR (event); |
2161 | 697 int bytes_remaining; |
698 int format_bytes = format/8; | |
699 int max_bytes = SELECTION_QUANTUM (display); | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
700 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
701 int count = SPECPDL_INDEX (); |
2161 | 702 |
703 if (max_bytes > MAX_SELECTION_QUANTUM) | |
704 max_bytes = MAX_SELECTION_QUANTUM; | |
705 | |
706 reply.type = SelectionNotify; | |
707 reply.display = display; | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
708 reply.requestor = window; |
2161 | 709 reply.selection = SELECTION_EVENT_SELECTION (event); |
710 reply.time = SELECTION_EVENT_TIME (event); | |
711 reply.target = SELECTION_EVENT_TARGET (event); | |
712 reply.property = SELECTION_EVENT_PROPERTY (event); | |
713 if (reply.property == None) | |
714 reply.property = reply.target; | |
715 | |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
716 BLOCK_INPUT; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
717 /* The protected block contains wait_for_property_change, which can |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
718 run random lisp code (process handlers) or signal. Therefore, we |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
719 put the x_uncatch_errors call in an unwind. */ |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
720 record_unwind_protect (x_catch_errors_unwind, Qnil); |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
721 x_catch_errors (display); |
2161 | 722 |
57948
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
723 #ifdef TRACE_SELECTION |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
724 { |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
725 char *sel = XGetAtomName (display, reply.selection); |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
726 char *tgt = XGetAtomName (display, reply.target); |
78763
8110f4179a3a
(cnt): Rename to x_reply_selection_request_cnt for clarity.
Glenn Morris <rgm@gnu.org>
parents:
78743
diff
changeset
|
727 TRACE3 ("%s, target %s (%d)", sel, tgt, ++x_reply_selection_request_cnt); |
57948
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
728 if (sel) XFree (sel); |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
729 if (tgt) XFree (tgt); |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
730 } |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
731 #endif /* TRACE_SELECTION */ |
481911368712
* xselect.c (TRACE3): New debug macro.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57777
diff
changeset
|
732 |
2161 | 733 /* Store the data on the requested property. |
734 If the selection is large, only store the first N bytes of it. | |
735 */ | |
736 bytes_remaining = size * format_bytes; | |
737 if (bytes_remaining <= max_bytes) | |
738 { | |
739 /* Send all the data at once, with minimal handshaking. */ | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
740 TRACE1 ("Sending all %d bytes", bytes_remaining); |
2161 | 741 XChangeProperty (display, window, reply.property, type, format, |
742 PropModeReplace, data, size); | |
743 /* At this point, the selection was successfully stored; ack it. */ | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
744 XSendEvent (display, window, False, 0L, (XEvent *) &reply); |
2161 | 745 } |
746 else | |
747 { | |
748 /* Send an INCR selection. */ | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
749 struct prop_location *wait_object; |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
750 int had_errors; |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
751 Lisp_Object frame; |
2161 | 752 |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
753 frame = some_frame_on_display (dpyinfo); |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
754 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
755 /* If the display no longer has frames, we can't expect |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
756 to get many more selection requests from it, so don't |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
757 bother trying to queue them. */ |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
758 if (!NILP (frame)) |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
759 { |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
760 x_start_queuing_selection_requests (); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
761 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
762 record_unwind_protect (queue_selection_requests_unwind, |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
763 Qnil); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
764 } |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
765 |
11198
571306c7b038
New arg DPYINFO to all callers of x_window_to_frame, x_any_window_to_frame,
Karl Heuer <kwzh@gnu.org>
parents:
11161
diff
changeset
|
766 if (x_window_to_frame (dpyinfo, window)) /* #### debug */ |
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
767 error ("Attempt to transfer an INCR to ourself!"); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
768 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
769 TRACE2 ("Start sending %d bytes incrementally (%s)", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
770 bytes_remaining, XGetAtomName (display, reply.property)); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
771 wait_object = expect_property_change (display, window, reply.property, |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
772 PropertyDelete); |
2161 | 773 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
774 TRACE1 ("Set %s to number of bytes to send", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
775 XGetAtomName (display, reply.property)); |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
776 { |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
777 /* XChangeProperty expects an array of long even if long is more than |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
778 32 bits. */ |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
779 long value[1]; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
780 |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
781 value[0] = bytes_remaining; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
782 XChangeProperty (display, window, reply.property, dpyinfo->Xatom_INCR, |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
783 32, PropModeReplace, |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
784 (unsigned char *) value, 1); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
785 } |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
786 |
2161 | 787 XSelectInput (display, window, PropertyChangeMask); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
788 |
2161 | 789 /* Tell 'em the INCR data is there... */ |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
790 TRACE0 ("Send SelectionNotify event"); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
791 XSendEvent (display, window, False, 0L, (XEvent *) &reply); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
792 XFlush (display); |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
793 |
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
794 had_errors = x_had_errors_p (display); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
795 UNBLOCK_INPUT; |
2161 | 796 |
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
797 /* First, wait for the requester to ack by deleting the property. |
2161 | 798 This can run random lisp code (process handlers) or signal. */ |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
799 if (! had_errors) |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
800 { |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
801 TRACE1 ("Waiting for ACK (deletion of %s)", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
802 XGetAtomName (display, reply.property)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
803 wait_for_property_change (wait_object); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
804 } |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
805 else |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
806 unexpect_property_change (wait_object); |
2161 | 807 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
808 TRACE0 ("Got ACK"); |
2161 | 809 while (bytes_remaining) |
810 { | |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
811 int i = ((bytes_remaining < max_bytes) |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
812 ? bytes_remaining |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
813 : max_bytes); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
814 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
815 BLOCK_INPUT; |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
816 |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
817 wait_object |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
818 = expect_property_change (display, window, reply.property, |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
819 PropertyDelete); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
820 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
821 TRACE1 ("Sending increment of %d bytes", i); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
822 TRACE1 ("Set %s to increment data", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
823 XGetAtomName (display, reply.property)); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
824 |
2161 | 825 /* Append the next chunk of data to the property. */ |
826 XChangeProperty (display, window, reply.property, type, format, | |
827 PropModeAppend, data, i / format_bytes); | |
828 bytes_remaining -= i; | |
829 data += i; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
830 XFlush (display); |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
831 had_errors = x_had_errors_p (display); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
832 UNBLOCK_INPUT; |
2161 | 833 |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
834 if (had_errors) |
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
835 break; |
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
836 |
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
837 /* Now wait for the requester to ack this chunk by deleting the |
74145 | 838 property. This can run random lisp code or signal. */ |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
839 TRACE1 ("Waiting for increment ACK (deletion of %s)", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
840 XGetAtomName (display, reply.property)); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
841 wait_for_property_change (wait_object); |
2161 | 842 } |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
843 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
844 /* Now write a zero-length chunk to the property to tell the |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
845 requester that we're done. */ |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
846 BLOCK_INPUT; |
2161 | 847 if (! waiting_for_other_props_on_window (display, window)) |
848 XSelectInput (display, window, 0L); | |
849 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
850 TRACE1 ("Set %s to a 0-length chunk to indicate EOF", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
851 XGetAtomName (display, reply.property)); |
2161 | 852 XChangeProperty (display, window, reply.property, type, format, |
853 PropModeReplace, data, 0); | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
854 TRACE0 ("Done sending incrementally"); |
2161 | 855 } |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
856 |
49065 | 857 /* rms, 2003-01-03: I think I have fixed this bug. */ |
35193
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
858 /* The window we're communicating with may have been deleted |
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
859 in the meantime (that's a real situation from a bug report). |
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
860 In this case, there may be events in the event queue still |
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
861 refering to the deleted window, and we'll get a BadWindow error |
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
862 in XTread_socket when processing the events. I don't have |
b317937fe5f8
(x_reply_selection_request): Add a comment.
Gerd Moellmann <gerd@gnu.org>
parents:
33963
diff
changeset
|
863 an idea how to fix that. gerd, 2001-01-98. */ |
57050
d303ac34c1a0
* xselect.c (x_reply_selection_request): XSync and UNBLOCK before
Jan Djärv <jan.h.d@swipnet.se>
parents:
56729
diff
changeset
|
864 /* 2004-09-10: XSync and UNBLOCK so that possible protocol errors are |
d303ac34c1a0
* xselect.c (x_reply_selection_request): XSync and UNBLOCK before
Jan Djärv <jan.h.d@swipnet.se>
parents:
56729
diff
changeset
|
865 delivered before uncatch errors. */ |
d303ac34c1a0
* xselect.c (x_reply_selection_request): XSync and UNBLOCK before
Jan Djärv <jan.h.d@swipnet.se>
parents:
56729
diff
changeset
|
866 XSync (display, False); |
d303ac34c1a0
* xselect.c (x_reply_selection_request): XSync and UNBLOCK before
Jan Djärv <jan.h.d@swipnet.se>
parents:
56729
diff
changeset
|
867 UNBLOCK_INPUT; |
57053
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
868 |
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
869 /* GTK queues events in addition to the queue in Xlib. So we |
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
870 UNBLOCK to enter the event loop and get possible errors delivered, |
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
871 and then BLOCK again because x_uncatch_errors requires it. */ |
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
872 BLOCK_INPUT; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
873 /* This calls x_uncatch_errors. */ |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
874 unbind_to (count, Qnil); |
57053
abdfb8ccbb2b
Must BLOCK/UNBLOCK around x_uncatch_errors.
Jan Djärv <jan.h.d@swipnet.se>
parents:
57050
diff
changeset
|
875 UNBLOCK_INPUT; |
2161 | 876 } |
877 | |
878 /* Handle a SelectionRequest event EVENT. | |
879 This is called from keyboard.c when such an event is found in the queue. */ | |
880 | |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
881 static void |
2161 | 882 x_handle_selection_request (event) |
883 struct input_event *event; | |
884 { | |
885 struct gcpro gcpro1, gcpro2, gcpro3; | |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
886 Lisp_Object local_selection_data; |
2161 | 887 Lisp_Object selection_symbol; |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
888 Lisp_Object target_symbol; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
889 Lisp_Object converted_selection; |
2161 | 890 Time local_selection_time; |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
891 Lisp_Object successful_p; |
2161 | 892 int count; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
893 struct x_display_info *dpyinfo |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
894 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event)); |
2161 | 895 |
58096
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
896 TRACE2 ("x_handle_selection_request, from=0x%08lx time=%lu", |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
897 (unsigned long) SELECTION_EVENT_REQUESTOR (event), |
b32fa5b7492d
Include <sys/types.h> and <unistd.h> (for getpid).
Kim F. Storm <storm@cua.dk>
parents:
57952
diff
changeset
|
898 (unsigned long) SELECTION_EVENT_TIME (event)); |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
899 |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
900 local_selection_data = Qnil; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
901 target_symbol = Qnil; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
902 converted_selection = Qnil; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
903 successful_p = Qnil; |
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
904 |
2161 | 905 GCPRO3 (local_selection_data, converted_selection, target_symbol); |
906 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
907 selection_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event), |
2161 | 908 SELECTION_EVENT_SELECTION (event)); |
909 | |
910 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist); | |
911 | |
912 if (NILP (local_selection_data)) | |
913 { | |
914 /* Someone asked for the selection, but we don't have it any more. | |
915 */ | |
916 x_decline_selection_request (event); | |
917 goto DONE; | |
918 } | |
919 | |
920 local_selection_time = (Time) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
921 cons_to_long (XCAR (XCDR (XCDR (local_selection_data)))); |
2161 | 922 |
923 if (SELECTION_EVENT_TIME (event) != CurrentTime | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
924 && local_selection_time > SELECTION_EVENT_TIME (event)) |
2161 | 925 { |
926 /* Someone asked for the selection, and we have one, but not the one | |
927 they're looking for. | |
928 */ | |
929 x_decline_selection_request (event); | |
930 goto DONE; | |
931 } | |
932 | |
933 x_selection_current_request = event; | |
46285
3f111801efb4
Rename BINDING_STACK_SIZE to SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
45985
diff
changeset
|
934 count = SPECPDL_INDEX (); |
35237
387dc44657f0
(selection_request_dpyinfo): New variable.
Gerd Moellmann <gerd@gnu.org>
parents:
35193
diff
changeset
|
935 selection_request_dpyinfo = dpyinfo; |
2161 | 936 record_unwind_protect (x_selection_request_lisp_error, Qnil); |
937 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
938 target_symbol = x_atom_to_symbol (SELECTION_EVENT_DISPLAY (event), |
2161 | 939 SELECTION_EVENT_TARGET (event)); |
940 | |
941 #if 0 /* #### MULTIPLE doesn't work yet */ | |
942 if (EQ (target_symbol, QMULTIPLE)) | |
943 target_symbol = fetch_multiple_target (event); | |
944 #endif | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
945 |
2161 | 946 /* Convert lisp objects back into binary data */ |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
947 |
2161 | 948 converted_selection |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
949 = x_get_local_selection (selection_symbol, target_symbol, 0); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
950 |
2161 | 951 if (! NILP (converted_selection)) |
952 { | |
953 unsigned char *data; | |
954 unsigned int size; | |
955 int format; | |
956 Atom type; | |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
957 int nofree; |
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
958 |
73427
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
959 if (CONSP (converted_selection) && NILP (XCDR (converted_selection))) |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
960 { |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
961 x_decline_selection_request (event); |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
962 goto DONE2; |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
963 } |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
964 |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
965 lisp_data_to_selection_data (SELECTION_EVENT_DISPLAY (event), |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
966 converted_selection, |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
967 &data, &type, &size, &format, &nofree); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
968 |
2161 | 969 x_reply_selection_request (event, format, data, size, type); |
970 successful_p = Qt; | |
971 | |
972 /* Indicate we have successfully processed this event. */ | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
973 x_selection_current_request = 0; |
2161 | 974 |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
975 /* Use xfree, not XFree, because lisp_data_to_selection_data |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
976 calls xmalloc itself. */ |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
977 if (!nofree) |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
978 xfree (data); |
2161 | 979 } |
73427
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
980 |
842c20ea5853
* xselect.c (x_handle_selection_request): If the converted_selection
Jan Djärv <jan.h.d@swipnet.se>
parents:
72352
diff
changeset
|
981 DONE2: |
2161 | 982 unbind_to (count, Qnil); |
983 | |
984 DONE: | |
985 | |
986 /* Let random lisp code notice that the selection has been asked for. */ | |
987 { | |
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
988 Lisp_Object rest; |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
989 rest = Vx_sent_selection_functions; |
2161 | 990 if (!EQ (rest, Qunbound)) |
991 for (; CONSP (rest); rest = Fcdr (rest)) | |
992 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p); | |
993 } | |
50473
d89a8e99c73b
(x_handle_selection_request): Move UNGCPRO to very end.
Richard M. Stallman <rms@gnu.org>
parents:
50110
diff
changeset
|
994 |
d89a8e99c73b
(x_handle_selection_request): Move UNGCPRO to very end.
Richard M. Stallman <rms@gnu.org>
parents:
50110
diff
changeset
|
995 UNGCPRO; |
2161 | 996 } |
997 | |
24163
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
998 /* Handle a SelectionClear event EVENT, which indicates that some |
2161 | 999 client cleared out our previously asserted selection. |
1000 This is called from keyboard.c when such an event is found in the queue. */ | |
1001 | |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1002 static void |
2161 | 1003 x_handle_selection_clear (event) |
1004 struct input_event *event; | |
1005 { | |
1006 Display *display = SELECTION_EVENT_DISPLAY (event); | |
1007 Atom selection = SELECTION_EVENT_SELECTION (event); | |
1008 Time changed_owner_time = SELECTION_EVENT_TIME (event); | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1009 |
2161 | 1010 Lisp_Object selection_symbol, local_selection_data; |
1011 Time local_selection_time; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1012 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
24163
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1013 struct x_display_info *t_dpyinfo; |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1014 |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1015 TRACE0 ("x_handle_selection_clear"); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1016 |
83631
7d63b897231b
(x_handle_selection_clear): Only access
Dan Nicolaescu <dann@ics.uci.edu>
parents:
83560
diff
changeset
|
1017 #ifdef MULTI_KBOARD |
24163
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1018 /* If the new selection owner is also Emacs, |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1019 don't clear the new selection. */ |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1020 BLOCK_INPUT; |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1021 /* Check each display on the same terminal, |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1022 to see if this Emacs job now owns the selection |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1023 through that display. */ |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1024 for (t_dpyinfo = x_display_list; t_dpyinfo; t_dpyinfo = t_dpyinfo->next) |
83431
76396de7f50a
Rename `struct device' to `struct terminal'. Rename some terminal-related functions similarly.
Karoly Lorentey <lorentey@elte.hu>
parents:
83423
diff
changeset
|
1025 if (t_dpyinfo->terminal->kboard == dpyinfo->terminal->kboard) |
24163
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1026 { |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1027 Window owner_window |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1028 = XGetSelectionOwner (t_dpyinfo->display, selection); |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1029 if (x_window_to_frame (t_dpyinfo, owner_window) != 0) |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1030 { |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1031 UNBLOCK_INPUT; |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1032 return; |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1033 } |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1034 } |
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
1035 UNBLOCK_INPUT; |
83631
7d63b897231b
(x_handle_selection_clear): Only access
Dan Nicolaescu <dann@ics.uci.edu>
parents:
83560
diff
changeset
|
1036 #endif |
7d63b897231b
(x_handle_selection_clear): Only access
Dan Nicolaescu <dann@ics.uci.edu>
parents:
83560
diff
changeset
|
1037 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1038 selection_symbol = x_atom_to_symbol (display, selection); |
2161 | 1039 |
1040 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist); | |
1041 | |
1042 /* Well, we already believe that we don't own it, so that's just fine. */ | |
1043 if (NILP (local_selection_data)) return; | |
1044 | |
1045 local_selection_time = (Time) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1046 cons_to_long (XCAR (XCDR (XCDR (local_selection_data)))); |
2161 | 1047 |
1048 /* This SelectionClear is for a selection that we no longer own, so we can | |
1049 disregard it. (That is, we have reasserted the selection since this | |
1050 request was generated.) */ | |
1051 | |
1052 if (changed_owner_time != CurrentTime | |
1053 && local_selection_time > changed_owner_time) | |
1054 return; | |
1055 | |
1056 /* Otherwise, we're really honest and truly being told to drop it. | |
1057 Don't use Fdelq as that may QUIT;. */ | |
1058 | |
1059 if (EQ (local_selection_data, Fcar (Vselection_alist))) | |
1060 Vselection_alist = Fcdr (Vselection_alist); | |
1061 else | |
1062 { | |
1063 Lisp_Object rest; | |
85372
f7d19cfed7da
* xselect.c (x_own_selection, x_handle_selection_clear)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84496
diff
changeset
|
1064 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest)) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1065 if (EQ (local_selection_data, Fcar (XCDR (rest)))) |
2161 | 1066 { |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
1067 XSETCDR (rest, Fcdr (XCDR (rest))); |
2161 | 1068 break; |
1069 } | |
1070 } | |
1071 | |
1072 /* Let random lisp code notice that the selection has been stolen. */ | |
1073 | |
1074 { | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1075 Lisp_Object rest; |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
1076 rest = Vx_lost_selection_functions; |
2161 | 1077 if (!EQ (rest, Qunbound)) |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1078 { |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1079 for (; CONSP (rest); rest = Fcdr (rest)) |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1080 call1 (Fcar (rest), selection_symbol); |
5244
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1081 prepare_menu_bars (); |
35336
002c02db42d3
Call redisplay_preserve_echo_area with additional arg.
Gerd Moellmann <gerd@gnu.org>
parents:
35237
diff
changeset
|
1082 redisplay_preserve_echo_area (20); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1083 } |
2161 | 1084 } |
1085 } | |
1086 | |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1087 void |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1088 x_handle_selection_event (event) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1089 struct input_event *event; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1090 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1091 TRACE0 ("x_handle_selection_event"); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1092 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1093 if (event->kind == SELECTION_REQUEST_EVENT) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1094 { |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1095 if (x_queue_selection_requests) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1096 x_queue_event (event); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1097 else |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1098 x_handle_selection_request (event); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1099 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1100 else |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1101 x_handle_selection_clear (event); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1102 } |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1103 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1104 |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1105 /* Clear all selections that were made from frame F. |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1106 We do this when about to delete a frame. */ |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1107 |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1108 void |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1109 x_clear_frame_selections (f) |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1110 FRAME_PTR f; |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1111 { |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1112 Lisp_Object frame; |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1113 Lisp_Object rest; |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1114 |
9286
2accc8da0793
(x_clear_frame_selections, wait_for_property_change): Use new accessor macros
Karl Heuer <kwzh@gnu.org>
parents:
8355
diff
changeset
|
1115 XSETFRAME (frame, f); |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1116 |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1117 /* Otherwise, we're really honest and truly being told to drop it. |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1118 Don't use Fdelq as that may QUIT;. */ |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1119 |
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1120 /* Delete elements from the beginning of Vselection_alist. */ |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1121 while (!NILP (Vselection_alist) |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1122 && EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (Vselection_alist))))))) |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1123 { |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1124 /* Let random Lisp code notice that the selection has been stolen. */ |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1125 Lisp_Object hooks, selection_symbol; |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1126 |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
1127 hooks = Vx_lost_selection_functions; |
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1128 selection_symbol = Fcar (Fcar (Vselection_alist)); |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1129 |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1130 if (!EQ (hooks, Qunbound)) |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1131 { |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1132 for (; CONSP (hooks); hooks = Fcdr (hooks)) |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1133 call1 (Fcar (hooks), selection_symbol); |
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1134 #if 0 /* This can crash when deleting a frame |
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1135 from x_connection_closed. Anyway, it seems unnecessary; |
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1136 something else should cause a redisplay. */ |
35336
002c02db42d3
Call redisplay_preserve_echo_area with additional arg.
Gerd Moellmann <gerd@gnu.org>
parents:
35237
diff
changeset
|
1137 redisplay_preserve_echo_area (21); |
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1138 #endif |
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1139 } |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1140 |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1141 Vselection_alist = Fcdr (Vselection_alist); |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1142 } |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1143 |
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
1144 /* Delete elements after the beginning of Vselection_alist. */ |
85372
f7d19cfed7da
* xselect.c (x_own_selection, x_handle_selection_clear)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
84496
diff
changeset
|
1145 for (rest = Vselection_alist; CONSP (rest); rest = XCDR (rest)) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1146 if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCDR (rest)))))))) |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1147 { |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1148 /* Let random Lisp code notice that the selection has been stolen. */ |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1149 Lisp_Object hooks, selection_symbol; |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1150 |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
1151 hooks = Vx_lost_selection_functions; |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1152 selection_symbol = Fcar (Fcar (XCDR (rest))); |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1153 |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1154 if (!EQ (hooks, Qunbound)) |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1155 { |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1156 for (; CONSP (hooks); hooks = Fcdr (hooks)) |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1157 call1 (Fcar (hooks), selection_symbol); |
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1158 #if 0 /* See above */ |
35336
002c02db42d3
Call redisplay_preserve_echo_area with additional arg.
Gerd Moellmann <gerd@gnu.org>
parents:
35237
diff
changeset
|
1159 redisplay_preserve_echo_area (22); |
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
1160 #endif |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1161 } |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
1162 XSETCDR (rest, Fcdr (XCDR (rest))); |
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1163 break; |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1164 } |
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1165 } |
2161 | 1166 |
1167 /* Nonzero if any properties for DISPLAY and WINDOW | |
1168 are on the list of what we are waiting for. */ | |
1169 | |
1170 static int | |
1171 waiting_for_other_props_on_window (display, window) | |
1172 Display *display; | |
1173 Window window; | |
1174 { | |
1175 struct prop_location *rest = property_change_wait_list; | |
1176 while (rest) | |
1177 if (rest->display == display && rest->window == window) | |
1178 return 1; | |
1179 else | |
1180 rest = rest->next; | |
1181 return 0; | |
1182 } | |
1183 | |
1184 /* Add an entry to the list of property changes we are waiting for. | |
1185 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for. | |
1186 The return value is a number that uniquely identifies | |
1187 this awaited property change. */ | |
1188 | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1189 static struct prop_location * |
2161 | 1190 expect_property_change (display, window, property, state) |
1191 Display *display; | |
1192 Window window; | |
17372
30720c688961
(expect_property_change): Fix Lisp_Object/integer confusion.
Karl Heuer <kwzh@gnu.org>
parents:
17190
diff
changeset
|
1193 Atom property; |
2161 | 1194 int state; |
1195 { | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1196 struct prop_location *pl = (struct prop_location *) xmalloc (sizeof *pl); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1197 pl->identifier = ++prop_location_identifier; |
2161 | 1198 pl->display = display; |
1199 pl->window = window; | |
1200 pl->property = property; | |
1201 pl->desired_state = state; | |
1202 pl->next = property_change_wait_list; | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1203 pl->arrived = 0; |
2161 | 1204 property_change_wait_list = pl; |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1205 return pl; |
2161 | 1206 } |
1207 | |
1208 /* Delete an entry from the list of property changes we are waiting for. | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1209 IDENTIFIER is the number that uniquely identifies the entry. */ |
2161 | 1210 |
1211 static void | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1212 unexpect_property_change (location) |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1213 struct prop_location *location; |
2161 | 1214 { |
1215 struct prop_location *prev = 0, *rest = property_change_wait_list; | |
1216 while (rest) | |
1217 { | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1218 if (rest == location) |
2161 | 1219 { |
1220 if (prev) | |
1221 prev->next = rest->next; | |
1222 else | |
1223 property_change_wait_list = rest->next; | |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1224 xfree (rest); |
2161 | 1225 return; |
1226 } | |
1227 prev = rest; | |
1228 rest = rest->next; | |
1229 } | |
1230 } | |
1231 | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1232 /* Remove the property change expectation element for IDENTIFIER. */ |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1233 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1234 static Lisp_Object |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1235 wait_for_property_change_unwind (loc) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1236 Lisp_Object loc; |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1237 { |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1238 struct prop_location *location = XSAVE_VALUE (loc)->pointer; |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1239 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1240 unexpect_property_change (location); |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1241 if (location == property_change_reply_object) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1242 property_change_reply_object = 0; |
11908
4f4034f45cbf
(queue_selection_requests_unwind): Add return value.
Karl Heuer <kwzh@gnu.org>
parents:
11881
diff
changeset
|
1243 return Qnil; |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1244 } |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1245 |
2161 | 1246 /* Actually wait for a property change. |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1247 IDENTIFIER should be the value that expect_property_change returned. */ |
2161 | 1248 |
1249 static void | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1250 wait_for_property_change (location) |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1251 struct prop_location *location; |
2161 | 1252 { |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1253 int secs, usecs; |
46293
1fb8f75062c6
Use macro SPECPDL_INDEX.
Juanma Barranquero <lekktu@gmail.com>
parents:
46285
diff
changeset
|
1254 int count = SPECPDL_INDEX (); |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1255 |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1256 if (property_change_reply_object) |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1257 abort (); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1258 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1259 /* Make sure to do unexpect_property_change if we quit or err. */ |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1260 record_unwind_protect (wait_for_property_change_unwind, |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1261 make_save_value (location, 0)); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1262 |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
1263 XSETCAR (property_change_reply, Qnil); |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
1264 property_change_reply_object = location; |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1265 |
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
1266 /* If the event we are waiting for arrives beyond here, it will set |
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
1267 property_change_reply, because property_change_reply_object says so. */ |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1268 if (! location->arrived) |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1269 { |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1270 secs = x_selection_timeout / 1000; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1271 usecs = (x_selection_timeout % 1000) * 1000; |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1272 TRACE2 (" Waiting %d secs, %d usecs", secs, usecs); |
56729
e6e0caa7ec87
Rename wait_reading_process_input to wait_reading_process_output.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
1273 wait_reading_process_output (secs, usecs, 0, 0, |
e6e0caa7ec87
Rename wait_reading_process_input to wait_reading_process_output.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
1274 property_change_reply, NULL, 0); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1275 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1276 if (NILP (XCAR (property_change_reply))) |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1277 { |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1278 TRACE0 (" Timed out"); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1279 error ("Timed out waiting for property-notify event"); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1280 } |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1281 } |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1282 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1283 unbind_to (count, Qnil); |
2161 | 1284 } |
1285 | |
1286 /* Called from XTread_socket in response to a PropertyNotify event. */ | |
1287 | |
1288 void | |
1289 x_handle_property_notify (event) | |
1290 XPropertyEvent *event; | |
1291 { | |
1292 struct prop_location *prev = 0, *rest = property_change_wait_list; | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1293 |
2161 | 1294 while (rest) |
1295 { | |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1296 if (!rest->arrived |
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1297 && rest->property == event->atom |
2161 | 1298 && rest->window == event->window |
1299 && rest->display == event->display | |
1300 && rest->desired_state == event->state) | |
1301 { | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1302 TRACE2 ("Expected %s of property %s", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1303 (event->state == PropertyDelete ? "deletion" : "change"), |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1304 XGetAtomName (event->display, event->atom)); |
2161 | 1305 |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1306 rest->arrived = 1; |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1307 |
2161 | 1308 /* If this is the one wait_for_property_change is waiting for, |
1309 tell it to wake up. */ | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1310 if (rest == property_change_reply_object) |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
1311 XSETCAR (property_change_reply, Qt); |
2161 | 1312 |
1313 return; | |
1314 } | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1315 |
2161 | 1316 prev = rest; |
1317 rest = rest->next; | |
1318 } | |
1319 } | |
1320 | |
1321 | |
1322 | |
1323 #if 0 /* #### MULTIPLE doesn't work yet */ | |
1324 | |
1325 static Lisp_Object | |
1326 fetch_multiple_target (event) | |
1327 XSelectionRequestEvent *event; | |
1328 { | |
1329 Display *display = event->display; | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1330 Window window = event->requestor; |
2161 | 1331 Atom target = event->target; |
1332 Atom selection_atom = event->selection; | |
1333 int result; | |
1334 | |
1335 return | |
1336 Fcons (QMULTIPLE, | |
1337 x_get_window_property_as_lisp_data (display, window, target, | |
1338 QMULTIPLE, selection_atom)); | |
1339 } | |
1340 | |
1341 static Lisp_Object | |
1342 copy_multiple_data (obj) | |
1343 Lisp_Object obj; | |
1344 { | |
1345 Lisp_Object vec; | |
1346 int i; | |
1347 int size; | |
1348 if (CONSP (obj)) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1349 return Fcons (XCAR (obj), copy_multiple_data (XCDR (obj))); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1350 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
1351 CHECK_VECTOR (obj); |
2161 | 1352 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil); |
1353 for (i = 0; i < size; i++) | |
1354 { | |
1355 Lisp_Object vec2 = XVECTOR (obj)->contents [i]; | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
1356 CHECK_VECTOR (vec2); |
2161 | 1357 if (XVECTOR (vec2)->size != 2) |
1358 /* ??? Confusing error message */ | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1359 signal_error ("Vectors must be of length 2", vec2); |
2161 | 1360 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil); |
1361 XVECTOR (XVECTOR (vec)->contents [i])->contents [0] | |
1362 = XVECTOR (vec2)->contents [0]; | |
1363 XVECTOR (XVECTOR (vec)->contents [i])->contents [1] | |
1364 = XVECTOR (vec2)->contents [1]; | |
1365 } | |
1366 return vec; | |
1367 } | |
1368 | |
1369 #endif | |
1370 | |
1371 | |
1372 /* Variables for communication with x_handle_selection_notify. */ | |
1373 static Atom reading_which_selection; | |
1374 static Lisp_Object reading_selection_reply; | |
1375 static Window reading_selection_window; | |
1376 | |
1377 /* Do protocol to read selection-data from the server. | |
1378 Converts this to Lisp data and returns it. */ | |
1379 | |
1380 static Lisp_Object | |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1381 x_get_foreign_selection (selection_symbol, target_type, time_stamp) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1382 Lisp_Object selection_symbol, target_type, time_stamp; |
2161 | 1383 { |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
1384 struct frame *sf = SELECTED_FRAME (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1385 Window requestor_window; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1386 Display *display; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1387 struct x_display_info *dpyinfo; |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1388 Time requestor_time = last_event_timestamp; |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1389 Atom target_property; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1390 Atom selection_atom; |
2161 | 1391 Atom type_atom; |
3492
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1392 int secs, usecs; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1393 int count = SPECPDL_INDEX (); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1394 Lisp_Object frame; |
2161 | 1395 |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1396 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1397 return Qnil; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1398 |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1399 requestor_window = FRAME_X_WINDOW (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1400 display = FRAME_X_DISPLAY (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1401 dpyinfo = FRAME_X_DISPLAY_INFO (sf); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1402 target_property = dpyinfo->Xatom_EMACS_TMP; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1403 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol); |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
1404 |
2161 | 1405 if (CONSP (target_type)) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1406 type_atom = symbol_to_x_atom (dpyinfo, display, XCAR (target_type)); |
2161 | 1407 else |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1408 type_atom = symbol_to_x_atom (dpyinfo, display, target_type); |
2161 | 1409 |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1410 if (! NILP (time_stamp)) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1411 { |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1412 if (CONSP (time_stamp)) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1413 requestor_time = (Time) cons_to_long (time_stamp); |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1414 else if (INTEGERP (time_stamp)) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1415 requestor_time = (Time) XUINT (time_stamp); |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1416 else if (FLOATP (time_stamp)) |
59411
ecb6689e04bf
* gtkutil.c (xg_gtk_scroll_destroy, xg_create_scroll_bar)
Jan Djärv <jan.h.d@swipnet.se>
parents:
59067
diff
changeset
|
1417 requestor_time = (Time) XFLOAT_DATA (time_stamp); |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1418 else |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1419 error ("TIME_STAMP must be cons or number"); |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1420 } |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
1421 |
2161 | 1422 BLOCK_INPUT; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1423 |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1424 /* The protected block contains wait_reading_process_output, which |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1425 can run random lisp code (process handlers) or signal. |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1426 Therefore, we put the x_uncatch_errors call in an unwind. */ |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1427 record_unwind_protect (x_catch_errors_unwind, Qnil); |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
1428 x_catch_errors (display); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1429 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1430 TRACE2 ("Get selection %s, type %s", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1431 XGetAtomName (display, type_atom), |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1432 XGetAtomName (display, target_property)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1433 |
2161 | 1434 XConvertSelection (display, selection_atom, type_atom, target_property, |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1435 requestor_window, requestor_time); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1436 XFlush (display); |
2161 | 1437 |
1438 /* Prepare to block until the reply has been read. */ | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1439 reading_selection_window = requestor_window; |
2161 | 1440 reading_which_selection = selection_atom; |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
1441 XSETCAR (reading_selection_reply, Qnil); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1442 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1443 frame = some_frame_on_display (dpyinfo); |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1444 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1445 /* If the display no longer has frames, we can't expect |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1446 to get many more selection requests from it, so don't |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1447 bother trying to queue them. */ |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1448 if (!NILP (frame)) |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1449 { |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1450 x_start_queuing_selection_requests (); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1451 |
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1452 record_unwind_protect (queue_selection_requests_unwind, |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1453 Qnil); |
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1454 } |
2161 | 1455 UNBLOCK_INPUT; |
1456 | |
3492
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1457 /* This allows quits. Also, don't wait forever. */ |
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1458 secs = x_selection_timeout / 1000; |
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1459 usecs = (x_selection_timeout % 1000) * 1000; |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1460 TRACE1 (" Start waiting %d secs for SelectionNotify", secs); |
56729
e6e0caa7ec87
Rename wait_reading_process_input to wait_reading_process_output.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
1461 wait_reading_process_output (secs, usecs, 0, 0, |
e6e0caa7ec87
Rename wait_reading_process_input to wait_reading_process_output.
Kim F. Storm <storm@cua.dk>
parents:
56717
diff
changeset
|
1462 reading_selection_reply, NULL, 0); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1463 TRACE1 (" Got event = %d", !NILP (XCAR (reading_selection_reply))); |
2161 | 1464 |
5244
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1465 BLOCK_INPUT; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1466 if (x_had_errors_p (display)) |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1467 error ("Cannot get selection"); |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
1468 /* This calls x_uncatch_errors. */ |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
1469 unbind_to (count, Qnil); |
5244
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1470 UNBLOCK_INPUT; |
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1471 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1472 if (NILP (XCAR (reading_selection_reply))) |
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1473 error ("Timed out waiting for reply from selection owner"); |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1474 if (EQ (XCAR (reading_selection_reply), Qlambda)) |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1475 error ("No `%s' selection", SDATA (SYMBOL_NAME (selection_symbol))); |
2161 | 1476 |
1477 /* Otherwise, the selection is waiting for us on the requested property. */ | |
1478 return | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1479 x_get_window_property_as_lisp_data (display, requestor_window, |
2161 | 1480 target_property, target_type, |
1481 selection_atom); | |
1482 } | |
1483 | |
1484 /* Subroutines of x_get_window_property_as_lisp_data */ | |
1485 | |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1486 /* Use xfree, not XFree, to free the data obtained with this function. */ |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1487 |
2161 | 1488 static void |
1489 x_get_window_property (display, window, property, data_ret, bytes_ret, | |
1490 actual_type_ret, actual_format_ret, actual_size_ret, | |
1491 delete_p) | |
1492 Display *display; | |
1493 Window window; | |
1494 Atom property; | |
1495 unsigned char **data_ret; | |
1496 int *bytes_ret; | |
1497 Atom *actual_type_ret; | |
1498 int *actual_format_ret; | |
1499 unsigned long *actual_size_ret; | |
1500 int delete_p; | |
1501 { | |
1502 int total_size; | |
1503 unsigned long bytes_remaining; | |
1504 int offset = 0; | |
1505 unsigned char *tmp_data = 0; | |
1506 int result; | |
1507 int buffer_size = SELECTION_QUANTUM (display); | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1508 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1509 if (buffer_size > MAX_SELECTION_QUANTUM) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1510 buffer_size = MAX_SELECTION_QUANTUM; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1511 |
2161 | 1512 BLOCK_INPUT; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1513 |
2161 | 1514 /* First probe the thing to find out how big it is. */ |
1515 result = XGetWindowProperty (display, window, property, | |
11881
3c292d5eed59
(x_get_window_property): Cast args of XGetWindowProperty.
Karl Heuer <kwzh@gnu.org>
parents:
11702
diff
changeset
|
1516 0L, 0L, False, AnyPropertyType, |
2161 | 1517 actual_type_ret, actual_format_ret, |
1518 actual_size_ret, | |
1519 &bytes_remaining, &tmp_data); | |
1520 if (result != Success) | |
1521 { | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1522 UNBLOCK_INPUT; |
2161 | 1523 *data_ret = 0; |
1524 *bytes_ret = 0; | |
1525 return; | |
1526 } | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1527 |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1528 /* This was allocated by Xlib, so use XFree. */ |
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1529 XFree ((char *) tmp_data); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1530 |
2161 | 1531 if (*actual_type_ret == None || *actual_format_ret == 0) |
1532 { | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1533 UNBLOCK_INPUT; |
2161 | 1534 return; |
1535 } | |
1536 | |
1537 total_size = bytes_remaining + 1; | |
1538 *data_ret = (unsigned char *) xmalloc (total_size); | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1539 |
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
1540 /* Now read, until we've gotten it all. */ |
2161 | 1541 while (bytes_remaining) |
1542 { | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1543 #ifdef TRACE_SELECTION |
2161 | 1544 int last = bytes_remaining; |
1545 #endif | |
1546 result | |
1547 = XGetWindowProperty (display, window, property, | |
11881
3c292d5eed59
(x_get_window_property): Cast args of XGetWindowProperty.
Karl Heuer <kwzh@gnu.org>
parents:
11702
diff
changeset
|
1548 (long)offset/4, (long)buffer_size/4, |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1549 False, |
2161 | 1550 AnyPropertyType, |
1551 actual_type_ret, actual_format_ret, | |
1552 actual_size_ret, &bytes_remaining, &tmp_data); | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1553 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1554 TRACE2 ("Read %ld bytes from property %s", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1555 last - bytes_remaining, |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1556 XGetAtomName (display, property)); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1557 |
2161 | 1558 /* If this doesn't return Success at this point, it means that |
1559 some clod deleted the selection while we were in the midst of | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1560 reading it. Deal with that, I guess.... */ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1561 if (result != Success) |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1562 break; |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1563 |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1564 /* The man page for XGetWindowProperty says: |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1565 "If the returned format is 32, the returned data is represented |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1566 as a long array and should be cast to that type to obtain the |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1567 elements." |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1568 This applies even if long is more than 32 bits, the X library |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1569 converts from 32 bit elements received from the X server to long |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1570 and passes the long array to us. Thus, for that case bcopy can not |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1571 be used. We convert to a 32 bit type here, because so much code |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1572 assume on that. |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1573 |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1574 The bytes and offsets passed to XGetWindowProperty refers to the |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1575 property and those are indeed in 32 bit quantities if format is 32. */ |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1576 |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1577 if (*actual_format_ret == 32 && *actual_format_ret < BITS_PER_LONG) |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1578 { |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1579 unsigned long i; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1580 int *idata = (int *) ((*data_ret) + offset); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1581 long *ldata = (long *) tmp_data; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1582 |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1583 for (i = 0; i < *actual_size_ret; ++i) |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1584 { |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1585 idata[i]= (int) ldata[i]; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1586 offset += 4; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1587 } |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1588 } |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1589 else |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1590 { |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1591 *actual_size_ret *= *actual_format_ret / 8; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1592 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1593 offset += *actual_size_ret; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
1594 } |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1595 |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1596 /* This was allocated by Xlib, so use XFree. */ |
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1597 XFree ((char *) tmp_data); |
2161 | 1598 } |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1599 |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1600 XFlush (display); |
2161 | 1601 UNBLOCK_INPUT; |
1602 *bytes_ret = offset; | |
1603 } | |
1604 | |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1605 /* Use xfree, not XFree, to free the data obtained with this function. */ |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1606 |
2161 | 1607 static void |
1608 receive_incremental_selection (display, window, property, target_type, | |
1609 min_size_bytes, data_ret, size_bytes_ret, | |
1610 type_ret, format_ret, size_ret) | |
1611 Display *display; | |
1612 Window window; | |
1613 Atom property; | |
1614 Lisp_Object target_type; /* for error messages only */ | |
1615 unsigned int min_size_bytes; | |
1616 unsigned char **data_ret; | |
1617 int *size_bytes_ret; | |
1618 Atom *type_ret; | |
1619 unsigned long *size_ret; | |
1620 int *format_ret; | |
1621 { | |
1622 int offset = 0; | |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1623 struct prop_location *wait_object; |
2161 | 1624 *size_bytes_ret = min_size_bytes; |
1625 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret); | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1626 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1627 TRACE1 ("Read %d bytes incrementally", min_size_bytes); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1628 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1629 /* At this point, we have read an INCR property. |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1630 Delete the property to ack it. |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1631 (But first, prepare to receive the next event in this handshake.) |
2161 | 1632 |
1633 Now, we must loop, waiting for the sending window to put a value on | |
1634 that property, then reading the property, then deleting it to ack. | |
1635 We are done when the sender places a property of length 0. | |
1636 */ | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1637 BLOCK_INPUT; |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1638 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1639 TRACE1 (" Delete property %s", |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1640 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property)))); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1641 XDeleteProperty (display, window, property); |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1642 TRACE1 (" Expect new value of property %s", |
57952
a6f82b95d10b
* xselect.c (struct selection_event_queue, selection_queue)
Kim F. Storm <storm@cua.dk>
parents:
57948
diff
changeset
|
1643 SDATA (SYMBOL_NAME (x_atom_to_symbol (display, property)))); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1644 wait_object = expect_property_change (display, window, property, |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1645 PropertyNewValue); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1646 XFlush (display); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1647 UNBLOCK_INPUT; |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1648 |
2161 | 1649 while (1) |
1650 { | |
1651 unsigned char *tmp_data; | |
1652 int tmp_size_bytes; | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1653 |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1654 TRACE0 (" Wait for property change"); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1655 wait_for_property_change (wait_object); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1656 |
2161 | 1657 /* expect it again immediately, because x_get_window_property may |
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
1658 .. no it won't, I don't get it. |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1659 .. Ok, I get it now, the Xt code that implements INCR is broken. */ |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1660 TRACE0 (" Get property value"); |
2161 | 1661 x_get_window_property (display, window, property, |
1662 &tmp_data, &tmp_size_bytes, | |
1663 type_ret, format_ret, size_ret, 1); | |
1664 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1665 TRACE1 (" Read increment of %d bytes", tmp_size_bytes); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1666 |
2161 | 1667 if (tmp_size_bytes == 0) /* we're done */ |
1668 { | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1669 TRACE0 ("Done reading incrementally"); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1670 |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1671 if (! waiting_for_other_props_on_window (display, window)) |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1672 XSelectInput (display, window, STANDARD_EVENT_SET); |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1673 /* Use xfree, not XFree, because x_get_window_property |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1674 calls xmalloc itself. */ |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1675 if (tmp_data) xfree (tmp_data); |
2161 | 1676 break; |
1677 } | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1678 |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1679 BLOCK_INPUT; |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1680 TRACE1 (" ACK by deleting property %s", |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1681 XGetAtomName (display, property)); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1682 XDeleteProperty (display, window, property); |
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1683 wait_object = expect_property_change (display, window, property, |
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1684 PropertyNewValue); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1685 XFlush (display); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1686 UNBLOCK_INPUT; |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1687 |
2161 | 1688 if (*size_bytes_ret < offset + tmp_size_bytes) |
1689 { | |
1690 *size_bytes_ret = offset + tmp_size_bytes; | |
1691 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret); | |
1692 } | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1693 |
4547
3bd8248cc191
(receive_incremental_selection): Use bcopy, not memcpy.
Richard M. Stallman <rms@gnu.org>
parents:
4373
diff
changeset
|
1694 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes); |
2161 | 1695 offset += tmp_size_bytes; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1696 |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1697 /* Use xfree, not XFree, because x_get_window_property |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1698 calls xmalloc itself. */ |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1699 xfree (tmp_data); |
2161 | 1700 } |
1701 } | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1702 |
2161 | 1703 |
1704 /* Once a requested selection is "ready" (we got a SelectionNotify event), | |
1705 fetch value from property PROPERTY of X window WINDOW on display DISPLAY. | |
1706 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */ | |
1707 | |
1708 static Lisp_Object | |
1709 x_get_window_property_as_lisp_data (display, window, property, target_type, | |
1710 selection_atom) | |
1711 Display *display; | |
1712 Window window; | |
1713 Atom property; | |
1714 Lisp_Object target_type; /* for error messages only */ | |
1715 Atom selection_atom; /* for error messages only */ | |
1716 { | |
1717 Atom actual_type; | |
1718 int actual_format; | |
1719 unsigned long actual_size; | |
1720 unsigned char *data = 0; | |
1721 int bytes = 0; | |
1722 Lisp_Object val; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1723 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
2161 | 1724 |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1725 TRACE0 ("Reading selection data"); |
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1726 |
2161 | 1727 x_get_window_property (display, window, property, &data, &bytes, |
1728 &actual_type, &actual_format, &actual_size, 1); | |
1729 if (! data) | |
1730 { | |
1731 int there_is_a_selection_owner; | |
1732 BLOCK_INPUT; | |
1733 there_is_a_selection_owner | |
1734 = XGetSelectionOwner (display, selection_atom); | |
1735 UNBLOCK_INPUT; | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1736 if (there_is_a_selection_owner) |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1737 signal_error ("Selection owner couldn't convert", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1738 actual_type |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1739 ? list2 (target_type, |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1740 x_atom_to_symbol (display, actual_type)) |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1741 : target_type); |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1742 else |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1743 signal_error ("No selection", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1744 x_atom_to_symbol (display, selection_atom)); |
2161 | 1745 } |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1746 |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1747 if (actual_type == dpyinfo->Xatom_INCR) |
2161 | 1748 { |
1749 /* That wasn't really the data, just the beginning. */ | |
1750 | |
1751 unsigned int min_size_bytes = * ((unsigned int *) data); | |
1752 BLOCK_INPUT; | |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1753 /* Use xfree, not XFree, because x_get_window_property |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1754 calls xmalloc itself. */ |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1755 xfree ((char *) data); |
2161 | 1756 UNBLOCK_INPUT; |
1757 receive_incremental_selection (display, window, property, target_type, | |
1758 min_size_bytes, &data, &bytes, | |
1759 &actual_type, &actual_format, | |
1760 &actual_size); | |
1761 } | |
1762 | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1763 BLOCK_INPUT; |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
1764 TRACE1 (" Delete property %s", XGetAtomName (display, property)); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1765 XDeleteProperty (display, window, property); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1766 XFlush (display); |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1767 UNBLOCK_INPUT; |
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1768 |
2161 | 1769 /* It's been read. Now convert it to a lisp object in some semi-rational |
1770 manner. */ | |
1771 val = selection_data_to_lisp_data (display, data, bytes, | |
1772 actual_type, actual_format); | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
1773 |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1774 /* Use xfree, not XFree, because x_get_window_property |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1775 calls xmalloc itself. */ |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1776 xfree ((char *) data); |
2161 | 1777 return val; |
1778 } | |
1779 | |
1780 /* These functions convert from the selection data read from the server into | |
1781 something that we can use from Lisp, and vice versa. | |
1782 | |
1783 Type: Format: Size: Lisp Type: | |
1784 ----- ------- ----- ----------- | |
1785 * 8 * String | |
1786 ATOM 32 1 Symbol | |
1787 ATOM 32 > 1 Vector of Symbols | |
1788 * 16 1 Integer | |
1789 * 16 > 1 Vector of Integers | |
1790 * 32 1 if <=16 bits: Integer | |
1791 if > 16 bits: Cons of top16, bot16 | |
1792 * 32 > 1 Vector of the above | |
1793 | |
1794 When converting a Lisp number to C, it is assumed to be of format 16 if | |
1795 it is an integer, and of format 32 if it is a cons of two integers. | |
1796 | |
1797 When converting a vector of numbers from Lisp to C, it is assumed to be | |
1798 of format 16 if every element in the vector is an integer, and is assumed | |
1799 to be of format 32 if any element is a cons of two integers. | |
1800 | |
1801 When converting an object to C, it may be of the form (SYMBOL . <data>) | |
1802 where SYMBOL is what we should claim that the type is. Format and | |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1803 representation are as above. |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1804 |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1805 Important: When format is 32, data should contain an array of int, |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1806 not an array of long as the X library returns. This makes a difference |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1807 when sizeof(long) != sizeof(int). */ |
2161 | 1808 |
1809 | |
1810 | |
1811 static Lisp_Object | |
1812 selection_data_to_lisp_data (display, data, size, type, format) | |
1813 Display *display; | |
1814 unsigned char *data; | |
1815 Atom type; | |
1816 int size, format; | |
1817 { | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1818 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
2161 | 1819 |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1820 if (type == dpyinfo->Xatom_NULL) |
2161 | 1821 return QNULL; |
1822 | |
1823 /* Convert any 8-bit data to a string, for compactness. */ | |
1824 else if (format == 8) | |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1825 { |
51598
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1826 Lisp_Object str, lispy_type; |
2161 | 1827 |
51598
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1828 str = make_unibyte_string ((char *) data, size); |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1829 /* Indicate that this string is from foreign selection by a text |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1830 property `foreign-selection' so that the caller of |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1831 x-get-selection-internal (usually x-get-selection) can know |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1832 that the string must be decode. */ |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1833 if (type == dpyinfo->Xatom_COMPOUND_TEXT) |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1834 lispy_type = QCOMPOUND_TEXT; |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1835 else if (type == dpyinfo->Xatom_UTF8_STRING) |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1836 lispy_type = QUTF8_STRING; |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1837 else |
51598
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1838 lispy_type = QSTRING; |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1839 Fput_text_property (make_number (0), make_number (size), |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
1840 Qforeign_selection, lispy_type, str); |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1841 return str; |
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1842 } |
2161 | 1843 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to |
1844 a vector of symbols. | |
1845 */ | |
1846 else if (type == XA_ATOM) | |
1847 { | |
1848 int i; | |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1849 /* On a 64 bit machine sizeof(Atom) == sizeof(long) == 8. |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1850 But the callers of these function has made sure the data for |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1851 format == 32 is an array of int. Thus, use int instead |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1852 of Atom. */ |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1853 int *idata = (int *) data; |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1854 |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1855 if (size == sizeof (int)) |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1856 return x_atom_to_symbol (display, (Atom) idata[0]); |
2161 | 1857 else |
1858 { | |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1859 Lisp_Object v = Fmake_vector (make_number (size / sizeof (int)), |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1860 make_number (0)); |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1861 for (i = 0; i < size / sizeof (int); i++) |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1862 Faset (v, make_number (i), |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
1863 x_atom_to_symbol (display, (Atom) idata[i])); |
2161 | 1864 return v; |
1865 } | |
1866 } | |
1867 | |
78401 | 1868 /* Convert a single 16-bit number or a small 32-bit number to a Lisp_Int. |
1869 If the number is 32 bits and won't fit in a Lisp_Int, | |
1870 convert it to a cons of integers, 16 bits in each half. | |
2161 | 1871 */ |
50110
b8c1a5c8f9c0
(selection_data_to_lisp_data): Use int instead of
Andreas Schwab <schwab@suse.de>
parents:
49065
diff
changeset
|
1872 else if (format == 32 && size == sizeof (int)) |
b8c1a5c8f9c0
(selection_data_to_lisp_data): Use int instead of
Andreas Schwab <schwab@suse.de>
parents:
49065
diff
changeset
|
1873 return long_to_cons (((unsigned int *) data) [0]); |
2161 | 1874 else if (format == 16 && size == sizeof (short)) |
1875 return make_number ((int) (((unsigned short *) data) [0])); | |
1876 | |
1877 /* Convert any other kind of data to a vector of numbers, represented | |
1878 as above (as an integer, or a cons of two 16 bit integers.) | |
1879 */ | |
1880 else if (format == 16) | |
1881 { | |
1882 int i; | |
18952
4e695c86585c
(selection_data_to_lisp_data):
Richard M. Stallman <rms@gnu.org>
parents:
18734
diff
changeset
|
1883 Lisp_Object v; |
4e695c86585c
(selection_data_to_lisp_data):
Richard M. Stallman <rms@gnu.org>
parents:
18734
diff
changeset
|
1884 v = Fmake_vector (make_number (size / 2), make_number (0)); |
4e695c86585c
(selection_data_to_lisp_data):
Richard M. Stallman <rms@gnu.org>
parents:
18734
diff
changeset
|
1885 for (i = 0; i < size / 2; i++) |
2161 | 1886 { |
1887 int j = (int) ((unsigned short *) data) [i]; | |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1888 Faset (v, make_number (i), make_number (j)); |
2161 | 1889 } |
1890 return v; | |
1891 } | |
1892 else | |
1893 { | |
1894 int i; | |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1895 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0)); |
2161 | 1896 for (i = 0; i < size / 4; i++) |
1897 { | |
50110
b8c1a5c8f9c0
(selection_data_to_lisp_data): Use int instead of
Andreas Schwab <schwab@suse.de>
parents:
49065
diff
changeset
|
1898 unsigned int j = ((unsigned int *) data) [i]; |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1899 Faset (v, make_number (i), long_to_cons (j)); |
2161 | 1900 } |
1901 return v; | |
1902 } | |
1903 } | |
1904 | |
1905 | |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1906 /* Use xfree, not XFree, to free the data obtained with this function. */ |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1907 |
2161 | 1908 static void |
1909 lisp_data_to_selection_data (display, obj, | |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1910 data_ret, type_ret, size_ret, |
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1911 format_ret, nofree_ret) |
2161 | 1912 Display *display; |
1913 Lisp_Object obj; | |
1914 unsigned char **data_ret; | |
1915 Atom *type_ret; | |
1916 unsigned int *size_ret; | |
1917 int *format_ret; | |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1918 int *nofree_ret; |
2161 | 1919 { |
1920 Lisp_Object type = Qnil; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1921 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1922 |
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1923 *nofree_ret = 0; |
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1924 |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1925 if (CONSP (obj) && SYMBOLP (XCAR (obj))) |
2161 | 1926 { |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1927 type = XCAR (obj); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1928 obj = XCDR (obj); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1929 if (CONSP (obj) && NILP (XCDR (obj))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1930 obj = XCAR (obj); |
2161 | 1931 } |
1932 | |
1933 if (EQ (obj, QNULL) || (EQ (type, QNULL))) | |
1934 { /* This is not the same as declining */ | |
1935 *format_ret = 32; | |
1936 *size_ret = 0; | |
1937 *data_ret = 0; | |
1938 type = QNULL; | |
1939 } | |
1940 else if (STRINGP (obj)) | |
1941 { | |
60030
e41b38ec1a82
(lisp_data_to_selection_data): If OBJ is a non-ASCII
Kenichi Handa <handa@m17n.org>
parents:
59993
diff
changeset
|
1942 if (SCHARS (obj) < SBYTES (obj)) |
e41b38ec1a82
(lisp_data_to_selection_data): If OBJ is a non-ASCII
Kenichi Handa <handa@m17n.org>
parents:
59993
diff
changeset
|
1943 /* OBJ is a multibyte string containing a non-ASCII char. */ |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
1944 signal_error ("Non-ASCII string must be encoded in advance", obj); |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
1945 if (NILP (type)) |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
1946 type = QSTRING; |
30352
63f82aef9860
(lisp_data_to_selection_data): Use x_encode_text.
Kenichi Handa <handa@m17n.org>
parents:
29024
diff
changeset
|
1947 *format_ret = 8; |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
1948 *size_ret = SBYTES (obj); |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
1949 *data_ret = SDATA (obj); |
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
1950 *nofree_ret = 1; |
2161 | 1951 } |
1952 else if (SYMBOLP (obj)) | |
1953 { | |
1954 *format_ret = 32; | |
1955 *size_ret = 1; | |
1956 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1); | |
1957 (*data_ret) [sizeof (Atom)] = 0; | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1958 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj); |
2161 | 1959 if (NILP (type)) type = QATOM; |
1960 } | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1961 else if (INTEGERP (obj) |
2161 | 1962 && XINT (obj) < 0xFFFF |
1963 && XINT (obj) > -0xFFFF) | |
1964 { | |
1965 *format_ret = 16; | |
1966 *size_ret = 1; | |
1967 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1); | |
1968 (*data_ret) [sizeof (short)] = 0; | |
1969 (*(short **) data_ret) [0] = (short) XINT (obj); | |
1970 if (NILP (type)) type = QINTEGER; | |
1971 } | |
2169 | 1972 else if (INTEGERP (obj) |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1973 || (CONSP (obj) && INTEGERP (XCAR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1974 && (INTEGERP (XCDR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1975 || (CONSP (XCDR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
1976 && INTEGERP (XCAR (XCDR (obj))))))) |
2161 | 1977 { |
1978 *format_ret = 32; | |
1979 *size_ret = 1; | |
1980 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1); | |
1981 (*data_ret) [sizeof (long)] = 0; | |
1982 (*(unsigned long **) data_ret) [0] = cons_to_long (obj); | |
1983 if (NILP (type)) type = QINTEGER; | |
1984 } | |
1985 else if (VECTORP (obj)) | |
1986 { | |
1987 /* Lisp_Vectors may represent a set of ATOMs; | |
1988 a set of 16 or 32 bit INTEGERs; | |
1989 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...] | |
1990 */ | |
1991 int i; | |
1992 | |
1993 if (SYMBOLP (XVECTOR (obj)->contents [0])) | |
1994 /* This vector is an ATOM set */ | |
1995 { | |
1996 if (NILP (type)) type = QATOM; | |
1997 *size_ret = XVECTOR (obj)->size; | |
1998 *format_ret = 32; | |
1999 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom)); | |
2000 for (i = 0; i < *size_ret; i++) | |
2001 if (SYMBOLP (XVECTOR (obj)->contents [i])) | |
2002 (*(Atom **) data_ret) [i] | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2003 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]); |
2161 | 2004 else |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2005 signal_error ("All elements of selection vector must have same type", obj); |
2161 | 2006 } |
2007 #if 0 /* #### MULTIPLE doesn't work yet */ | |
2008 else if (VECTORP (XVECTOR (obj)->contents [0])) | |
2009 /* This vector is an ATOM_PAIR set */ | |
2010 { | |
2011 if (NILP (type)) type = QATOM_PAIR; | |
2012 *size_ret = XVECTOR (obj)->size; | |
2013 *format_ret = 32; | |
2014 *data_ret = (unsigned char *) | |
2015 xmalloc ((*size_ret) * sizeof (Atom) * 2); | |
2016 for (i = 0; i < *size_ret; i++) | |
2017 if (VECTORP (XVECTOR (obj)->contents [i])) | |
2018 { | |
2019 Lisp_Object pair = XVECTOR (obj)->contents [i]; | |
2020 if (XVECTOR (pair)->size != 2) | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2021 signal_error ( |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2022 "Elements of the vector must be vectors of exactly two elements", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2023 pair); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
2024 |
2161 | 2025 (*(Atom **) data_ret) [i * 2] |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2026 = symbol_to_x_atom (dpyinfo, display, |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2027 XVECTOR (pair)->contents [0]); |
2161 | 2028 (*(Atom **) data_ret) [(i * 2) + 1] |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2029 = symbol_to_x_atom (dpyinfo, display, |
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2030 XVECTOR (pair)->contents [1]); |
2161 | 2031 } |
2032 else | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2033 signal_error ("All elements of the vector must be of the same type", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2034 obj); |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
2035 |
2161 | 2036 } |
2037 #endif | |
2038 else | |
2039 /* This vector is an INTEGER set, or something like it */ | |
2040 { | |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2041 int data_size = 2; |
2161 | 2042 *size_ret = XVECTOR (obj)->size; |
2043 if (NILP (type)) type = QINTEGER; | |
2044 *format_ret = 16; | |
2045 for (i = 0; i < *size_ret; i++) | |
2046 if (CONSP (XVECTOR (obj)->contents [i])) | |
2047 *format_ret = 32; | |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
2048 else if (!INTEGERP (XVECTOR (obj)->contents [i])) |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2049 signal_error (/* Qselection_error */ |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2050 "Elements of selection vector must be integers or conses of integers", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2051 obj); |
2161 | 2052 |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2053 /* Use sizeof(long) even if it is more than 32 bits. See comment |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2054 in x_get_window_property and x_fill_property_data. */ |
63529
01dd74cb546e
(lisp_data_to_selection_data): Fix spelling.
Juanma Barranquero <lekktu@gmail.com>
parents:
60134
diff
changeset
|
2055 |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2056 if (*format_ret == 32) data_size = sizeof(long); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2057 *data_ret = (unsigned char *) xmalloc (*size_ret * data_size); |
2161 | 2058 for (i = 0; i < *size_ret; i++) |
2059 if (*format_ret == 32) | |
2060 (*((unsigned long **) data_ret)) [i] | |
2061 = cons_to_long (XVECTOR (obj)->contents [i]); | |
2062 else | |
2063 (*((unsigned short **) data_ret)) [i] | |
2064 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]); | |
2065 } | |
2066 } | |
2067 else | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2068 signal_error (/* Qselection_error */ "Unrecognized selection data", obj); |
2161 | 2069 |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2070 *type_ret = symbol_to_x_atom (dpyinfo, display, type); |
2161 | 2071 } |
2072 | |
2073 static Lisp_Object | |
2074 clean_local_selection_data (obj) | |
2075 Lisp_Object obj; | |
2076 { | |
2077 if (CONSP (obj) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2078 && INTEGERP (XCAR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2079 && CONSP (XCDR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2080 && INTEGERP (XCAR (XCDR (obj))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2081 && NILP (XCDR (XCDR (obj)))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2082 obj = Fcons (XCAR (obj), XCDR (obj)); |
2161 | 2083 |
2084 if (CONSP (obj) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2085 && INTEGERP (XCAR (obj)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2086 && INTEGERP (XCDR (obj))) |
2161 | 2087 { |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2088 if (XINT (XCAR (obj)) == 0) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2089 return XCDR (obj); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2090 if (XINT (XCAR (obj)) == -1) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2091 return make_number (- XINT (XCDR (obj))); |
2161 | 2092 } |
2093 if (VECTORP (obj)) | |
2094 { | |
2095 int i; | |
2096 int size = XVECTOR (obj)->size; | |
2097 Lisp_Object copy; | |
2098 if (size == 1) | |
2099 return clean_local_selection_data (XVECTOR (obj)->contents [0]); | |
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
2100 copy = Fmake_vector (make_number (size), Qnil); |
2161 | 2101 for (i = 0; i < size; i++) |
2102 XVECTOR (copy)->contents [i] | |
2103 = clean_local_selection_data (XVECTOR (obj)->contents [i]); | |
2104 return copy; | |
2105 } | |
2106 return obj; | |
2107 } | |
2108 | |
2109 /* Called from XTread_socket to handle SelectionNotify events. | |
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
2110 If it's the selection we are waiting for, stop waiting |
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
2111 by setting the car of reading_selection_reply to non-nil. |
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
2112 We store t there if the reply is successful, lambda if not. */ |
2161 | 2113 |
2114 void | |
2115 x_handle_selection_notify (event) | |
2116 XSelectionEvent *event; | |
2117 { | |
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
2118 if (event->requestor != reading_selection_window) |
2161 | 2119 return; |
2120 if (event->selection != reading_which_selection) | |
2121 return; | |
2122 | |
38386
6bf3530c700d
(x_decline_selection_request): Handle errors
Gerd Moellmann <gerd@gnu.org>
parents:
35336
diff
changeset
|
2123 TRACE0 ("Received SelectionNotify"); |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
2124 XSETCAR (reading_selection_reply, |
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
38386
diff
changeset
|
2125 (event->property != 0 ? Qt : Qlambda)); |
2161 | 2126 } |
2127 | |
2128 | |
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
2129 DEFUN ("x-own-selection-internal", Fx_own_selection_internal, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2130 Sx_own_selection_internal, 2, 2, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2131 doc: /* Assert an X selection of the given TYPE with the given VALUE. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2132 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2133 \(Those are literal upper-case symbol names, since that's what X expects.) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2134 VALUE is typically a string, or a cons of two markers, but may be |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2135 anything that the functions on `selection-converter-alist' know about. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2136 (selection_name, selection_value) |
2161 | 2137 Lisp_Object selection_name, selection_value; |
2138 { | |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2139 check_x (); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2140 CHECK_SYMBOL (selection_name); |
63706
557271737e6b
(Fx_own_selection_internal): Follow error conventions.
Juanma Barranquero <lekktu@gmail.com>
parents:
63529
diff
changeset
|
2141 if (NILP (selection_value)) error ("SELECTION-VALUE may not be nil"); |
2161 | 2142 x_own_selection (selection_name, selection_value); |
2143 return selection_value; | |
2144 } | |
2145 | |
2146 | |
2147 /* Request the selection value from the owner. If we are the owner, | |
2148 simply return our selection value. If we are not the owner, this | |
2149 will block until all of the data has arrived. */ | |
2150 | |
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
2151 DEFUN ("x-get-selection-internal", Fx_get_selection_internal, |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2152 Sx_get_selection_internal, 2, 3, 0, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2153 doc: /* Return text selected from some X window. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2154 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2155 \(Those are literal upper-case symbol names, since that's what X expects.) |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2156 TYPE is the type of data desired, typically `STRING'. |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2157 TIME_STAMP is the time to use in the XConvertSelection call for foreign |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2158 selections. If omitted, defaults to the time for the last event. */) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2159 (selection_symbol, target_type, time_stamp) |
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2160 Lisp_Object selection_symbol, target_type, time_stamp; |
2161 | 2161 { |
2162 Lisp_Object val = Qnil; | |
2163 struct gcpro gcpro1, gcpro2; | |
2164 GCPRO2 (target_type, val); /* we store newly consed data into these */ | |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2165 check_x (); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2166 CHECK_SYMBOL (selection_symbol); |
2161 | 2167 |
2168 #if 0 /* #### MULTIPLE doesn't work yet */ | |
2169 if (CONSP (target_type) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2170 && XCAR (target_type) == QMULTIPLE) |
2161 | 2171 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2172 CHECK_VECTOR (XCDR (target_type)); |
2161 | 2173 /* So we don't destructively modify this... */ |
2174 target_type = copy_multiple_data (target_type); | |
2175 } | |
2176 else | |
2177 #endif | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2178 CHECK_SYMBOL (target_type); |
2161 | 2179 |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
2180 val = x_get_local_selection (selection_symbol, target_type, 1); |
2161 | 2181 |
2182 if (NILP (val)) | |
2183 { | |
53911
609de9ab5f75
* xselect.c (x_get_foreign_selection): Add new optional parameter
Jan Djärv <jan.h.d@swipnet.se>
parents:
53818
diff
changeset
|
2184 val = x_get_foreign_selection (selection_symbol, target_type, time_stamp); |
2161 | 2185 goto DONE; |
2186 } | |
2187 | |
2188 if (CONSP (val) | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2189 && SYMBOLP (XCAR (val))) |
2161 | 2190 { |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2191 val = XCDR (val); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2192 if (CONSP (val) && NILP (XCDR (val))) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2193 val = XCAR (val); |
2161 | 2194 } |
2195 val = clean_local_selection_data (val); | |
2196 DONE: | |
2197 UNGCPRO; | |
2198 return val; | |
2199 } | |
2200 | |
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
2201 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2202 Sx_disown_selection_internal, 1, 2, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2203 doc: /* If we own the selection SELECTION, disown it. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2204 Disowning it means there is no such selection. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2205 (selection, time) |
2161 | 2206 Lisp_Object selection; |
2207 Lisp_Object time; | |
2208 { | |
2209 Time timestamp; | |
2210 Atom selection_atom; | |
60134
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2211 union { |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2212 struct selection_input_event sie; |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2213 struct input_event ie; |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2214 } event; |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2215 Display *display; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2216 struct x_display_info *dpyinfo; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2217 struct frame *sf = SELECTED_FRAME (); |
2161 | 2218 |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2219 check_x (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2220 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2221 return Qnil; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2222 |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2223 display = FRAME_X_DISPLAY (sf); |
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2224 dpyinfo = FRAME_X_DISPLAY_INFO (sf); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2225 CHECK_SYMBOL (selection); |
2161 | 2226 if (NILP (time)) |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
2227 timestamp = last_event_timestamp; |
2161 | 2228 else |
2229 timestamp = cons_to_long (time); | |
2230 | |
2231 if (NILP (assq_no_quit (selection, Vselection_alist))) | |
2232 return Qnil; /* Don't disown the selection when we're not the owner. */ | |
2233 | |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2234 selection_atom = symbol_to_x_atom (dpyinfo, display, selection); |
2161 | 2235 |
2236 BLOCK_INPUT; | |
2237 XSetSelectionOwner (display, selection_atom, None, timestamp); | |
2238 UNBLOCK_INPUT; | |
2239 | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3492
diff
changeset
|
2240 /* It doesn't seem to be guaranteed that a SelectionClear event will be |
2161 | 2241 generated for a window which owns the selection when that window sets |
2242 the selection owner to None. The NCD server does, the MIT Sun4 server | |
2243 doesn't. So we synthesize one; this means we might get two, but | |
2244 that's ok, because the second one won't have any effect. */ | |
60134
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2245 SELECTION_EVENT_DISPLAY (&event.sie) = display; |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2246 SELECTION_EVENT_SELECTION (&event.sie) = selection_atom; |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2247 SELECTION_EVENT_TIME (&event.sie) = timestamp; |
dd37bedfb1f4
(Fx_disown_selection_internal): Use union of struct
Andreas Schwab <schwab@suse.de>
parents:
60030
diff
changeset
|
2248 x_handle_selection_clear (&event.ie); |
2161 | 2249 |
2250 return Qt; | |
2251 } | |
2252 | |
2169 | 2253 /* Get rid of all the selections in buffer BUFFER. |
2254 This is used when we kill a buffer. */ | |
2255 | |
2256 void | |
2257 x_disown_buffer_selections (buffer) | |
2258 Lisp_Object buffer; | |
2259 { | |
2260 Lisp_Object tail; | |
2261 struct buffer *buf = XBUFFER (buffer); | |
2262 | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2263 for (tail = Vselection_alist; CONSP (tail); tail = XCDR (tail)) |
2169 | 2264 { |
2265 Lisp_Object elt, value; | |
25646
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2266 elt = XCAR (tail); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2267 value = XCDR (elt); |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2268 if (CONSP (value) && MARKERP (XCAR (value)) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2269 && XMARKER (XCAR (value))->buffer == buf) |
9154af188477
Use XCAR and XCDR instead of explicit member references.
Ken Raeburn <raeburn@raeburn.org>
parents:
24163
diff
changeset
|
2270 Fx_disown_selection_internal (XCAR (elt), Qnil); |
2169 | 2271 } |
2272 } | |
2161 | 2273 |
2274 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p, | |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2275 0, 1, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2276 doc: /* Whether the current Emacs process owns the given X Selection. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2277 The arg should be the name of the selection in question, typically one of |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2278 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2279 \(Those are literal upper-case symbol names, since that's what X expects.) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2280 For convenience, the symbol nil is the same as `PRIMARY', |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2281 and t is the same as `SECONDARY'. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2282 (selection) |
2161 | 2283 Lisp_Object selection; |
2284 { | |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2285 check_x (); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2286 CHECK_SYMBOL (selection); |
2161 | 2287 if (EQ (selection, Qnil)) selection = QPRIMARY; |
2288 if (EQ (selection, Qt)) selection = QSECONDARY; | |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
2289 |
2161 | 2290 if (NILP (Fassq (selection, Vselection_alist))) |
2291 return Qnil; | |
2292 return Qt; | |
2293 } | |
2294 | |
2295 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p, | |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2296 0, 1, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2297 doc: /* Whether there is an owner for the given X Selection. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2298 The arg should be the name of the selection in question, typically one of |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2299 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2300 \(Those are literal upper-case symbol names, since that's what X expects.) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2301 For convenience, the symbol nil is the same as `PRIMARY', |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2302 and t is the same as `SECONDARY'. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2303 (selection) |
2161 | 2304 Lisp_Object selection; |
2305 { | |
2306 Window owner; | |
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2307 Atom atom; |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2308 Display *dpy; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2309 struct frame *sf = SELECTED_FRAME (); |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2310 |
9680
14a8113d8a8b
(Fx_selection_exists_p): If selected_frame isn't an x frame, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
9670
diff
changeset
|
2311 /* It should be safe to call this before we have an X frame. */ |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2312 if (! FRAME_X_P (sf)) |
9680
14a8113d8a8b
(Fx_selection_exists_p): If selected_frame isn't an x frame, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
9670
diff
changeset
|
2313 return Qnil; |
14a8113d8a8b
(Fx_selection_exists_p): If selected_frame isn't an x frame, return nil.
Richard M. Stallman <rms@gnu.org>
parents:
9670
diff
changeset
|
2314 |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2315 dpy = FRAME_X_DISPLAY (sf); |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2316 CHECK_SYMBOL (selection); |
2161 | 2317 if (!NILP (Fx_selection_owner_p (selection))) |
2318 return Qt; | |
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2319 if (EQ (selection, Qnil)) selection = QPRIMARY; |
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2320 if (EQ (selection, Qt)) selection = QSECONDARY; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2321 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), dpy, selection); |
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2322 if (atom == 0) |
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2323 return Qnil; |
2161 | 2324 BLOCK_INPUT; |
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2325 owner = XGetSelectionOwner (dpy, atom); |
2161 | 2326 UNBLOCK_INPUT; |
2327 return (owner ? Qt : Qnil); | |
2328 } | |
2329 | |
2330 | |
2331 #ifdef CUT_BUFFER_SUPPORT | |
2332 | |
2333 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */ | |
2334 static void | |
2335 initialize_cut_buffers (display, window) | |
2336 Display *display; | |
2337 Window window; | |
2338 { | |
2339 unsigned char *data = (unsigned char *) ""; | |
2340 BLOCK_INPUT; | |
2341 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \ | |
2342 PropModeAppend, data, 0) | |
2343 FROB (XA_CUT_BUFFER0); | |
2344 FROB (XA_CUT_BUFFER1); | |
2345 FROB (XA_CUT_BUFFER2); | |
2346 FROB (XA_CUT_BUFFER3); | |
2347 FROB (XA_CUT_BUFFER4); | |
2348 FROB (XA_CUT_BUFFER5); | |
2349 FROB (XA_CUT_BUFFER6); | |
2350 FROB (XA_CUT_BUFFER7); | |
2351 #undef FROB | |
2352 UNBLOCK_INPUT; | |
2353 } | |
2354 | |
2355 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2356 #define CHECK_CUT_BUFFER(symbol) \ |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2357 do { CHECK_SYMBOL ((symbol)); \ |
2161 | 2358 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \ |
2359 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \ | |
2360 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \ | |
2361 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \ | |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2362 signal_error ("Doesn't name a cut buffer", (symbol)); \ |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2363 } while (0) |
2161 | 2364 |
2169 | 2365 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2366 Sx_get_cut_buffer_internal, 1, 1, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2367 doc: /* Returns the value of the named cut buffer (typically CUT_BUFFER0). */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2368 (buffer) |
2161 | 2369 Lisp_Object buffer; |
2370 { | |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2371 Window window; |
2161 | 2372 Atom buffer_atom; |
2373 unsigned char *data; | |
2374 int bytes; | |
2375 Atom type; | |
2376 int format; | |
2377 unsigned long size; | |
2378 Lisp_Object ret; | |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2379 Display *display; |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2380 struct x_display_info *dpyinfo; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2381 struct frame *sf = SELECTED_FRAME (); |
2161 | 2382 |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2383 check_x (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2384 |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2385 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2386 return Qnil; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2387 |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2388 display = FRAME_X_DISPLAY (sf); |
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2389 dpyinfo = FRAME_X_DISPLAY_INFO (sf); |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2390 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2391 CHECK_CUT_BUFFER (buffer); |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2392 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer); |
2161 | 2393 |
2394 x_get_window_property (display, window, buffer_atom, &data, &bytes, | |
2395 &type, &format, &size, 0); | |
21654
8f2af8f84898
(Fx_get_cut_buffer_internal): If FORMAT is 0, cut buffer is empty.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
2396 if (!data || !format) |
8f2af8f84898
(Fx_get_cut_buffer_internal): If FORMAT is 0, cut buffer is empty.
Richard M. Stallman <rms@gnu.org>
parents:
21514
diff
changeset
|
2397 return Qnil; |
45672
1f957476e757
(lisp_data_to_selection_data): Fix last change:
Sam Steingold <sds@gnu.org>
parents:
45670
diff
changeset
|
2398 |
2161 | 2399 if (format != 8 || type != XA_STRING) |
71994
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2400 signal_error ("Cut buffer doesn't contain 8-bit data", |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2401 list2 (x_atom_to_symbol (display, type), |
e650d66ac6db
(x_get_local_selection, copy_multiple_data)
Kim F. Storm <storm@cua.dk>
parents:
69282
diff
changeset
|
2402 make_number (format))); |
2161 | 2403 |
59067
fdadde62c624
(Fx_get_cut_buffer_internal): Return a unibyte string.
Kenichi Handa <handa@m17n.org>
parents:
58096
diff
changeset
|
2404 ret = (bytes ? make_unibyte_string ((char *) data, bytes) : Qnil); |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
2405 /* Use xfree, not XFree, because x_get_window_property |
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
2406 calls xmalloc itself. */ |
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
2407 xfree (data); |
2161 | 2408 return ret; |
2409 } | |
2410 | |
2411 | |
2169 | 2412 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2413 Sx_store_cut_buffer_internal, 2, 2, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2414 doc: /* Sets the value of the named cut buffer (typically CUT_BUFFER0). */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2415 (buffer, string) |
2161 | 2416 Lisp_Object buffer, string; |
2417 { | |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2418 Window window; |
2161 | 2419 Atom buffer_atom; |
2420 unsigned char *data; | |
2421 int bytes; | |
2422 int bytes_remaining; | |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2423 int max_bytes; |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2424 Display *display; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2425 struct frame *sf = SELECTED_FRAME (); |
2161 | 2426 |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2427 check_x (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2428 |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2429 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2430 return Qnil; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2431 |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2432 display = FRAME_X_DISPLAY (sf); |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2433 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */ |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2434 |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2435 max_bytes = SELECTION_QUANTUM (display); |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2436 if (max_bytes > MAX_SELECTION_QUANTUM) |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2437 max_bytes = MAX_SELECTION_QUANTUM; |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2438 |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2439 CHECK_CUT_BUFFER (buffer); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2440 CHECK_STRING (string); |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2441 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (sf), |
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2442 display, buffer); |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2443 data = (unsigned char *) SDATA (string); |
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
2444 bytes = SBYTES (string); |
2161 | 2445 bytes_remaining = bytes; |
2446 | |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2447 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized) |
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2448 { |
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2449 initialize_cut_buffers (display, window); |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2450 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1; |
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2451 } |
2161 | 2452 |
2453 BLOCK_INPUT; | |
3473
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2454 |
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2455 /* Don't mess up with an empty value. */ |
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2456 if (!bytes_remaining) |
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2457 XChangeProperty (display, window, buffer_atom, XA_STRING, 8, |
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2458 PropModeReplace, data, 0); |
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2459 |
2161 | 2460 while (bytes_remaining) |
2461 { | |
2462 int chunk = (bytes_remaining < max_bytes | |
2463 ? bytes_remaining : max_bytes); | |
2464 XChangeProperty (display, window, buffer_atom, XA_STRING, 8, | |
2465 (bytes_remaining == bytes | |
2466 ? PropModeReplace | |
2467 : PropModeAppend), | |
2468 data, chunk); | |
2469 data += chunk; | |
2470 bytes_remaining -= chunk; | |
2471 } | |
2472 UNBLOCK_INPUT; | |
2473 return string; | |
2474 } | |
2475 | |
2476 | |
2169 | 2477 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2478 Sx_rotate_cut_buffers_internal, 1, 1, 0, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2479 doc: /* Rotate the values of the cut buffers by the given number of step. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2480 Positive means shift the values forward, negative means backward. */) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2481 (n) |
2161 | 2482 Lisp_Object n; |
2483 { | |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2484 Window window; |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2485 Atom props[8]; |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2486 Display *display; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2487 struct frame *sf = SELECTED_FRAME (); |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2488 |
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2489 check_x (); |
2161 | 2490 |
83004
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2491 if (! FRAME_X_P (sf)) |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2492 return Qnil; |
7900111db01c
Converted display hooks to be display-local. Plus many bugfixes.
Karoly Lorentey <lorentey@elte.hu>
parents:
52401
diff
changeset
|
2493 |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2494 display = FRAME_X_DISPLAY (sf); |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2495 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */ |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
40123
diff
changeset
|
2496 CHECK_NUMBER (n); |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2497 if (XINT (n) == 0) |
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2498 return n; |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2499 if (! FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized) |
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2500 { |
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2501 initialize_cut_buffers (display, window); |
25681
3e56c05edfab
(x_own_selection): Change for Lisp_Object selected_frame.
Gerd Moellmann <gerd@gnu.org>
parents:
25646
diff
changeset
|
2502 FRAME_X_DISPLAY_INFO (sf)->cut_buffers_initialized = 1; |
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2503 } |
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2504 |
2161 | 2505 props[0] = XA_CUT_BUFFER0; |
2506 props[1] = XA_CUT_BUFFER1; | |
2507 props[2] = XA_CUT_BUFFER2; | |
2508 props[3] = XA_CUT_BUFFER3; | |
2509 props[4] = XA_CUT_BUFFER4; | |
2510 props[5] = XA_CUT_BUFFER5; | |
2511 props[6] = XA_CUT_BUFFER6; | |
2512 props[7] = XA_CUT_BUFFER7; | |
2513 BLOCK_INPUT; | |
2514 XRotateWindowProperties (display, window, props, 8, XINT (n)); | |
2515 UNBLOCK_INPUT; | |
2516 return n; | |
2517 } | |
2518 | |
2519 #endif | |
2520 | |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2521 /*********************************************************************** |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2522 Drag and drop support |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2523 ***********************************************************************/ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2524 /* Check that lisp values are of correct type for x_fill_property_data. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2525 That is, number, string or a cons with two numbers (low and high 16 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2526 bit parts of a 32 bit number). */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2527 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2528 int |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2529 x_check_property_data (data) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2530 Lisp_Object data; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2531 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2532 Lisp_Object iter; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2533 int size = 0; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2534 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2535 for (iter = data; CONSP (iter) && size != -1; iter = XCDR (iter), ++size) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2536 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2537 Lisp_Object o = XCAR (iter); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2538 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2539 if (! NUMBERP (o) && ! STRINGP (o) && ! CONSP (o)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2540 size = -1; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2541 else if (CONSP (o) && |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2542 (! NUMBERP (XCAR (o)) || ! NUMBERP (XCDR (o)))) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2543 size = -1; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2544 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2545 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2546 return size; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2547 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2548 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2549 /* Convert lisp values to a C array. Values may be a number, a string |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2550 which is taken as an X atom name and converted to the atom value, or |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2551 a cons containing the two 16 bit parts of a 32 bit number. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2552 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2553 DPY is the display use to look up X atoms. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2554 DATA is a Lisp list of values to be converted. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2555 RET is the C array that contains the converted values. It is assumed |
59411
ecb6689e04bf
* gtkutil.c (xg_gtk_scroll_destroy, xg_create_scroll_bar)
Jan Djärv <jan.h.d@swipnet.se>
parents:
59067
diff
changeset
|
2556 it is big enough to hold all values. |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2557 FORMAT is 8, 16 or 32 and denotes char/short/long for each C value to |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2558 be stored in RET. Note that long is used for 32 even if long is more |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2559 than 32 bits (see man pages for XChangeProperty, XGetWindowProperty and |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2560 XClientMessageEvent). */ |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2561 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2562 void |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2563 x_fill_property_data (dpy, data, ret, format) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2564 Display *dpy; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2565 Lisp_Object data; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2566 void *ret; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2567 int format; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2568 { |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2569 long val; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2570 long *d32 = (long *) ret; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2571 short *d16 = (short *) ret; |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2572 char *d08 = (char *) ret; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2573 Lisp_Object iter; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2574 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2575 for (iter = data; CONSP (iter); iter = XCDR (iter)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2576 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2577 Lisp_Object o = XCAR (iter); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2578 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2579 if (INTEGERP (o)) |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2580 val = (long) XFASTINT (o); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2581 else if (FLOATP (o)) |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2582 val = (long) XFLOAT_DATA (o); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2583 else if (CONSP (o)) |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2584 val = (long) cons_to_long (o); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2585 else if (STRINGP (o)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2586 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2587 BLOCK_INPUT; |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2588 val = (long) XInternAtom (dpy, (char *) SDATA (o), False); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2589 UNBLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2590 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2591 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2592 error ("Wrong type, must be string, number or cons"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2593 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2594 if (format == 8) |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2595 *d08++ = (char) val; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2596 else if (format == 16) |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2597 *d16++ = (short) val; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2598 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2599 *d32++ = val; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2600 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2601 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2602 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2603 /* Convert an array of C values to a Lisp list. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2604 F is the frame to be used to look up X atoms if the TYPE is XA_ATOM. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2605 DATA is a C array of values to be converted. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2606 TYPE is the type of the data. Only XA_ATOM is special, it converts |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2607 each number in DATA to its corresponfing X atom as a symbol. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2608 FORMAT is 8, 16 or 32 and gives the size in bits for each C value to |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2609 be stored in RET. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2610 SIZE is the number of elements in DATA. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2611 |
59993
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
2612 Important: When format is 32, data should contain an array of int, |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
2613 not an array of long as the X library returns. This makes a difference |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
2614 when sizeof(long) != sizeof(int). |
22a410b2373b
* xselect.c (selection_data_to_lisp_data): For the special case
Jan Djärv <jan.h.d@swipnet.se>
parents:
59975
diff
changeset
|
2615 |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2616 Also see comment for selection_data_to_lisp_data above. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2617 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2618 Lisp_Object |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2619 x_property_data_to_lisp (f, data, type, format, size) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2620 struct frame *f; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2621 unsigned char *data; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2622 Atom type; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2623 int format; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2624 unsigned long size; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2625 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2626 return selection_data_to_lisp_data (FRAME_X_DISPLAY (f), |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2627 data, size*format/8, type, format); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2628 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2629 |
59931
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2630 /* Get the mouse position in frame relative coordinates. */ |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2631 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2632 static void |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2633 mouse_position_for_drop (f, x, y) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2634 FRAME_PTR f; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2635 int *x; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2636 int *y; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2637 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2638 Window root, dummy_window; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2639 int dummy; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2640 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2641 BLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2642 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2643 XQueryPointer (FRAME_X_DISPLAY (f), |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2644 DefaultRootWindow (FRAME_X_DISPLAY (f)), |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2645 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2646 /* The root window which contains the pointer. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2647 &root, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2648 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2649 /* Window pointer is on, not used */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2650 &dummy_window, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2651 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2652 /* The position on that root window. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2653 x, y, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2654 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2655 /* x/y in dummy_window coordinates, not used. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2656 &dummy, &dummy, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2657 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2658 /* Modifier keys and pointer buttons, about which |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2659 we don't care. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2660 (unsigned int *) &dummy); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2661 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2662 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2663 /* Absolute to relative. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2664 *x -= f->left_pos + FRAME_OUTER_TO_INNER_DIFF_X (f); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2665 *y -= f->top_pos + FRAME_OUTER_TO_INNER_DIFF_Y (f); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2666 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2667 UNBLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2668 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2669 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2670 DEFUN ("x-get-atom-name", Fx_get_atom_name, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2671 Sx_get_atom_name, 1, 2, 0, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2672 doc: /* Return the X atom name for VALUE as a string. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2673 VALUE may be a number or a cons where the car is the upper 16 bits and |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2674 the cdr is the lower 16 bits of a 32 bit value. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2675 Use the display for FRAME or the current frame if FRAME is not given or nil. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2676 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2677 If the value is 0 or the atom is not known, return the empty string. */) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2678 (value, frame) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2679 Lisp_Object value, frame; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2680 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2681 struct frame *f = check_x_frame (frame); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2682 char *name = 0; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2683 Lisp_Object ret = Qnil; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2684 Display *dpy = FRAME_X_DISPLAY (f); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2685 Atom atom; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
2686 int had_errors; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2687 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2688 if (INTEGERP (value)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2689 atom = (Atom) XUINT (value); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2690 else if (FLOATP (value)) |
59411
ecb6689e04bf
* gtkutil.c (xg_gtk_scroll_destroy, xg_create_scroll_bar)
Jan Djärv <jan.h.d@swipnet.se>
parents:
59067
diff
changeset
|
2691 atom = (Atom) XFLOAT_DATA (value); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2692 else if (CONSP (value)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2693 atom = (Atom) cons_to_long (value); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2694 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2695 error ("Wrong type, value must be number or cons"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2696 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2697 BLOCK_INPUT; |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
2698 x_catch_errors (dpy); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2699 name = atom ? XGetAtomName (dpy, atom) : ""; |
69209
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
2700 had_errors = x_had_errors_p (dpy); |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
2701 x_uncatch_errors (); |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
2702 |
b9ad41f39bf6
* xselect.c (x_catch_errors_unwind): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
69173
diff
changeset
|
2703 if (!had_errors) |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2704 ret = make_string (name, strlen (name)); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2705 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2706 if (atom && name) XFree (name); |
81277
b65a4afd46bd
(Fx_get_atom_name): Use empty_unibyte_string.
Juanma Barranquero <lekktu@gmail.com>
parents:
76360
diff
changeset
|
2707 if (NILP (ret)) ret = empty_unibyte_string; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2708 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2709 UNBLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2710 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2711 return ret; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2712 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2713 |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2714 DEFUN ("x-register-dnd-atom", Fx_register_dnd_atom, |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2715 Sx_register_dnd_atom, 1, 2, 0, |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2716 doc: /* Request that dnd events are made for ClientMessages with ATOM. |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2717 ATOM can be a symbol or a string. The ATOM is interned on the display that |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2718 FRAME is on. If FRAME is nil, the selected frame is used. */) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2719 (atom, frame) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2720 Lisp_Object atom, frame; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2721 { |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2722 Atom x_atom; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2723 struct frame *f = check_x_frame (frame); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2724 size_t i; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2725 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2726 |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2727 |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2728 if (SYMBOLP (atom)) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2729 x_atom = symbol_to_x_atom (dpyinfo, FRAME_X_DISPLAY (f), atom); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2730 else if (STRINGP (atom)) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2731 { |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2732 BLOCK_INPUT; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2733 x_atom = XInternAtom (FRAME_X_DISPLAY (f), (char *) SDATA (atom), False); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2734 UNBLOCK_INPUT; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2735 } |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2736 else |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2737 error ("ATOM must be a symbol or a string"); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2738 |
74145 | 2739 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i) |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2740 if (dpyinfo->x_dnd_atoms[i] == x_atom) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2741 return Qnil; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2742 |
74145 | 2743 if (dpyinfo->x_dnd_atoms_length == dpyinfo->x_dnd_atoms_size) |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2744 { |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2745 dpyinfo->x_dnd_atoms_size *= 2; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2746 dpyinfo->x_dnd_atoms = xrealloc (dpyinfo->x_dnd_atoms, |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2747 sizeof (*dpyinfo->x_dnd_atoms) |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2748 * dpyinfo->x_dnd_atoms_size); |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2749 } |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2750 |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2751 dpyinfo->x_dnd_atoms[dpyinfo->x_dnd_atoms_length++] = x_atom; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2752 return Qnil; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2753 } |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2754 |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2755 /* Convert an XClientMessageEvent to a Lisp event of type DRAG_N_DROP_EVENT. */ |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2756 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2757 int |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2758 x_handle_dnd_message (f, event, dpyinfo, bufp) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2759 struct frame *f; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2760 XClientMessageEvent *event; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2761 struct x_display_info *dpyinfo; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2762 struct input_event *bufp; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2763 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2764 Lisp_Object vec; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2765 Lisp_Object frame; |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2766 /* format 32 => size 5, format 16 => size 10, format 8 => size 20 */ |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2767 unsigned long size = 160/event->format; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2768 int x, y; |
59931
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2769 unsigned char *data = (unsigned char *) event->data.b; |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2770 int idata[5]; |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2771 size_t i; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2772 |
74145 | 2773 for (i = 0; i < dpyinfo->x_dnd_atoms_length; ++i) |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2774 if (dpyinfo->x_dnd_atoms[i] == event->message_type) break; |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2775 |
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2776 if (i == dpyinfo->x_dnd_atoms_length) return 0; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2777 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2778 XSETFRAME (frame, f); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2779 |
59931
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2780 /* On a 64 bit machine, the event->data.l array members are 64 bits (long), |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2781 but the x_property_data_to_lisp (or rather selection_data_to_lisp_data) |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2782 function expects them to be of size int (i.e. 32). So to be able to |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2783 use that function, put the data in the form it expects if format is 32. */ |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2784 |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2785 if (event->format == 32 && event->format < BITS_PER_LONG) |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2786 { |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2787 int i; |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2788 for (i = 0; i < 5; ++i) /* There are only 5 longs in a ClientMessage. */ |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2789 idata[i] = (int) event->data.l[i]; |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2790 data = (unsigned char *) idata; |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2791 } |
f5f2fbf049bc
* xselect.c (Fx_send_client_event, x_handle_dnd_message): Handle
Jan Djärv <jan.h.d@swipnet.se>
parents:
59411
diff
changeset
|
2792 |
53966
26dc8943ee64
Lisp_Object/int mixup.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
53911
diff
changeset
|
2793 vec = Fmake_vector (make_number (4), Qnil); |
91607
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2794 ASET (vec, 0, SYMBOL_NAME (x_atom_to_symbol (FRAME_X_DISPLAY (f), |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2795 event->message_type))); |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2796 ASET (vec, 1, frame); |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2797 ASET (vec, 2, make_number (event->format)); |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2798 ASET (vec, 3, x_property_data_to_lisp (f, |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2799 data, |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2800 event->message_type, |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2801 event->format, |
d1e53221c4aa
* xselect.c (x_handle_dnd_message):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
91327
diff
changeset
|
2802 size)); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2803 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2804 mouse_position_for_drop (f, &x, &y); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2805 bufp->kind = DRAG_N_DROP_EVENT; |
67670
8596872766c6
(x_handle_dnd_message): Drag-and-drop items are now
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
64770
diff
changeset
|
2806 bufp->frame_or_window = frame; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2807 bufp->timestamp = CurrentTime; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2808 bufp->x = make_number (x); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2809 bufp->y = make_number (y); |
67670
8596872766c6
(x_handle_dnd_message): Drag-and-drop items are now
YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
parents:
64770
diff
changeset
|
2810 bufp->arg = vec; |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2811 bufp->modifiers = 0; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2812 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2813 return 1; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2814 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2815 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2816 DEFUN ("x-send-client-message", Fx_send_client_event, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2817 Sx_send_client_message, 6, 6, 0, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2818 doc: /* Send a client message of MESSAGE-TYPE to window DEST on DISPLAY. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2819 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2820 For DISPLAY, specify either a frame or a display name (a string). |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2821 If DISPLAY is nil, that stands for the selected frame's display. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2822 DEST may be a number, in which case it is a Window id. The value 0 may |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2823 be used to send to the root window of the DISPLAY. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2824 If DEST is a cons, it is converted to a 32 bit number |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2825 with the high 16 bits from the car and the lower 16 bit from the cdr. That |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2826 number is then used as a window id. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2827 If DEST is a frame the event is sent to the outer window of that frame. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2828 Nil means the currently selected frame. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2829 If DEST is the string "PointerWindow" the event is sent to the window that |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2830 contains the pointer. If DEST is the string "InputFocus" the event is |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2831 sent to the window that has the input focus. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2832 FROM is the frame sending the event. Use nil for currently selected frame. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2833 MESSAGE-TYPE is the name of an Atom as a string. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2834 FORMAT must be one of 8, 16 or 32 and determines the size of the values in |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2835 bits. VALUES is a list of numbers, cons and/or strings containing the values |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2836 to send. If a value is a string, it is converted to an Atom and the value of |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2837 the Atom is sent. If a value is a cons, it is converted to a 32 bit number |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2838 with the high 16 bits from the car and the lower 16 bit from the cdr. |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2839 If more values than fits into the event is given, the excessive values |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2840 are ignored. */) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2841 (display, dest, from, message_type, format, values) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2842 Lisp_Object display, dest, from, message_type, format, values; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2843 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2844 struct x_display_info *dpyinfo = check_x_display_info (display); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2845 Window wdest; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2846 XEvent event; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2847 Lisp_Object cons; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2848 int size; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2849 struct frame *f = check_x_frame (from); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2850 int to_root; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2851 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2852 CHECK_STRING (message_type); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2853 CHECK_NUMBER (format); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2854 CHECK_CONS (values); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2855 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2856 if (x_check_property_data (values) == -1) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2857 error ("Bad data in VALUES, must be number, cons or string"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2858 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2859 event.xclient.type = ClientMessage; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2860 event.xclient.format = XFASTINT (format); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2861 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2862 if (event.xclient.format != 8 && event.xclient.format != 16 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2863 && event.xclient.format != 32) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2864 error ("FORMAT must be one of 8, 16 or 32"); |
56135 | 2865 |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2866 if (FRAMEP (dest) || NILP (dest)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2867 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2868 struct frame *fdest = check_x_frame (dest); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2869 wdest = FRAME_OUTER_WINDOW (fdest); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2870 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2871 else if (STRINGP (dest)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2872 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2873 if (strcmp (SDATA (dest), "PointerWindow") == 0) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2874 wdest = PointerWindow; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2875 else if (strcmp (SDATA (dest), "InputFocus") == 0) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2876 wdest = InputFocus; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2877 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2878 error ("DEST as a string must be one of PointerWindow or InputFocus"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2879 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2880 else if (INTEGERP (dest)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2881 wdest = (Window) XFASTINT (dest); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2882 else if (FLOATP (dest)) |
59411
ecb6689e04bf
* gtkutil.c (xg_gtk_scroll_destroy, xg_create_scroll_bar)
Jan Djärv <jan.h.d@swipnet.se>
parents:
59067
diff
changeset
|
2883 wdest = (Window) XFLOAT_DATA (dest); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2884 else if (CONSP (dest)) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2885 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2886 if (! NUMBERP (XCAR (dest)) || ! NUMBERP (XCDR (dest))) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2887 error ("Both car and cdr for DEST must be numbers"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2888 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2889 wdest = (Window) cons_to_long (dest); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2890 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2891 else |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2892 error ("DEST must be a frame, nil, string, number or cons"); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2893 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2894 if (wdest == 0) wdest = dpyinfo->root_window; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2895 to_root = wdest == dpyinfo->root_window; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2896 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2897 for (cons = values, size = 0; CONSP (cons); cons = XCDR (cons), ++size) |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2898 ; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2899 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2900 BLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2901 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2902 event.xclient.message_type |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2903 = XInternAtom (dpyinfo->display, SDATA (message_type), False); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2904 event.xclient.display = dpyinfo->display; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2905 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2906 /* Some clients (metacity for example) expects sending window to be here |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2907 when sending to the root window. */ |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2908 event.xclient.window = to_root ? FRAME_OUTER_WINDOW (f) : wdest; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2909 |
63529
01dd74cb546e
(lisp_data_to_selection_data): Fix spelling.
Juanma Barranquero <lekktu@gmail.com>
parents:
60134
diff
changeset
|
2910 |
59975
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2911 memset (event.xclient.data.b, 0, sizeof (event.xclient.data.b)); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2912 x_fill_property_data (dpyinfo->display, values, event.xclient.data.b, |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2913 event.xclient.format); |
501c2e5945ff
* xselect.c (x_reply_selection_request): Pass long array to
Jan Djärv <jan.h.d@swipnet.se>
parents:
59931
diff
changeset
|
2914 |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2915 /* If event mask is 0 the event is sent to the client that created |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2916 the destination window. But if we are sending to the root window, |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2917 there is no such client. Then we set the event mask to 0xffff. The |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2918 event then goes to clients selecting for events on the root window. */ |
69152
f2147c1027b6
* xterm.h (x_catch_errors) Return value changed to void.
Chong Yidong <cyd@stupidchicken.com>
parents:
68651
diff
changeset
|
2919 x_catch_errors (dpyinfo->display); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2920 { |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2921 int propagate = to_root ? False : True; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2922 unsigned mask = to_root ? 0xffff : 0; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2923 XSendEvent (dpyinfo->display, wdest, propagate, mask, &event); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2924 XFlush (dpyinfo->display); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2925 } |
69173
fdee8318ddc9
* xterm.h, xterm.c (x_uncatch_errors): Delete unneccessary
Chong Yidong <cyd@stupidchicken.com>
parents:
69152
diff
changeset
|
2926 x_uncatch_errors (); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2927 UNBLOCK_INPUT; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2928 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2929 return Qnil; |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2930 } |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2931 |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2932 |
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
2933 void |
2161 | 2934 syms_of_xselect () |
2935 { | |
2936 defsubr (&Sx_get_selection_internal); | |
2937 defsubr (&Sx_own_selection_internal); | |
2938 defsubr (&Sx_disown_selection_internal); | |
2939 defsubr (&Sx_selection_owner_p); | |
2940 defsubr (&Sx_selection_exists_p); | |
2941 | |
2942 #ifdef CUT_BUFFER_SUPPORT | |
2169 | 2943 defsubr (&Sx_get_cut_buffer_internal); |
2944 defsubr (&Sx_store_cut_buffer_internal); | |
2945 defsubr (&Sx_rotate_cut_buffers_internal); | |
2161 | 2946 #endif |
2947 | |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2948 defsubr (&Sx_get_atom_name); |
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2949 defsubr (&Sx_send_client_message); |
72352
237fcefd8610
* xselect.c (Fx_register_dnd_atom): New function.
Jan Djärv <jan.h.d@swipnet.se>
parents:
71994
diff
changeset
|
2950 defsubr (&Sx_register_dnd_atom); |
53786
8aea816df4cc
* xselect.c: Include termhooks.h and X11/Xproto.h
Jan Djärv <jan.h.d@swipnet.se>
parents:
52401
diff
changeset
|
2951 |
2161 | 2952 reading_selection_reply = Fcons (Qnil, Qnil); |
2953 staticpro (&reading_selection_reply); | |
2954 reading_selection_window = 0; | |
2955 reading_which_selection = 0; | |
2956 | |
2957 property_change_wait_list = 0; | |
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
2958 prop_location_identifier = 0; |
2161 | 2959 property_change_reply = Fcons (Qnil, Qnil); |
2960 staticpro (&property_change_reply); | |
2961 | |
2962 Vselection_alist = Qnil; | |
2963 staticpro (&Vselection_alist); | |
2964 | |
2965 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist, | |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2966 doc: /* An alist associating X Windows selection-types with functions. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2967 These functions are called to convert the selection, with three args: |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2968 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD'); |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2969 a desired type to which the selection should be converted; |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2970 and the local selection value (whatever was given to `x-own-selection'). |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2971 |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2972 The function should return the value to send to the X server |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2973 \(typically a string). A return value of nil |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2974 means that the conversion could not be done. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2975 A return value which is the symbol `NULL' |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2976 means that a side-effect was executed, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2977 and there is no meaningful selection value. */); |
2161 | 2978 Vselection_converter_alist = Qnil; |
2979 | |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
2980 DEFVAR_LISP ("x-lost-selection-functions", &Vx_lost_selection_functions, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2981 doc: /* A list of functions to be called when Emacs loses an X selection. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2982 \(This happens when some other X client makes its own selection |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2983 or when a Lisp program explicitly clears the selection.) |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2984 The functions are called with one argument, the selection type |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2985 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'). */); |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
2986 Vx_lost_selection_functions = Qnil; |
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
2987 |
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
2988 DEFVAR_LISP ("x-sent-selection-functions", &Vx_sent_selection_functions, |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2989 doc: /* A list of functions to be called when Emacs answers a selection request. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2990 The functions are called with four arguments: |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2991 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD'); |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2992 - the selection-type which Emacs was asked to convert the |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2993 selection into before sending (for example, `STRING' or `LENGTH'); |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2994 - a flag indicating success or failure for responding to the request. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2995 We might have failed (and declined the request) for any number of reasons, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2996 including being asked for a selection that we no longer own, or being asked |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2997 to convert into a type that we don't know about or that is inappropriate. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2998 This hook doesn't let you change the behavior of Emacs's selection replies, |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
2999 it merely informs you that they have happened. */); |
57777
c02cbcd40932
(Vx_lost_selection_functions, Vx_sent_selection_functions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
57053
diff
changeset
|
3000 Vx_sent_selection_functions = Qnil; |
2161 | 3001 |
3002 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout, | |
40123
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
3003 doc: /* Number of milliseconds to wait for a selection reply. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
3004 If the selection owner doesn't reply in this time, we give up. |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
3005 A value of 0 means wait as long as necessary. This is initialized from the |
e528f2adeed4
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
3006 \"*selectionTimeout\" resource. */); |
2161 | 3007 x_selection_timeout = 0; |
3008 | |
3009 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY); | |
3010 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY); | |
3011 QSTRING = intern ("STRING"); staticpro (&QSTRING); | |
3012 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER); | |
3013 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD); | |
3014 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); | |
3015 QTEXT = intern ("TEXT"); staticpro (&QTEXT); | |
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
3016 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT); |
46881
970ca194ce9a
(QUTF8_STRING): New variable.
Kenichi Handa <handa@m17n.org>
parents:
46370
diff
changeset
|
3017 QUTF8_STRING = intern ("UTF8_STRING"); staticpro (&QUTF8_STRING); |
2161 | 3018 QDELETE = intern ("DELETE"); staticpro (&QDELETE); |
3019 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE); | |
3020 QINCR = intern ("INCR"); staticpro (&QINCR); | |
3021 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP); | |
3022 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS); | |
3023 QATOM = intern ("ATOM"); staticpro (&QATOM); | |
3024 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR); | |
3025 QNULL = intern ("NULL"); staticpro (&QNULL); | |
43559
244e1fe7e57f
(Qcompound_text_with_extensions): Renamed from Qcompound_text_no_extensions.
Eli Zaretskii <eliz@gnu.org>
parents:
43474
diff
changeset
|
3026 Qcompound_text_with_extensions = intern ("compound-text-with-extensions"); |
244e1fe7e57f
(Qcompound_text_with_extensions): Renamed from Qcompound_text_no_extensions.
Eli Zaretskii <eliz@gnu.org>
parents:
43474
diff
changeset
|
3027 staticpro (&Qcompound_text_with_extensions); |
2161 | 3028 |
3029 #ifdef CUT_BUFFER_SUPPORT | |
3030 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0); | |
3031 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1); | |
3032 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2); | |
3033 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3); | |
3034 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4); | |
3035 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5); | |
3036 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6); | |
3037 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7); | |
3038 #endif | |
3039 | |
51598
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
3040 Qforeign_selection = intern ("foreign-selection"); |
8e404f2a6715
Don't include cahrset.h, coding.h, composite.h.
Kenichi Handa <handa@m17n.org>
parents:
50473
diff
changeset
|
3041 staticpro (&Qforeign_selection); |
2161 | 3042 } |
52401 | 3043 |
3044 /* arch-tag: 7c293b0f-9918-4f69-8ac7-03e142307236 | |
3045 (do not change this comment) */ |