annotate lisp/select.el @ 5750:66d2f63df75f

Correct some spelling and formatting in behavior.el. Mentioned in tracker issue 826, the third thing mentioned there (the file name at the bottom of the file) had already been fixed. lisp/ChangeLog addition: 2013-08-05 Aidan Kehoe <kehoea@parhasard.net> * behavior.el: (override-behavior): Correct some spelling and formatting here, thank you Steven Mitchell in tracker issue 826.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Aug 2013 10:05:32 +0100
parents 0df3cedee9ac
children bbe4146603db
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.
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
6 ;; Copyright (C) 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; Keywords: extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
13 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
14 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
15 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
16 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
18 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
19 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
20 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
21 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4783
diff changeset
24 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;;; Synched up with: Not in FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
30 ;; This file is dumped with XEmacs
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
34 ;; We prefer UTF8_STRING to COMPOUND_TEXT because, even though the latter
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
35 ;; gives us more information when taking data from other XEmacs invocations,
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
36 ;; Mozilla will happily give us broken COMPOUND_TEXT where a non-broken
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
37 ;; UTF8_STRING is available.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
38 (defvar selection-preferred-types
5364
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
39 `(UTF8_STRING ,@(and (featurep 'mule) '(COMPOUND_TEXT)) STRING
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
40 ,@(mapcan #'(lambda (format)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
41 (and (featurep format)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
42 (list (intern (format "image/%s" format)))))
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
43 '(png gif jpeg tiff xpm xbm)))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
44 "An ordered list of X11 type atoms for selections we want to receive.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
45 We prefer UTF8_STRING over COMPOUND_TEXT, for compatibility with a certain
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
46 widely-used browser suite, and COMPOUND_TEXT over STRING. (COMPOUND_TEXT
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
47 isn't available on non-Mule.) We also accept several image types.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
48
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
49 For compatibility, this can be a single atom. ")
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
50
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
51 ;; Renamed because it was just ridiculous for it to be mostly image formats
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
52 ;; and named selected-text-type.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
53 (define-obsolete-variable-alias 'selected-text-type 'selection-preferred-types)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
55 (defvar selection-sets-clipboard nil
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 "Controls the selection's relationship to the clipboard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 When non-nil, any operation that sets the primary selection will also
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 set the clipboard.")
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 copy-primary-selection ()
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
61 "Copy the selection to the Clipboard and the kill ring.
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
62 This is similar to the command \\[kill-ring-save] except that it will
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
63 save to the Clipboard even if that command doesn't, and it handles rectangles
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
64 properly."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 (cut-copy-clear-internal 'copy)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 (defun kill-primary-selection ()
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
70 "Copy the selection to the Clipboard and the kill ring, then delete it.
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
71 This is similar to the command \\[kill-region] except that it will
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
72 save to the Clipboard even if that command doesn't, and it handles rectangles
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
73 properly."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 (cut-copy-clear-internal 'cut)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 (defun delete-primary-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 "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
80 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 (and (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (cut-copy-clear-internal 'clear)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 (defun yank-clipboard-selection ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 "Insert the current Clipboard selection at point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 (interactive "*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 (when (console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 (setq last-command nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (setq this-command 'yank) ; so that yank-pop works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (let ((clip (get-clipboard)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (or clip (error "there is no clipboard selection"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (insert clip))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (defun get-clipboard ()
829
42a86787d173 [xemacs-hg @ 2002-05-07 15:58:46 by stephent]
stephent
parents: 771
diff changeset
96 "Return text pasted to the clipboard.
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
97 Not suitable for `interprogram-paste-function', use `get-clipboard-foreign'."
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
98 (get-selection 'CLIPBOARD))
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
99
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
100 (defun get-clipboard-foreign ()
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
101 "Return text pasted to the clipboard by another program.
829
42a86787d173 [xemacs-hg @ 2002-05-07 15:58:46 by stephent]
stephent
parents: 771
diff changeset
102 See `interprogram-paste-function' for more information."
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
103 (get-selection-foreign 'CLIPBOARD))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (define-device-method get-cutbuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 "Return the value of one of the cut buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 This will do nothing under anything other than X.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (defun get-selection-no-error (&optional type data-type)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
110 "Return the value of a window-system selection.
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
111 The argument TYPE (default `PRIMARY') says which selection, and the argument
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
112 DATA-TYPE (defaulting to the value of `selection-preferred-types'), says how
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
113 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
114 (condition-case nil (get-selection type data-type) (t nil)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (defun get-selection (&optional type data-type)
843
f46864126a0d [xemacs-hg @ 2002-05-15 15:27:40 by stephent]
stephent
parents: 829
diff changeset
117 "Return the value of a window-system selection.
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
118 The argument TYPE (default `PRIMARY') says which selection, and the argument
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
119 DATA-TYPE (defaulting to the value of, and compatible with,
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
120 `selection-preferred-types') says how to convert the data. If
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
121 there is no selection an error is signalled. Not suitable in a
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
122 `interprogram-paste-function', q.v."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (or type (setq type 'PRIMARY))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
124 (or data-type (setq data-type selection-preferred-types))
829
42a86787d173 [xemacs-hg @ 2002-05-07 15:58:46 by stephent]
stephent
parents: 771
diff changeset
125 (if (consp data-type)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
126 ;; TARGETS is a vector; we want a list so we can memq --> append it to
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
127 ;; nil.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
128 (let ((targets (append (get-selection-internal type 'TARGETS) nil))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
129 res)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
130 (catch 'converted
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
131 (if targets
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
132 (dolist (current-preference data-type)
3072
4c038e89d563 [xemacs-hg @ 2005-11-16 07:22:37 by stephent]
stephent
parents: 2656
diff changeset
133 (condition-case nil
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
134 (if (and (memq current-preference targets)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
135 (setq res (get-selection-internal
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
136 type current-preference)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
137 (throw 'converted res))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
138 (selection-conversion-error
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
139 nil))))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
140 ;; The source app didn't offer us anything compatible in TARGETS,
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
141 ;; or they're not negotiating at all. (That is, we're probably not
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
142 ;; on X11.) Try to convert to the types specified by our caller,
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
143 ;; and throw an error if the last one of those fails.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
144 (while data-type
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
145 (condition-case err
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
146 (progn
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
147 (setq res (get-selection-internal type (car data-type)))
2656
0ba09d009197 [xemacs-hg @ 2005-03-12 20:57:40 by aidan]
aidan
parents: 2624
diff changeset
148 (if res (throw 'converted res)
0ba09d009197 [xemacs-hg @ 2005-03-12 20:57:40 by aidan]
aidan
parents: 2624
diff changeset
149 (signal 'selection-conversion-error nil)))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
150 (selection-conversion-error
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
151 (if (cdr data-type)
2656
0ba09d009197 [xemacs-hg @ 2005-03-12 20:57:40 by aidan]
aidan
parents: 2624
diff changeset
152 (setq data-type (cdr data-type))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
153 (signal (car err) (cdr err))))))))
829
42a86787d173 [xemacs-hg @ 2002-05-07 15:58:46 by stephent]
stephent
parents: 771
diff changeset
154 (get-selection-internal type data-type)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
847
74899b430f18 [xemacs-hg @ 2002-05-17 03:46:55 by stephent]
stephent
parents: 843
diff changeset
156 (defun get-selection-foreign (&optional type data-type)
74899b430f18 [xemacs-hg @ 2002-05-17 03:46:55 by stephent]
stephent
parents: 843
diff changeset
157 "Return the value of a window-system selection, or nil if XEmacs owns it.
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
158 The argument TYPE (default `PRIMARY') says which selection, and the argument
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
159 DATA-TYPE (defaulting to the value of `selection-preferred-types' which see)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
160 says how to convert the data. If there is no selection an error is
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
161 signalled. See `interprogram-paste-function' for more information."
847
74899b430f18 [xemacs-hg @ 2002-05-17 03:46:55 by stephent]
stephent
parents: 843
diff changeset
162 (unless (selection-owner-p type)
74899b430f18 [xemacs-hg @ 2002-05-17 03:46:55 by stephent]
stephent
parents: 843
diff changeset
163 (get-selection type data-type)))
74899b430f18 [xemacs-hg @ 2002-05-17 03:46:55 by stephent]
stephent
parents: 843
diff changeset
164
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 ;; FSFmacs calls this `x-set-selection', and reverses the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
166 ;; first two arguments (duh ...). This order is more logical.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
167 (defun own-selection (data &optional type how-to-add data-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
168 "Make a window-system selection of type TYPE and value DATA.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 The argument TYPE (default `PRIMARY') says which selection,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
170 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
171 that can be converted using the function corresponding to DATA-TYPE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
172 in `select-converter-alist'---strings are the usual choice, but
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
173 other types may be permissible depending on the DATA-TYPE parameter
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
174 \(if DATA-TYPE is not supplied, the default behavior is window
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
175 system specific, but strings are always accepted).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
176 HOW-TO-ADD may be any of the following:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
177
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
178 'replace-all or nil -- replace all data in the selection.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
179 'replace-existing -- replace data for specified DATA-TYPE only.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
180 'append or t -- append data to existing DATA-TYPE data.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
181
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
182 DATA-TYPE is the window-system specific data type identifier
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
183 \(see `register-selection-data-type' for more information).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 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
186 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
187 between the markers *at whatever time the selection is examined* (note
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
188 that the window system clipboard does not necessarily duplicate this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
189 behavior - it doesn't on mswindows for example).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 Thus, editing done in the buffer after you specify the selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 can alter the effective value of the selection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 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
194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 Interactively, the text of the region is used as the selection value."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (interactive (if (not current-prefix-arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (list (read-string "Store text for pasting: "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (list (substring (region-beginning) (region-end)))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
199 ;; calling own-selection-internal will mess this up, so preserve it.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
200 (let ((zmacs-region-stays zmacs-region-stays))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
201 ;FSFmacs huh?? It says:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
202 ;; "This is for temporary compatibility with pre-release Emacs 19."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
203 ;(if (stringp type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
204 ; (setq type (intern type)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
205 (or type (setq type 'PRIMARY))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
206 (if (null data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
207 (disown-selection-internal type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
208 (own-selection-internal type data how-to-add data-type)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
209 (when (and (eq type 'PRIMARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
210 selection-sets-clipboard)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
211 (own-selection-internal 'CLIPBOARD data how-to-add data-type)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
212 (cond ((eq type 'PRIMARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
213 (setq primary-selection-extent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
214 (select-make-extent-for-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
215 data primary-selection-extent)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
216 ((eq type 'SECONDARY)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
217 (setq secondary-selection-extent
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
218 (select-make-extent-for-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
219 data secondary-selection-extent)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
220 ;; zmacs-region-stays is for commands, not low-level functions.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
221 ;; 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
222 ;; cause unwanted sticky-region behavior in kill-region and friends.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
223 (if (interactive-p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
224 (setq zmacs-region-stays t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 data)
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 (defun dehilight-selection (selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 "for use as a value of `lost-selection-hooks'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (cond ((eq selection 'PRIMARY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 (if primary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (if (consp primary-selection-extent)
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4222
diff changeset
233 (mapc 'delete-extent primary-selection-extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (delete-extent primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (setq primary-selection-extent nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (if zmacs-regions (zmacs-deactivate-region)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 ((eq selection 'SECONDARY)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (if secondary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 (if (consp secondary-selection-extent)
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4222
diff changeset
241 (mapc 'delete-extent secondary-selection-extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (delete-extent secondary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 (setq secondary-selection-extent nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (setq lost-selection-hooks 'dehilight-selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
248 (defun own-clipboard (string &optional push)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
249 "Paste the given string to the window system Clipboard.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
250 See `interprogram-cut-function' for more information."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 (own-selection string 'CLIPBOARD))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (defun disown-selection (&optional secondary-p)
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
254 "Assuming we own the selection, disown it.
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
255 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
256 primary selection."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (disown-selection-internal (if secondary-p 'SECONDARY 'PRIMARY))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (when (and selection-sets-clipboard
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
259 (memq secondary-p '(nil PRIMARY CLIPBOARD)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (disown-selection-internal 'CLIPBOARD)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 ;; selections and active regions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 ;; If and only if zmacs-regions is true:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 ;; 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
267 ;; assert it as the Primary selection. This causes it to be hilighted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 ;; When the region goes into the "inactive" state, we disown the Primary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 ;; selection, causing the region to be dehilighted.
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 ;; 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
272 ;; 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
273 ;; application asserts the selection. This is probably not a big deal.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (defun activate-region-as-selection ()
5368
ed74d2ca7082 Use ', not #', when a given symbol may not have a function binding at read time
Aidan Kehoe <kehoea@parhasard.net>
parents: 5364
diff changeset
276 (cond ((and-fboundp 'mouse-track-rectangle-p
4222
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
277 (mouse-track-rectangle-p
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
278 (mouse-track-activate-rectangular-selection))))
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
279 ((marker-buffer (mark-marker t))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 444
diff changeset
280 (own-selection (cons (point-marker t) (mark-marker t))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 (defvar primary-selection-extent nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 "The extent of the primary selection; don't use this.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 (defvar secondary-selection-extent nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 "The extent of the secondary selection; don't use this.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (defun select-make-extent-for-selection (selection previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 ;; 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
290 ;; selection, for highlighting purposes. If the selection isn't associated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 ;; with a buffer, this does nothing.
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
292 ;;
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
293 ;; Something similar needs to be hooked into the rectangle functions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (let ((buffer nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 (valid (and (extentp previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 (extent-object previous-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (buffer-live-p (extent-object previous-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 (cond ((stringp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 ;; if we're selecting a string, lose the previous extent used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 ;; to highlight the selection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (setq valid nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 ((consp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (setq start (min (car selection) (cdr selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 end (max (car selection) (cdr selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 valid (and valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 (eq (marker-buffer (car selection))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (extent-object previous-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 buffer (marker-buffer (car selection))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 ((extentp selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (setq start (extent-start-position selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 end (extent-end-position selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 valid (and valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (eq (extent-object selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 (extent-object previous-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 buffer (extent-object selection)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 (signal 'error (list "invalid selection" selection))))
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 (if valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (if (listp previous-extent)
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4222
diff changeset
324 (mapc 'delete-extent previous-extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (delete-extent previous-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (error nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (if (not buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 ;; string case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 ;; normal case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (if valid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (set-extent-endpoints previous-extent start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (setq previous-extent (make-extent start end buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 ;; Make the extent be closed on the right, which means that if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 ;; characters are inserted exactly at the end of the extent, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 ;; extent will grow to cover them. This is important for shell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 ;; buffers - suppose one makes a selection, and one end is at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 ;; point-max. If the shell produces output, that marker will remain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 ;; at point-max (its position will increase). So it's important that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 ;; the extent exhibit the same behavior, lest the region covered by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 ;; the extent (the visual indication), and the region between point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 ;; and mark (the actual selection value) become different!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (set-extent-property previous-extent 'end-open nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (cond
5368
ed74d2ca7082 Use ', not #', when a given symbol may not have a function binding at read time
Aidan Kehoe <kehoea@parhasard.net>
parents: 5364
diff changeset
348 ((and-fboundp 'mouse-track-rectangle-p
4222
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
349 (mouse-track-rectangle-p
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
350 (setq previous-extent (list previous-extent))
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
351 (default-mouse-track-next-move-rect start end previous-extent)
38ef5a6da799 [xemacs-hg @ 2007-10-13 14:08:26 by aidan]
aidan
parents: 4021
diff changeset
352 ))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 previous-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (defun valid-simple-selection-p (data)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
356 "An obsolete function that tests whether something was a valid simple
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
357 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
358 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
359 (or (stringp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 ;FSFmacs huh?? (symbolp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 (integerp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (and (consp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (integerp (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 (or (integerp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (and (consp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 (integerp (car (cdr data))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (extentp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 (and (consp data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (markerp (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (markerp (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (marker-buffer (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (marker-buffer (cdr data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (eq (marker-buffer (car data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (marker-buffer (cdr data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 (buffer-live-p (marker-buffer (car data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (buffer-live-p (marker-buffer (cdr data))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 (defun cut-copy-clear-internal (mode)
5364
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
379 (or (memq mode '(cut copy clear)) (error "unknown mode %S" mode))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (or (selection-owner-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 (error "XEmacs does not own the primary selection"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 (setq last-command nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 (or primary-selection-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 (error "the primary selection is not an extent?"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (let (rect-p b s e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 ((consp primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 (setq rect-p t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 b (extent-object (car primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 s (extent-start-position (car primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 e (extent-end-position (car (reverse primary-selection-extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 (setq rect-p nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 b (extent-object primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 s (extent-start-position primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 e (extent-end-position primary-selection-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 (set-buffer b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 (cond ((memq mode '(cut copy))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 (if rect-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (progn
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
402 ;; killed-rectangle is defvarred in rect.el
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 (setq killed-rectangle (extract-rectangle s e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (kill-new (mapconcat #'identity killed-rectangle "\n")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 (copy-region-as-kill s e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 ;; Maybe killing doesn't own clipboard. Make sure it happens.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 ;; This memq is kind of grody, because they might have done it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 ;; some other way, but owning the clipboard twice in that case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 ;; wouldn't actually hurt anything.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 (or (and (consp kill-hooks) (memq 'own-clipboard kill-hooks))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 847
diff changeset
411 (eq 'own-clipboard interprogram-cut-function)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (own-clipboard (car kill-ring)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (cond ((memq mode '(cut clear))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (if rect-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (delete-rectangle s e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (delete-region s e))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (disown-selection nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
420
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 ;;; Functions to convert the selection into various other selection
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
422 ;;; types.
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 ;; These next three functions get called by C code...
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
425 (defun select-convert-in (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
426 "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
427 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
428 suitable internal representation otherwise."
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
429 (and value
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
430 (funcall (or (cdr (assq type selection-converter-in-alist)) #'ignore)
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
431 selection type value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
433 (defun select-convert-out (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
434 "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
435 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
436 representation otherwise."
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
437 (and value
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
438 (funcall (or (cdr (assq type selection-converter-out-alist)) #'ignore)
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
439 selection type value)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
440
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
441 (defun select-coerce (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
442 "Attempt to convert the specified internal VALUE to a representation
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
443 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
444 nil if this is impossible, or a suitable representation otherwise."
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
445 (and value
5644
0df3cedee9ac select-coercion-alist, not select-conversion-alist, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5618
diff changeset
446 (funcall (or (cdr (assq type selection-coercion-alist)) #'ignore)
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
447 selection type value)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
448
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
449 ;; The rest of the functions on this "page" are conversion handlers,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
450 ;; append handlers and buffer-kill handlers.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (defun select-convert-to-text (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (cond ((stringp value)
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
453 (substring-no-properties value))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (set-buffer (extent-object value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (widen)
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
459 (buffer-substring-no-properties (extent-start-position value)
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
460 (extent-end-position value)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (or (eq (marker-buffer (car value)) (marker-buffer (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (list "markers must be in the same buffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (car value) (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (set-buffer (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 (error "selection is in a killed buffer")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 (widen)
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
473 (buffer-substring-no-properties (car value) (cdr value)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
476 (defun select-convert-to-timestamp (selection type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
477 (let ((ts (get-xemacs-selection-timestamp selection)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
478 (if ts (cons 'TIMESTAMP ts))))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
479
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
480 (defun select-convert-to-utf-8-text (selection type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
481 (cond ((stringp value)
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
482 (cons 'UTF8_STRING (encode-coding-string
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
483 (substring-no-properties value) 'utf-8)))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
484 ((extentp value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
485 (save-excursion
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
486 (set-buffer (extent-object value))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
487 (save-restriction
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
488 (widen)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
489 (cons 'UTF8_STRING
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
490 (encode-coding-string (buffer-substring-no-properties
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
491 (extent-start-position value)
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
492 (extent-end-position value))
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
493 'utf-8)))))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
494 ((and (consp value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
495 (markerp (car value))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
496 (markerp (cdr value)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
497 (or (eq (marker-buffer (car value)) (marker-buffer (cdr value)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
498 (signal 'error
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
499 (list "markers must be in the same buffer"
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
500 (car value) (cdr value))))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
501 (save-excursion
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
502 (set-buffer (or (marker-buffer (car value))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
503 (error "selection is in a killed buffer")))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
504 (save-restriction
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
505 (widen)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
506 (cons 'UTF8_STRING (encode-coding-string
5571
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
507 (buffer-substring-no-properties
5273dd66a1ba Strip extent information when passing text to external programs, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
508 (car value) (cdr value)) 'utf-8)))))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
509 (t nil)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
510
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
511 (defun select-coerce-to-text (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
512 (select-convert-to-text selection type value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
513
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (defun select-convert-to-string (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (let ((outval (select-convert-to-text selection type value)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
516 ;; 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
517 ;; 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
518 (if (stringp outval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (cons 'STRING outval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 outval)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (defun select-convert-to-compound-text (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 ;; converts to compound text automatically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (select-convert-to-text selection type value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (defun select-convert-to-length (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (let ((value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (cond ((stringp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (length value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (extent-length value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (or (eq (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 (marker-buffer (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (signal 'error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (list "markers must be in the same buffer"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 (car value) (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (abs (- (car value) (cdr value)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (if value ; force it to be in 32-bit format.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (cons (ash value -16) (logand value 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (defun select-convert-to-targets (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 ;; return a vector of atoms, but remove duplicates first.
5618
cc1ec4c93a67 Improve Lisp style in a few places, select.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5571
diff changeset
547 (delete-duplicates (map 'vector #'car selection-converter-out-alist)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (defun select-convert-to-delete (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (disown-selection-internal selection)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 ;; 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
552 ;; 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
553 ;; 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
554 'NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (defun select-convert-to-filename (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 (cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (buffer-file-name (or (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 (error "selection is in a killed buffer"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (buffer-file-name (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (error "selection is in a killed buffer"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (t nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (defun select-convert-to-charpos (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (let (a b tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (setq a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (setq a (car value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 b (cdr value))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (setq a (1- a) b (1- b)) ; zero-based
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (defun select-convert-to-lineno (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (let (a b buf tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (setq buf (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (setq a (marker-position (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 b (marker-position (cdr value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 buf (marker-buffer (car value)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (setq a (1+ (count-lines 1 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (setq b (1+ (count-lines 1 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (defun select-convert-to-colno (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (let (a b buf tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (setq buf (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 b (extent-end-position value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (setq a (car value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 b (cdr value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 buf (marker-buffer a))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (setq a (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (setq b (current-column)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (cons 'SPAN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 (vector (cons (ash a -16) (logand a 65535))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 (cons (ash b -16) (logand b 65535))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (defun select-convert-to-sourceloc (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (let (a b buf file-name tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (cond ((cond ((extentp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (setq buf (or (extent-object value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (error "selection is in a killed buffer"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 a (extent-start-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 b (extent-end-position value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 file-name (buffer-file-name buf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 ((and (consp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (markerp (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 (markerp (cdr value)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 (setq a (marker-position (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 b (marker-position (cdr value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 buf (or (marker-buffer (car value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 (error "selection is in a killed buffer"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 file-name (buffer-file-name buf))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 (set-buffer buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 (widen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 (goto-char a)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 (setq a (1+ (count-lines 1 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 (goto-char b)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 (setq b (1+ (count-lines 1 (point))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (if (< b a) (setq tmp a a b b tmp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 (format "%s:%d" file-name a)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 (defun select-convert-to-os (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (symbol-name system-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (defun select-convert-to-host (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 (system-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 (defun select-convert-to-user (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 (user-full-name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 (defun select-convert-to-class (selection type size)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
672 (symbol-value 'x-emacs-application-class))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 ;; We do not try to determine the name Emacs was invoked with,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 ;; 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
676 (defun select-convert-to-name (selection type size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 ;invocation-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 "xemacs")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (defun select-convert-to-integer (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 (and (integerp value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 (cons (ash value -16) (logand value 65535))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
684 ;; Can convert from the following integer representations
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
685 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
686 ;; integer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
687 ;; (integer . integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
688 ;; (integer integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
689 ;; (list [integer|(integer . integer)]*)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
690 ;; (vector [integer|(integer . integer)]*)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
691 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
692 ;; Cons'd integers get cleaned up a little.
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 (defun select-convert-from-integer (selection type value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
695 (cond ((integerp value) ; Integer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
696 value)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
697
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
698 ((and (consp value) ; (integer . integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
699 (integerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
700 (integerp (cdr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
701 (if (eq (car value) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
702 (cdr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
703 (if (and (eq (car value) -1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
704 (< (cdr value) 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
705 (cdr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
706 value)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
707
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
708 ((and (listp value) ; (integer integer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
709 (eq (length value) 2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
710 (integerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
711 (integerp (cadr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
712 (if (eq (car value) 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
713 (cadr value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
714 (if (and (eq (car value) -1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
715 (< (cdr value) 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
716 (- (cadr value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
717 (cons (car value) (cadr value)))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
718
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
719 ((listp value) ; list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
720 (if (cdr value)
4021
cef5f57bb9e2 [xemacs-hg @ 2007-06-21 13:39:08 by aidan]
aidan
parents: 3072
diff changeset
721 (mapcar #'(lambda (x)
cef5f57bb9e2 [xemacs-hg @ 2007-06-21 13:39:08 by aidan]
aidan
parents: 3072
diff changeset
722 (select-convert-from-integer selection type x))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
723 value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
724 (select-convert-from-integer selection type (car value))))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
725
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
726 ((vectorp value) ; vector
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
727 (if (eq (length value) 1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
728 (select-convert-from-integer selection type (aref value 0))
4021
cef5f57bb9e2 [xemacs-hg @ 2007-06-21 13:39:08 by aidan]
aidan
parents: 3072
diff changeset
729 (mapvector #'(lambda (x)
cef5f57bb9e2 [xemacs-hg @ 2007-06-21 13:39:08 by aidan]
aidan
parents: 3072
diff changeset
730 (select-convert-from-integer selection type x))
cef5f57bb9e2 [xemacs-hg @ 2007-06-21 13:39:08 by aidan]
aidan
parents: 3072
diff changeset
731 value)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
732
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
733 (t nil)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
734 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
735
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
736 (defun select-convert-from-ip-address (selection type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
737 (if (and (stringp value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
738 (= (length value) 4))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
739 (format "%d.%d.%d.%d"
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
740 (aref value 0) (aref value 1) (aref value 2) (aref value 3))))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
741
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 (defun select-convert-to-atom (selection type value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 (and (symbolp value) value))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
745 (defun select-convert-from-utf-8-text (selection type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
746 (decode-coding-string value 'utf-8))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
747
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
748 (defun select-convert-from-utf-16-le-text (selection type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
749 (decode-coding-string value 'utf-16-le))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
750
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
751 ;; Image conversion.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
752 (defun select-convert-from-image-data (image-type value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
753 "Take an image type specification--one of the image types this XEmacs
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
754 supports--and some data in that format, return a space, with a glyph
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
755 corresponding to that data as an end-glyph extent property of that space. "
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
756 (let* ((str (make-string 1 ?\ ))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
757 (extent (make-extent 0 1 str))
5344
2a54dfbe434f Don't quote keywords, they've been self-quoting for well over a decade.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4783
diff changeset
758 (glyph (make-glyph (vector image-type :data value))))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
759 (when glyph
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
760 (set-extent-property extent 'invisible t)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
761 (set-extent-property extent 'start-open t)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
762 (set-extent-property extent 'end-open t)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
763 (set-extent-property extent 'duplicable t)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
764 (set-extent-property extent 'atomic t)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
765 (set-extent-end-glyph extent glyph)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
766 str)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
767
5364
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
768 (macrolet
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
769 ((create-image-functions (&rest formats)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
770 (cons
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
771 'progn
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
772 (mapcar
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
773 #'(lambda (format)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
774 `(if (featurep ',format)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
775 (defalias (intern (concat "select-convert-from-image/"
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
776 ,(symbol-name format)))
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
777 #'(lambda (selection type value)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
778 (select-convert-from-image-data ',format
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
779 value))))) formats))))
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
780 (create-image-functions gif jpeg png tiff xpm xbm))
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
781
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
782 ;;; CF_xxx conversions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
783 (defun select-convert-from-cf-text (selection type value)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
784 (if (find-coding-system 'mswindows-multibyte)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
785 (let ((value (decode-coding-string value 'mswindows-multibyte)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
786 (replace-in-string (if (string-match "\0" value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
787 (substring value 0 (match-beginning 0))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
788 value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
789 "\\(\r\n\\|\n\r\\)" "\n" t))))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
790
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
791 (defun select-convert-from-cf-unicodetext (selection type value)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
792 (if (find-coding-system 'mswindows-unicode)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
793 (let ((value (decode-coding-string value 'mswindows-unicode)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
794 (replace-in-string (if (string-match "\0" value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
795 (substring value 0 (match-beginning 0))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
796 value)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
797 "\\(\r\n\\|\n\r\\)" "\n" t))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
798
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
799 (defun select-convert-to-cf-text (selection type value)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
800 (if (find-coding-system 'mswindows-multibyte)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
801 (let ((text (select-convert-to-text selection type value)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
802 (encode-coding-string
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
803 (concat (replace-in-string text "\n" "\r\n" t) "\0")
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
804 'mswindows-multibyte))))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
805
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
806 (defun select-convert-to-cf-unicodetext (selection type value)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
807 (if (find-coding-system 'mswindows-unicode)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
808 (let ((text (select-convert-to-text selection type value)))
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
809 (encode-coding-string
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
810 (concat (replace-in-string text "\n" "\r\n" t) "\0")
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
811 'mswindows-unicode))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
812
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
813 ;;; Appenders
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
814 (defun select-append-to-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
815 (let ((text1 (select-convert-to-text selection 'STRING value1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
816 (text2 (select-convert-to-text selection 'STRING value2)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
817 (if (and text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
818 (concat text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
819 nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
820
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
821 (defun select-append-to-string (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
822 (select-append-to-text selection type value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
823
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
824 (defun select-append-to-compound-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
825 (select-append-to-text selection type value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
826
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
827 (defun select-append-to-cf-text (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
828 (let ((text1 (select-convert-from-cf-text selection 'CF_TEXT value1))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
829 (text2 (select-convert-from-cf-text selection 'CF_TEXT value2)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
830 (if (and text1 text2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
831 (select-convert-to-cf-text selection type (concat text1 text2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
832 nil)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
834 (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
835 (let ((text1 (select-convert-from-cf-unicodetext selection
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
836 'CF_UNICODETEXT value1))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
837 (text2 (select-convert-from-cf-unicodetext selection
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
838 'CF_UNICODETEXT value2)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
839 (if (and text1 text2)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
840 (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
841 nil)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
842
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
843 (defun select-append-default (selection type value1 value2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
844 ;; 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
845 ;; 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
846 ;; appending numbers to strings, etc...
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
847 (cond ((and (stringp value1) (stringp value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
848 (select-append-to-string selection 'STRING value1 value2))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
849 (t nil)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
850
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
851 ;;; Buffer kill handlers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
852
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
853 (defun select-buffer-killed-default (selection type value buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
854 ;; This handler gets used if the type is "nil".
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
855 (cond ((extentp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
856 (if (eq (extent-object value) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
857 ; If this selection is on the clipboard, grab it quick
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
858 (when (eq selection 'CLIPBOARD)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
859 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
860 (set-buffer (extent-object value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
861 (save-restriction
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
862 (widen)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
863 (buffer-substring (extent-start-position value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
864 (extent-end-position value)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
865 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
866 ((markerp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
867 (unless (eq (marker-buffer value) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
868 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
869 ((and (consp value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
870 (markerp (car value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
871 (markerp (cdr value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
872 (if (or (eq (marker-buffer (car value)) buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
873 (eq (marker-buffer (cdr value)) buffer))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
874 ; If this selection is on the clipboard, grab it quick
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
875 (when (eq selection 'CLIPBOARD)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
876 (save-excursion
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
877 (set-buffer (marker-buffer (car value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
878 (save-restriction
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
879 (widen)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
880 (buffer-substring (car value) (cdr value)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
881 value))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
882 (t value)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
883
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
884 (defun select-buffer-killed-text (selection type value buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
885 (select-buffer-killed-default selection type value buffer))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
886
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
887 ;; Types listed in here can be selections of XEmacs
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
888 (setq selection-converter-out-alist
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
889 '((TIMESTAMP . select-convert-to-timestamp)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
890 (UTF8_STRING . select-convert-to-utf-8-text)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
891 (TEXT . select-convert-to-text)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (STRING . select-convert-to-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 (COMPOUND_TEXT . select-convert-to-compound-text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (TARGETS . select-convert-to-targets)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 (LENGTH . select-convert-to-length)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 (DELETE . select-convert-to-delete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 (FILE_NAME . select-convert-to-filename)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (CHARACTER_POSITION . select-convert-to-charpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (SOURCE_LOC . select-convert-to-sourceloc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 (LINE_NUMBER . select-convert-to-lineno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 (COLUMN_NUMBER . select-convert-to-colno)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 (OWNER_OS . select-convert-to-os)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 (HOST_NAME . select-convert-to-host)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 (USER . select-convert-to-user)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 (CLASS . select-convert-to-class)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 (NAME . select-convert-to-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 (ATOM . select-convert-to-atom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 (INTEGER . select-convert-to-integer)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
909 (CF_TEXT . select-convert-to-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
910 (CF_UNICODETEXT . select-convert-to-cf-unicodetext)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
911 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
912
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
913 ;; Types listed here can be selections foreign to XEmacs
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
914 (setq selection-converter-in-alist
5364
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
915 `(; Specific types that get handled by generic converters
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
916 (INTEGER . select-convert-from-integer)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
917 (TIMESTAMP . select-convert-from-integer)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
918 (LENGTH . select-convert-from-integer)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
919 (LIST_LENGTH . select-convert-from-integer)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
920 (CLIENT_WINDOW . select-convert-from-integer)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
921 (PROCESS . select-convert-from-integer)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
922 (IP_ADDRESS . select-convert-from-ip-address)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
923 ;; We go after UTF8_STRING in preference to STRING because Mozilla,
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
924 ;; at least, does bad things with non-Latin-1 Unicode characters in
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
925 ;; STRING.
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
926 (UTF8_STRING . select-convert-from-utf-8-text)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
927 (CF_TEXT . select-convert-from-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
928 (CF_UNICODETEXT . select-convert-from-cf-unicodetext)
2624
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
929 (text/html . select-convert-from-utf-16-le-text) ; Mozilla
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
930 (text/_moz_htmlcontext . select-convert-from-utf-16-le-text)
8174a45f637c [xemacs-hg @ 2005-03-01 00:21:18 by aidan]
aidan
parents: 851
diff changeset
931 (text/_moz_htmlinfo . select-convert-from-utf-16-le-text)
5364
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
932 ,@(loop
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
933 for format in '(gif jpeg png tiff xpm xbm)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
934 nconc (if (featurep format)
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
935 (list (cons (intern (format "image/%s" format))
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
936 (intern (format "select-convert-from-image/%s"
0f9aa4eb4bec Make my Lisp a little more sophisticated, select.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5344
diff changeset
937 format))))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
939 ;; Types listed here have special coercion functions that can munge
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
940 ;; 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
941 ;; 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
942 ;; but getting the *current* text in the region back when calling
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
943 ;; get-selection.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
944 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
945 ;; 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
946 ;; its type is retrieved from the internal selection cache, or when
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
947 ;; 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
948 ;; values with types listed in selection-coercible-types.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
949 (setq selection-coercion-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
950 '((TEXT . select-coerce-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
951 (STRING . select-coerce-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
952 (COMPOUND_TEXT . select-coerce-to-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
953 (CF_TEXT . select-coerce-to-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
954 (CF_UNICODETEXT . select-coerce-to-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
955 ))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
956
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
957 ;; Types listed here can be appended by own-selection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
958 (setq selection-appender-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
959 '((nil . select-append-default)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
960 (TEXT . select-append-to-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
961 (STRING . select-append-to-string)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
962 (COMPOUND_TEXT . select-append-to-compound-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
963 (CF_TEXT . select-append-to-cf-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
964 (CF_UNICODETEXT . select-append-to-cf-unicodetext)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
965 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
966
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
967 ;; Types listed here have buffer-kill handlers
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
968 (setq selection-buffer-killed-alist
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
969 '((nil . select-buffer-killed-default)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
970 (TEXT . select-buffer-killed-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
971 (STRING . select-buffer-killed-text)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
972 (COMPOUND_TEXT . select-buffer-killed-text)
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
973 (CF_TEXT . select-buffer-killed-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
974 (CF_UNICODETEXT . select-buffer-killed-text)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 487
diff changeset
975 ))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
976
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
977 ;; 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
978 (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
979
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 ;;; select.el ends here