annotate src/select.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 183866b06e0b
children 42a86787d173
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
10 later version.
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
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 /* Synched up with: Not synched with FSF. */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
23
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
24 #include <config.h>
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
25 #include "lisp.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
26
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
27 #include "buffer.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
28 #include "device.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
29 #include "extents.h"
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
30 #include "console.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
31 #include "objects.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
32
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
33 #include "frame.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
34 #include "opaque.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
35 #include "select.h"
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
36
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
37 /* X Atoms */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
38 Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
39 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
40 QATOM_PAIR, QCOMPOUND_TEXT;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
41
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
42 /* Windows clipboard formats */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
43 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
44 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
45 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
46 QCF_OWNERDISPLAY, QCF_DSPTEXT, QCF_DSPBITMAP, QCF_DSPMETAFILEPICT,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
47 QCF_DSPENHMETAFILE;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
48
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
49 /* Selection strategy symbols */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
50 Lisp_Object Qreplace_all, Qreplace_existing;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
51
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
52 /* "Selection owner couldn't convert selection" */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
53 Lisp_Object Qselection_conversion_error;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
54
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
55 /* A couple of Lisp functions */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
56 Lisp_Object Qselect_convert_in, Qselect_convert_out, Qselect_coerce;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
57
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
58 /* 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
59 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
60 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
61 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
62 elisp-level extension of the emacs selection handling.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
63 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
64 Lisp_Object Vselection_converter_out_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
65 Lisp_Object Vselection_converter_in_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
66 Lisp_Object Vselection_coercion_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 Lisp_Object Vselection_appender_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68 Lisp_Object Vselection_buffer_killed_alist;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69 Lisp_Object Vselection_coercible_types;
414
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 Lisp_Object Vlost_selection_hooks;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
72
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
73 /* This is an association list whose elements are of the form
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
74 ( selection-name selection-value selection-timestamp )
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
75 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
76 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
77 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
78 selection data type, and value is any type of Lisp object.
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
79 selection-timestamp is the time at which emacs began owning this selection,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
80 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
81 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
82 that selection.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
83 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
84 selection-values.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
85 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
86 Lisp_Object Vselection_alist;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
87
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
88 /* 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
89 the selection value and converts it to the type. */
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
90 static Lisp_Object
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
91 get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
92 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
93 Lisp_Object local_value = assq_no_quit (selection_symbol, Vselection_alist);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
94
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
95 if (!NILP (local_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
96 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
97 Lisp_Object value_list = XCAR (XCDR (local_value));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
98 Lisp_Object value;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
99
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
100 /* First try to find an entry of the appropriate type */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
101 value = assq_no_quit (target_type, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
102
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
103 if (!NILP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
104 return XCDR (value);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
105 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
106
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
107 return Qnil;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
108 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
109
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
110 /* #### Should perhaps handle 'MULTIPLE. The code below is now completely
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
111 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
112 it here should anyone show an interest - ajh */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
113 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
114 else if (CONSP (target_type) &&
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
115 XCAR (target_type) == QMULTIPLE)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
116 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
117 Lisp_Object pairs = XCDR (target_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
118 int len = XVECTOR_LENGTH (pairs);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
119 int i;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
120 /* If the target is MULTIPLE, then target_type looks like
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
121 (MULTIPLE . [[SELECTION1 TARGET1] [SELECTION2 TARGET2] ... ])
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
122 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
123 return it as [[SELECTION1 <value1>] [SELECTION2 <value2>] ... ]
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 for (i = 0; i < len; i++)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
126 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
127 Lisp_Object pair = XVECTOR_DATA (pairs) [i];
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 x_get_local_selection (XVECTOR_DATA (pair) [0],
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
130 XVECTOR_DATA (pair) [1]);
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 return pairs;
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 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
135
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
136 DEFUN ("own-selection-internal", Fown_selection_internal, 2, 5, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
137 Give the selection SELECTION-NAME the value SELECTION-VALUE.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
138 SELECTION-NAME is a symbol, typically PRIMARY, SECONDARY, or CLIPBOARD.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
139 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
140 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
141 Optional arg HOW-TO-ADD specifies how the selection will be combined
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
142 with any existing selection(s) - see `own-selection' for more
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
143 information.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
144 Optional arg DATA-TYPE is a window-system-specific type.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
145 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
146 It defaults to the selected 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 (selection_name, selection_value, how_to_add, data_type, device))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
149 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
150 Lisp_Object selection_time, selection_data, prev_value = Qnil,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
151 value_list = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
152 Lisp_Object prev_real_value = Qnil;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
153 struct gcpro gcpro1;
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
154 int owned_p = 0;
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
155
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
156 CHECK_SYMBOL (selection_name);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
157 if (NILP (selection_value))
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
158 invalid_argument ("`selection-value' may not be nil", Qunbound);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
159
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
160 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
161 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
162
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
163 if (!EQ (how_to_add, Qappend) && !EQ (how_to_add, Qt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
164 && !EQ (how_to_add, Qreplace_existing)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
165 && !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
166 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
167 "replace_existing or t", how_to_add);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
168
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
169 #ifdef MULE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
170 if (NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
171 data_type = QCOMPOUND_TEXT;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 #else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 if (NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174 data_type = QSTRING;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 #endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
176
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
177 /* Examine the how-to-add argument */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
178 if (EQ (how_to_add, Qreplace_all) || NILP (how_to_add))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
179 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
180 Lisp_Object local_selection_data = assq_no_quit (selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
181 Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
182
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
183 if (!NILP (local_selection_data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 {
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
185 owned_p = 1;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
186 /* Don't use Fdelq() as that may QUIT;. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
187 if (EQ (local_selection_data, Fcar (Vselection_alist)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
188 Vselection_alist = Fcdr (Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
189 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
190 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
191 Lisp_Object rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
192 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
193 if (EQ (local_selection_data, Fcar (XCDR (rest))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
194 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
195 XCDR (rest) = Fcdr (XCDR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
196 break;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
197 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
199 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
201 else
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 /* Look for a previous value */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
204 prev_value = assq_no_quit (selection_name, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
205
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
206 if (!NILP (prev_value))
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
207 {
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
208 owned_p = 1;
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
209 value_list = XCAR (XCDR (prev_value));
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
210 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
211
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
212 if (!NILP (value_list))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
213 prev_real_value = assq_no_quit (data_type, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
214 }
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 /* Append values if necessary */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
217 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
218 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
219 /* Did we have anything of this type previously? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
220 if (!NILP (prev_real_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
221 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
222 if ((NILP (data_type) && STRINGP (selection_value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
223 && STRINGP (XCDR (prev_real_value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
224 || !NILP (data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
225 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
226 Lisp_Object function = assq_no_quit (data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227 Vselection_appender_alist);
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 (function))
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 (no function)",
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 function = XCDR (function);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
235
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
236 selection_value = call4 (function,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 selection_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
239 XCDR (prev_real_value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240 selection_value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242 if (NILP (selection_value))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
243 signal_error (Qinvalid_argument,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
244 "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
245 data_type);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
246 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
247 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
248 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
249 XCDR (prev_real_value),
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 458
diff changeset
250 selection_value);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
251 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
252
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 selection_data = Fcons (data_type, selection_value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254 value_list = Fcons (selection_data, value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
257 if (!NILP (prev_real_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
258 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 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
260
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
261 /* Delete the old type entry from the list */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
262 for (rest = value_list; !NILP (rest); rest = Fcdr (rest))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
263 if (EQ (prev_real_value, Fcar (XCDR (rest))))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
264 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
265 XCDR (rest) = Fcdr (XCDR (rest));
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
266 break;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
267 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
268 }
442
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 value_list = Fcons (Fcons (data_type, selection_value),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
273 }
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
274
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 /* Complete the local cache update; note that we destructively
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 modify the current list entry if there is one */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
277 if (NILP (prev_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
278 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 selection_data = list3 (selection_name, value_list, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280 Vselection_alist = Fcons (selection_data, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
281 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
282 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
283 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
284 selection_data = prev_value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
285 Fsetcar (XCDR (selection_data), value_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
287
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
288 GCPRO1 (selection_data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 /* 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
291 selection_alist */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
292 if (HAS_DEVMETH_P (XDEVICE (device), own_selection))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
293 selection_time = DEVMETH (XDEVICE (device), own_selection,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
294 (selection_name, selection_value,
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 456
diff changeset
295 how_to_add, data_type, owned_p));
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
296 else
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
297 selection_time = Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
298
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
299 Fsetcar (XCDR (XCDR (selection_data)), selection_time);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
300
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
301 UNGCPRO;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 414
diff changeset
302
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
303 return selection_value;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
304 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
305
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
306 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
307 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
308 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
309 device does not support this feature or the registration fails. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
310 (data_type, device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
311 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
312 /* Check arguments */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
313 CHECK_STRING (data_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
314
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
315 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
316 device = Fselected_device (Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
317
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
318 if (HAS_DEVMETH_P (XDEVICE (device), register_selection_data_type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
319 return DEVMETH (XDEVICE (device), register_selection_data_type,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
320 (data_type));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
321 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
322 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
323 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
324
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
325 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
326 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
327 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
328 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
329 (data_type, device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
330 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
331 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
332 device = Fselected_device (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 if (HAS_DEVMETH_P (XDEVICE (device), selection_data_type_name))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
335 return DEVMETH (XDEVICE (device), selection_data_type_name, (data_type));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
336 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
337 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
338 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
339
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
340 DEFUN ("available-selection-types", Favailable_selection_types, 1, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
341 Retrieve a list of currently available types of selection associated with
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
342 the given SELECTION-NAME, optionally on the specified DEVICE. This list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
343 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
344 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
345 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
346 (selection_name, device))
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 Lisp_Object types = Qnil, rest;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
349 struct gcpro gcpro1;
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 CHECK_SYMBOL (selection_name);
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 if (NILP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
354 device = Fselected_device (Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
355
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
356 GCPRO1 (types);
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 /* First check the device */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
359 if (HAS_DEVMETH_P (XDEVICE (device), available_selection_types))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
360 types = DEVMETH (XDEVICE (device), available_selection_types,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
361 (selection_name));
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 /* Now look in the list */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
364 rest = assq_no_quit (selection_name, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
365
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
366 if (NILP (rest))
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 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
369
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
370 return types;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
371 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
372
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
373 /* 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
374 for (rest = XCAR (XCDR (rest)); !NILP (rest); rest = XCDR (rest))
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 Lisp_Object value = XCDR (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377 Lisp_Object type = XCAR (XCAR (rest));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
378
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
379 types = Fcons (type, types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
380
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
381 if ((STRINGP (value) || EXTENTP (value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
382 && (NILP (type) || EQ (type, QSTRING)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
383 || EQ (type, QTEXT) || EQ (type, QCOMPOUND_TEXT)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
384 types = Fcons (QTEXT, Fcons (QCOMPOUND_TEXT, Fcons (QSTRING, types)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
385 else if (INTP (value) && NILP (type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
386 types = Fcons (QINTEGER, types);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
387 else if (SYMBOLP (value) && NILP (type))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
388 types = Fcons (QATOM, 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
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
391 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
392
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
393 return types;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
394 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
395
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
396 /* remove a selection from our local copy
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
397 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
398 void
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
399 handle_selection_clear (Lisp_Object selection_symbol)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
400 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
401 Lisp_Object local_selection_data = assq_no_quit (selection_symbol,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
402 Vselection_alist);
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
403
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
404 /* 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
405 if (NILP (local_selection_data)) return;
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 /* Otherwise, we're really honest and truly being told to drop it.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
408 Don't use Fdelq() as that may QUIT;.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
409 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
410 if (EQ (local_selection_data, Fcar (Vselection_alist)))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
411 Vselection_alist = Fcdr (Vselection_alist);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
412 else
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
413 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
414 Lisp_Object rest;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
415 for (rest = Vselection_alist; !NILP (rest); rest = Fcdr (rest))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
416 if (EQ (local_selection_data, Fcar (XCDR (rest))))
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 XCDR (rest) = Fcdr (XCDR (rest));
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
419 break;
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 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
422
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
423 /* Let random lisp code notice that the selection has been stolen.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
424 */
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 Lisp_Object rest;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
427 Lisp_Object val = Vlost_selection_hooks;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
428 if (!UNBOUNDP (val) && !NILP (val))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
429 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
430 if (CONSP (val) && !EQ (XCAR (val), Qlambda))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
431 for (rest = val; !NILP (rest); rest = Fcdr (rest))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
432 call1 (Fcar (rest), selection_symbol);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
433 else
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
434 call1 (val, selection_symbol);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
435 }
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 }
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 DEFUN ("disown-selection-internal", Fdisown_selection_internal, 1, 3, 0, /*
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
440 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
441 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
442 (selection_name, selection_time, device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
443 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
444 if (NILP (assq_no_quit (selection_name, Vselection_alist)))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
445 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
446
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
447 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
448 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
449
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
450 MAYBE_DEVMETH (XDEVICE (device), disown_selection,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
451 (selection_name, selection_time));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
452
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
453 handle_selection_clear (selection_name);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
454
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
455 return Qt;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
456 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
457
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
458 DEFUN ("selection-owner-p", Fselection_owner_p, 0, 1, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
459 Return t if the current emacs process owns SELECTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
460 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
461 the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
462 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
463 */
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
464 (selection))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
465 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
466 CHECK_SYMBOL (selection);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
467 if (EQ (selection, Qnil)) selection = QPRIMARY;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
468 else if (EQ (selection, Qt)) selection = QSECONDARY;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
469
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
470 return NILP (Fassq (selection, Vselection_alist)) ? Qnil : Qt;
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 DEFUN ("selection-exists-p", Fselection_exists_p, 0, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
474 Whether there is currently an owner for SELECTION.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
475 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
476 the symbols PRIMARY, SECONDARY, or CLIPBOARD. (For convenience, the symbol
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
477 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
478 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
479 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
480 (selection, data_type, device))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
481 {
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
482 CHECK_SYMBOL (selection);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
483 if (NILP (data_type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
484 && !NILP (Fselection_owner_p (selection)))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
485 return Qt;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
486
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
487 if (NILP (device))
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
488 device = Fselected_device (Qnil);
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
489
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
490 return HAS_DEVMETH_P (XDEVICE (device), selection_exists_p) ?
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491 DEVMETH (XDEVICE (device), selection_exists_p, (selection, data_type))
414
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
492 : Qnil;
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
493 }
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
494
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
495 /* Get the timestamp of the given selection */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496 DEFUN ("get-selection-timestamp", Fget_selection_timestamp, 1, 1, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
497 Return the timestamp associated with the specified SELECTION, if it exists.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 Note that the timestamp is a device-specific object, and may not actually be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499 visible from Lisp.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
501 (selection))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
502 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
503 Lisp_Object local_value = assq_no_quit (selection, Vselection_alist);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
504
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
505 if (!NILP (local_value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
506 return XCAR (XCDR (XCDR (local_value)));
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,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
512 simply return our selection value. If we are not the owner, this
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
513 will block until all of the data has arrived.
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 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
838 the 'COMPOUND_TEXT format; otherwise (no Mule support),
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
839 the string will be left as-is and sent in the 'STRING
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
845 specified, a type of 'STRING or 'COMPOUND_TEXT will be
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
846 sent, as for strings.)
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
847 -- the symbol 'NULL (Indicates that there is no meaningful return value.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
848 Empty 32-bit data with a type of 'NULL will be sent.)
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,
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
850 a type of 'ATOM will be sent.)
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
853 'INTEGER will be sent.)
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
856 'INTEGER will be sent.)
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
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
858 is not specified, a type of 'ATOM will be sent.)
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.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
diff changeset
860 If the type is not specified, a type of 'INTEGER
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.
da8ed4261e83 Import from CVS: tag r21-2-15
cvs
parents:
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 }