annotate src/select.c @ 5518:3cc7470ea71c

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