annotate src/select.c @ 5608:4cffcc80b299

Fix Windows build by adding sequence.obj to the build list.
author Vin Shelton <acs@xemacs.org>
date Thu, 08 Dec 2011 10:05:14 -0500
parents 56144c8593a8
children 79e9934779c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
1 /* Generic selection processing for XEmacs
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
2 Copyright (C) 1999 Free Software Foundation, Inc.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
3 Copyright (C) 1999 Andy Piper.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
4
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
5 This file is part of XEmacs.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
6
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5176
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5176
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5176
diff changeset
10 option) any later version.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
11
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
15 for more details.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
16
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5176
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
19
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
20 /* Synched up with: Not synched with FSF. */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
21
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
22 #include <config.h>
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
23 #include "lisp.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
24
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
25 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 843
diff changeset
26 #include "device-impl.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
27 #include "extents.h"
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
28 #include "console.h"
5176
8b2f75cecb89 rename objects* (.c, .h and .el files) to fontcolor*
Ben Wing <ben@xemacs.org>
parents: 3025
diff changeset
29 #include "fontcolor.h"
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
30
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
31 #include "frame.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
32 #include "opaque.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
33 #include "select.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
34
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
35 /* X Atoms */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
36 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
37 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
38 QATOM_PAIR, QCOMPOUND_TEXT;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
39
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
40 /* Windows clipboard formats */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
41 Lisp_Object QCF_TEXT, QCF_BITMAP, QCF_METAFILEPICT, QCF_SYLK, QCF_DIF,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
42 QCF_TIFF, QCF_OEMTEXT, QCF_DIB, QCF_DIBV5, QCF_PALETTE, QCF_PENDATA,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
43 QCF_RIFF, QCF_WAVE, QCF_UNICODETEXT, QCF_ENHMETAFILE, QCF_HDROP, QCF_LOCALE,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
44 QCF_OWNERDISPLAY, QCF_DSPTEXT, QCF_DSPBITMAP, QCF_DSPMETAFILEPICT,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
45 QCF_DSPENHMETAFILE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
46
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
47 /* Selection strategy symbols */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
48 Lisp_Object Qreplace_all, Qreplace_existing;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
49
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
50 /* "Selection owner couldn't convert selection" */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
51 Lisp_Object Qselection_conversion_error;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
52
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
53 /* A couple of Lisp functions */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
54 Lisp_Object Qselect_convert_in, Qselect_convert_out, Qselect_coerce;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
55
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
56 /* These are alists whose CARs are selection-types (whose names are the same
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
57 as the names of X Atoms or Windows clipboard formats) and whose CDRs are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
58 the names of Lisp functions to call to convert the given Emacs selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
59 value to a string representing the given selection type. This is for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
60 elisp-level extension of the emacs selection handling.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
61 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
62 Lisp_Object Vselection_converter_out_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
63 Lisp_Object Vselection_converter_in_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
64 Lisp_Object Vselection_coercion_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
65 Lisp_Object Vselection_appender_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
66 Lisp_Object Vselection_buffer_killed_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 Lisp_Object Vselection_coercible_types;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
68
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
69 Lisp_Object Vlost_selection_hooks;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
70
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
71 /* This is an association list whose elements are of the form
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
72 ( selection-name selection-value selection-timestamp )
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
73 selection-name is a lisp symbol, whose name is the name of an X Atom.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
74 selection-value is a list of cons pairs that emacs owns for that selection.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
75 Each pair consists of (type . value), where type is nil or a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
76 selection data type, and value is any type of Lisp object.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
77 selection-timestamp is the time at which emacs began owning this selection,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
78 as a cons of two 16-bit numbers (making a 32 bit time).
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
79 If there is an entry in this alist, then it can be assumed that emacs owns
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
80 that selection.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
81 The only (eq) parts of this list that are visible from elisp are the
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
82 selection-values.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
83 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
84 Lisp_Object Vselection_alist;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
85
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 /* Given a selection-name and desired type, this looks up our local copy of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
87 the selection value and converts it to the type. */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
88 static Lisp_Object
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
89 get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
90 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
91 Lisp_Object local_value = assq_no_quit (selection_symbol, Vselection_alist);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
92
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
93 if (!NILP (local_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
94 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
95 Lisp_Object value_list = XCAR (XCDR (local_value));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
96 Lisp_Object value;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
97
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
98 /* First try to find an entry of the appropriate type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
99 value = assq_no_quit (target_type, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
100
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
101 if (!NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
102 return XCDR (value);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
103 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
104
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
105 return Qnil;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
106 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
107
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
108 /* #### Should perhaps handle `MULTIPLE'. The code below is now completely
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
109 broken due to a re-organization of get_local_selection, but I've left
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
110 it here should anyone show an interest - ajh */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
111 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
112 else if (CONSP (target_type) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
113 XCAR (target_type) == QMULTIPLE)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
114 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
115 Lisp_Object pairs = XCDR (target_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
116 int len = XVECTOR_LENGTH (pairs);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
117 int i;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
118 /* If the target is MULTIPLE, then target_type looks like
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
119 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
120 We modify the second element of each pair in the vector and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
121 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
122 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
123 for (i = 0; i < len; i++)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
124 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
125 Lisp_Object pair = XVECTOR_DATA (pairs) [i];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
126 XVECTOR_DATA (pair) [1] =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
127 x_get_local_selection (XVECTOR_DATA (pair) [0],
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
128 XVECTOR_DATA (pair) [1]);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
129 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
130 return pairs;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
131 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
132 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
133
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
134 DEFUN ("own-selection-internal", Fown_selection_internal, 2, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
135 Give the selection SELECTION-NAME the value SELECTION-VALUE.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
136 SELECTION-NAME is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
137 SELECTION-VALUE is typically a string, or a cons of two markers, but may be
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
138 anything that the functions on selection-converter-out-alist know about.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
139 Optional arg HOW-TO-ADD specifies how the selection will be combined
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
140 with any existing selection(s) - see `own-selection' for more
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
141 information.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
142 Optional arg DATA-TYPE is a window-system-specific type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
143 Optional arg DEVICE specifies the device on which to assert the selection.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
144 It defaults to the selected device.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
145 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
146 (selection_name, selection_value, how_to_add, data_type, device))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
147 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
148 Lisp_Object selection_time, selection_data, prev_value = Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
149 value_list = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
150 Lisp_Object prev_real_value = Qnil;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
151 struct gcpro gcpro1;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
152 int owned_p = 0;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
153
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
154 CHECK_SYMBOL (selection_name);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
155 if (NILP (selection_value))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
156 invalid_argument ("`selection-value' may not be nil", Qunbound);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
157
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
158 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
159 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
160
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
161 if (!EQ (how_to_add, Qappend) && !EQ (how_to_add, Qt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
162 && !EQ (how_to_add, Qreplace_existing)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
163 && !EQ (how_to_add, Qreplace_all) && !NILP (how_to_add))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
164 invalid_constant ("`how-to-add' must be nil, append, replace_all, "
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
165 "replace_existing or t", how_to_add);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
166
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
167 #ifdef MULE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
168 if (NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
169 data_type = QCOMPOUND_TEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
170 #else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171 if (NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 data_type = QSTRING;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 /* Examine the how-to-add argument */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
176 if (EQ (how_to_add, Qreplace_all) || NILP (how_to_add))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
177 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
178 Lisp_Object local_selection_data = assq_no_quit (selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
179 Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
180
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
181 if (!NILP (local_selection_data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
182 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
183 owned_p = 1;
5338
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5176
diff changeset
184 Vselection_alist
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5176
diff changeset
185 = delq_no_quit (local_selection_data, Vselection_alist);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
186 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
187 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
188 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
189 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
190 /* Look for a previous value */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
191 prev_value = assq_no_quit (selection_name, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
192
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
193 if (!NILP (prev_value))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
194 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
195 owned_p = 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
196 value_list = XCAR (XCDR (prev_value));
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
197 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
198
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
199 if (!NILP (value_list))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 prev_real_value = assq_no_quit (data_type, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
201 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
202
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
203 /* Append values if necessary */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
204 if (!NILP (value_list) && (EQ (how_to_add, Qappend) || EQ (how_to_add, Qt)))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
205 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
206 /* Did we have anything of this type previously? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
207 if (!NILP (prev_real_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
208 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
209 if ((NILP (data_type) && STRINGP (selection_value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
210 && STRINGP (XCDR (prev_real_value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
211 || !NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
212 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
213 Lisp_Object function = assq_no_quit (data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
214 Vselection_appender_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
215
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
216 if (NILP (function))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
217 signal_error (Qinvalid_argument,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
218 "Cannot append selections of supplied types (no function)",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
219 data_type);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
220
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
221 function = XCDR (function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
222
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
223 selection_value = call4 (function,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
224 selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
225 data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
226 XCDR (prev_real_value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227 selection_value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
228
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
229 if (NILP (selection_value))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
230 signal_error (Qinvalid_argument,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
231 "Cannot append selections of supplied types (function returned nil)",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
232 data_type);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
233 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
234 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
235 signal_error_2 (Qinvalid_argument, "Cannot append selections of supplied types (data type nil and both values not strings)",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
236 XCDR (prev_real_value),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
237 selection_value);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
239
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240 selection_data = Fcons (data_type, selection_value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 value_list = Fcons (selection_data, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
243
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
244 if (!NILP (prev_real_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
245 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
246 Lisp_Object rest; /* We know it isn't the CAR, so it's easy. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
247
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
248 /* Delete the old type entry from the list */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
249 for (rest = value_list; !NILP (rest); rest = Fcdr (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
250 if (EQ (prev_real_value, Fcar (XCDR (rest))))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
251 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
252 XCDR (rest) = Fcdr (XCDR (rest));
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
253 break;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
254 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
255 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
257 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258 value_list = Fcons (Fcons (data_type, selection_value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
260 }
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
261
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
262 /* Complete the local cache update; note that we destructively
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263 modify the current list entry if there is one */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 if (NILP (prev_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
266 selection_data = list3 (selection_name, value_list, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267 Vselection_alist = Fcons (selection_data, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
268 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
269 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
270 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
271 selection_data = prev_value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 Fsetcar (XCDR (selection_data), value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
274
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 GCPRO1 (selection_data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 /* have to do device specific stuff last so that methods can access the
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
278 selection_alist */
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
279
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
280 /* If you are re-implementing this for another redisplay type, either make
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
281 certain that the selection time will fit within thirty-two bits, or
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
282 redesign get-xemacs-selection-timestamp to return, say, a bignum, and
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
283 convert the device-specific timestamp to a bignum before storing it in
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
284 this list. The current practice is to blindly assume that the timestamp
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
285 is thirty-two bits, which will work for extant architectures. */
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
286
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
287 if (HAS_DEVMETH_P (XDEVICE (device), own_selection))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
288 selection_time = DEVMETH (XDEVICE (device), own_selection,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289 (selection_name, selection_value,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
290 how_to_add, data_type, owned_p));
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
291 else
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
292 selection_time = Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
293
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
294 Fsetcar (XCDR (XCDR (selection_data)), selection_time);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
295
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
296 UNGCPRO;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
297
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
298 return selection_value;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
299 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
300
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
301 DEFUN ("register-selection-data-type", Fregister_selection_data_type, 1,2,0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
302 Register a new selection data type DATA-TYPE, optionally on the specified
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
303 DEVICE. Returns the device-specific data type identifier, or nil if the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
304 device does not support this feature or the registration fails. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
305 (data_type, device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
306 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
307 /* Check arguments */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
308 CHECK_STRING (data_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
309
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
310 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
311 device = Fselected_device (Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
312
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
313 if (HAS_DEVMETH_P (XDEVICE (device), register_selection_data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
314 return DEVMETH (XDEVICE (device), register_selection_data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
315 (data_type));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
316 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
317 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
318 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
319
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
320 DEFUN ("selection-data-type-name", Fselection_data_type_name, 1, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
321 Retrieve the name of the specified selection data type DATA-TYPE, optionally
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
322 on the specified DEVICE. Returns either a string or a symbol on success, and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
323 nil if the device does not support this feature or the type is not known. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
324 (data_type, device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
325 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
326 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
327 device = Fselected_device (Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
328
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
329 if (HAS_DEVMETH_P (XDEVICE (device), selection_data_type_name))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
330 return DEVMETH (XDEVICE (device), selection_data_type_name, (data_type));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
331 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
332 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
333 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
334
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
335 DEFUN ("available-selection-types", Favailable_selection_types, 1, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
336 Retrieve a list of currently available types of selection associated with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
337 the given SELECTION-NAME, optionally on the specified DEVICE. This list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
338 does not take into account any possible conversions that might take place,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
339 so it should be taken as a minimal estimate of what is available.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
340 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
341 (selection_name, device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
342 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
343 Lisp_Object types = Qnil, rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
344 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
345
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
346 CHECK_SYMBOL (selection_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
347
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
348 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
349 device = Fselected_device (Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
350
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
351 GCPRO1 (types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
352
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
353 /* First check the device */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
354 if (HAS_DEVMETH_P (XDEVICE (device), available_selection_types))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
355 types = DEVMETH (XDEVICE (device), available_selection_types,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
356 (selection_name));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
357
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
358 /* Now look in the list */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
359 rest = assq_no_quit (selection_name, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
360
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
361 if (NILP (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
362 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
363 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
364
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
365 return types;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
366 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
367
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
368 /* Examine the types and cons them onto the front of the list */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
369 for (rest = XCAR (XCDR (rest)); !NILP (rest); rest = XCDR (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
370 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
371 Lisp_Object value = XCDR (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
372 Lisp_Object type = XCAR (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
373
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
374 types = Fcons (type, types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
375
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
376 if ((STRINGP (value) || EXTENTP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377 && (NILP (type) || EQ (type, QSTRING)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
378 || EQ (type, QTEXT) || EQ (type, QCOMPOUND_TEXT)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
379 types = Fcons (QTEXT, Fcons (QCOMPOUND_TEXT, Fcons (QSTRING, types)));
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5468
diff changeset
380 else if (FIXNUMP (value) && NILP (type))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
381 types = Fcons (QINTEGER, types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
382 else if (SYMBOLP (value) && NILP (type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
383 types = Fcons (QATOM, types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
384 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
385
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
386 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
387
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
388 return types;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
389 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
390
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
391 /* remove a selection from our local copy
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
392 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
393 void
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
394 handle_selection_clear (Lisp_Object selection_symbol)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
395 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
396 Lisp_Object local_selection_data = assq_no_quit (selection_symbol,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
397 Vselection_alist);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
398
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
399 /* Well, we already believe that we don't own it, so that's just fine. */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
400 if (NILP (local_selection_data)) return;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
401
5338
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5176
diff changeset
402 /* Otherwise, we're really honest and truly being told to drop it. */
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5176
diff changeset
403 Vselection_alist = delq_no_quit (local_selection_data, Vselection_alist);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
404
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
405 /* Let random lisp code notice that the selection has been stolen.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
406 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
407 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
408 Lisp_Object rest;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
409 Lisp_Object val = Vlost_selection_hooks;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
410 if (!UNBOUNDP (val) && !NILP (val))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
411 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
412 if (CONSP (val) && !EQ (XCAR (val), Qlambda))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
413 for (rest = val; !NILP (rest); rest = Fcdr (rest))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
414 call1 (Fcar (rest), selection_symbol);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
415 else
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
416 call1 (val, selection_symbol);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
417 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
418 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
419 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
420
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
421 DEFUN ("disown-selection-internal", Fdisown_selection_internal, 1, 3, 0, /*
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
422 If we own the named selection, then disown it (make there be no selection).
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
423 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
424 (selection_name, selection_time, device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
425 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
426 if (NILP (assq_no_quit (selection_name, Vselection_alist)))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
427 return Qnil; /* Don't disown the selection when we're not the owner. */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
428
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
429 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
430 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
431
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
432 MAYBE_DEVMETH (XDEVICE (device), disown_selection,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
433 (selection_name, selection_time));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
434
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
435 handle_selection_clear (selection_name);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
436
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
437 return Qt;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
438 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
439
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
440 DEFUN ("selection-owner-p", Fselection_owner_p, 0, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
441 Return t if the current emacs process owns SELECTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
442 SELECTION should be the name of the selection in question, typically one of
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
443 the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
444 nil is the same as PRIMARY, and t is the same as SECONDARY.)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
445 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
446 (selection))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
447 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
448 CHECK_SYMBOL (selection);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
449 if (EQ (selection, Qnil)) selection = QPRIMARY;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
450 else if (EQ (selection, Qt)) selection = QSECONDARY;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
451
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
452 return NILP (Fassq (selection, Vselection_alist)) ? Qnil : Qt;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
453 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
454
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455 DEFUN ("selection-exists-p", Fselection_exists_p, 0, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
456 Whether there is currently an owner for SELECTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
457 SELECTION should be the name of the selection in question, typically one of
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
458 the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
459 nil is the same as PRIMARY, and t is the same as SECONDARY.)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
460 Optionally, the window-system DATA-TYPE and the DEVICE may be specified.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
461 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
462 (selection, data_type, device))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
463 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
464 CHECK_SYMBOL (selection);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
465 if (NILP (data_type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 && !NILP (Fselection_owner_p (selection)))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
467 return Qt;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
468
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
469 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
470 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
471
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
472 return HAS_DEVMETH_P (XDEVICE (device), selection_exists_p) ?
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 DEVMETH (XDEVICE (device), selection_exists_p, (selection, data_type))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
474 : Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
475 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
476
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
477 Lisp_Object
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
478 get_selection_raw_time(Lisp_Object selection)
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
479 {
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
480 Lisp_Object local_value = assq_no_quit (selection, Vselection_alist);
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
481
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
482 if (!NILP (local_value))
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
483 {
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
484 return XCAR (XCDR (XCDR (local_value)));
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
485 }
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
486 return Qnil;
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
487 }
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
488
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 /* Get the timestamp of the given selection */
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
490 DEFUN ("get-xemacs-selection-timestamp", Fget_selection_timestamp, 1, 1, 0, /*
2757
7844ab77b582 [xemacs-hg @ 2005-05-05 17:10:19 by aidan]
aidan
parents: 2620
diff changeset
491 Return timestamp for SELECTION, if it belongs to XEmacs and exists.
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
492
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
493 The timestamp is a cons of two integers, the first being the higher-order
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
494 sixteen bits of the device-specific thirty-two-bit quantity, the second
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
495 being the lower-order sixteen bits of same. Expect to see this API change
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
496 when and if redisplay on a window system with timestamps wider than 32bits
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
497 happens.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499 (selection))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500 {
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
501 Lisp_Object val = get_selection_raw_time(selection);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
502
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
503 if (!NILP (val))
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
504 {
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
505 return word_to_lisp(* (UINT_32_BIT *) XOPAQUE_DATA (val));
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 872
diff changeset
506 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
507
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
508 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
509 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
510
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
511 /* Request the selection value from the owner. If we are the owner,
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
512 simply return our selection value. If we are not the owner, this
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
513 will block until all of the data has arrived.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
514 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
515 DEFUN ("get-selection-internal", Fget_selection_internal, 2, 3, 0, /*
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
516 Return text selected from some window-system window.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
517 SELECTION is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
518 TARGET-TYPE is the type of data desired, typically STRING or COMPOUND_TEXT.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
519 Under Mule, if the resultant data comes back as 8-bit data in type
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
520 TEXT or COMPOUND_TEXT, it will be decoded as Compound Text.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
521 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
522 (selection, target_type, device))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
523 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
524 /* This function can GC */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
525 Lisp_Object val = Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
526 struct gcpro gcpro1, gcpro2;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
527 GCPRO2 (target_type, val);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
528 CHECK_SYMBOL (selection);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
529
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
530 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
531 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
532
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
533 #ifdef MULE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
534 if (NILP (target_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
535 target_type = QCOMPOUND_TEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
536 #else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
537 if (NILP (target_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
538 target_type = QSTRING;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
539 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
540
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
541 #if 0 /* #### MULTIPLE doesn't work yet and probably never will */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
542 if (CONSP (target_type) &&
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
543 XCAR (target_type) == QMULTIPLE)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
544 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
545 CHECK_VECTOR (XCDR (target_type));
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
546 /* So we don't destructively modify this... */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
547 target_type = copy_multiple_data (target_type);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
548 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
549 #endif
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
550
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551 /* Used to check that target_type was a symbol. This is no longer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
552 necessarily the case, because the type might be registered with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
553 the device (in which case target_type would be a device-specific
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
554 identifier - probably an integer) - ajh */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
555
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
556 val = get_local_selection (selection, target_type);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
557
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
558 if (!NILP (val))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
559 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560 /* If we get something from the local cache, we may need to convert
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
561 it slightly - to do this, we call select-coerce */
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
562 val = call3 (Qselect_coerce, selection, target_type, val);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
564 else if (HAS_DEVMETH_P (XDEVICE (device), get_foreign_selection))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 /* Nothing in the local cache; try the window system */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
567 val = DEVMETH (XDEVICE (device), get_foreign_selection,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
568 (selection, target_type));
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
569 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571 if (NILP (val))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
572 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
573 /* Still nothing. Try coercion. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 /* Try looking in selection-coercible-types to see if any of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
576 them are present for this selection. We try them *in order*;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 the first for which a conversion succeeds gets returned. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
578 EXTERNAL_LIST_LOOP_2 (element, Vselection_coercible_types)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
579 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
580 val = get_local_selection (selection, element);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
581
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
582 if (NILP (val))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
583 continue;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
585 val = call3 (Qselect_coerce, selection, target_type, val);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
586
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
587 if (!NILP (val))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
588 break;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
589 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
590 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
591
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
592 /* Used to call clean_local_selection here... but that really belonged
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 in Lisp (so the equivalent is now built-in to the INTEGER conversion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
594 function select-convert-from-integer) - ajh */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
595
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
596 UNGCPRO;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
597 return val;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
598 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
599
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 /* These are convenient interfaces to the lisp code in select.el;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
601 this way we can rename them easily rather than having to hunt everywhere.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 Also, this gives us access to get_local_selection so that convert_out
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 can retrieve the internal selection value automatically if passed a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
604 value of Qnil. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
606 select_convert_in (Lisp_Object selection,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
607 Lisp_Object type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
608 Lisp_Object value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 return call3 (Qselect_convert_in, selection, type, value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 select_coerce (Lisp_Object selection,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 Lisp_Object type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616 Lisp_Object value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
617 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
618 return call3 (Qselect_coerce, selection, type, value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
619 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
620
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
621 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
622 select_convert_out (Lisp_Object selection,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
623 Lisp_Object type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 Lisp_Object value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
625 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
626 if (NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
627 value = get_local_selection (selection, type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
628
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
629 if (NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
630 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
631 /* Try looking in selection-coercible-types to see if any of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
632 them are present for this selection. We try them *in order*;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633 the first for which a conversion succeeds gets returned. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
634 EXTERNAL_LIST_LOOP_2 (element, Vselection_coercible_types)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
635 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
636 Lisp_Object ret;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
637
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
638 value = get_local_selection (selection, element);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
640 if (NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
641 continue;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
642
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
643 ret = call3 (Qselect_convert_out, selection, type, value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
644
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
645 if (!NILP (ret))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
646 return ret;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
647 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
648
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
649 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
650 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
651
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 return call3 (Qselect_convert_out, selection, type, value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
654
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
655
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
656 /* Gets called from kill-buffer; this lets us dispose of buffer-dependent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
657 selections (or alternatively make them independent of the buffer) when
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
658 it gets vaped. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
659 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
660 select_notify_buffer_kill (Lisp_Object buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
661 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
662 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
663 struct gcpro gcpro1, gcpro2, gcpro3;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
664
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
665 /* For each element of Vselection_alist */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
666 for (rest = Vselection_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
667 !NILP (rest);)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 Lisp_Object selection, values, prev = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 selection = XCAR (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 for (values = XCAR (XCDR (selection));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 !NILP (values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675 values = XCDR (values))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
676 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
677 Lisp_Object value, handler_fn;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
678
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
679 /* Extract the (type . value) pair. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
680 value = XCAR (values);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
681
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
682 /* Find the handler function (if any). */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
683 handler_fn = Fcdr (Fassq (XCAR (value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
684 Vselection_buffer_killed_alist));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
685
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
686 if (!NILP (handler_fn))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 Lisp_Object newval;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
690 /* Protect ourselves, just in case some tomfool calls
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 own-selection from with the buffer-killed handler, then
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 causes a GC. Just as a note, *don't do this*. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
693 GCPRO3 (rest, values, value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
694
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
695 newval = call4 (handler_fn, XCAR (selection), XCAR (value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 XCDR (value), buffer);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
697
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
698 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
699
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
700 /* Set or delete the value (by destructively modifying
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
701 the list). */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 if (!NILP (newval))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704 Fsetcdr (value, newval);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
705
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706 prev = values;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710 if (NILP (prev))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 Fsetcar (XCDR (selection), XCDR (values));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
713 Fsetcdr (prev, XCDR (values));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
715 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 prev = values;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 /* If we have no values for this selection */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 if (NILP (XCAR (XCDR (selection))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 /* Move on to the next element *first* */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724 rest = XCDR (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
726 /* Protect it and disown this selection */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
727 GCPRO1 (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
728
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729 Fdisown_selection_internal (XCAR (selection), Qnil, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
731 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
733 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
734 rest = XCDR (rest);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
735 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
736 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
738
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
739 void
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
740 syms_of_select (void)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
741 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
742 DEFSUBR (Fown_selection_internal);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
743 DEFSUBR (Fget_selection_internal);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
744 DEFSUBR (Fget_selection_timestamp);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
745 DEFSUBR (Fselection_exists_p);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
746 DEFSUBR (Fdisown_selection_internal);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
747 DEFSUBR (Fselection_owner_p);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
748 DEFSUBR (Favailable_selection_types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 DEFSUBR (Fregister_selection_data_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750 DEFSUBR (Fselection_data_type_name);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
751
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
752 /* Lisp Functions */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
753 DEFSYMBOL (Qselect_convert_in);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
754 DEFSYMBOL (Qselect_convert_out);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
755 DEFSYMBOL (Qselect_coerce);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
756
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
757 /* X Atoms */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
758 DEFSYMBOL (QPRIMARY);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
759 DEFSYMBOL (QSECONDARY);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
760 DEFSYMBOL (QSTRING);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
761 DEFSYMBOL (QINTEGER);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
762 DEFSYMBOL (QCLIPBOARD);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
763 DEFSYMBOL (QTIMESTAMP);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
764 DEFSYMBOL (QTEXT);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
765 DEFSYMBOL (QDELETE);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
766 DEFSYMBOL (QMULTIPLE);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
767 DEFSYMBOL (QINCR);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
768 defsymbol (&QEMACS_TMP, "_EMACS_TMP_");
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
769 DEFSYMBOL (QTARGETS);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
770 DEFSYMBOL (QATOM);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
771 defsymbol (&QATOM_PAIR, "ATOM_PAIR");
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
772 defsymbol (&QCOMPOUND_TEXT, "COMPOUND_TEXT");
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
773 DEFSYMBOL (QNULL);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
774
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
775 /* Windows formats - these all start with CF_ */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
776 defsymbol (&QCF_TEXT, "CF_TEXT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
777 defsymbol (&QCF_BITMAP, "CF_BITMAP");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
778 defsymbol (&QCF_METAFILEPICT, "CF_METAFILEPICT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
779 defsymbol (&QCF_SYLK, "CF_SYLK");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
780 defsymbol (&QCF_DIF, "CF_DIF");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
781 defsymbol (&QCF_TIFF, "CF_TIFF");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
782 defsymbol (&QCF_OEMTEXT, "CF_OEMTEXT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
783 defsymbol (&QCF_DIB, "CF_DIB");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
784 defsymbol (&QCF_DIBV5, "CF_DIBV5");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
785 defsymbol (&QCF_PALETTE, "CF_PALETTE");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
786 defsymbol (&QCF_PENDATA, "CF_PENDATA");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
787 defsymbol (&QCF_RIFF, "CF_RIFF");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
788 defsymbol (&QCF_WAVE, "CF_WAVE");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
789 defsymbol (&QCF_UNICODETEXT, "CF_UNICODETEXT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790 defsymbol (&QCF_ENHMETAFILE, "CF_ENHMETAFILE");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
791 defsymbol (&QCF_HDROP, "CF_HDROP");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
792 defsymbol (&QCF_LOCALE, "CF_LOCALE");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
793 defsymbol (&QCF_OWNERDISPLAY, "CF_OWNERDISPLAY");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
794 defsymbol (&QCF_DSPTEXT, "CF_DSPTEXT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
795 defsymbol (&QCF_DSPBITMAP, "CF_DSPBITMAP");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
796 defsymbol (&QCF_DSPMETAFILEPICT, "CF_DSPMETAFILEPICT");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
797 defsymbol (&QCF_DSPENHMETAFILE, "CF_DSPENHMETAFILE");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799 /* Selection strategies */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
800 DEFSYMBOL (Qreplace_all);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
801 DEFSYMBOL (Qreplace_existing);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
802
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
803 DEFERROR_STANDARD (Qselection_conversion_error, Qconversion_error);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
804 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
805
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
806 void
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
807 vars_of_select (void)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
808 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
809 Vselection_alist = Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
810 staticpro (&Vselection_alist);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
811
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
812 DEFVAR_LISP ("selection-converter-alist", &Vselection_converter_out_alist /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
813 An alist associating selection-types (such as STRING and TIMESTAMP) with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
814 functions. This is an alias for `selection-converter-out-alist', and should
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
815 be considered obsolete. Use the new name instead. */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
816
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
817 DEFVAR_LISP ("selection-converter-out-alist",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
818 &Vselection_converter_out_alist /*
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
819 An alist associating selection-types (such as STRING and TIMESTAMP) with
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
820 functions. These functions will be called with three args: the name
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
821 of the selection (typically PRIMARY, SECONDARY, or CLIPBOARD); a
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
822 desired type to which the selection should be converted; and the local
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
823 selection value (whatever had been passed to `own-selection').
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
824
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
825 The return type of these functions depends upon the device in question;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
826 for mswindows, a string should be returned containing data in the requested
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
827 format, or nil to indicate that the conversion could not be done. Additionally,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
828 it is permissible to return a cons of the form (DATA-TYPE . STRING) suggesting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
829 a new data type to use instead.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
830
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
831 For X, the return value should be one of:
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
832
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
833 -- nil (the conversion could not be done)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
834 -- a cons of a symbol and any of the following values; the symbol
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
835 explicitly specifies the type that will be sent.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
836 -- a string (If the type is not specified, then if Mule support exists,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
837 the string will be converted to Compound Text and sent in
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
838 the `COMPOUND_TEXT' format; otherwise (no Mule support),
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
839 the string will be left as-is and sent in the `STRING'
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
840 format. If the type is specified, the string will be
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
841 left as-is (or converted to binary format under Mule).
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
842 In all cases, 8-bit data it sent.)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
843 -- a character (With Mule support, will be converted to Compound Text
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
844 whether or not a type is specified. If a type is not
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
845 specified, a type of `STRING' or `COMPOUND_TEXT' will be
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
846 sent, as for strings.)
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
847 -- the symbol `NULL' (Indicates that there is no meaningful return value.
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
848 Empty 32-bit data with a type of `NULL' will be sent.)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
849 -- a symbol (Will be converted into an atom. If the type is not specified,
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
850 a type of `ATOM' will be sent.)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
851 -- an integer (Will be converted into a 16-bit or 32-bit integer depending
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
852 on the value. If the type is not specified, a type of
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
853 `INTEGER' will be sent.)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
854 -- a cons (HIGH . LOW) of integers (Will be converted into a 32-bit integer.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
855 If the type is not specified, a type of
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
856 `INTEGER' will be sent.)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
857 -- a vector of symbols (Will be converted into a list of atoms. If the type
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
858 is not specified, a type of `ATOM' will be sent.)
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
859 -- a vector of integers (Will be converted into a list of 16-bit integers.
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
860 If the type is not specified, a type of `INTEGER'
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
861 will be sent.)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
862 -- a vector of integers and/or conses (HIGH . LOW) of integers
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
863 (Will be converted into a list of 16-bit integers.
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2757
diff changeset
864 If the type is not specified, a type of `INTEGER'
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
865 will be sent.)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
866 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
867 Vselection_converter_out_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
868
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
869 DEFVAR_LISP ("selection-converter-in-alist",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
870 &Vselection_converter_in_alist /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
871 An alist associating selection-types (such as STRING and TIMESTAMP) with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
872 functions. These functions will be called with three args: the name
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
873 of the selection (typically PRIMARY, SECONDARY or CLIPBOARD); the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
874 type from which the selection should be converted; and the selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
875 value. These functions should return a suitable representation of the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
876 value, or nil to indicate that the conversion was not possible.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
877
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
878 See also `selection-converter-out-alist'. */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
879 Vselection_converter_in_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
880
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
881 DEFVAR_LISP ("selection-coercion-alist",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
882 &Vselection_coercion_alist /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
883 An alist associating selection-types (such as STRING and TIMESTAMP) with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
884 functions. These functions will be called with three args; the name
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
885 of the selection (typically PRIMARY, SECONDARY or CLIPBOARD); the type
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
886 from which the selection should be converted, and the selection value.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 The value passed will be *exactly the same value* that was given to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
888 `own-selection'; it should be converted into something suitable for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
889 return to a program calling `get-selection' with the appropriate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
890 parameters.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
891
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
892 See also `selection-converter-in-alist' and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
893 `selection-converter-out-alist'. */);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
894 Vselection_coercion_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
895
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
896 DEFVAR_LISP ("selection-appender-alist",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
897 &Vselection_appender_alist /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
898 An alist associating selection-types (such as STRING and TIMESTAMP) with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
899 functions. These functions will be called with four args; the name
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900 of the selection (typically PRIMARY, SECONDARY or CLIPBOARD); the type
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 of the selection; and two selection values. The functions are expected to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
902 return a value representing the catenation of the two values, or nil to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
903 indicate that this was not possible. */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
904 Vselection_appender_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
905
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
906 DEFVAR_LISP ("selection-buffer-killed-alist",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
907 &Vselection_buffer_killed_alist /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
908 An alist associating selection-types (such as STRING and TIMESTAMP) with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
909 functions. These functions will be called whenever a buffer is killed,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
910 with four args: the name of the selection (typically PRIMARY, SECONDARY
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
911 or CLIPBOARD); the type of the selection; the value of the selection; and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
912 the buffer that has just been killed. These functions should return a new
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
913 selection value, or nil to indicate that the selection value should be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
914 deleted. */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
915 Vselection_buffer_killed_alist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
916
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
917 DEFVAR_LISP ("selection-coercible-types",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 &Vselection_coercible_types /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 A list of selection types that are coercible---that is, types that may be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
920 automatically converted to another type. Selection values with types in this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
921 list may be subject to conversion attempts to other types. */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
922 Vselection_coercible_types = Qnil;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
923
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
924 DEFVAR_LISP ("lost-selection-hooks", &Vlost_selection_hooks /*
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
925 A function or functions to be called after we have been notified
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
926 that we have lost the selection. The function(s) will be called with one
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
927 argument, a symbol naming the selection (typically PRIMARY, SECONDARY, or
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
928 CLIPBOARD).
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
929 */ );
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
930 Vlost_selection_hooks = Qunbound;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
931 }