Mercurial > emacs
annotate src/xselect.c @ 25427:dde5fcbfa2af
(Info-tagify): Don't insert more than one newline before the tag table.
(Info-tagify): Start by widening.
Match node headers that don't list the file name,
and more kinds of page separations.
Strip properties during tagification.
Use start of node header line as tag's position.
Fix the "done" message.
(Info-validate): Save and restore match data around narrowing down.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sun, 29 Aug 1999 19:19:00 +0000 |
| parents | 719325fbe6a1 |
| children | 9154af188477 |
| 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. |
| 20708 | 2 Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation. |
| 2161 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
| 8 the Free Software Foundation; either version 2, or (at your option) | |
| 9 any later version. | |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
|
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14134
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14134
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
| 2161 | 20 |
| 2961 | 21 |
| 2161 | 22 /* Rewritten by jwz */ |
| 23 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4636
diff
changeset
|
24 #include <config.h> |
| 2161 | 25 #include "lisp.h" |
| 26 #include "xterm.h" /* for all of the X includes */ | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
27 #include "dispextern.h" /* frame.h seems to want this */ |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
28 #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
|
29 #include "blockinput.h" |
| 20104 | 30 #include "buffer.h" |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
31 #include "charset.h" |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
32 #include "coding.h" |
| 21514 | 33 #include "process.h" |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
34 |
| 2161 | 35 #define CUT_BUFFER_SUPPORT |
| 36 | |
| 37 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP, | |
| 38 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL, | |
| 39 QATOM_PAIR; | |
| 40 | |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
41 Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */ |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
42 |
| 2161 | 43 #ifdef CUT_BUFFER_SUPPORT |
| 44 Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3, | |
| 45 QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7; | |
| 46 #endif | |
| 47 | |
|
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
48 static Lisp_Object Vx_lost_selection_hooks; |
|
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
49 static Lisp_Object Vx_sent_selection_hooks; |
|
19094
3f7a3248883b
(Vclipboard_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
18952
diff
changeset
|
50 /* Coding system for communicating with other X clients via cutbuffer, |
|
3f7a3248883b
(Vclipboard_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
18952
diff
changeset
|
51 selection, and clipboard. */ |
|
22736
a5015b8f1003
(Vselection_coding_system):
Richard M. Stallman <rms@gnu.org>
parents:
22716
diff
changeset
|
52 static Lisp_Object Vselection_coding_system; |
| 2161 | 53 |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
54 /* Coding system for the next communicating with other X clients. */ |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
55 static Lisp_Object Vnext_selection_coding_system; |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
56 |
| 2161 | 57 /* If this is a smaller number than the max-request-size of the display, |
| 58 emacs will use INCR selection transfer when the selection is larger | |
| 59 than this. The max-request-size is usually around 64k, so if you want | |
| 60 emacs to use incremental selection transfers when the selection is | |
| 61 smaller than that, set this. I added this mostly for debugging the | |
|
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
62 incremental transfer stuff, but it might improve server performance. */ |
| 2161 | 63 #define MAX_SELECTION_QUANTUM 0xFFFFFF |
| 64 | |
|
2372
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
65 #ifdef HAVE_X11R4 |
|
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
66 #define SELECTION_QUANTUM(dpy) ((XMaxRequestSize(dpy) << 2) - 100) |
|
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
67 #else |
|
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
68 #define SELECTION_QUANTUM(dpy) (((dpy)->max_request_size << 2) - 100) |
|
ad7cb938ae08
* xselect.c (SELECTION_QUANTUM): Don't use XMaxRequestSize on R3;
Jim Blandy <jimb@redhat.com>
parents:
2255
diff
changeset
|
69 #endif |
| 2161 | 70 |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
71 /* 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
|
72 /* Defined in keyboard.c. */ |
|
2f5c1df12e01
(last_event_timestamp): Declare, but don't define.
Karl Heuer <kwzh@gnu.org>
parents:
15585
diff
changeset
|
73 extern unsigned long last_event_timestamp; |
| 2161 | 74 |
| 75 /* 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
|
76 ( 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
|
77 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
|
78 SELECTION-VALUE is the value that emacs owns for that selection. |
| 2161 | 79 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
|
80 SELECTION-TIMESTAMP is the time at which emacs began owning this selection, |
| 2161 | 81 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
|
82 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
|
83 If there is an entry in this alist, then it can be assumed that Emacs owns |
| 2161 | 84 that selection. |
| 85 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
|
86 selection-values. */ |
|
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
87 static Lisp_Object Vselection_alist; |
| 2161 | 88 |
| 89 /* This is an alist whose CARs are selection-types (whose names are the same | |
| 90 as the names of X Atoms) and whose CDRs are the names of Lisp functions to | |
| 91 call to convert the given Emacs selection value to a string representing | |
| 92 the given selection type. This is for Lisp-level extension of the emacs | |
|
11702
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
93 selection handling. */ |
|
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
94 static Lisp_Object Vselection_converter_alist; |
| 2161 | 95 |
| 96 /* 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
|
97 we give up on it. This is in milliseconds (0 = no timeout.) */ |
|
afad0099d14b
(Vx_sent_selection_hooks, Vx_lost_selection_hooks, Vselection_alist)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
98 static int x_selection_timeout; |
| 2161 | 99 |
| 100 /* Utility functions */ | |
| 101 | |
| 102 static void lisp_data_to_selection_data (); | |
| 103 static Lisp_Object selection_data_to_lisp_data (); | |
| 104 static Lisp_Object x_get_window_property_as_lisp_data (); | |
| 105 | |
| 106 /* This converts a Lisp symbol to a server Atom, avoiding a server | |
| 107 roundtrip whenever possible. */ | |
| 108 | |
| 109 static Atom | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
110 symbol_to_x_atom (dpyinfo, display, sym) |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
111 struct x_display_info *dpyinfo; |
| 2161 | 112 Display *display; |
| 113 Lisp_Object sym; | |
| 114 { | |
| 115 Atom val; | |
| 116 if (NILP (sym)) return 0; | |
| 117 if (EQ (sym, QPRIMARY)) return XA_PRIMARY; | |
| 118 if (EQ (sym, QSECONDARY)) return XA_SECONDARY; | |
| 119 if (EQ (sym, QSTRING)) return XA_STRING; | |
| 120 if (EQ (sym, QINTEGER)) return XA_INTEGER; | |
| 121 if (EQ (sym, QATOM)) return XA_ATOM; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
122 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
123 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
124 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
|
125 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
126 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
127 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
128 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
129 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
|
130 if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
131 if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL; |
| 2161 | 132 #ifdef CUT_BUFFER_SUPPORT |
| 133 if (EQ (sym, QCUT_BUFFER0)) return XA_CUT_BUFFER0; | |
| 134 if (EQ (sym, QCUT_BUFFER1)) return XA_CUT_BUFFER1; | |
| 135 if (EQ (sym, QCUT_BUFFER2)) return XA_CUT_BUFFER2; | |
| 136 if (EQ (sym, QCUT_BUFFER3)) return XA_CUT_BUFFER3; | |
| 137 if (EQ (sym, QCUT_BUFFER4)) return XA_CUT_BUFFER4; | |
| 138 if (EQ (sym, QCUT_BUFFER5)) return XA_CUT_BUFFER5; | |
| 139 if (EQ (sym, QCUT_BUFFER6)) return XA_CUT_BUFFER6; | |
| 140 if (EQ (sym, QCUT_BUFFER7)) return XA_CUT_BUFFER7; | |
| 141 #endif | |
| 142 if (!SYMBOLP (sym)) abort (); | |
| 143 | |
| 144 #if 0 | |
| 145 fprintf (stderr, " XInternAtom %s\n", (char *) XSYMBOL (sym)->name->data); | |
| 146 #endif | |
| 147 BLOCK_INPUT; | |
| 148 val = XInternAtom (display, (char *) XSYMBOL (sym)->name->data, False); | |
| 149 UNBLOCK_INPUT; | |
| 150 return val; | |
| 151 } | |
| 152 | |
| 153 | |
| 154 /* This converts a server Atom to a Lisp symbol, avoiding server roundtrips | |
| 155 and calls to intern whenever possible. */ | |
| 156 | |
| 157 static Lisp_Object | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
158 x_atom_to_symbol (dpyinfo, display, atom) |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
159 struct x_display_info *dpyinfo; |
| 2161 | 160 Display *display; |
| 161 Atom atom; | |
| 162 { | |
| 163 char *str; | |
| 164 Lisp_Object val; | |
| 165 if (! atom) return Qnil; | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
166 switch (atom) |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
167 { |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
168 case XA_PRIMARY: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
169 return QPRIMARY; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
170 case XA_SECONDARY: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
171 return QSECONDARY; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
172 case XA_STRING: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
173 return QSTRING; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
174 case XA_INTEGER: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
175 return QINTEGER; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
176 case XA_ATOM: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
177 return QATOM; |
| 2161 | 178 #ifdef CUT_BUFFER_SUPPORT |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
179 case XA_CUT_BUFFER0: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
180 return QCUT_BUFFER0; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
181 case XA_CUT_BUFFER1: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
182 return QCUT_BUFFER1; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
183 case XA_CUT_BUFFER2: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
184 return QCUT_BUFFER2; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
185 case XA_CUT_BUFFER3: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
186 return QCUT_BUFFER3; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
187 case XA_CUT_BUFFER4: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
188 return QCUT_BUFFER4; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
189 case XA_CUT_BUFFER5: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
190 return QCUT_BUFFER5; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
191 case XA_CUT_BUFFER6: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
192 return QCUT_BUFFER6; |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
193 case XA_CUT_BUFFER7: |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
194 return QCUT_BUFFER7; |
| 2161 | 195 #endif |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
196 } |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
197 |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
198 if (atom == dpyinfo->Xatom_CLIPBOARD) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
199 return QCLIPBOARD; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
200 if (atom == dpyinfo->Xatom_TIMESTAMP) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
201 return QTIMESTAMP; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
202 if (atom == dpyinfo->Xatom_TEXT) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
203 return QTEXT; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
204 if (atom == dpyinfo->Xatom_COMPOUND_TEXT) |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
205 return QCOMPOUND_TEXT; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
206 if (atom == dpyinfo->Xatom_DELETE) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
207 return QDELETE; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
208 if (atom == dpyinfo->Xatom_MULTIPLE) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
209 return QMULTIPLE; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
210 if (atom == dpyinfo->Xatom_INCR) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
211 return QINCR; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
212 if (atom == dpyinfo->Xatom_EMACS_TMP) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
213 return QEMACS_TMP; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
214 if (atom == dpyinfo->Xatom_TARGETS) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
215 return QTARGETS; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
216 if (atom == dpyinfo->Xatom_NULL) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
217 return QNULL; |
| 2161 | 218 |
| 219 BLOCK_INPUT; | |
| 220 str = XGetAtomName (display, atom); | |
| 221 UNBLOCK_INPUT; | |
| 222 #if 0 | |
| 223 fprintf (stderr, " XGetAtomName --> %s\n", str); | |
| 224 #endif | |
| 225 if (! str) return Qnil; | |
| 226 val = intern (str); | |
| 227 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
|
228 /* This was allocated by Xlib, so use XFree. */ |
| 2161 | 229 XFree (str); |
| 230 UNBLOCK_INPUT; | |
| 231 return val; | |
| 232 } | |
|
2255
ff870650d188
(cons_to_long, long_to_cons): No longer static.
Richard M. Stallman <rms@gnu.org>
parents:
2169
diff
changeset
|
233 |
| 2161 | 234 /* Do protocol to assert ourself as a selection owner. |
| 235 Update the Vselection_alist so that we can reply to later requests for | |
| 236 our selection. */ | |
| 237 | |
| 238 static void | |
| 239 x_own_selection (selection_name, selection_value) | |
| 240 Lisp_Object selection_name, selection_value; | |
| 241 { | |
| 242 Window selecting_window = FRAME_X_WINDOW (selected_frame); | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
243 Display *display = FRAME_X_DISPLAY (selected_frame); |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
244 Time time = last_event_timestamp; |
| 2161 | 245 Atom selection_atom; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
246 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame); |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
247 int count; |
| 2161 | 248 |
| 249 CHECK_SYMBOL (selection_name, 0); | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
250 selection_atom = symbol_to_x_atom (dpyinfo, display, selection_name); |
| 2161 | 251 |
| 252 BLOCK_INPUT; | |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
253 count = x_catch_errors (display); |
| 2161 | 254 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
|
255 x_check_errors (display, "Can't set selection: %s"); |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
256 x_uncatch_errors (display, count); |
| 2161 | 257 UNBLOCK_INPUT; |
| 258 | |
| 259 /* Now update the local cache */ | |
| 260 { | |
| 261 Lisp_Object selection_time; | |
| 262 Lisp_Object selection_data; | |
| 263 Lisp_Object prev_value; | |
| 264 | |
| 265 selection_time = long_to_cons ((unsigned long) time); | |
| 266 selection_data = Fcons (selection_name, | |
| 267 Fcons (selection_value, | |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
268 Fcons (selection_time, |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
269 Fcons (Fselected_frame (), Qnil)))); |
| 2161 | 270 prev_value = assq_no_quit (selection_name, Vselection_alist); |
| 271 | |
| 272 Vselection_alist = Fcons (selection_data, Vselection_alist); | |
| 273 | |
| 274 /* If we already owned the selection, remove the old selection data. | |
| 275 Perhaps we should destructively modify it instead. | |
| 276 Don't use Fdelq as that may QUIT. */ | |
| 277 if (!NILP (prev_value)) | |
| 278 { | |
| 279 Lisp_Object rest; /* we know it's not the CAR, so it's easy. */ | |
| 280 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest)) | |
| 281 if (EQ (prev_value, Fcar (XCONS (rest)->cdr))) | |
| 282 { | |
| 283 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr); | |
| 284 break; | |
| 285 } | |
| 286 } | |
| 287 } | |
| 288 } | |
| 289 | |
| 290 /* Given a selection-name and desired type, look up our local copy of | |
| 291 the selection value and convert it to the type. | |
| 292 The value is nil or a string. | |
| 293 This function is used both for remote requests | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
294 and for local x-get-selection-internal. |
| 2161 | 295 |
| 296 This calls random Lisp code, and may signal or gc. */ | |
| 297 | |
| 298 static Lisp_Object | |
| 299 x_get_local_selection (selection_symbol, target_type) | |
| 300 Lisp_Object selection_symbol, target_type; | |
| 301 { | |
| 302 Lisp_Object local_value; | |
| 303 Lisp_Object handler_fn, value, type, check; | |
| 304 int count; | |
| 305 | |
| 306 local_value = assq_no_quit (selection_symbol, Vselection_alist); | |
| 307 | |
| 308 if (NILP (local_value)) return Qnil; | |
| 309 | |
| 310 /* TIMESTAMP and MULTIPLE are special cases 'cause that's easiest. */ | |
| 311 if (EQ (target_type, QTIMESTAMP)) | |
| 312 { | |
| 313 handler_fn = Qnil; | |
| 314 value = XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car; | |
| 315 } | |
| 316 #if 0 | |
| 317 else if (EQ (target_type, QDELETE)) | |
| 318 { | |
| 319 handler_fn = Qnil; | |
| 320 Fx_disown_selection_internal | |
| 321 (selection_symbol, | |
| 322 XCONS (XCONS (XCONS (local_value)->cdr)->cdr)->car); | |
| 323 value = QNULL; | |
| 324 } | |
| 325 #endif | |
| 326 | |
| 327 #if 0 /* #### MULTIPLE doesn't work yet */ | |
| 328 else if (CONSP (target_type) | |
| 329 && XCONS (target_type)->car == QMULTIPLE) | |
| 330 { | |
|
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
331 Lisp_Object pairs; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
332 int size; |
| 2161 | 333 int i; |
|
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
334 pairs = XCONS (target_type)->cdr; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
335 size = XVECTOR (pairs)->size; |
| 2161 | 336 /* If the target is MULTIPLE, then target_type looks like |
| 337 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ]) | |
| 338 We modify the second element of each pair in the vector and | |
| 339 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ] | |
| 340 */ | |
| 341 for (i = 0; i < size; i++) | |
| 342 { | |
|
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
343 Lisp_Object pair; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
344 pair = XVECTOR (pairs)->contents [i]; |
| 2161 | 345 XVECTOR (pair)->contents [1] |
| 346 = x_get_local_selection (XVECTOR (pair)->contents [0], | |
| 347 XVECTOR (pair)->contents [1]); | |
| 348 } | |
| 349 return pairs; | |
| 350 } | |
| 351 #endif | |
| 352 else | |
| 353 { | |
| 354 /* Don't allow a quit within the converter. | |
| 355 When the user types C-g, he would be surprised | |
| 356 if by luck it came during a converter. */ | |
| 357 count = specpdl_ptr - specpdl; | |
| 358 specbind (Qinhibit_quit, Qt); | |
| 359 | |
| 360 CHECK_SYMBOL (target_type, 0); | |
| 361 handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist)); | |
|
3166
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
362 if (!NILP (handler_fn)) |
|
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
363 value = call3 (handler_fn, |
|
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
364 selection_symbol, target_type, |
|
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
365 XCONS (XCONS (local_value)->cdr)->car); |
|
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
366 else |
|
419d3bf1cb2b
(x_get_local_selection): If no conversion function
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
367 value = Qnil; |
| 2161 | 368 unbind_to (count, Qnil); |
| 369 } | |
| 370 | |
| 371 /* Make sure this value is of a type that we could transmit | |
| 372 to another X client. */ | |
| 2169 | 373 |
| 2161 | 374 check = value; |
| 375 if (CONSP (value) | |
| 376 && SYMBOLP (XCONS (value)->car)) | |
| 377 type = XCONS (value)->car, | |
| 378 check = XCONS (value)->cdr; | |
| 379 | |
| 380 if (STRINGP (check) | |
| 381 || VECTORP (check) | |
| 382 || SYMBOLP (check) | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
383 || INTEGERP (check) |
| 2161 | 384 || NILP (value)) |
| 385 return value; | |
| 2169 | 386 /* Check for a value that cons_to_long could handle. */ |
| 2161 | 387 else if (CONSP (check) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
388 && INTEGERP (XCONS (check)->car) |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
389 && (INTEGERP (XCONS (check)->cdr) |
| 2161 | 390 || |
| 391 (CONSP (XCONS (check)->cdr) | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
392 && INTEGERP (XCONS (XCONS (check)->cdr)->car) |
| 2161 | 393 && NILP (XCONS (XCONS (check)->cdr)->cdr)))) |
| 394 return value; | |
| 395 else | |
| 396 return | |
| 397 Fsignal (Qerror, | |
| 2169 | 398 Fcons (build_string ("invalid data returned by selection-conversion function"), |
| 2161 | 399 Fcons (handler_fn, Fcons (value, Qnil)))); |
| 400 } | |
| 401 | |
| 402 /* Subroutines of x_reply_selection_request. */ | |
| 403 | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
404 /* Send a SelectionNotify event to the requestor with property=None, |
| 2161 | 405 meaning we were unable to do what they wanted. */ |
| 406 | |
| 407 static void | |
| 408 x_decline_selection_request (event) | |
| 409 struct input_event *event; | |
| 410 { | |
| 411 XSelectionEvent reply; | |
| 412 reply.type = SelectionNotify; | |
| 413 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
|
414 reply.requestor = SELECTION_EVENT_REQUESTOR (event); |
| 2161 | 415 reply.selection = SELECTION_EVENT_SELECTION (event); |
| 416 reply.time = SELECTION_EVENT_TIME (event); | |
| 417 reply.target = SELECTION_EVENT_TARGET (event); | |
| 418 reply.property = None; | |
| 419 | |
| 420 BLOCK_INPUT; | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
421 XSendEvent (reply.display, reply.requestor, False, 0L, |
|
6804
dcbde04df85c
(x_decline_selection_request): Call XFlushQueue.
Richard M. Stallman <rms@gnu.org>
parents:
6520
diff
changeset
|
422 (XEvent *) &reply); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
423 XFlush (reply.display); |
| 2161 | 424 UNBLOCK_INPUT; |
| 425 } | |
| 426 | |
| 427 /* This is the selection request currently being processed. | |
| 428 It is set to zero when the request is fully processed. */ | |
| 429 static struct input_event *x_selection_current_request; | |
| 430 | |
| 431 /* 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
|
432 an error, we tell the requester that we were unable to do what they wanted |
| 2161 | 433 before we throw to top-level or go into the debugger or whatever. */ |
| 434 | |
| 435 static Lisp_Object | |
| 436 x_selection_request_lisp_error (ignore) | |
| 437 Lisp_Object ignore; | |
| 438 { | |
| 439 if (x_selection_current_request != 0) | |
| 440 x_decline_selection_request (x_selection_current_request); | |
| 441 return Qnil; | |
| 442 } | |
| 443 | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
444 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
445 /* 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
|
446 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
|
447 actually tested that yet. */ |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
448 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
449 /* 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
|
450 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
451 struct prop_location |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
452 { |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
453 int identifier; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
454 Display *display; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
455 Window window; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
456 Atom property; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
457 int desired_state; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
458 int arrived; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
459 struct prop_location *next; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
460 }; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
461 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
462 static struct prop_location *expect_property_change (); |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
463 static void wait_for_property_change (); |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
464 static void unexpect_property_change (); |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
465 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
|
466 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
467 static int prop_location_identifier; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
468 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
469 static Lisp_Object property_change_reply; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
470 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
471 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
|
472 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
473 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
|
474 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
475 static Lisp_Object |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
476 queue_selection_requests_unwind (frame) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
477 Lisp_Object frame; |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
478 { |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
479 FRAME_PTR f = XFRAME (frame); |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
480 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
481 if (! NILP (frame)) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
482 x_stop_queuing_selection_requests (FRAME_X_DISPLAY (f)); |
|
11908
4f4034f45cbf
(queue_selection_requests_unwind): Add return value.
Karl Heuer <kwzh@gnu.org>
parents:
11881
diff
changeset
|
483 return Qnil; |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
484 } |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
485 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
486 /* 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
|
487 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
|
488 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
489 static Lisp_Object |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
490 some_frame_on_display (dpyinfo) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
491 struct x_display_info *dpyinfo; |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
492 { |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
493 Lisp_Object list, frame; |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
494 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
495 FOR_EACH_FRAME (list, frame) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
496 { |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
497 if (FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
498 return frame; |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
499 } |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
500 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
501 return Qnil; |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
502 } |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
503 |
| 2161 | 504 /* Send the reply to a selection request event EVENT. |
| 505 TYPE is the type of selection data requested. | |
| 506 DATA and SIZE describe the data to send, already converted. | |
| 507 FORMAT is the unit-size (in bits) of the data to be transmitted. */ | |
| 508 | |
| 509 static void | |
| 510 x_reply_selection_request (event, format, data, size, type) | |
| 511 struct input_event *event; | |
| 512 int format, size; | |
| 513 unsigned char *data; | |
| 514 Atom type; | |
| 515 { | |
| 516 XSelectionEvent reply; | |
| 517 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
|
518 Window window = SELECTION_EVENT_REQUESTOR (event); |
| 2161 | 519 int bytes_remaining; |
| 520 int format_bytes = format/8; | |
| 521 int max_bytes = SELECTION_QUANTUM (display); | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
522 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
523 int count; |
| 2161 | 524 |
| 525 if (max_bytes > MAX_SELECTION_QUANTUM) | |
| 526 max_bytes = MAX_SELECTION_QUANTUM; | |
| 527 | |
| 528 reply.type = SelectionNotify; | |
| 529 reply.display = display; | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
530 reply.requestor = window; |
| 2161 | 531 reply.selection = SELECTION_EVENT_SELECTION (event); |
| 532 reply.time = SELECTION_EVENT_TIME (event); | |
| 533 reply.target = SELECTION_EVENT_TARGET (event); | |
| 534 reply.property = SELECTION_EVENT_PROPERTY (event); | |
| 535 if (reply.property == None) | |
| 536 reply.property = reply.target; | |
| 537 | |
| 538 /* #### XChangeProperty can generate BadAlloc, and we must handle it! */ | |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
539 BLOCK_INPUT; |
|
17614
da246ef7532c
(x_reply_selection_request): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
17608
diff
changeset
|
540 count = x_catch_errors (display); |
| 2161 | 541 |
| 542 /* Store the data on the requested property. | |
| 543 If the selection is large, only store the first N bytes of it. | |
| 544 */ | |
| 545 bytes_remaining = size * format_bytes; | |
| 546 if (bytes_remaining <= max_bytes) | |
| 547 { | |
| 548 /* Send all the data at once, with minimal handshaking. */ | |
| 549 #if 0 | |
| 550 fprintf (stderr,"\nStoring all %d\n", bytes_remaining); | |
| 551 #endif | |
| 552 XChangeProperty (display, window, reply.property, type, format, | |
| 553 PropModeReplace, data, size); | |
| 554 /* 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
|
555 XSendEvent (display, window, False, 0L, (XEvent *) &reply); |
| 2161 | 556 } |
| 557 else | |
| 558 { | |
| 559 /* Send an INCR selection. */ | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
560 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
|
561 int had_errors; |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
562 Lisp_Object frame; |
| 2161 | 563 |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
564 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
|
565 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
566 /* 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
|
567 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
|
568 bother trying to queue them. */ |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
569 if (!NILP (frame)) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
570 { |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
571 x_start_queuing_selection_requests (display); |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
572 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
573 record_unwind_protect (queue_selection_requests_unwind, |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
574 frame); |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
575 } |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
576 |
|
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
|
577 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
|
578 error ("Attempt to transfer an INCR to ourself!"); |
| 2161 | 579 #if 0 |
| 580 fprintf (stderr, "\nINCR %d\n", bytes_remaining); | |
| 581 #endif | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
582 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
|
583 PropertyDelete); |
| 2161 | 584 |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
585 XChangeProperty (display, window, reply.property, dpyinfo->Xatom_INCR, |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
586 32, PropModeReplace, |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
587 (unsigned char *) &bytes_remaining, 1); |
| 2161 | 588 XSelectInput (display, window, PropertyChangeMask); |
| 589 /* Tell 'em the INCR data is there... */ | |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
590 XSendEvent (display, window, False, 0L, (XEvent *) &reply); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
591 XFlush (display); |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
592 |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
593 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
|
594 UNBLOCK_INPUT; |
| 2161 | 595 |
|
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
596 /* First, wait for the requester to ack by deleting the property. |
| 2161 | 597 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
|
598 if (! had_errors) |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
599 wait_for_property_change (wait_object); |
| 2161 | 600 |
| 601 while (bytes_remaining) | |
| 602 { | |
| 603 int i = ((bytes_remaining < max_bytes) | |
| 604 ? bytes_remaining | |
| 605 : max_bytes); | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
606 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
607 BLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
608 |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
609 wait_object |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
610 = expect_property_change (display, window, reply.property, |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
611 PropertyDelete); |
| 2161 | 612 #if 0 |
| 613 fprintf (stderr," INCR adding %d\n", i); | |
| 614 #endif | |
| 615 /* Append the next chunk of data to the property. */ | |
| 616 XChangeProperty (display, window, reply.property, type, format, | |
| 617 PropModeAppend, data, i / format_bytes); | |
| 618 bytes_remaining -= i; | |
| 619 data += i; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
620 XFlush (display); |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
621 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
|
622 UNBLOCK_INPUT; |
| 2161 | 623 |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
624 if (had_errors) |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
625 break; |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
626 |
|
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
627 /* Now wait for the requester to ack this chunk by deleting the |
| 2161 | 628 property. This can run random lisp code or signal. |
| 629 */ | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
630 wait_for_property_change (wait_object); |
| 2161 | 631 } |
|
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
632 /* Now write a zero-length chunk to the property to tell the requester |
| 2161 | 633 that we're done. */ |
| 634 #if 0 | |
| 635 fprintf (stderr," INCR done\n"); | |
| 636 #endif | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
637 BLOCK_INPUT; |
| 2161 | 638 if (! waiting_for_other_props_on_window (display, window)) |
| 639 XSelectInput (display, window, 0L); | |
| 640 | |
| 641 XChangeProperty (display, window, reply.property, type, format, | |
| 642 PropModeReplace, data, 0); | |
| 643 } | |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
644 |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
645 XFlush (display); |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
646 x_uncatch_errors (display, count); |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
647 UNBLOCK_INPUT; |
| 2161 | 648 } |
| 649 | |
| 650 /* Handle a SelectionRequest event EVENT. | |
| 651 This is called from keyboard.c when such an event is found in the queue. */ | |
| 652 | |
| 653 void | |
| 654 x_handle_selection_request (event) | |
| 655 struct input_event *event; | |
| 656 { | |
| 657 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
|
658 Lisp_Object local_selection_data; |
| 2161 | 659 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
|
660 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
|
661 Lisp_Object converted_selection; |
| 2161 | 662 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
|
663 Lisp_Object successful_p; |
| 2161 | 664 int count; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
665 struct x_display_info *dpyinfo |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
666 = x_display_info_for_display (SELECTION_EVENT_DISPLAY (event)); |
| 2161 | 667 |
|
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
668 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
|
669 target_symbol = Qnil; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
670 converted_selection = Qnil; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
671 successful_p = Qnil; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
672 |
| 2161 | 673 GCPRO3 (local_selection_data, converted_selection, target_symbol); |
| 674 | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
675 selection_symbol = x_atom_to_symbol (dpyinfo, |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
676 SELECTION_EVENT_DISPLAY (event), |
| 2161 | 677 SELECTION_EVENT_SELECTION (event)); |
| 678 | |
| 679 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist); | |
| 680 | |
| 681 if (NILP (local_selection_data)) | |
| 682 { | |
| 683 /* Someone asked for the selection, but we don't have it any more. | |
| 684 */ | |
| 685 x_decline_selection_request (event); | |
| 686 goto DONE; | |
| 687 } | |
| 688 | |
| 689 local_selection_time = (Time) | |
| 690 cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car); | |
| 691 | |
| 692 if (SELECTION_EVENT_TIME (event) != CurrentTime | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
693 && local_selection_time > SELECTION_EVENT_TIME (event)) |
| 2161 | 694 { |
| 695 /* Someone asked for the selection, and we have one, but not the one | |
| 696 they're looking for. | |
| 697 */ | |
| 698 x_decline_selection_request (event); | |
| 699 goto DONE; | |
| 700 } | |
| 701 | |
| 702 count = specpdl_ptr - specpdl; | |
| 703 x_selection_current_request = event; | |
| 704 record_unwind_protect (x_selection_request_lisp_error, Qnil); | |
| 705 | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
706 target_symbol = x_atom_to_symbol (dpyinfo, SELECTION_EVENT_DISPLAY (event), |
| 2161 | 707 SELECTION_EVENT_TARGET (event)); |
| 708 | |
| 709 #if 0 /* #### MULTIPLE doesn't work yet */ | |
| 710 if (EQ (target_symbol, QMULTIPLE)) | |
| 711 target_symbol = fetch_multiple_target (event); | |
| 712 #endif | |
| 713 | |
| 714 /* Convert lisp objects back into binary data */ | |
| 715 | |
| 716 converted_selection | |
| 717 = x_get_local_selection (selection_symbol, target_symbol); | |
| 718 | |
| 719 if (! NILP (converted_selection)) | |
| 720 { | |
| 721 unsigned char *data; | |
| 722 unsigned int size; | |
| 723 int format; | |
| 724 Atom type; | |
|
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
725 int nofree; |
|
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
726 |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
727 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
|
728 converted_selection, |
|
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
729 &data, &type, &size, &format, &nofree); |
| 2161 | 730 |
| 731 x_reply_selection_request (event, format, data, size, type); | |
| 732 successful_p = Qt; | |
| 733 | |
| 734 /* Indicate we have successfully processed this event. */ | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
735 x_selection_current_request = 0; |
| 2161 | 736 |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
737 /* 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
|
738 calls xmalloc itself. */ |
|
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
739 if (!nofree) |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
740 xfree (data); |
| 2161 | 741 } |
| 742 unbind_to (count, Qnil); | |
| 743 | |
| 744 DONE: | |
| 745 | |
| 746 UNGCPRO; | |
| 747 | |
| 748 /* Let random lisp code notice that the selection has been asked for. */ | |
| 749 { | |
|
6520
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
750 Lisp_Object rest; |
|
bbde44df8b9d
(x_get_local_selection, x_handle_selection_request): Use assignment, not
Karl Heuer <kwzh@gnu.org>
parents:
5947
diff
changeset
|
751 rest = Vx_sent_selection_hooks; |
| 2161 | 752 if (!EQ (rest, Qunbound)) |
| 753 for (; CONSP (rest); rest = Fcdr (rest)) | |
| 754 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p); | |
| 755 } | |
| 756 } | |
| 757 | |
|
24163
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
758 /* Handle a SelectionClear event EVENT, which indicates that some |
| 2161 | 759 client cleared out our previously asserted selection. |
| 760 This is called from keyboard.c when such an event is found in the queue. */ | |
| 761 | |
| 762 void | |
| 763 x_handle_selection_clear (event) | |
| 764 struct input_event *event; | |
| 765 { | |
| 766 Display *display = SELECTION_EVENT_DISPLAY (event); | |
| 767 Atom selection = SELECTION_EVENT_SELECTION (event); | |
| 768 Time changed_owner_time = SELECTION_EVENT_TIME (event); | |
| 769 | |
| 770 Lisp_Object selection_symbol, local_selection_data; | |
| 771 Time local_selection_time; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
772 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
|
773 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
|
774 |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
775 /* 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
|
776 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
|
777 BLOCK_INPUT; |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
778 /* 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
|
779 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
|
780 through that display. */ |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
781 for (t_dpyinfo = x_display_list; t_dpyinfo; t_dpyinfo = t_dpyinfo->next) |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
782 if (t_dpyinfo->kboard == dpyinfo->kboard) |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
783 { |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
784 Window owner_window |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
785 = XGetSelectionOwner (t_dpyinfo->display, selection); |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
786 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
|
787 { |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
788 UNBLOCK_INPUT; |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
789 return; |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
790 } |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
791 } |
|
719325fbe6a1
(x_handle_selection_clear): Don't clear the
Richard M. Stallman <rms@gnu.org>
parents:
23873
diff
changeset
|
792 UNBLOCK_INPUT; |
| 2161 | 793 |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
794 selection_symbol = x_atom_to_symbol (dpyinfo, display, selection); |
| 2161 | 795 |
| 796 local_selection_data = assq_no_quit (selection_symbol, Vselection_alist); | |
| 797 | |
| 798 /* Well, we already believe that we don't own it, so that's just fine. */ | |
| 799 if (NILP (local_selection_data)) return; | |
| 800 | |
| 801 local_selection_time = (Time) | |
| 802 cons_to_long (XCONS (XCONS (XCONS (local_selection_data)->cdr)->cdr)->car); | |
| 803 | |
| 804 /* This SelectionClear is for a selection that we no longer own, so we can | |
| 805 disregard it. (That is, we have reasserted the selection since this | |
| 806 request was generated.) */ | |
| 807 | |
| 808 if (changed_owner_time != CurrentTime | |
| 809 && local_selection_time > changed_owner_time) | |
| 810 return; | |
| 811 | |
| 812 /* Otherwise, we're really honest and truly being told to drop it. | |
| 813 Don't use Fdelq as that may QUIT;. */ | |
| 814 | |
| 815 if (EQ (local_selection_data, Fcar (Vselection_alist))) | |
| 816 Vselection_alist = Fcdr (Vselection_alist); | |
| 817 else | |
| 818 { | |
| 819 Lisp_Object rest; | |
| 820 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest)) | |
| 821 if (EQ (local_selection_data, Fcar (XCONS (rest)->cdr))) | |
| 822 { | |
| 823 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr); | |
| 824 break; | |
| 825 } | |
| 826 } | |
| 827 | |
| 828 /* Let random lisp code notice that the selection has been stolen. */ | |
| 829 | |
| 830 { | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
831 Lisp_Object rest; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
832 rest = Vx_lost_selection_hooks; |
| 2161 | 833 if (!EQ (rest, Qunbound)) |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
834 { |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
835 for (; CONSP (rest); rest = Fcdr (rest)) |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
836 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
|
837 prepare_menu_bars (); |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
838 redisplay_preserve_echo_area (); |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
839 } |
| 2161 | 840 } |
| 841 } | |
| 842 | |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
843 /* 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
|
844 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
|
845 |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
846 void |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
847 x_clear_frame_selections (f) |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
848 FRAME_PTR f; |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
849 { |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
850 Lisp_Object frame; |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
851 Lisp_Object rest; |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
852 |
|
9286
2accc8da0793
(x_clear_frame_selections, wait_for_property_change): Use new accessor macros
Karl Heuer <kwzh@gnu.org>
parents:
8355
diff
changeset
|
853 XSETFRAME (frame, f); |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
854 |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
855 /* 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
|
856 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
|
857 |
|
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
858 /* 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
|
859 while (!NILP (Vselection_alist) |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
860 && 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
|
861 { |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
862 /* 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
|
863 Lisp_Object hooks, selection_symbol; |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
864 |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
865 hooks = Vx_lost_selection_hooks; |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
866 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
|
867 |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
868 if (!EQ (hooks, Qunbound)) |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
869 { |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
870 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
|
871 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
|
872 #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
|
873 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
|
874 something else should cause a redisplay. */ |
|
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
875 redisplay_preserve_echo_area (); |
|
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
876 #endif |
|
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
877 } |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
878 |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
879 Vselection_alist = Fcdr (Vselection_alist); |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
880 } |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
881 |
|
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
882 /* Delete elements after the beginning of Vselection_alist. */ |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
883 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest)) |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
884 if (EQ (frame, Fcar (Fcdr (Fcdr (Fcdr (Fcar (XCONS (rest)->cdr))))))) |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
885 { |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
886 /* 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
|
887 Lisp_Object hooks, selection_symbol; |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
888 |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
889 hooks = Vx_lost_selection_hooks; |
|
13555
e640f6afb190
(x_clear_frame_selections): Get selection_symbol properly.
Richard M. Stallman <rms@gnu.org>
parents:
12531
diff
changeset
|
890 selection_symbol = Fcar (Fcar (XCONS (rest)->cdr)); |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
891 |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
892 if (!EQ (hooks, Qunbound)) |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
893 { |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
894 for (; CONSP (hooks); hooks = Fcdr (hooks)) |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
895 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
|
896 #if 0 /* See above */ |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
897 redisplay_preserve_echo_area (); |
|
15585
335aa5c3ce34
(x_clear_frame_selections): Don't call redisplay_preserve_echo_area here.
Miles Bader <miles@gnu.org>
parents:
14372
diff
changeset
|
898 #endif |
|
8101
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
899 } |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
900 XCONS (rest)->cdr = Fcdr (XCONS (rest)->cdr); |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
901 break; |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
902 } |
|
77d5b5c8a71f
(x_own_selection, x_get_foreign_selection):
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
903 } |
| 2161 | 904 |
| 905 /* Nonzero if any properties for DISPLAY and WINDOW | |
| 906 are on the list of what we are waiting for. */ | |
| 907 | |
| 908 static int | |
| 909 waiting_for_other_props_on_window (display, window) | |
| 910 Display *display; | |
| 911 Window window; | |
| 912 { | |
| 913 struct prop_location *rest = property_change_wait_list; | |
| 914 while (rest) | |
| 915 if (rest->display == display && rest->window == window) | |
| 916 return 1; | |
| 917 else | |
| 918 rest = rest->next; | |
| 919 return 0; | |
| 920 } | |
| 921 | |
| 922 /* Add an entry to the list of property changes we are waiting for. | |
| 923 DISPLAY, WINDOW, PROPERTY, STATE describe what we will wait for. | |
| 924 The return value is a number that uniquely identifies | |
| 925 this awaited property change. */ | |
| 926 | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
927 static struct prop_location * |
| 2161 | 928 expect_property_change (display, window, property, state) |
| 929 Display *display; | |
| 930 Window window; | |
|
17372
30720c688961
(expect_property_change): Fix Lisp_Object/integer confusion.
Karl Heuer <kwzh@gnu.org>
parents:
17190
diff
changeset
|
931 Atom property; |
| 2161 | 932 int state; |
| 933 { | |
| 934 struct prop_location *pl | |
| 935 = (struct prop_location *) xmalloc (sizeof (struct prop_location)); | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
936 pl->identifier = ++prop_location_identifier; |
| 2161 | 937 pl->display = display; |
| 938 pl->window = window; | |
| 939 pl->property = property; | |
| 940 pl->desired_state = state; | |
| 941 pl->next = property_change_wait_list; | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
942 pl->arrived = 0; |
| 2161 | 943 property_change_wait_list = pl; |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
944 return pl; |
| 2161 | 945 } |
| 946 | |
| 947 /* 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
|
948 IDENTIFIER is the number that uniquely identifies the entry. */ |
| 2161 | 949 |
| 950 static void | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
951 unexpect_property_change (location) |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
952 struct prop_location *location; |
| 2161 | 953 { |
| 954 struct prop_location *prev = 0, *rest = property_change_wait_list; | |
| 955 while (rest) | |
| 956 { | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
957 if (rest == location) |
| 2161 | 958 { |
| 959 if (prev) | |
| 960 prev->next = rest->next; | |
| 961 else | |
| 962 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
|
963 xfree (rest); |
| 2161 | 964 return; |
| 965 } | |
| 966 prev = rest; | |
| 967 rest = rest->next; | |
| 968 } | |
| 969 } | |
| 970 | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
971 /* 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
|
972 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
973 static Lisp_Object |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
974 wait_for_property_change_unwind (identifierval) |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
975 Lisp_Object identifierval; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
976 { |
|
9960
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
977 unexpect_property_change ((struct prop_location *) |
|
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
978 (XFASTINT (XCONS (identifierval)->car) << 16 |
|
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
979 | XFASTINT (XCONS (identifierval)->cdr))); |
|
11908
4f4034f45cbf
(queue_selection_requests_unwind): Add return value.
Karl Heuer <kwzh@gnu.org>
parents:
11881
diff
changeset
|
980 return Qnil; |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
981 } |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
982 |
| 2161 | 983 /* 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
|
984 IDENTIFIER should be the value that expect_property_change returned. */ |
| 2161 | 985 |
| 986 static void | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
987 wait_for_property_change (location) |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
988 struct prop_location *location; |
| 2161 | 989 { |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
990 int secs, usecs; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
991 int count = specpdl_ptr - specpdl; |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
992 Lisp_Object tem; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
993 |
|
9960
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
994 tem = Fcons (Qnil, Qnil); |
|
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
995 XSETFASTINT (XCONS (tem)->car, (EMACS_UINT)location >> 16); |
|
d7735c829d73
(wait_for_property_change): Encode location as a cons of two integers instead
Karl Heuer <kwzh@gnu.org>
parents:
9701
diff
changeset
|
996 XSETFASTINT (XCONS (tem)->cdr, (EMACS_UINT)location & 0xffff); |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
997 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
998 /* Make sure to do unexpect_property_change if we quit or err. */ |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
999 record_unwind_protect (wait_for_property_change_unwind, tem); |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1000 |
| 2161 | 1001 XCONS (property_change_reply)->car = Qnil; |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1002 |
|
10633
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
1003 property_change_reply_object = location; |
|
70ee88d09615
(wait_for_property_change): Avoid unlikely timing error.
Richard M. Stallman <rms@gnu.org>
parents:
9960
diff
changeset
|
1004 /* 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
|
1005 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
|
1006 if (! location->arrived) |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1007 { |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1008 secs = x_selection_timeout / 1000; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1009 usecs = (x_selection_timeout % 1000) * 1000; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1010 wait_reading_process_input (secs, usecs, property_change_reply, 0); |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1011 |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1012 if (NILP (XCONS (property_change_reply)->car)) |
|
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1013 error ("Timed out waiting for property-notify event"); |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1014 } |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1015 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1016 unbind_to (count, Qnil); |
| 2161 | 1017 } |
| 1018 | |
| 1019 /* Called from XTread_socket in response to a PropertyNotify event. */ | |
| 1020 | |
| 1021 void | |
| 1022 x_handle_property_notify (event) | |
| 1023 XPropertyEvent *event; | |
| 1024 { | |
| 1025 struct prop_location *prev = 0, *rest = property_change_wait_list; | |
| 1026 while (rest) | |
| 1027 { | |
| 1028 if (rest->property == event->atom | |
| 1029 && rest->window == event->window | |
| 1030 && rest->display == event->display | |
| 1031 && rest->desired_state == event->state) | |
| 1032 { | |
| 1033 #if 0 | |
| 1034 fprintf (stderr, "Saw expected prop-%s on %s\n", | |
| 1035 (event->state == PropertyDelete ? "delete" : "change"), | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1036 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo, event->display, |
| 2161 | 1037 event->atom)) |
| 1038 ->name->data); | |
| 1039 #endif | |
| 1040 | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1041 rest->arrived = 1; |
|
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1042 |
| 2161 | 1043 /* If this is the one wait_for_property_change is waiting for, |
| 1044 tell it to wake up. */ | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1045 if (rest == property_change_reply_object) |
| 2161 | 1046 XCONS (property_change_reply)->car = Qt; |
| 1047 | |
| 1048 if (prev) | |
| 1049 prev->next = rest->next; | |
| 1050 else | |
| 1051 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
|
1052 xfree (rest); |
| 2161 | 1053 return; |
| 1054 } | |
| 1055 prev = rest; | |
| 1056 rest = rest->next; | |
| 1057 } | |
| 1058 #if 0 | |
| 1059 fprintf (stderr, "Saw UNexpected prop-%s on %s\n", | |
| 1060 (event->state == PropertyDelete ? "delete" : "change"), | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1061 (char *) XSYMBOL (x_atom_to_symbol (dpyinfo, |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1062 event->display, event->atom)) |
| 2161 | 1063 ->name->data); |
| 1064 #endif | |
| 1065 } | |
| 1066 | |
| 1067 | |
| 1068 | |
| 1069 #if 0 /* #### MULTIPLE doesn't work yet */ | |
| 1070 | |
| 1071 static Lisp_Object | |
| 1072 fetch_multiple_target (event) | |
| 1073 XSelectionRequestEvent *event; | |
| 1074 { | |
| 1075 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
|
1076 Window window = event->requestor; |
| 2161 | 1077 Atom target = event->target; |
| 1078 Atom selection_atom = event->selection; | |
| 1079 int result; | |
| 1080 | |
| 1081 return | |
| 1082 Fcons (QMULTIPLE, | |
| 1083 x_get_window_property_as_lisp_data (display, window, target, | |
| 1084 QMULTIPLE, selection_atom)); | |
| 1085 } | |
| 1086 | |
| 1087 static Lisp_Object | |
| 1088 copy_multiple_data (obj) | |
| 1089 Lisp_Object obj; | |
| 1090 { | |
| 1091 Lisp_Object vec; | |
| 1092 int i; | |
| 1093 int size; | |
| 1094 if (CONSP (obj)) | |
| 1095 return Fcons (XCONS (obj)->car, copy_multiple_data (XCONS (obj)->cdr)); | |
| 1096 | |
| 1097 CHECK_VECTOR (obj, 0); | |
| 1098 vec = Fmake_vector (size = XVECTOR (obj)->size, Qnil); | |
| 1099 for (i = 0; i < size; i++) | |
| 1100 { | |
| 1101 Lisp_Object vec2 = XVECTOR (obj)->contents [i]; | |
| 1102 CHECK_VECTOR (vec2, 0); | |
| 1103 if (XVECTOR (vec2)->size != 2) | |
| 1104 /* ??? Confusing error message */ | |
| 1105 Fsignal (Qerror, Fcons (build_string ("vectors must be of length 2"), | |
| 1106 Fcons (vec2, Qnil))); | |
| 1107 XVECTOR (vec)->contents [i] = Fmake_vector (2, Qnil); | |
| 1108 XVECTOR (XVECTOR (vec)->contents [i])->contents [0] | |
| 1109 = XVECTOR (vec2)->contents [0]; | |
| 1110 XVECTOR (XVECTOR (vec)->contents [i])->contents [1] | |
| 1111 = XVECTOR (vec2)->contents [1]; | |
| 1112 } | |
| 1113 return vec; | |
| 1114 } | |
| 1115 | |
| 1116 #endif | |
| 1117 | |
| 1118 | |
| 1119 /* Variables for communication with x_handle_selection_notify. */ | |
| 1120 static Atom reading_which_selection; | |
| 1121 static Lisp_Object reading_selection_reply; | |
| 1122 static Window reading_selection_window; | |
| 1123 | |
| 1124 /* Do protocol to read selection-data from the server. | |
| 1125 Converts this to Lisp data and returns it. */ | |
| 1126 | |
| 1127 static Lisp_Object | |
| 1128 x_get_foreign_selection (selection_symbol, target_type) | |
| 1129 Lisp_Object selection_symbol, target_type; | |
| 1130 { | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1131 Window requestor_window = FRAME_X_WINDOW (selected_frame); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
1132 Display *display = FRAME_X_DISPLAY (selected_frame); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1133 struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame); |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1134 Time requestor_time = last_event_timestamp; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1135 Atom target_property = dpyinfo->Xatom_EMACS_TMP; |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1136 Atom selection_atom = symbol_to_x_atom (dpyinfo, display, selection_symbol); |
| 2161 | 1137 Atom type_atom; |
|
3492
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1138 int secs, usecs; |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1139 int count; |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1140 Lisp_Object frame; |
| 2161 | 1141 |
| 1142 if (CONSP (target_type)) | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1143 type_atom = symbol_to_x_atom (dpyinfo, display, XCONS (target_type)->car); |
| 2161 | 1144 else |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1145 type_atom = symbol_to_x_atom (dpyinfo, display, target_type); |
| 2161 | 1146 |
| 1147 BLOCK_INPUT; | |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1148 count = x_catch_errors (display); |
| 2161 | 1149 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
|
1150 requestor_window, requestor_time); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1151 XFlush (display); |
| 2161 | 1152 |
| 1153 /* 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
|
1154 reading_selection_window = requestor_window; |
| 2161 | 1155 reading_which_selection = selection_atom; |
| 1156 XCONS (reading_selection_reply)->car = Qnil; | |
|
10674
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1157 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1158 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
|
1159 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1160 /* 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
|
1161 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
|
1162 bother trying to queue them. */ |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1163 if (!NILP (frame)) |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1164 { |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1165 x_start_queuing_selection_requests (display); |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1166 |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1167 record_unwind_protect (queue_selection_requests_unwind, |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1168 frame); |
|
ba12df743888
(x_get_foreign_selection, x_reply_selection_request):
Richard M. Stallman <rms@gnu.org>
parents:
10633
diff
changeset
|
1169 } |
| 2161 | 1170 UNBLOCK_INPUT; |
| 1171 | |
|
3492
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1172 /* 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
|
1173 secs = x_selection_timeout / 1000; |
|
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1174 usecs = (x_selection_timeout % 1000) * 1000; |
|
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
1175 wait_reading_process_input (secs, usecs, reading_selection_reply, 0); |
| 2161 | 1176 |
|
5244
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1177 BLOCK_INPUT; |
|
9701
26a60dd57b6e
(x_own_selection, x_get_foreign_selection): Change calls
Richard M. Stallman <rms@gnu.org>
parents:
9691
diff
changeset
|
1178 x_check_errors (display, "Cannot get selection: %s"); |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1179 x_uncatch_errors (display, count); |
|
5244
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1180 UNBLOCK_INPUT; |
|
c0bd54986550
(x_get_foreign_selection): Use x_catch_errors.
Richard M. Stallman <rms@gnu.org>
parents:
5131
diff
changeset
|
1181 |
| 2161 | 1182 if (NILP (XCONS (reading_selection_reply)->car)) |
|
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1183 error ("Timed out waiting for reply from selection owner"); |
|
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1184 if (EQ (XCONS (reading_selection_reply)->car, Qlambda)) |
|
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1185 error ("No `%s' selection", XSYMBOL (selection_symbol)->name->data); |
| 2161 | 1186 |
| 1187 /* Otherwise, the selection is waiting for us on the requested property. */ | |
| 1188 return | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1189 x_get_window_property_as_lisp_data (display, requestor_window, |
| 2161 | 1190 target_property, target_type, |
| 1191 selection_atom); | |
| 1192 } | |
| 1193 | |
| 1194 /* Subroutines of x_get_window_property_as_lisp_data */ | |
| 1195 | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1196 /* 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
|
1197 |
| 2161 | 1198 static void |
| 1199 x_get_window_property (display, window, property, data_ret, bytes_ret, | |
| 1200 actual_type_ret, actual_format_ret, actual_size_ret, | |
| 1201 delete_p) | |
| 1202 Display *display; | |
| 1203 Window window; | |
| 1204 Atom property; | |
| 1205 unsigned char **data_ret; | |
| 1206 int *bytes_ret; | |
| 1207 Atom *actual_type_ret; | |
| 1208 int *actual_format_ret; | |
| 1209 unsigned long *actual_size_ret; | |
| 1210 int delete_p; | |
| 1211 { | |
| 1212 int total_size; | |
| 1213 unsigned long bytes_remaining; | |
| 1214 int offset = 0; | |
| 1215 unsigned char *tmp_data = 0; | |
| 1216 int result; | |
| 1217 int buffer_size = SELECTION_QUANTUM (display); | |
| 1218 if (buffer_size > MAX_SELECTION_QUANTUM) buffer_size = MAX_SELECTION_QUANTUM; | |
| 1219 | |
| 1220 BLOCK_INPUT; | |
| 1221 /* First probe the thing to find out how big it is. */ | |
| 1222 result = XGetWindowProperty (display, window, property, | |
|
11881
3c292d5eed59
(x_get_window_property): Cast args of XGetWindowProperty.
Karl Heuer <kwzh@gnu.org>
parents:
11702
diff
changeset
|
1223 0L, 0L, False, AnyPropertyType, |
| 2161 | 1224 actual_type_ret, actual_format_ret, |
| 1225 actual_size_ret, | |
| 1226 &bytes_remaining, &tmp_data); | |
| 1227 if (result != Success) | |
| 1228 { | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1229 UNBLOCK_INPUT; |
| 2161 | 1230 *data_ret = 0; |
| 1231 *bytes_ret = 0; | |
| 1232 return; | |
| 1233 } | |
|
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1234 /* 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
|
1235 XFree ((char *) tmp_data); |
| 2161 | 1236 |
| 1237 if (*actual_type_ret == None || *actual_format_ret == 0) | |
| 1238 { | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1239 UNBLOCK_INPUT; |
| 2161 | 1240 return; |
| 1241 } | |
| 1242 | |
| 1243 total_size = bytes_remaining + 1; | |
| 1244 *data_ret = (unsigned char *) xmalloc (total_size); | |
| 1245 | |
|
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
1246 /* Now read, until we've gotten it all. */ |
| 2161 | 1247 while (bytes_remaining) |
| 1248 { | |
| 1249 #if 0 | |
| 1250 int last = bytes_remaining; | |
| 1251 #endif | |
| 1252 result | |
| 1253 = XGetWindowProperty (display, window, property, | |
|
11881
3c292d5eed59
(x_get_window_property): Cast args of XGetWindowProperty.
Karl Heuer <kwzh@gnu.org>
parents:
11702
diff
changeset
|
1254 (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
|
1255 False, |
| 2161 | 1256 AnyPropertyType, |
| 1257 actual_type_ret, actual_format_ret, | |
| 1258 actual_size_ret, &bytes_remaining, &tmp_data); | |
| 1259 #if 0 | |
| 1260 fprintf (stderr, "<< read %d\n", last-bytes_remaining); | |
| 1261 #endif | |
| 1262 /* If this doesn't return Success at this point, it means that | |
| 1263 some clod deleted the selection while we were in the midst of | |
| 1264 reading it. Deal with that, I guess.... | |
| 1265 */ | |
| 1266 if (result != Success) break; | |
| 1267 *actual_size_ret *= *actual_format_ret / 8; | |
| 1268 bcopy (tmp_data, (*data_ret) + offset, *actual_size_ret); | |
| 1269 offset += *actual_size_ret; | |
|
14371
dfeae392adcd
(x_get_window_property_as_lisp_data): Use xfree, not XFree.
Richard M. Stallman <rms@gnu.org>
parents:
14186
diff
changeset
|
1270 /* 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
|
1271 XFree ((char *) tmp_data); |
| 2161 | 1272 } |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1273 |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1274 XFlush (display); |
| 2161 | 1275 UNBLOCK_INPUT; |
| 1276 *bytes_ret = offset; | |
| 1277 } | |
| 1278 | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1279 /* 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
|
1280 |
| 2161 | 1281 static void |
| 1282 receive_incremental_selection (display, window, property, target_type, | |
| 1283 min_size_bytes, data_ret, size_bytes_ret, | |
| 1284 type_ret, format_ret, size_ret) | |
| 1285 Display *display; | |
| 1286 Window window; | |
| 1287 Atom property; | |
| 1288 Lisp_Object target_type; /* for error messages only */ | |
| 1289 unsigned int min_size_bytes; | |
| 1290 unsigned char **data_ret; | |
| 1291 int *size_bytes_ret; | |
| 1292 Atom *type_ret; | |
| 1293 unsigned long *size_ret; | |
| 1294 int *format_ret; | |
| 1295 { | |
| 1296 int offset = 0; | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1297 struct prop_location *wait_object; |
| 2161 | 1298 *size_bytes_ret = min_size_bytes; |
| 1299 *data_ret = (unsigned char *) xmalloc (*size_bytes_ret); | |
| 1300 #if 0 | |
| 1301 fprintf (stderr, "\nread INCR %d\n", min_size_bytes); | |
| 1302 #endif | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1303 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1304 /* 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
|
1305 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
|
1306 (But first, prepare to receive the next event in this handshake.) |
| 2161 | 1307 |
| 1308 Now, we must loop, waiting for the sending window to put a value on | |
| 1309 that property, then reading the property, then deleting it to ack. | |
| 1310 We are done when the sender places a property of length 0. | |
| 1311 */ | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1312 BLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1313 XSelectInput (display, window, STANDARD_EVENT_SET | PropertyChangeMask); |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1314 XDeleteProperty (display, window, property); |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1315 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
|
1316 PropertyNewValue); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1317 XFlush (display); |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1318 UNBLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1319 |
| 2161 | 1320 while (1) |
| 1321 { | |
| 1322 unsigned char *tmp_data; | |
| 1323 int tmp_size_bytes; | |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1324 wait_for_property_change (wait_object); |
| 2161 | 1325 /* 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
|
1326 .. no it won't, I don't get it. |
| 2161 | 1327 .. Ok, I get it now, the Xt code that implements INCR is broken. |
| 1328 */ | |
| 1329 x_get_window_property (display, window, property, | |
| 1330 &tmp_data, &tmp_size_bytes, | |
| 1331 type_ret, format_ret, size_ret, 1); | |
| 1332 | |
| 1333 if (tmp_size_bytes == 0) /* we're done */ | |
| 1334 { | |
| 1335 #if 0 | |
| 1336 fprintf (stderr, " read INCR done\n"); | |
| 1337 #endif | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1338 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
|
1339 XSelectInput (display, window, STANDARD_EVENT_SET); |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1340 unexpect_property_change (wait_object); |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1341 /* 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
|
1342 calls xmalloc itself. */ |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1343 if (tmp_data) xfree (tmp_data); |
| 2161 | 1344 break; |
| 1345 } | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1346 |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1347 BLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1348 XDeleteProperty (display, window, property); |
|
4636
bb0ec6a82089
(struct property_change): New field `arrived'.
Richard M. Stallman <rms@gnu.org>
parents:
4547
diff
changeset
|
1349 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
|
1350 PropertyNewValue); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1351 XFlush (display); |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1352 UNBLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1353 |
| 2161 | 1354 #if 0 |
| 1355 fprintf (stderr, " read INCR %d\n", tmp_size_bytes); | |
| 1356 #endif | |
| 1357 if (*size_bytes_ret < offset + tmp_size_bytes) | |
| 1358 { | |
| 1359 #if 0 | |
| 1360 fprintf (stderr, " read INCR realloc %d -> %d\n", | |
| 1361 *size_bytes_ret, offset + tmp_size_bytes); | |
| 1362 #endif | |
| 1363 *size_bytes_ret = offset + tmp_size_bytes; | |
| 1364 *data_ret = (unsigned char *) xrealloc (*data_ret, *size_bytes_ret); | |
| 1365 } | |
|
4547
3bd8248cc191
(receive_incremental_selection): Use bcopy, not memcpy.
Richard M. Stallman <rms@gnu.org>
parents:
4373
diff
changeset
|
1366 bcopy (tmp_data, (*data_ret) + offset, tmp_size_bytes); |
| 2161 | 1367 offset += tmp_size_bytes; |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1368 /* 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
|
1369 calls xmalloc itself. */ |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1370 xfree (tmp_data); |
| 2161 | 1371 } |
| 1372 } | |
| 1373 | |
| 1374 /* Once a requested selection is "ready" (we got a SelectionNotify event), | |
| 1375 fetch value from property PROPERTY of X window WINDOW on display DISPLAY. | |
| 1376 TARGET_TYPE and SELECTION_ATOM are used in error message if this fails. */ | |
| 1377 | |
| 1378 static Lisp_Object | |
| 1379 x_get_window_property_as_lisp_data (display, window, property, target_type, | |
| 1380 selection_atom) | |
| 1381 Display *display; | |
| 1382 Window window; | |
| 1383 Atom property; | |
| 1384 Lisp_Object target_type; /* for error messages only */ | |
| 1385 Atom selection_atom; /* for error messages only */ | |
| 1386 { | |
| 1387 Atom actual_type; | |
| 1388 int actual_format; | |
| 1389 unsigned long actual_size; | |
| 1390 unsigned char *data = 0; | |
| 1391 int bytes = 0; | |
| 1392 Lisp_Object val; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1393 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
| 2161 | 1394 |
| 1395 x_get_window_property (display, window, property, &data, &bytes, | |
| 1396 &actual_type, &actual_format, &actual_size, 1); | |
| 1397 if (! data) | |
| 1398 { | |
| 1399 int there_is_a_selection_owner; | |
| 1400 BLOCK_INPUT; | |
| 1401 there_is_a_selection_owner | |
| 1402 = XGetSelectionOwner (display, selection_atom); | |
| 1403 UNBLOCK_INPUT; | |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1404 Fsignal (Qerror, |
|
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1405 there_is_a_selection_owner |
|
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1406 ? Fcons (build_string ("selection owner couldn't convert"), |
| 2161 | 1407 actual_type |
| 1408 ? Fcons (target_type, | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1409 Fcons (x_atom_to_symbol (dpyinfo, display, |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1410 actual_type), |
| 2161 | 1411 Qnil)) |
| 1412 : Fcons (target_type, Qnil)) | |
|
17608
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1413 : Fcons (build_string ("no selection"), |
|
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1414 Fcons (x_atom_to_symbol (dpyinfo, display, |
|
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1415 selection_atom), |
|
23baa4f48b6e
(x_own_selection, x_reply_selection_request)
Richard M. Stallman <rms@gnu.org>
parents:
17372
diff
changeset
|
1416 Qnil))); |
| 2161 | 1417 } |
| 1418 | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1419 if (actual_type == dpyinfo->Xatom_INCR) |
| 2161 | 1420 { |
| 1421 /* That wasn't really the data, just the beginning. */ | |
| 1422 | |
| 1423 unsigned int min_size_bytes = * ((unsigned int *) data); | |
| 1424 BLOCK_INPUT; | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1425 /* 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
|
1426 calls xmalloc itself. */ |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1427 xfree ((char *) data); |
| 2161 | 1428 UNBLOCK_INPUT; |
| 1429 receive_incremental_selection (display, window, property, target_type, | |
| 1430 min_size_bytes, &data, &bytes, | |
| 1431 &actual_type, &actual_format, | |
| 1432 &actual_size); | |
| 1433 } | |
| 1434 | |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1435 BLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1436 XDeleteProperty (display, window, property); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1437 XFlush (display); |
|
4373
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1438 UNBLOCK_INPUT; |
|
02a515f35abc
(prop_location_identifier): Was named prop_location_tick.
Richard M. Stallman <rms@gnu.org>
parents:
4278
diff
changeset
|
1439 |
| 2161 | 1440 /* It's been read. Now convert it to a lisp object in some semi-rational |
| 1441 manner. */ | |
| 1442 val = selection_data_to_lisp_data (display, data, bytes, | |
| 1443 actual_type, actual_format); | |
| 1444 | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1445 /* 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
|
1446 calls xmalloc itself. */ |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1447 xfree ((char *) data); |
| 2161 | 1448 return val; |
| 1449 } | |
| 1450 | |
| 1451 /* These functions convert from the selection data read from the server into | |
| 1452 something that we can use from Lisp, and vice versa. | |
| 1453 | |
| 1454 Type: Format: Size: Lisp Type: | |
| 1455 ----- ------- ----- ----------- | |
| 1456 * 8 * String | |
| 1457 ATOM 32 1 Symbol | |
| 1458 ATOM 32 > 1 Vector of Symbols | |
| 1459 * 16 1 Integer | |
| 1460 * 16 > 1 Vector of Integers | |
| 1461 * 32 1 if <=16 bits: Integer | |
| 1462 if > 16 bits: Cons of top16, bot16 | |
| 1463 * 32 > 1 Vector of the above | |
| 1464 | |
| 1465 When converting a Lisp number to C, it is assumed to be of format 16 if | |
| 1466 it is an integer, and of format 32 if it is a cons of two integers. | |
| 1467 | |
| 1468 When converting a vector of numbers from Lisp to C, it is assumed to be | |
| 1469 of format 16 if every element in the vector is an integer, and is assumed | |
| 1470 to be of format 32 if any element is a cons of two integers. | |
| 1471 | |
| 1472 When converting an object to C, it may be of the form (SYMBOL . <data>) | |
| 1473 where SYMBOL is what we should claim that the type is. Format and | |
| 1474 representation are as above. */ | |
| 1475 | |
| 1476 | |
| 1477 | |
| 1478 static Lisp_Object | |
| 1479 selection_data_to_lisp_data (display, data, size, type, format) | |
| 1480 Display *display; | |
| 1481 unsigned char *data; | |
| 1482 Atom type; | |
| 1483 int size, format; | |
| 1484 { | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1485 struct x_display_info *dpyinfo = x_display_info_for_display (display); |
| 2161 | 1486 |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1487 if (type == dpyinfo->Xatom_NULL) |
| 2161 | 1488 return QNULL; |
| 1489 | |
| 1490 /* Convert any 8-bit data to a string, for compactness. */ | |
| 1491 else if (format == 8) | |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1492 { |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1493 Lisp_Object str; |
|
17721
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1494 int require_encoding = 0; |
| 2161 | 1495 |
|
23113
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1496 if ( |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1497 #if 1 |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1498 1 |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1499 #else |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1500 ! NILP (buffer_defaults.enable_multibyte_characters) |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1501 #endif |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1502 ) |
|
17721
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1503 { |
| 20104 | 1504 /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode |
| 1505 DATA to Emacs internal format because DATA may be encoded | |
| 1506 in compound text format. In addtion, if TYPE is `STRING' | |
| 1507 and DATA contains any 8-bit Latin-1 code, we should also | |
| 1508 decode it. */ | |
| 1509 if (type == dpyinfo->Xatom_TEXT | |
| 1510 || type == dpyinfo->Xatom_COMPOUND_TEXT) | |
| 1511 require_encoding = 1; | |
| 1512 else if (type == XA_STRING) | |
|
17721
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1513 { |
| 20104 | 1514 int i; |
| 1515 for (i = 0; i < size; i++) | |
|
17721
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1516 { |
| 20104 | 1517 if (data[i] >= 0x80) |
| 1518 { | |
| 1519 require_encoding = 1; | |
| 1520 break; | |
| 1521 } | |
|
17721
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1522 } |
|
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1523 } |
|
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1524 } |
|
4ebed8fa4fcb
(selection_data_to_lisp_data): If TYPE is `STRING'
Kenichi Handa <handa@m17n.org>
parents:
17668
diff
changeset
|
1525 if (!require_encoding) |
|
22716
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1526 { |
|
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1527 str = make_unibyte_string ((char *) data, size); |
|
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1528 Vlast_coding_system_used = Qraw_text; |
|
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1529 } |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1530 else |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1531 { |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1532 int bufsize; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1533 unsigned char *buf; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1534 struct coding_system coding; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1535 |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1536 if (NILP (Vnext_selection_coding_system)) |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1537 Vnext_selection_coding_system = Vselection_coding_system; |
|
19094
3f7a3248883b
(Vclipboard_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
18952
diff
changeset
|
1538 setup_coding_system |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1539 (Fcheck_coding_system(Vnext_selection_coding_system), &coding); |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1540 Vnext_selection_coding_system = Qnil; |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1541 coding.mode |= CODING_MODE_LAST_BLOCK; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1542 bufsize = decoding_buffer_size (&coding, size); |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1543 buf = (unsigned char *) xmalloc (bufsize); |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1544 decode_coding (&coding, data, buf, size, bufsize); |
|
21330
146e9f0c310b
(selection_data_to_lisp_data): Give
Kenichi Handa <handa@m17n.org>
parents:
21247
diff
changeset
|
1545 size = (coding.fake_multibyte |
|
146e9f0c310b
(selection_data_to_lisp_data): Give
Kenichi Handa <handa@m17n.org>
parents:
21247
diff
changeset
|
1546 ? multibyte_chars_in_text (buf, coding.produced) |
|
146e9f0c310b
(selection_data_to_lisp_data): Give
Kenichi Handa <handa@m17n.org>
parents:
21247
diff
changeset
|
1547 : coding.produced_char); |
|
146e9f0c310b
(selection_data_to_lisp_data): Give
Kenichi Handa <handa@m17n.org>
parents:
21247
diff
changeset
|
1548 str = make_string_from_bytes ((char *) buf, size, coding.produced); |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1549 xfree (buf); |
|
22716
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1550 Vlast_coding_system_used = coding.symbol; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1551 } |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1552 return str; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1553 } |
| 2161 | 1554 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to |
| 1555 a vector of symbols. | |
| 1556 */ | |
| 1557 else if (type == XA_ATOM) | |
| 1558 { | |
| 1559 int i; | |
| 1560 if (size == sizeof (Atom)) | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1561 return x_atom_to_symbol (dpyinfo, display, *((Atom *) data)); |
| 2161 | 1562 else |
| 1563 { | |
|
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1564 Lisp_Object v = Fmake_vector (make_number (size / sizeof (Atom)), |
|
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1565 make_number (0)); |
| 2161 | 1566 for (i = 0; i < size / sizeof (Atom); i++) |
|
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1567 Faset (v, make_number (i), |
|
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1568 x_atom_to_symbol (dpyinfo, display, ((Atom *) data) [i])); |
| 2161 | 1569 return v; |
| 1570 } | |
| 1571 } | |
| 1572 | |
| 1573 /* Convert a single 16 or small 32 bit number to a Lisp_Int. | |
| 1574 If the number is > 16 bits, convert it to a cons of integers, | |
| 1575 16 bits in each half. | |
| 1576 */ | |
| 1577 else if (format == 32 && size == sizeof (long)) | |
| 1578 return long_to_cons (((unsigned long *) data) [0]); | |
| 1579 else if (format == 16 && size == sizeof (short)) | |
| 1580 return make_number ((int) (((unsigned short *) data) [0])); | |
| 1581 | |
| 1582 /* Convert any other kind of data to a vector of numbers, represented | |
| 1583 as above (as an integer, or a cons of two 16 bit integers.) | |
| 1584 */ | |
| 1585 else if (format == 16) | |
| 1586 { | |
| 1587 int i; | |
|
18952
4e695c86585c
(selection_data_to_lisp_data):
Richard M. Stallman <rms@gnu.org>
parents:
18734
diff
changeset
|
1588 Lisp_Object v; |
|
4e695c86585c
(selection_data_to_lisp_data):
Richard M. Stallman <rms@gnu.org>
parents:
18734
diff
changeset
|
1589 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
|
1590 for (i = 0; i < size / 2; i++) |
| 2161 | 1591 { |
| 1592 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
|
1593 Faset (v, make_number (i), make_number (j)); |
| 2161 | 1594 } |
| 1595 return v; | |
| 1596 } | |
| 1597 else | |
| 1598 { | |
| 1599 int i; | |
|
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1600 Lisp_Object v = Fmake_vector (make_number (size / 4), make_number (0)); |
| 2161 | 1601 for (i = 0; i < size / 4; i++) |
| 1602 { | |
| 1603 unsigned long j = ((unsigned long *) data) [i]; | |
|
18734
a26b6aca56ca
(selection_data_to_lisp_data): Convert Fmake_vector
Richard M. Stallman <rms@gnu.org>
parents:
18534
diff
changeset
|
1604 Faset (v, make_number (i), long_to_cons (j)); |
| 2161 | 1605 } |
| 1606 return v; | |
| 1607 } | |
| 1608 } | |
| 1609 | |
| 1610 | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
1611 /* 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
|
1612 |
| 2161 | 1613 static void |
| 1614 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
|
1615 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
|
1616 format_ret, nofree_ret) |
| 2161 | 1617 Display *display; |
| 1618 Lisp_Object obj; | |
| 1619 unsigned char **data_ret; | |
| 1620 Atom *type_ret; | |
| 1621 unsigned int *size_ret; | |
| 1622 int *format_ret; | |
|
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1623 int *nofree_ret; |
| 2161 | 1624 { |
| 1625 Lisp_Object type = Qnil; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1626 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
|
1627 |
|
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1628 *nofree_ret = 0; |
|
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1629 |
| 2161 | 1630 if (CONSP (obj) && SYMBOLP (XCONS (obj)->car)) |
| 1631 { | |
| 1632 type = XCONS (obj)->car; | |
| 1633 obj = XCONS (obj)->cdr; | |
| 1634 if (CONSP (obj) && NILP (XCONS (obj)->cdr)) | |
| 1635 obj = XCONS (obj)->car; | |
| 1636 } | |
| 1637 | |
| 1638 if (EQ (obj, QNULL) || (EQ (type, QNULL))) | |
| 1639 { /* This is not the same as declining */ | |
| 1640 *format_ret = 32; | |
| 1641 *size_ret = 0; | |
| 1642 *data_ret = 0; | |
| 1643 type = QNULL; | |
| 1644 } | |
| 1645 else if (STRINGP (obj)) | |
| 1646 { | |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1647 /* Since we are now handling multilingual text, we must consider |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1648 sending back compound text. */ |
|
17878
2232640df372
(lisp_data_to_selection_data): charsets from `char' to `int.
Kenichi Handa <handa@m17n.org>
parents:
17721
diff
changeset
|
1649 int charsets[MAX_CHARSET + 1]; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1650 int num; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1651 |
| 2161 | 1652 *format_ret = 8; |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
20710
diff
changeset
|
1653 *size_ret = STRING_BYTES (XSTRING (obj)); |
|
4278
889d81e3f507
(lisp_data_to_selection_data): New arg NOFREE_RET.
Richard M. Stallman <rms@gnu.org>
parents:
3591
diff
changeset
|
1654 *data_ret = XSTRING (obj)->data; |
|
17878
2232640df372
(lisp_data_to_selection_data): charsets from `char' to `int.
Kenichi Handa <handa@m17n.org>
parents:
17721
diff
changeset
|
1655 bzero (charsets, (MAX_CHARSET + 1) * sizeof (int)); |
| 20104 | 1656 num = ((*size_ret <= 1 /* Check the possibility of short cut. */ |
|
23113
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1657 || !STRING_MULTIBYTE (obj) |
|
4d3c7b5b4fae
(selection_data_to_lisp_data): Code-convert selections
Richard M. Stallman <rms@gnu.org>
parents:
23024
diff
changeset
|
1658 || *size_ret == XSTRING (obj)->size) |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1659 ? 0 |
|
23873
f3304ac34d54
(lisp_data_to_selection_data): Call find_charset_in_str
Kenichi Handa <handa@m17n.org>
parents:
23580
diff
changeset
|
1660 : find_charset_in_str (*data_ret, *size_ret, charsets, Qnil, 0, 1)); |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1661 |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1662 if (!num || (num == 1 && charsets[CHARSET_ASCII])) |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1663 { |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1664 /* No multibyte character in OBJ. We need not encode it. */ |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1665 *nofree_ret = 1; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1666 if (NILP (type)) type = QSTRING; |
|
22716
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1667 Vlast_coding_system_used = Qraw_text; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1668 } |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1669 else |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1670 { |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1671 /* We must encode contents of OBJ to compound text format. |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1672 The format is compatible with what the target `STRING' |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1673 expects if OBJ contains only ASCII and Latin-1 |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1674 characters. */ |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1675 int bufsize; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1676 unsigned char *buf; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1677 struct coding_system coding; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1678 |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1679 if (NILP (Vnext_selection_coding_system)) |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1680 Vnext_selection_coding_system = Vselection_coding_system; |
|
19094
3f7a3248883b
(Vclipboard_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
18952
diff
changeset
|
1681 setup_coding_system |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1682 (Fcheck_coding_system (Vnext_selection_coding_system), &coding); |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
1683 Vnext_selection_coding_system = Qnil; |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1684 coding.mode |= CODING_MODE_LAST_BLOCK; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1685 bufsize = encoding_buffer_size (&coding, *size_ret); |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1686 buf = (unsigned char *) xmalloc (bufsize); |
|
20710
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1687 encode_coding (&coding, *data_ret, buf, *size_ret, bufsize); |
|
3ca65e83c8a1
(selection_data_to_lisp_data): Adjusted for the change
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1688 *size_ret = coding.produced; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1689 *data_ret = buf; |
| 20104 | 1690 if (charsets[charset_latin_iso8859_1] |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1691 && (num == 1 || (num == 2 && charsets[CHARSET_ASCII]))) |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1692 { |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1693 /* Ok, we can return it as `STRING'. */ |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1694 if (NILP (type)) type = QSTRING; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1695 } |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1696 else |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1697 { |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1698 /* We must return it as `COMPOUND_TEXT'. */ |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1699 if (NILP (type)) type = QCOMPOUND_TEXT; |
|
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1700 } |
|
22716
2d00337b7152
(selection_data_to_lisp_data): Set Vlast_coding_system_used.
Kenichi Handa <handa@m17n.org>
parents:
22164
diff
changeset
|
1701 Vlast_coding_system_used = coding.symbol; |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
1702 } |
| 2161 | 1703 } |
| 1704 else if (SYMBOLP (obj)) | |
| 1705 { | |
| 1706 *format_ret = 32; | |
| 1707 *size_ret = 1; | |
| 1708 *data_ret = (unsigned char *) xmalloc (sizeof (Atom) + 1); | |
| 1709 (*data_ret) [sizeof (Atom)] = 0; | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1710 (*(Atom **) data_ret) [0] = symbol_to_x_atom (dpyinfo, display, obj); |
| 2161 | 1711 if (NILP (type)) type = QATOM; |
| 1712 } | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1713 else if (INTEGERP (obj) |
| 2161 | 1714 && XINT (obj) < 0xFFFF |
| 1715 && XINT (obj) > -0xFFFF) | |
| 1716 { | |
| 1717 *format_ret = 16; | |
| 1718 *size_ret = 1; | |
| 1719 *data_ret = (unsigned char *) xmalloc (sizeof (short) + 1); | |
| 1720 (*data_ret) [sizeof (short)] = 0; | |
| 1721 (*(short **) data_ret) [0] = (short) XINT (obj); | |
| 1722 if (NILP (type)) type = QINTEGER; | |
| 1723 } | |
| 2169 | 1724 else if (INTEGERP (obj) |
| 1725 || (CONSP (obj) && INTEGERP (XCONS (obj)->car) | |
| 1726 && (INTEGERP (XCONS (obj)->cdr) | |
| 1727 || (CONSP (XCONS (obj)->cdr) | |
| 1728 && INTEGERP (XCONS (XCONS (obj)->cdr)->car))))) | |
| 2161 | 1729 { |
| 1730 *format_ret = 32; | |
| 1731 *size_ret = 1; | |
| 1732 *data_ret = (unsigned char *) xmalloc (sizeof (long) + 1); | |
| 1733 (*data_ret) [sizeof (long)] = 0; | |
| 1734 (*(unsigned long **) data_ret) [0] = cons_to_long (obj); | |
| 1735 if (NILP (type)) type = QINTEGER; | |
| 1736 } | |
| 1737 else if (VECTORP (obj)) | |
| 1738 { | |
| 1739 /* Lisp_Vectors may represent a set of ATOMs; | |
| 1740 a set of 16 or 32 bit INTEGERs; | |
| 1741 or a set of ATOM_PAIRs (represented as [[A1 A2] [A3 A4] ...] | |
| 1742 */ | |
| 1743 int i; | |
| 1744 | |
| 1745 if (SYMBOLP (XVECTOR (obj)->contents [0])) | |
| 1746 /* This vector is an ATOM set */ | |
| 1747 { | |
| 1748 if (NILP (type)) type = QATOM; | |
| 1749 *size_ret = XVECTOR (obj)->size; | |
| 1750 *format_ret = 32; | |
| 1751 *data_ret = (unsigned char *) xmalloc ((*size_ret) * sizeof (Atom)); | |
| 1752 for (i = 0; i < *size_ret; i++) | |
| 1753 if (SYMBOLP (XVECTOR (obj)->contents [i])) | |
| 1754 (*(Atom **) data_ret) [i] | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1755 = symbol_to_x_atom (dpyinfo, display, XVECTOR (obj)->contents [i]); |
| 2161 | 1756 else |
| 1757 Fsignal (Qerror, /* Qselection_error */ | |
| 1758 Fcons (build_string | |
| 1759 ("all elements of selection vector must have same type"), | |
| 1760 Fcons (obj, Qnil))); | |
| 1761 } | |
| 1762 #if 0 /* #### MULTIPLE doesn't work yet */ | |
| 1763 else if (VECTORP (XVECTOR (obj)->contents [0])) | |
| 1764 /* This vector is an ATOM_PAIR set */ | |
| 1765 { | |
| 1766 if (NILP (type)) type = QATOM_PAIR; | |
| 1767 *size_ret = XVECTOR (obj)->size; | |
| 1768 *format_ret = 32; | |
| 1769 *data_ret = (unsigned char *) | |
| 1770 xmalloc ((*size_ret) * sizeof (Atom) * 2); | |
| 1771 for (i = 0; i < *size_ret; i++) | |
| 1772 if (VECTORP (XVECTOR (obj)->contents [i])) | |
| 1773 { | |
| 1774 Lisp_Object pair = XVECTOR (obj)->contents [i]; | |
| 1775 if (XVECTOR (pair)->size != 2) | |
| 1776 Fsignal (Qerror, | |
| 1777 Fcons (build_string | |
| 1778 ("elements of the vector must be vectors of exactly two elements"), | |
| 1779 Fcons (pair, Qnil))); | |
| 1780 | |
| 1781 (*(Atom **) data_ret) [i * 2] | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1782 = symbol_to_x_atom (dpyinfo, display, |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1783 XVECTOR (pair)->contents [0]); |
| 2161 | 1784 (*(Atom **) data_ret) [(i * 2) + 1] |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1785 = symbol_to_x_atom (dpyinfo, display, |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1786 XVECTOR (pair)->contents [1]); |
| 2161 | 1787 } |
| 1788 else | |
| 1789 Fsignal (Qerror, | |
| 1790 Fcons (build_string | |
| 1791 ("all elements of the vector must be of the same type"), | |
| 1792 Fcons (obj, Qnil))); | |
| 1793 | |
| 1794 } | |
| 1795 #endif | |
| 1796 else | |
| 1797 /* This vector is an INTEGER set, or something like it */ | |
| 1798 { | |
| 1799 *size_ret = XVECTOR (obj)->size; | |
| 1800 if (NILP (type)) type = QINTEGER; | |
| 1801 *format_ret = 16; | |
| 1802 for (i = 0; i < *size_ret; i++) | |
| 1803 if (CONSP (XVECTOR (obj)->contents [i])) | |
| 1804 *format_ret = 32; | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1805 else if (!INTEGERP (XVECTOR (obj)->contents [i])) |
| 2161 | 1806 Fsignal (Qerror, /* Qselection_error */ |
| 1807 Fcons (build_string | |
| 1808 ("elements of selection vector must be integers or conses of integers"), | |
| 1809 Fcons (obj, Qnil))); | |
| 1810 | |
| 1811 *data_ret = (unsigned char *) xmalloc (*size_ret * (*format_ret/8)); | |
| 1812 for (i = 0; i < *size_ret; i++) | |
| 1813 if (*format_ret == 32) | |
| 1814 (*((unsigned long **) data_ret)) [i] | |
| 1815 = cons_to_long (XVECTOR (obj)->contents [i]); | |
| 1816 else | |
| 1817 (*((unsigned short **) data_ret)) [i] | |
| 1818 = (unsigned short) cons_to_long (XVECTOR (obj)->contents [i]); | |
| 1819 } | |
| 1820 } | |
| 1821 else | |
| 1822 Fsignal (Qerror, /* Qselection_error */ | |
| 1823 Fcons (build_string ("unrecognised selection data"), | |
| 1824 Fcons (obj, Qnil))); | |
| 1825 | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1826 *type_ret = symbol_to_x_atom (dpyinfo, display, type); |
| 2161 | 1827 } |
| 1828 | |
| 1829 static Lisp_Object | |
| 1830 clean_local_selection_data (obj) | |
| 1831 Lisp_Object obj; | |
| 1832 { | |
| 1833 if (CONSP (obj) | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1834 && INTEGERP (XCONS (obj)->car) |
| 2161 | 1835 && CONSP (XCONS (obj)->cdr) |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1836 && INTEGERP (XCONS (XCONS (obj)->cdr)->car) |
| 2161 | 1837 && NILP (XCONS (XCONS (obj)->cdr)->cdr)) |
| 1838 obj = Fcons (XCONS (obj)->car, XCONS (obj)->cdr); | |
| 1839 | |
| 1840 if (CONSP (obj) | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1841 && INTEGERP (XCONS (obj)->car) |
|
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1842 && INTEGERP (XCONS (obj)->cdr)) |
| 2161 | 1843 { |
| 1844 if (XINT (XCONS (obj)->car) == 0) | |
| 1845 return XCONS (obj)->cdr; | |
| 1846 if (XINT (XCONS (obj)->car) == -1) | |
| 1847 return make_number (- XINT (XCONS (obj)->cdr)); | |
| 1848 } | |
| 1849 if (VECTORP (obj)) | |
| 1850 { | |
| 1851 int i; | |
| 1852 int size = XVECTOR (obj)->size; | |
| 1853 Lisp_Object copy; | |
| 1854 if (size == 1) | |
| 1855 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
|
1856 copy = Fmake_vector (make_number (size), Qnil); |
| 2161 | 1857 for (i = 0; i < size; i++) |
| 1858 XVECTOR (copy)->contents [i] | |
| 1859 = clean_local_selection_data (XVECTOR (obj)->contents [i]); | |
| 1860 return copy; | |
| 1861 } | |
| 1862 return obj; | |
| 1863 } | |
| 1864 | |
| 1865 /* 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
|
1866 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
|
1867 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
|
1868 We store t there if the reply is successful, lambda if not. */ |
| 2161 | 1869 |
| 1870 void | |
| 1871 x_handle_selection_notify (event) | |
| 1872 XSelectionEvent *event; | |
| 1873 { | |
|
14031
51c6f601f42b
Undo previous change, except for comments and doc strings.
Richard M. Stallman <rms@gnu.org>
parents:
13942
diff
changeset
|
1874 if (event->requestor != reading_selection_window) |
| 2161 | 1875 return; |
| 1876 if (event->selection != reading_which_selection) | |
| 1877 return; | |
| 1878 | |
|
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1879 XCONS (reading_selection_reply)->car |
|
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1880 = (event->property != 0 ? Qt : Qlambda); |
| 2161 | 1881 } |
| 1882 | |
| 1883 | |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1884 DEFUN ("x-own-selection-internal", Fx_own_selection_internal, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1885 Sx_own_selection_internal, 2, 2, 0, |
| 2161 | 1886 "Assert an X selection of the given TYPE with the given VALUE.\n\ |
| 1887 TYPE is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\ | |
| 1888 \(Those are literal upper-case symbol names, since that's what X expects.)\n\ | |
| 1889 VALUE is typically a string, or a cons of two markers, but may be\n\ | |
| 2169 | 1890 anything that the functions on `selection-converter-alist' know about.") |
| 2161 | 1891 (selection_name, selection_value) |
| 1892 Lisp_Object selection_name, selection_value; | |
| 1893 { | |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
1894 check_x (); |
| 2161 | 1895 CHECK_SYMBOL (selection_name, 0); |
|
14134
a1ebbdb060b8
(x_handle_selection_notify): Give an indication
Karl Heuer <kwzh@gnu.org>
parents:
14031
diff
changeset
|
1896 if (NILP (selection_value)) error ("selection-value may not be nil"); |
| 2161 | 1897 x_own_selection (selection_name, selection_value); |
| 1898 return selection_value; | |
| 1899 } | |
| 1900 | |
| 1901 | |
| 1902 /* Request the selection value from the owner. If we are the owner, | |
| 1903 simply return our selection value. If we are not the owner, this | |
| 1904 will block until all of the data has arrived. */ | |
| 1905 | |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1906 DEFUN ("x-get-selection-internal", Fx_get_selection_internal, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1907 Sx_get_selection_internal, 2, 2, 0, |
| 2161 | 1908 "Return text selected from some X window.\n\ |
| 1909 SELECTION is a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\ | |
| 1910 \(Those are literal upper-case symbol names, since that's what X expects.)\n\ | |
| 2169 | 1911 TYPE is the type of data desired, typically `STRING'.") |
| 2161 | 1912 (selection_symbol, target_type) |
| 1913 Lisp_Object selection_symbol, target_type; | |
| 1914 { | |
| 1915 Lisp_Object val = Qnil; | |
| 1916 struct gcpro gcpro1, gcpro2; | |
| 1917 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
|
1918 check_x (); |
| 2161 | 1919 CHECK_SYMBOL (selection_symbol, 0); |
| 1920 | |
| 1921 #if 0 /* #### MULTIPLE doesn't work yet */ | |
| 1922 if (CONSP (target_type) | |
| 1923 && XCONS (target_type)->car == QMULTIPLE) | |
| 1924 { | |
| 1925 CHECK_VECTOR (XCONS (target_type)->cdr, 0); | |
| 1926 /* So we don't destructively modify this... */ | |
| 1927 target_type = copy_multiple_data (target_type); | |
| 1928 } | |
| 1929 else | |
| 1930 #endif | |
| 1931 CHECK_SYMBOL (target_type, 0); | |
| 1932 | |
| 1933 val = x_get_local_selection (selection_symbol, target_type); | |
| 1934 | |
| 1935 if (NILP (val)) | |
| 1936 { | |
| 1937 val = x_get_foreign_selection (selection_symbol, target_type); | |
| 1938 goto DONE; | |
| 1939 } | |
| 1940 | |
| 1941 if (CONSP (val) | |
| 1942 && SYMBOLP (XCONS (val)->car)) | |
| 1943 { | |
| 1944 val = XCONS (val)->cdr; | |
| 1945 if (CONSP (val) && NILP (XCONS (val)->cdr)) | |
| 1946 val = XCONS (val)->car; | |
| 1947 } | |
| 1948 val = clean_local_selection_data (val); | |
| 1949 DONE: | |
| 1950 UNGCPRO; | |
| 1951 return val; | |
| 1952 } | |
| 1953 | |
|
16485
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1954 DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, |
|
9b919c5464a4
Reorganize function definitions so etags finds them.
Erik Naggum <erik@naggum.no>
parents:
15705
diff
changeset
|
1955 Sx_disown_selection_internal, 1, 2, 0, |
| 2169 | 1956 "If we own the selection SELECTION, disown it.\n\ |
| 1957 Disowning it means there is no such selection.") | |
| 2161 | 1958 (selection, time) |
| 1959 Lisp_Object selection; | |
| 1960 Lisp_Object time; | |
| 1961 { | |
| 1962 Time timestamp; | |
| 1963 Atom selection_atom; | |
|
20350
fb6a03e51808
(Fx_disown_selection_internal): Fix type of EVENT.
Andreas Schwab <schwab@suse.de>
parents:
20255
diff
changeset
|
1964 struct selection_input_event event; |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
1965 Display *display; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1966 struct x_display_info *dpyinfo; |
| 2161 | 1967 |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
1968 check_x (); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
1969 display = FRAME_X_DISPLAY (selected_frame); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1970 dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame); |
| 2161 | 1971 CHECK_SYMBOL (selection, 0); |
| 1972 if (NILP (time)) | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
1973 timestamp = last_event_timestamp; |
| 2161 | 1974 else |
| 1975 timestamp = cons_to_long (time); | |
| 1976 | |
| 1977 if (NILP (assq_no_quit (selection, Vselection_alist))) | |
| 1978 return Qnil; /* Don't disown the selection when we're not the owner. */ | |
| 1979 | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
1980 selection_atom = symbol_to_x_atom (dpyinfo, display, selection); |
| 2161 | 1981 |
| 1982 BLOCK_INPUT; | |
| 1983 XSetSelectionOwner (display, selection_atom, None, timestamp); | |
| 1984 UNBLOCK_INPUT; | |
| 1985 | |
|
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3492
diff
changeset
|
1986 /* It doesn't seem to be guaranteed that a SelectionClear event will be |
| 2161 | 1987 generated for a window which owns the selection when that window sets |
| 1988 the selection owner to None. The NCD server does, the MIT Sun4 server | |
| 1989 doesn't. So we synthesize one; this means we might get two, but | |
| 1990 that's ok, because the second one won't have any effect. */ | |
|
5131
69078817ec92
(Fx_disown_selection_internal): When making the fake
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
1991 SELECTION_EVENT_DISPLAY (&event) = display; |
|
69078817ec92
(Fx_disown_selection_internal): When making the fake
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
1992 SELECTION_EVENT_SELECTION (&event) = selection_atom; |
|
69078817ec92
(Fx_disown_selection_internal): When making the fake
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
1993 SELECTION_EVENT_TIME (&event) = timestamp; |
|
20350
fb6a03e51808
(Fx_disown_selection_internal): Fix type of EVENT.
Andreas Schwab <schwab@suse.de>
parents:
20255
diff
changeset
|
1994 x_handle_selection_clear ((struct input_event *) &event); |
| 2161 | 1995 |
| 1996 return Qt; | |
| 1997 } | |
| 1998 | |
| 2169 | 1999 /* Get rid of all the selections in buffer BUFFER. |
| 2000 This is used when we kill a buffer. */ | |
| 2001 | |
| 2002 void | |
| 2003 x_disown_buffer_selections (buffer) | |
| 2004 Lisp_Object buffer; | |
| 2005 { | |
| 2006 Lisp_Object tail; | |
| 2007 struct buffer *buf = XBUFFER (buffer); | |
| 2008 | |
| 2009 for (tail = Vselection_alist; CONSP (tail); tail = XCONS (tail)->cdr) | |
| 2010 { | |
| 2011 Lisp_Object elt, value; | |
| 2012 elt = XCONS (tail)->car; | |
| 2013 value = XCONS (elt)->cdr; | |
| 2014 if (CONSP (value) && MARKERP (XCONS (value)->car) | |
| 2015 && XMARKER (XCONS (value)->car)->buffer == buf) | |
| 2016 Fx_disown_selection_internal (XCONS (elt)->car, Qnil); | |
| 2017 } | |
| 2018 } | |
| 2161 | 2019 |
| 2020 DEFUN ("x-selection-owner-p", Fx_selection_owner_p, Sx_selection_owner_p, | |
| 2021 0, 1, 0, | |
| 2169 | 2022 "Whether the current Emacs process owns the given X Selection.\n\ |
| 2161 | 2023 The arg should be the name of the selection in question, typically one of\n\ |
| 2024 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\ | |
| 2025 \(Those are literal upper-case symbol names, since that's what X expects.)\n\ | |
| 2026 For convenience, the symbol nil is the same as `PRIMARY',\n\ | |
| 2027 and t is the same as `SECONDARY'.)") | |
| 2028 (selection) | |
| 2029 Lisp_Object selection; | |
| 2030 { | |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2031 check_x (); |
| 2161 | 2032 CHECK_SYMBOL (selection, 0); |
| 2033 if (EQ (selection, Qnil)) selection = QPRIMARY; | |
| 2034 if (EQ (selection, Qt)) selection = QSECONDARY; | |
| 2035 | |
| 2036 if (NILP (Fassq (selection, Vselection_alist))) | |
| 2037 return Qnil; | |
| 2038 return Qt; | |
| 2039 } | |
| 2040 | |
| 2041 DEFUN ("x-selection-exists-p", Fx_selection_exists_p, Sx_selection_exists_p, | |
| 2042 0, 1, 0, | |
| 2043 "Whether there is an owner for the given X Selection.\n\ | |
| 2044 The arg should be the name of the selection in question, typically one of\n\ | |
| 2045 the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.\n\ | |
| 2046 \(Those are literal upper-case symbol names, since that's what X expects.)\n\ | |
| 2047 For convenience, the symbol nil is the same as `PRIMARY',\n\ | |
| 2048 and t is the same as `SECONDARY'.)") | |
| 2049 (selection) | |
| 2050 Lisp_Object selection; | |
| 2051 { | |
| 2052 Window owner; | |
|
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2053 Atom atom; |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2054 Display *dpy; |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2055 |
|
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
|
2056 /* It should be safe to call this before we have an X frame. */ |
|
9691
eea337e3af4e
(Fx_selection_exists_p): Fix backwards if.
Richard M. Stallman <rms@gnu.org>
parents:
9680
diff
changeset
|
2057 if (! FRAME_X_P (selected_frame)) |
|
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
|
2058 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
|
2059 |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2060 dpy = FRAME_X_DISPLAY (selected_frame); |
| 2161 | 2061 CHECK_SYMBOL (selection, 0); |
| 2062 if (!NILP (Fx_selection_owner_p (selection))) | |
| 2063 return Qt; | |
|
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2064 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
|
2065 if (EQ (selection, Qt)) selection = QSECONDARY; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2066 atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame), |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2067 dpy, selection); |
|
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2068 if (atom == 0) |
|
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2069 return Qnil; |
| 2161 | 2070 BLOCK_INPUT; |
|
2797
ae18dabac465
(Fx_selection_exists_p): Handle nil, t as SELECTION arg.
Richard M. Stallman <rms@gnu.org>
parents:
2515
diff
changeset
|
2071 owner = XGetSelectionOwner (dpy, atom); |
| 2161 | 2072 UNBLOCK_INPUT; |
| 2073 return (owner ? Qt : Qnil); | |
| 2074 } | |
| 2075 | |
| 2076 | |
| 2077 #ifdef CUT_BUFFER_SUPPORT | |
| 2078 | |
| 2079 /* Ensure that all 8 cut buffers exist. ICCCM says we gotta... */ | |
| 2080 static void | |
| 2081 initialize_cut_buffers (display, window) | |
| 2082 Display *display; | |
| 2083 Window window; | |
| 2084 { | |
| 2085 unsigned char *data = (unsigned char *) ""; | |
| 2086 BLOCK_INPUT; | |
| 2087 #define FROB(atom) XChangeProperty (display, window, atom, XA_STRING, 8, \ | |
| 2088 PropModeAppend, data, 0) | |
| 2089 FROB (XA_CUT_BUFFER0); | |
| 2090 FROB (XA_CUT_BUFFER1); | |
| 2091 FROB (XA_CUT_BUFFER2); | |
| 2092 FROB (XA_CUT_BUFFER3); | |
| 2093 FROB (XA_CUT_BUFFER4); | |
| 2094 FROB (XA_CUT_BUFFER5); | |
| 2095 FROB (XA_CUT_BUFFER6); | |
| 2096 FROB (XA_CUT_BUFFER7); | |
| 2097 #undef FROB | |
| 2098 UNBLOCK_INPUT; | |
| 2099 } | |
| 2100 | |
| 2101 | |
| 2169 | 2102 #define CHECK_CUT_BUFFER(symbol,n) \ |
| 2161 | 2103 { CHECK_SYMBOL ((symbol), (n)); \ |
| 2104 if (!EQ((symbol), QCUT_BUFFER0) && !EQ((symbol), QCUT_BUFFER1) \ | |
| 2105 && !EQ((symbol), QCUT_BUFFER2) && !EQ((symbol), QCUT_BUFFER3) \ | |
| 2106 && !EQ((symbol), QCUT_BUFFER4) && !EQ((symbol), QCUT_BUFFER5) \ | |
| 2107 && !EQ((symbol), QCUT_BUFFER6) && !EQ((symbol), QCUT_BUFFER7)) \ | |
| 2108 Fsignal (Qerror, \ | |
| 2169 | 2109 Fcons (build_string ("doesn't name a cut buffer"), \ |
| 2161 | 2110 Fcons ((symbol), Qnil))); \ |
| 2111 } | |
| 2112 | |
| 2169 | 2113 DEFUN ("x-get-cut-buffer-internal", Fx_get_cut_buffer_internal, |
| 2114 Sx_get_cut_buffer_internal, 1, 1, 0, | |
| 2115 "Returns the value of the named cut buffer (typically CUT_BUFFER0).") | |
| 2161 | 2116 (buffer) |
| 2117 Lisp_Object buffer; | |
| 2118 { | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2119 Window window; |
| 2161 | 2120 Atom buffer_atom; |
| 2121 unsigned char *data; | |
| 2122 int bytes; | |
| 2123 Atom type; | |
| 2124 int format; | |
| 2125 unsigned long size; | |
| 2126 Lisp_Object ret; | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2127 Display *display; |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2128 struct x_display_info *dpyinfo; |
| 2161 | 2129 |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2130 check_x (); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2131 display = FRAME_X_DISPLAY (selected_frame); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2132 dpyinfo = FRAME_X_DISPLAY_INFO (selected_frame); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2133 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */ |
| 2169 | 2134 CHECK_CUT_BUFFER (buffer, 0); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2135 buffer_atom = symbol_to_x_atom (dpyinfo, display, buffer); |
| 2161 | 2136 |
| 2137 x_get_window_property (display, window, buffer_atom, &data, &bytes, | |
| 2138 &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
|
2139 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
|
2140 return Qnil; |
| 2161 | 2141 |
| 2142 if (format != 8 || type != XA_STRING) | |
| 2143 Fsignal (Qerror, | |
| 2144 Fcons (build_string ("cut buffer doesn't contain 8-bit data"), | |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2145 Fcons (x_atom_to_symbol (dpyinfo, display, type), |
| 2161 | 2146 Fcons (make_number (format), Qnil)))); |
| 2147 | |
| 2148 ret = (bytes ? make_string ((char *) data, bytes) : Qnil); | |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
2149 /* 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
|
2150 calls xmalloc itself. */ |
|
20255
8c8f90c95569
(x_handle_selection_request): Use xfree, not free.
Karl Heuer <kwzh@gnu.org>
parents:
20104
diff
changeset
|
2151 xfree (data); |
| 2161 | 2152 return ret; |
| 2153 } | |
| 2154 | |
| 2155 | |
| 2169 | 2156 DEFUN ("x-store-cut-buffer-internal", Fx_store_cut_buffer_internal, |
| 2157 Sx_store_cut_buffer_internal, 2, 2, 0, | |
| 2158 "Sets the value of the named cut buffer (typically CUT_BUFFER0).") | |
| 2161 | 2159 (buffer, string) |
| 2160 Lisp_Object buffer, string; | |
| 2161 { | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2162 Window window; |
| 2161 | 2163 Atom buffer_atom; |
| 2164 unsigned char *data; | |
| 2165 int bytes; | |
| 2166 int bytes_remaining; | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2167 int max_bytes; |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2168 Display *display; |
| 2161 | 2169 |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2170 check_x (); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2171 display = FRAME_X_DISPLAY (selected_frame); |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2172 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
|
2173 |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2174 max_bytes = SELECTION_QUANTUM (display); |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2175 if (max_bytes > MAX_SELECTION_QUANTUM) |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2176 max_bytes = MAX_SELECTION_QUANTUM; |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2177 |
| 2169 | 2178 CHECK_CUT_BUFFER (buffer, 0); |
| 2161 | 2179 CHECK_STRING (string, 0); |
|
9670
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2180 buffer_atom = symbol_to_x_atom (FRAME_X_DISPLAY_INFO (selected_frame), |
|
a03e0a600f3f
Use XFlush, not XFlushQueue, throughout.
Richard M. Stallman <rms@gnu.org>
parents:
9617
diff
changeset
|
2181 display, buffer); |
| 2161 | 2182 data = (unsigned char *) XSTRING (string)->data; |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
20710
diff
changeset
|
2183 bytes = STRING_BYTES (XSTRING (string)); |
| 2161 | 2184 bytes_remaining = bytes; |
| 2185 | |
|
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2186 if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized) |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2187 { |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2188 initialize_cut_buffers (display, window); |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2189 FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1; |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2190 } |
| 2161 | 2191 |
| 2192 BLOCK_INPUT; | |
|
3473
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2193 |
|
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2194 /* 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
|
2195 if (!bytes_remaining) |
|
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2196 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
|
2197 PropModeReplace, data, 0); |
|
e1d043cb2f1a
(Fx_store_cut_buffer_internal): Handle empty string right.
Richard M. Stallman <rms@gnu.org>
parents:
3348
diff
changeset
|
2198 |
| 2161 | 2199 while (bytes_remaining) |
| 2200 { | |
| 2201 int chunk = (bytes_remaining < max_bytes | |
| 2202 ? bytes_remaining : max_bytes); | |
| 2203 XChangeProperty (display, window, buffer_atom, XA_STRING, 8, | |
| 2204 (bytes_remaining == bytes | |
| 2205 ? PropModeReplace | |
| 2206 : PropModeAppend), | |
| 2207 data, chunk); | |
| 2208 data += chunk; | |
| 2209 bytes_remaining -= chunk; | |
| 2210 } | |
| 2211 UNBLOCK_INPUT; | |
| 2212 return string; | |
| 2213 } | |
| 2214 | |
| 2215 | |
| 2169 | 2216 DEFUN ("x-rotate-cut-buffers-internal", Fx_rotate_cut_buffers_internal, |
| 2217 Sx_rotate_cut_buffers_internal, 1, 1, 0, | |
|
20524
07dc8bbcb2c8
(Fx_rotate_cut_buffers_internal): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
20350
diff
changeset
|
2218 "Rotate the values of the cut buffers by the given number of step.\n\ |
|
07dc8bbcb2c8
(Fx_rotate_cut_buffers_internal): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
20350
diff
changeset
|
2219 Positive means shift the values forward, negative means backward.") |
| 2161 | 2220 (n) |
| 2221 Lisp_Object n; | |
| 2222 { | |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2223 Window window; |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2224 Atom props[8]; |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2225 Display *display; |
| 2161 | 2226 |
|
5947
9ff439565145
(x-own-selection-internal, x-get-selection-internal,
Karl Heuer <kwzh@gnu.org>
parents:
5244
diff
changeset
|
2227 check_x (); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2228 display = FRAME_X_DISPLAY (selected_frame); |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2229 window = RootWindow (display, 0); /* Cut buffers are on screen 0 */ |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
2230 CHECK_NUMBER (n, 0); |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2231 if (XINT (n) == 0) |
|
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2232 return n; |
|
11161
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2233 if (! FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized) |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2234 { |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2235 initialize_cut_buffers (display, window); |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2236 FRAME_X_DISPLAY_INFO (selected_frame)->cut_buffers_initialized = 1; |
|
3e309e3f0ad5
(Fx_store_cut_buffer_internal): Use the flag in the
Karl Heuer <kwzh@gnu.org>
parents:
10674
diff
changeset
|
2237 } |
|
9616
1008823e2e1a
(x_get_foreign_selection): Get display from
Richard M. Stallman <rms@gnu.org>
parents:
9286
diff
changeset
|
2238 |
| 2161 | 2239 props[0] = XA_CUT_BUFFER0; |
| 2240 props[1] = XA_CUT_BUFFER1; | |
| 2241 props[2] = XA_CUT_BUFFER2; | |
| 2242 props[3] = XA_CUT_BUFFER3; | |
| 2243 props[4] = XA_CUT_BUFFER4; | |
| 2244 props[5] = XA_CUT_BUFFER5; | |
| 2245 props[6] = XA_CUT_BUFFER6; | |
| 2246 props[7] = XA_CUT_BUFFER7; | |
| 2247 BLOCK_INPUT; | |
| 2248 XRotateWindowProperties (display, window, props, 8, XINT (n)); | |
| 2249 UNBLOCK_INPUT; | |
| 2250 return n; | |
| 2251 } | |
| 2252 | |
| 2253 #endif | |
| 2254 | |
|
2163
8ba4fffa6566
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
2161
diff
changeset
|
2255 void |
| 2161 | 2256 syms_of_xselect () |
| 2257 { | |
| 2258 defsubr (&Sx_get_selection_internal); | |
| 2259 defsubr (&Sx_own_selection_internal); | |
| 2260 defsubr (&Sx_disown_selection_internal); | |
| 2261 defsubr (&Sx_selection_owner_p); | |
| 2262 defsubr (&Sx_selection_exists_p); | |
| 2263 | |
| 2264 #ifdef CUT_BUFFER_SUPPORT | |
| 2169 | 2265 defsubr (&Sx_get_cut_buffer_internal); |
| 2266 defsubr (&Sx_store_cut_buffer_internal); | |
| 2267 defsubr (&Sx_rotate_cut_buffers_internal); | |
| 2161 | 2268 #endif |
| 2269 | |
| 2270 reading_selection_reply = Fcons (Qnil, Qnil); | |
| 2271 staticpro (&reading_selection_reply); | |
| 2272 reading_selection_window = 0; | |
| 2273 reading_which_selection = 0; | |
| 2274 | |
| 2275 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
|
2276 prop_location_identifier = 0; |
| 2161 | 2277 property_change_reply = Fcons (Qnil, Qnil); |
| 2278 staticpro (&property_change_reply); | |
| 2279 | |
| 2280 Vselection_alist = Qnil; | |
| 2281 staticpro (&Vselection_alist); | |
| 2282 | |
| 2283 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_alist, | |
|
19195
09d4a6c290ae
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19194
diff
changeset
|
2284 "An alist associating X Windows selection-types with functions.\n\ |
| 2161 | 2285 These functions are called to convert the selection, with three args:\n\ |
| 2286 the name of the selection (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\ | |
| 2287 a desired type to which the selection should be converted;\n\ | |
| 2288 and the local selection value (whatever was given to `x-own-selection').\n\ | |
| 2289 \n\ | |
| 2290 The function should return the value to send to the X server\n\ | |
| 2291 \(typically a string). A return value of nil\n\ | |
| 2292 means that the conversion could not be done.\n\ | |
| 2293 A return value which is the symbol `NULL'\n\ | |
| 2294 means that a side-effect was executed,\n\ | |
| 2295 and there is no meaningful selection value."); | |
| 2296 Vselection_converter_alist = Qnil; | |
| 2297 | |
| 2298 DEFVAR_LISP ("x-lost-selection-hooks", &Vx_lost_selection_hooks, | |
|
19195
09d4a6c290ae
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19194
diff
changeset
|
2299 "A list of functions to be called when Emacs loses an X selection.\n\ |
| 2161 | 2300 \(This happens when some other X client makes its own selection\n\ |
| 2301 or when a Lisp program explicitly clears the selection.)\n\ | |
| 2302 The functions are called with one argument, the selection type\n\ | |
|
13557
037f27af8c7b
(syms_of_xselect): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
13555
diff
changeset
|
2303 \(a symbol, typically `PRIMARY', `SECONDARY', or `CLIPBOARD')."); |
| 2161 | 2304 Vx_lost_selection_hooks = Qnil; |
| 2305 | |
| 2306 DEFVAR_LISP ("x-sent-selection-hooks", &Vx_sent_selection_hooks, | |
|
19195
09d4a6c290ae
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19194
diff
changeset
|
2307 "A list of functions to be called when Emacs answers a selection request.\n\ |
| 2161 | 2308 The functions are called with four arguments:\n\ |
| 2309 - the selection name (typically `PRIMARY', `SECONDARY', or `CLIPBOARD');\n\ | |
| 2310 - the selection-type which Emacs was asked to convert the\n\ | |
| 2311 selection into before sending (for example, `STRING' or `LENGTH');\n\ | |
| 2312 - a flag indicating success or failure for responding to the request.\n\ | |
| 2313 We might have failed (and declined the request) for any number of reasons,\n\ | |
| 2314 including being asked for a selection that we no longer own, or being asked\n\ | |
| 2315 to convert into a type that we don't know about or that is inappropriate.\n\ | |
| 2316 This hook doesn't let you change the behavior of Emacs's selection replies,\n\ | |
| 2317 it merely informs you that they have happened."); | |
| 2318 Vx_sent_selection_hooks = Qnil; | |
| 2319 | |
|
22736
a5015b8f1003
(Vselection_coding_system):
Richard M. Stallman <rms@gnu.org>
parents:
22716
diff
changeset
|
2320 DEFVAR_LISP ("selection-coding-system", &Vselection_coding_system, |
|
19195
09d4a6c290ae
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19194
diff
changeset
|
2321 "Coding system for communicating with other X clients.\n\ |
|
19194
92a9271ea062
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19094
diff
changeset
|
2322 When sending or receiving text via cut_buffer, selection, and clipboard,\n\ |
|
92a9271ea062
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19094
diff
changeset
|
2323 the text is encoded or decoded by this coding system.\n\ |
|
23580
4ade2b248148
(Vselection_coding_system): Doc fix.
Andreas Schwab <schwab@suse.de>
parents:
23421
diff
changeset
|
2324 The default value is `compound-text'."); |
|
22736
a5015b8f1003
(Vselection_coding_system):
Richard M. Stallman <rms@gnu.org>
parents:
22716
diff
changeset
|
2325 Vselection_coding_system = intern ("compound-text"); |
|
19094
3f7a3248883b
(Vclipboard_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
18952
diff
changeset
|
2326 |
|
23024
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2327 DEFVAR_LISP ("next-selection-coding-system", &Vnext_selection_coding_system, |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2328 "Coding system for the next communication with other X clients.\n\ |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2329 Usually, `selection-coding-system' is used for communicating with\n\ |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2330 other X clients. But, if this variable is set, it is used for the\n\ |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2331 next communication only. After the communication, this variable is\n\ |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2332 set to nil."); |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2333 Vnext_selection_coding_system = Qnil; |
|
a9a3f2620318
(Vnext_selection_coding_system): New variable.
Kenichi Handa <handa@m17n.org>
parents:
22736
diff
changeset
|
2334 |
| 2161 | 2335 DEFVAR_INT ("x-selection-timeout", &x_selection_timeout, |
|
19195
09d4a6c290ae
(syms_of_xselect): Doc syntax fixes.
Richard M. Stallman <rms@gnu.org>
parents:
19194
diff
changeset
|
2336 "Number of milliseconds to wait for a selection reply.\n\ |
|
13942
b01288cb5fc8
(x_get_foreign_selection): Renamed local variables
Karl Heuer <kwzh@gnu.org>
parents:
13557
diff
changeset
|
2337 If the selection owner doesn't reply in this time, we give up.\n\ |
| 2161 | 2338 A value of 0 means wait as long as necessary. This is initialized from the\n\ |
|
3492
3e75726d76c7
(x_get_foreign_selection): Handle x_selection_timeout
Richard M. Stallman <rms@gnu.org>
parents:
3473
diff
changeset
|
2339 \"*selectionTimeout\" resource."); |
| 2161 | 2340 x_selection_timeout = 0; |
| 2341 | |
| 2342 QPRIMARY = intern ("PRIMARY"); staticpro (&QPRIMARY); | |
| 2343 QSECONDARY = intern ("SECONDARY"); staticpro (&QSECONDARY); | |
| 2344 QSTRING = intern ("STRING"); staticpro (&QSTRING); | |
| 2345 QINTEGER = intern ("INTEGER"); staticpro (&QINTEGER); | |
| 2346 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD); | |
| 2347 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); | |
| 2348 QTEXT = intern ("TEXT"); staticpro (&QTEXT); | |
|
17049
d58064f06282
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16485
diff
changeset
|
2349 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT); |
| 2161 | 2350 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); |
| 2351 QDELETE = intern ("DELETE"); staticpro (&QDELETE); | |
| 2352 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE); | |
| 2353 QINCR = intern ("INCR"); staticpro (&QINCR); | |
| 2354 QEMACS_TMP = intern ("_EMACS_TMP_"); staticpro (&QEMACS_TMP); | |
| 2355 QTARGETS = intern ("TARGETS"); staticpro (&QTARGETS); | |
| 2356 QATOM = intern ("ATOM"); staticpro (&QATOM); | |
| 2357 QATOM_PAIR = intern ("ATOM_PAIR"); staticpro (&QATOM_PAIR); | |
| 2358 QNULL = intern ("NULL"); staticpro (&QNULL); | |
| 2359 | |
| 2360 #ifdef CUT_BUFFER_SUPPORT | |
| 2361 QCUT_BUFFER0 = intern ("CUT_BUFFER0"); staticpro (&QCUT_BUFFER0); | |
| 2362 QCUT_BUFFER1 = intern ("CUT_BUFFER1"); staticpro (&QCUT_BUFFER1); | |
| 2363 QCUT_BUFFER2 = intern ("CUT_BUFFER2"); staticpro (&QCUT_BUFFER2); | |
| 2364 QCUT_BUFFER3 = intern ("CUT_BUFFER3"); staticpro (&QCUT_BUFFER3); | |
| 2365 QCUT_BUFFER4 = intern ("CUT_BUFFER4"); staticpro (&QCUT_BUFFER4); | |
| 2366 QCUT_BUFFER5 = intern ("CUT_BUFFER5"); staticpro (&QCUT_BUFFER5); | |
| 2367 QCUT_BUFFER6 = intern ("CUT_BUFFER6"); staticpro (&QCUT_BUFFER6); | |
| 2368 QCUT_BUFFER7 = intern ("CUT_BUFFER7"); staticpro (&QCUT_BUFFER7); | |
| 2369 #endif | |
| 2370 | |
| 2371 } |
