annotate lisp/select.el @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents 54fa1a5c2d12
children 42a86787d173
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; select.el --- Lisp interface to windows selections.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1998 Andy Piper.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1990, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995 Sun Microsystems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Keywords: extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ;; under the terms of the GNU General Public License as published by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ;; any later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 ;; XEmacs is distributed in the hope that it will be useful, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ;; General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
23 ;; along with XEmacs; see the file COPYING. If not, write to the
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;; Boston, MA 02111-1307, USA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Synched up with: Not in FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
31 ;; This file is dumped with XEmacs
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 (defvar selected-text-type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 (if (featurep 'mule) '(COMPOUND_TEXT STRING) 'STRING)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 "The type atom used to obtain selections from the X server.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 Can be either a valid X selection data type, or a list of such types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 COMPOUND_TEXT and STRING are the most commonly used data types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 If a list is provided, the types are tried in sequence until
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 there is a successful conversion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
43 (defvar selection-sets-clipboard nil
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 "Controls the selection's relationship to the clipboard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 When non-nil, any operation that sets the primary selection will also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 set the clipboard.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (defun copy-primary-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 "Copy the selection to the Clipboard and the kill ring."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 (cut-copy-clear-internal 'copy)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 (defun kill-primary-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 "Copy the selection to the Clipboard and the kill ring, then delete it."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 (cut-copy-clear-internal 'cut)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (defun delete-primary-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 "Delete the selection without copying it to the Clipboard or the kill ring."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 (cut-copy-clear-internal 'clear)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (defun yank-clipboard-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 "Insert the current Clipboard selection at point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 (when (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (setq last-command nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (setq this-command 'yank) ; so that yank-pop works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 (let ((clip (get-clipboard)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (or clip (error "there is no clipboard selection"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 (insert clip))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 (defun get-clipboard ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 "Return text pasted to the clipboard."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 (get-selection 'CLIPBOARD))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (define-device-method get-cutbuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 "Return the value of one of the cut buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 This will do nothing under anything other than X.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (defun get-selection-no-error (&optional type data-type)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
86 "Return the value of a window-system selection.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 The argument TYPE (default `PRIMARY') says which selection,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 and the argument DATA-TYPE (default `STRING', or `COMPOUND_TEXT' under Mule)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
89 says how to convert the data. Returns NIL if there is no selection."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
90 (condition-case nil (get-selection type data-type) (t nil)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (defun get-selection (&optional type data-type)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
93 "Return the value of a window-system selection.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 The argument TYPE (default `PRIMARY') says which selection,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 and the argument DATA-TYPE (default `STRING', or `COMPOUND_TEXT' under Mule)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 says how to convert the data. If there is no selection an error is signalled."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (or type (setq type 'PRIMARY))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 (or data-type (setq data-type selected-text-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (let ((text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (if (consp data-type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (condition-case err
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (get-selection-internal type (car data-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 (selection-conversion-error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 (if (cdr data-type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (get-selection type (cdr data-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (signal (car err) (cdr err)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 (get-selection-internal type data-type))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 text))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 ;; FSFmacs calls this `x-set-selection', and reverses the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
111 ;; first two arguments (duh ...). This order is more logical.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
112 (defun own-selection (data &optional type how-to-add data-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
113 "Make a window-system selection of type TYPE and value DATA.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 The argument TYPE (default `PRIMARY') says which selection,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
115 and DATA specifies the contents. DATA may be any lisp data type
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
116 that can be converted using the function corresponding to DATA-TYPE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
117 in `select-converter-alist'---strings are the usual choice, but
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
118 other types may be permissible depending on the DATA-TYPE parameter
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
119 (if DATA-TYPE is not supplied, the default behavior is window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
120 system specific, but strings are always accepted).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
121 HOW-TO-ADD may be any of the following:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
122
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
123 'replace-all or nil -- replace all data in the selection.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
124 'replace-existing -- replace data for specified DATA-TYPE only.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
125 'append or t -- append data to existing DATA-TYPE data.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
126
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
127 DATA-TYPE is the window-system specific data type identifier
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
128 (see `register-selection-data-type' for more information).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 The selection may also be a cons of two markers pointing to the same buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 or an overlay. In these cases, the selection is considered to be the text
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
132 between the markers *at whatever time the selection is examined* (note
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
133 that the window system clipboard does not necessarily duplicate this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
134 behavior - it doesn't on mswindows for example).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 Thus, editing done in the buffer after you specify the selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 can alter the effective value of the selection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 The data may also be a vector of valid non-vector selection values.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 Interactively, the text of the region is used as the selection value."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (interactive (if (not current-prefix-arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (list (read-string "Store text for pasting: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 (list (substring (region-beginning) (region-end)))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
144 ;; calling own-selection-internal will mess this up, so preserve it.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
145 (let ((zmacs-region-stays zmacs-region-stays))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
146 ;FSFmacs huh?? It says:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
147 ;; "This is for temporary compatibility with pre-release Emacs 19."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
148 ;(if (stringp type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
149 ; (setq type (intern type)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
150 (or type (setq type 'PRIMARY))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
151 (if (null data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
152 (disown-selection-internal type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
153 (own-selection-internal type data how-to-add data-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
154 (when (and (eq type 'PRIMARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
155 selection-sets-clipboard)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
156 (own-selection-internal 'CLIPBOARD data how-to-add data-type)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
157 (cond ((eq type 'PRIMARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
158 (setq primary-selection-extent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
159 (select-make-extent-for-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
160 data primary-selection-extent)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
161 ((eq type 'SECONDARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
162 (setq secondary-selection-extent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
163 (select-make-extent-for-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
164 data secondary-selection-extent)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
165 ;; zmacs-region-stays is for commands, not low-level functions.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
166 ;; when behaving as the latter, we better not set it, or we will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
167 ;; cause unwanted sticky-region behavior in kill-region and friends.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
168 (if (interactive-p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
169 (setq zmacs-region-stays t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 (defun dehilight-selection (selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 "for use as a value of `lost-selection-hooks'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (cond ((eq selection 'PRIMARY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 (if primary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (if (consp primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (mapcar 'delete-extent primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (delete-extent primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (setq primary-selection-extent nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (if zmacs-regions (zmacs-deactivate-region)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 ((eq selection 'SECONDARY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (if secondary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (if (consp secondary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 (mapcar 'delete-extent secondary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (delete-extent secondary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (setq secondary-selection-extent nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 (setq lost-selection-hooks 'dehilight-selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
193 (defun own-clipboard (string &optional push)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
194 "Paste the given string to the window system Clipboard.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
195 See `interprogram-cut-function' for more information."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (own-selection string 'CLIPBOARD))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (defun disown-selection (&optional secondary-p)
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
199 "Assuming we own the selection, disown it.
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
200 With an argument, discard the secondary selection instead of the
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
201 primary selection."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (disown-selection-internal (if secondary-p 'SECONDARY 'PRIMARY))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 (when (and selection-sets-clipboard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (or (not secondary-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (eq secondary-p 'PRIMARY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (eq secondary-p 'CLIPBOARD)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 (disown-selection-internal 'CLIPBOARD)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 ;; selections and active regions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 ;; If and only if zmacs-regions is true:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ;; When a mark is pushed and the region goes into the "active" state, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 ;; assert it as the Primary selection. This causes it to be hilighted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 ;; When the region goes into the "inactive" state, we disown the Primary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 ;; selection, causing the region to be dehilighted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 ;; Note that it is possible for the region to be in the "active" state
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 ;; and not be hilighted, if it is in the active state and then some other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 ;; application asserts the selection. This is probably not a big deal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (defun activate-region-as-selection ()
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
223 (cond (mouse-track-rectangle-p (mouse-track-activate-rectangular-selection))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
224 ((marker-buffer (mark-marker t))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
225 (own-selection (cons (point-marker t) (mark-marker t))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 (defvar primary-selection-extent nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 "The extent of the primary selection; don't use this.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (defvar secondary-selection-extent nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 "The extent of the secondary selection; don't use this.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (defun select-make-extent-for-selection (selection previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 ;; Given a selection, this makes an extent in the buffer which holds that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 ;; selection, for highlighting purposes. If the selection isn't associated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 ;; with a buffer, this does nothing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (let ((buffer nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (valid (and (extentp previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (extent-object previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 (buffer-live-p (extent-object previous-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (cond ((stringp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;; if we're selecting a string, lose the previous extent used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 ;; to highlight the selection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 (setq valid nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 ((consp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (setq start (min (car selection) (cdr selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 end (max (car selection) (cdr selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 valid (and valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (eq (marker-buffer (car selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (extent-object previous-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 buffer (marker-buffer (car selection))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 ((extentp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (setq start (extent-start-position selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 end (extent-end-position selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 valid (and valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (eq (extent-object selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (extent-object previous-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 buffer (extent-object selection)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (signal 'error (list "invalid selection" selection))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (if valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (if (listp previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (mapcar 'delete-extent previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (delete-extent previous-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (if (not buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 ;; string case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 ;; normal case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (if valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 (set-extent-endpoints previous-extent start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 (setq previous-extent (make-extent start end buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 ;; Make the extent be closed on the right, which means that if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ;; characters are inserted exactly at the end of the extent, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 ;; extent will grow to cover them. This is important for shell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 ;; buffers - suppose one makes a selection, and one end is at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 ;; point-max. If the shell produces output, that marker will remain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 ;; at point-max (its position will increase). So it's important that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 ;; the extent exhibit the same behavior, lest the region covered by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 ;; the extent (the visual indication), and the region between point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 ;; and mark (the actual selection value) become different!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (set-extent-property previous-extent 'end-open nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 (mouse-track-rectangle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (setq previous-extent (list previous-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 (default-mouse-track-next-move-rect start end previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 previous-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (defun valid-simple-selection-p (data)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
298 "An obsolete function that tests whether something was a valid simple
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
299 selection using the old XEmacs selection support. You shouldn't use this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
300 any more, because just about anything could be a valid selection now."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (or (stringp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 ;FSFmacs huh?? (symbolp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (integerp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (and (consp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 (integerp (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (or (integerp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 (and (consp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (integerp (car (cdr data))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (extentp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (and (consp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (markerp (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (markerp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (marker-buffer (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (marker-buffer (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (eq (marker-buffer (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (marker-buffer (cdr data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 (buffer-live-p (marker-buffer (car data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 (buffer-live-p (marker-buffer (cdr data))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (defun cut-copy-clear-internal (mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (or (memq mode '(cut copy clear)) (error "unkown mode %S" mode))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (or (selection-owner-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (error "XEmacs does not own the primary selection"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 (setq last-command nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (or primary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (error "the primary selection is not an extent?"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (let (rect-p b s e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 ((consp primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 (setq rect-p t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 b (extent-object (car primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 s (extent-start-position (car primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 e (extent-end-position (car (reverse primary-selection-extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 (setq rect-p nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 b (extent-object primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 s (extent-start-position primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 e (extent-end-position primary-selection-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (set-buffer b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (cond ((memq mode '(cut copy))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (if rect-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 ;; why is killed-rectangle free? Is it used somewhere?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 ;; should it be defvarred?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 (setq killed-rectangle (extract-rectangle s e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (kill-new (mapconcat #'identity killed-rectangle "\n")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 (copy-region-as-kill s e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 ;; Maybe killing doesn't own clipboard. Make sure it happens.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 ;; This memq is kind of grody, because they might have done it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 ;; some other way, but owning the clipboard twice in that case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 ;; wouldn't actually hurt anything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 (or (and (consp kill-hooks) (memq 'own-clipboard kill-hooks))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (own-clipboard (car kill-ring)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (cond ((memq mode '(cut clear))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (if rect-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (delete-rectangle s e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (delete-region s e))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 (disown-selection nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
362
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 ;;; Functions to convert the selection into various other selection
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
364 ;;; types.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
365
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
366 ;; These next three functions get called by C code...
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
367 (defun select-convert-in (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
368 "Attempt to convert the specified external VALUE to the specified DATA-TYPE,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
369 for the specified SELECTION. Return nil if this is impossible, or a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
370 suitable internal representation otherwise."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
371 (when value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
372 (let ((handler-fn (cdr (assq type selection-converter-in-alist))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
373 (when handler-fn
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
374 (apply handler-fn (list selection type value))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
376 (defun select-convert-out (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
377 "Attempt to convert the specified internal VALUE for the specified DATA-TYPE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
378 and SELECTION. Return nil if this is impossible, or a suitable external
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
379 representation otherwise."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
380 (when value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
381 (let ((handler-fn (cdr (assq type selection-converter-out-alist))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
382 (when handler-fn
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
383 (apply handler-fn (list selection type value))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
384
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
385 (defun select-coerce (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
386 "Attempt to convert the specified internal VALUE to a representation
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
387 suitable for return from `get-selection' in the specified DATA-TYPE. Return
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
388 nil if this is impossible, or a suitable representation otherwise."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
389 (when value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
390 (let ((handler-fn (cdr (assq type selection-coercion-alist))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
391 (when handler-fn
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
392 (apply handler-fn (list selection type value))))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
393
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
394 ;; The rest of the functions on this "page" are conversion handlers,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
395 ;; append handlers and buffer-kill handlers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 (defun select-convert-to-text (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (cond ((stringp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (set-buffer (extent-object value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (buffer-substring (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (extent-end-position value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 (or (eq (marker-buffer (car value)) (marker-buffer (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 (list "markers must be in the same buffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (car value) (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (set-buffer (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (error "selection is in a killed buffer")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (buffer-substring (car value) (cdr value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
421 (defun select-coerce-to-text (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
422 (select-convert-to-text selection type value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
423
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
424 (defun select-convert-from-text (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
425 (when (stringp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
426 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
427
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (defun select-convert-to-string (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (let ((outval (select-convert-to-text selection type value)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
430 ;; force the string to be not in Compound Text format. This grubby
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
431 ;; hack will go soon, to be replaced by a more general mechanism.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (if (stringp outval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (cons 'STRING outval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 outval)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 (defun select-convert-to-compound-text (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 ;; converts to compound text automatically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 (select-convert-to-text selection type value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (defun select-convert-to-length (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (let ((value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (cond ((stringp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (length value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (extent-length value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (or (eq (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (marker-buffer (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (list "markers must be in the same buffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (car value) (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (abs (- (car value) (cdr value)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (if value ; force it to be in 32-bit format.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (cons (ash value -16) (logand value 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
459 (defun select-convert-from-length (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
460 (select-convert-to-length selection type value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
461
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (defun select-convert-to-targets (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 ;; return a vector of atoms, but remove duplicates first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (let* ((all (cons 'TIMESTAMP (mapcar 'car selection-converter-alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (rest all))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (while rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (cond ((memq (car rest) (cdr rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (setcdr rest (delq (car rest) (cdr rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 (setq rest (cdr rest)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (apply 'vector all)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (defun select-convert-to-delete (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (disown-selection-internal selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 ;; A return value of nil means that we do not know how to do this conversion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 ;; and replies with an "error". A return value of NULL means that we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 ;; done the conversion (and any side-effects) but have no value to return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 'NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (defun select-convert-to-filename (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (buffer-file-name (or (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (error "selection is in a killed buffer"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (buffer-file-name (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 (error "selection is in a killed buffer"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
491 (defun select-convert-from-filename (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
492 (when (stringp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
493 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
494
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (defun select-convert-to-charpos (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (let (a b tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (setq a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (setq a (car value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 b (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 (setq a (1- a) b (1- b)) ; zero-based
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 (defun select-convert-to-lineno (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 (let (a b buf tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (setq buf (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (setq a (marker-position (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 b (marker-position (cdr value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 buf (marker-buffer (car value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (setq a (1+ (count-lines 1 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (setq b (1+ (count-lines 1 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (defun select-convert-to-colno (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 (let (a b buf tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (setq buf (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 (setq a (car value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 b (cdr value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 buf (marker-buffer a))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (setq a (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 (setq b (current-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (defun select-convert-to-sourceloc (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (let (a b buf file-name tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (setq buf (or (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (error "selection is in a killed buffer"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 b (extent-end-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 file-name (buffer-file-name buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (setq a (marker-position (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 b (marker-position (cdr value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 buf (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (error "selection is in a killed buffer"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 file-name (buffer-file-name buf))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (setq a (1+ (count-lines 1 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (setq b (1+ (count-lines 1 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (format "%s:%d" file-name a)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (defun select-convert-to-os (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (symbol-name system-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 (defun select-convert-to-host (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (system-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (defun select-convert-to-user (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (user-full-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (defun select-convert-to-class (selection type size)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
600 (symbol-value 'x-emacs-application-class))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 ;; We do not try to determine the name Emacs was invoked with,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 ;; because it is not clean for a program's behavior to depend on that.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (defun select-convert-to-name (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 ;invocation-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 "xemacs")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (defun select-convert-to-integer (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 (and (integerp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (cons (ash value -16) (logand value 65535))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
612 ;; Can convert from the following integer representations
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
613 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
614 ;; integer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
615 ;; (integer . integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
616 ;; (integer integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
617 ;; (list [integer|(integer . integer)]*)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
618 ;; (vector [integer|(integer . integer)]*)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
619 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
620 ;; Cons'd integers get cleaned up a little.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
621
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
622 (defun select-convert-from-integer (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
623 (cond ((integerp value) ; Integer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
624 value)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
625
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
626 ((and (consp value) ; (integer . integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
627 (integerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
628 (integerp (cdr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
629 (if (eq (car value) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
630 (cdr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
631 (if (and (eq (car value) -1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
632 (< (cdr value) 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
633 (cdr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
634 value)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
635
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
636 ((and (listp value) ; (integer integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
637 (eq (length value) 2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
638 (integerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
639 (integerp (cadr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
640 (if (eq (car value) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
641 (cadr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
642 (if (and (eq (car value) -1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
643 (< (cdr value) 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
644 (- (cadr value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
645 (cons (car value) (cadr value)))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
646
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
647 ((listp value) ; list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
648 (if (cdr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
649 (mapcar '(lambda (x)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
650 (select-convert-from-integer selection type x))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
651 value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
652 (select-convert-from-integer selection type (car value))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
653
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
654 ((vectorp value) ; vector
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
655 (if (eq (length value) 1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
656 (select-convert-from-integer selection type (aref value 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
657 (mapvector '(lambda (x)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
658 (select-convert-from-integer selection type x))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
659 value)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
660
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
661 (t nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
662 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
663
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 (defun select-convert-to-atom (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (and (symbolp value) value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
667 ;;; CF_xxx conversions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
668 (defun select-convert-from-cf-text (selection type value)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
669 (let ((value (decode-coding-string value 'mswindows-multibyte)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
670 (replace-in-string (if (string-match "\0" value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
671 (substring value 0 (match-beginning 0))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
672 value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
673 "\\(\r\n\\|\n\r\\)" "\n" t)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
674
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
675 (defun select-convert-from-cf-unicodetext (selection type value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
676 (let ((value (decode-coding-string value 'mswindows-unicode)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
677 (replace-in-string (if (string-match "\0" value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
678 (substring value 0 (match-beginning 0))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
679 value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
680 "\\(\r\n\\|\n\r\\)" "\n" t)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
681
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
682 (defun select-convert-to-cf-text (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
683 (let ((text (select-convert-to-text selection type value)))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
684 (encode-coding-string
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
685 (concat (replace-in-string text "\n" "\r\n" t) "\0")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
686 'mswindows-multibyte)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
687
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
688 (defun select-convert-to-cf-unicodetext (selection type value)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
689 (let ((text (select-convert-to-text selection type value)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
690 (encode-coding-string
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
691 (concat (replace-in-string text "\n" "\r\n" t) "\0")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
692 'mswindows-unicode)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
693
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
694 ;;; Appenders
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
695 (defun select-append-to-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
696 (let ((text1 (select-convert-to-text selection 'STRING value1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
697 (text2 (select-convert-to-text selection 'STRING value2)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
698 (if (and text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
699 (concat text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
700 nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
701
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
702 (defun select-append-to-string (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
703 (select-append-to-text selection type value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
704
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
705 (defun select-append-to-compound-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
706 (select-append-to-text selection type value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
707
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
708 (defun select-append-to-cf-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
709 (let ((text1 (select-convert-from-cf-text selection 'CF_TEXT value1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
710 (text2 (select-convert-from-cf-text selection 'CF_TEXT value2)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
711 (if (and text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
712 (select-convert-to-cf-text selection type (concat text1 text2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
713 nil)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
715 (defun select-append-to-cf-unicodetext (selection type value1 value2)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
716 (let ((text1 (select-convert-from-cf-unicodetext selection
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
717 'CF_UNICODETEXT value1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
718 (text2 (select-convert-from-cf-unicodetext selection
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
719 'CF_UNICODETEXT value2)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
720 (if (and text1 text2)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
721 (select-convert-to-cf-unicodetext selection type (concat text1 text2))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
722 nil)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
723
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
724 (defun select-append-default (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
725 ;; This appender gets used if the type is "nil" - i.e. default.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
726 ;; It should probably have more cases implemented than it does - e.g.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
727 ;; appending numbers to strings, etc...
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
728 (cond ((and (stringp value1) (stringp value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
729 (select-append-to-string selection 'STRING value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
730 (t nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
731
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
732 ;;; Buffer kill handlers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
733
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
734 (defun select-buffer-killed-default (selection type value buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
735 ;; This handler gets used if the type is "nil".
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
736 (cond ((extentp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
737 (if (eq (extent-object value) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
738 ; If this selection is on the clipboard, grab it quick
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
739 (when (eq selection 'CLIPBOARD)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
740 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
741 (set-buffer (extent-object value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
742 (save-restriction
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
743 (widen)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
744 (buffer-substring (extent-start-position value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
745 (extent-end-position value)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
746 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
747 ((markerp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
748 (unless (eq (marker-buffer value) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
749 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
750 ((and (consp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
751 (markerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
752 (markerp (cdr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
753 (if (or (eq (marker-buffer (car value)) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
754 (eq (marker-buffer (cdr value)) buffer))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
755 ; If this selection is on the clipboard, grab it quick
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
756 (when (eq selection 'CLIPBOARD)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
757 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
758 (set-buffer (marker-buffer (car value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
759 (save-restriction
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
760 (widen)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
761 (buffer-substring (car value) (cdr value)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
762 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
763 (t value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
764
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
765 (defun select-buffer-killed-text (selection type value buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
766 (select-buffer-killed-default selection type value buffer))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
767
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
768 ;; Types listed in here can be selections of XEmacs
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
769 (setq selection-converter-out-alist
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 '((TEXT . select-convert-to-text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (STRING . select-convert-to-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (COMPOUND_TEXT . select-convert-to-compound-text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (TARGETS . select-convert-to-targets)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (LENGTH . select-convert-to-length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (DELETE . select-convert-to-delete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 (FILE_NAME . select-convert-to-filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (CHARACTER_POSITION . select-convert-to-charpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 (SOURCE_LOC . select-convert-to-sourceloc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 (LINE_NUMBER . select-convert-to-lineno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (COLUMN_NUMBER . select-convert-to-colno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 (OWNER_OS . select-convert-to-os)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 (HOST_NAME . select-convert-to-host)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (USER . select-convert-to-user)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 (CLASS . select-convert-to-class)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (NAME . select-convert-to-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (ATOM . select-convert-to-atom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (INTEGER . select-convert-to-integer)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
788 (CF_TEXT . select-convert-to-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
789 (CF_UNICODETEXT . select-convert-to-cf-unicodetext)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
790 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
791
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
792 ;; Types listed here can be selections foreign to XEmacs
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
793 (setq selection-converter-in-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
794 '(; Specific types that get handled by generic converters
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
795 (COMPOUND_TEXT . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
796 (SOURCE_LOC . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
797 (OWNER_OS . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
798 (HOST_NAME . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
799 (USER . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
800 (CLASS . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
801 (NAME . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
802 ; Generic types
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
803 (INTEGER . select-convert-from-integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
804 (TEXT . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
805 (STRING . select-convert-from-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
806 (LENGTH . select-convert-from-length)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
807 (FILE_NAME . select-convert-from-filename)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
808 (CF_TEXT . select-convert-from-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
809 (CF_UNICODETEXT . select-convert-from-cf-unicodetext)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
812 ;; Types listed here have special coercion functions that can munge
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
813 ;; other types. This can also be used to add special features - e.g.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
814 ;; being able to pass a region or a cons of markers to own-selection,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
815 ;; but getting the *current* text in the region back when calling
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
816 ;; get-selection.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
817 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
818 ;; Any function listed in here *will be called* whenever a value of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
819 ;; its type is retrieved from the internal selection cache, or when
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
820 ;; no suitable values could be found in which case XEmacs looks for
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
821 ;; values with types listed in selection-coercible-types.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
822 (setq selection-coercion-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
823 '((TEXT . select-coerce-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
824 (STRING . select-coerce-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
825 (COMPOUND_TEXT . select-coerce-to-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
826 (CF_TEXT . select-coerce-to-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
827 (CF_UNICODETEXT . select-coerce-to-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
828 ))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
829
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
830 ;; Types listed here can be appended by own-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
831 (setq selection-appender-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
832 '((nil . select-append-default)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
833 (TEXT . select-append-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
834 (STRING . select-append-to-string)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
835 (COMPOUND_TEXT . select-append-to-compound-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
836 (CF_TEXT . select-append-to-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
837 (CF_UNICODETEXT . select-append-to-cf-unicodetext)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
838 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
839
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
840 ;; Types listed here have buffer-kill handlers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
841 (setq selection-buffer-killed-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
842 '((nil . select-buffer-killed-default)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
843 (TEXT . select-buffer-killed-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
844 (STRING . select-buffer-killed-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
845 (COMPOUND_TEXT . select-buffer-killed-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
846 (CF_TEXT . select-buffer-killed-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
847 (CF_UNICODETEXT . select-buffer-killed-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
848 ))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
849
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
850 ;; Lists of types that are coercible (can be converted to other types)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
851 (setq selection-coercible-types '(TEXT STRING COMPOUND_TEXT CF_TEXT CF_UNICODETEXT))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
852
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 ;;; select.el ends here