annotate lisp/mouse.el @ 5576:071b810ceb18

Declare labels as line where appropriate; use #'labels, not #'flet, tests. lisp/ChangeLog addition: 2011-10-03 Aidan Kehoe <kehoea@parhasard.net> * simple.el (handle-pre-motion-command-current-command-is-motion): Implement #'keysyms-equal with #'labels + (declare (inline ...)), instead of abusing macrolet to the same end. * specifier.el (let-specifier): * mule/mule-cmds.el (describe-language-environment): * mule/mule-cmds.el (set-language-environment-coding-systems): * mule/mule-x-init.el (x-use-halfwidth-roman-font): * faces.el (Face-frob-property): * keymap.el (key-sequence-list-description): * lisp-mode.el (construct-lisp-mode-menu): * loadhist.el (unload-feature): * mouse.el (default-mouse-track-check-for-activation): Declare various labels inline in dumped files when that reduces the size of the dumped image. Declaring labels inline is normally only worthwhile for inner loops and so on, but it's reasonable exercise of the related code to have these changes in core. tests/ChangeLog addition: 2011-10-03 Aidan Kehoe <kehoea@parhasard.net> * automated/case-tests.el (uni-mappings): * automated/database-tests.el (delete-database-files): * automated/hash-table-tests.el (iterations): * automated/lisp-tests.el (test1): * automated/lisp-tests.el (a): * automated/lisp-tests.el (cl-floor): * automated/lisp-tests.el (foo): * automated/lisp-tests.el (list-nreverse): * automated/lisp-tests.el (needs-lexical-context): * automated/mule-tests.el (featurep): * automated/os-tests.el (original-string): * automated/os-tests.el (with): * automated/symbol-tests.el (check-weak-list-unique): Replace #'flet with #'labels where appropriate in these tests, following my own advice on style in the docstrings of those functions.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 03 Oct 2011 20:16:14 +0100
parents 3bc58dc9d688
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 ;;; mouse.el --- window system-independent mouse support.
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) 1988, 1992-4, 1997 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ;; Copyright (C) 1995 Tinker Systems
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
5 ;; Copyright (C) 1995, 1996, 2000, 2002, 2004, 2005 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Keywords: mouse, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4790
diff changeset
12 ;; 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: 4790
diff changeset
13 ;; 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: 4790
diff changeset
14 ;; 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: 4790
diff changeset
15 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4790
diff changeset
17 ;; 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: 4790
diff changeset
18 ;; 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: 4790
diff changeset
19 ;; 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: 4790
diff changeset
20 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4790
diff changeset
23 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ;;; Synched up with: Not synched with FSF. Almost completely divergent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;; This file is dumped with XEmacs (when window system support is compiled in).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
31 ;;; Authorship:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
32
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
33 ;; Probably originally derived from FSF 19 pre-release.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
34 ;; much hacked upon by Jamie Zawinski and crew, pre-1994.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
35 ;; (only mouse-motion stuff currently remains from that era)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
36 ;; all mouse-track stuff completely rewritten by Ben Wing, 1995-1996.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
37 ;; mouse-eval-sexp and *-inside-extent-p from Stig, 1995.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
38 ;; vertical divider code c. 1998 from ?.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
39
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 (provide 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 (global-set-key 'button1 'mouse-track)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (global-set-key '(shift button1) 'mouse-track-adjust)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
46 (global-set-key '(meta button1) 'mouse-track-by-lines)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
47 (global-set-key '(meta shift button1) 'mouse-track-adjust-by-lines)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (global-set-key '(control button1) 'mouse-track-insert)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 (global-set-key '(control shift button1) 'mouse-track-delete-and-insert)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
50 (global-set-key '(meta control button1) 'mouse-track-insert-by-lines)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
51 (global-set-key '(meta shift control button1)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
52 'mouse-track-delete-and-insert-by-lines)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
53 (global-set-key 'button2 'mouse-track)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
54 (global-set-key '(meta button2) 'mouse-track-do-rectangle)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 (defgroup mouse nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 "Window system-independent mouse support."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 :group 'editing)
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 (defcustom mouse-track-rectangle-p nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 "*If true, then dragging out a region with the mouse selects rectangles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 instead of simple start/end regions."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 :group 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 (defcustom mouse-yank-at-point nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 "*If non-nil, the function `mouse-yank' will yank text at the cursor location.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 Otherwise, the cursor will be moved to the location of the pointer click before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 text is inserted."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 :group 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 (defcustom mouse-highlight-text 'context
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 "*Choose the default double-click highlighting behavior.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 If set to `context', double-click will highlight words when the mouse
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 is at a word character, or a symbol if the mouse is at a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 character.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 If set to `word', double-click will always attempt to highlight a word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 If set to `symbol', double-click will always attempt to highlight a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 symbol (the default behavior in previous XEmacs versions)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 :type '(choice (const context)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 (const word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 (const symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 :group 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 (defvar mouse-yank-function 'mouse-consolidated-yank
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 "Function that is called upon by `mouse-yank' to actually insert text.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 (defun mouse-consolidated-yank ()
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
90 "Insert the current selection at point.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
91 \(Under X Windows, if there is none, insert the X cutbuffer.) A mark is
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
92 pushed, so that the inserted text lies between point and mark. This is the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
93 default value of `mouse-yank-function', and as such is called by
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
94 `mouse-yank' to do the actual work."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (if (and (not (console-on-window-system-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 (and (featurep 'gpm)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 487
diff changeset
98 (not (declare-boundp gpm-minor-mode))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (yank)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 (if (region-active-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 (if (consp zmacs-region-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 ;; pirated code from insert-rectangle in rect.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 ;; perhaps that code should be modified to handle a list of extents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 ;; as the rectangle to be inserted?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (let ((lines zmacs-region-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 (insertcolumn (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 (first t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 (push-mark)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 (while lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 (or first
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 (or (bolp) (insert ?\n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (move-to-column insertcolumn t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 (setq first nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (insert (extent-string (car lines)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (setq lines (cdr lines))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (insert (extent-string zmacs-region-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (insert-selection t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (defun insert-selection (&optional check-cutbuffer-p move-point-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 "Insert the current selection into buffer at point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 (interactive "P")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 ;; we fallback to the clipboard if the current selection is not existent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (let ((text (if check-cutbuffer-p
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
127 (or (get-selection-no-error)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (get-cutbuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (get-selection-no-error 'CLIPBOARD)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (error "No selection, clipboard or cut buffer available"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (or (get-selection-no-error)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (get-selection 'CLIPBOARD)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 (cond (move-point-event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (mouse-set-point move-point-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (push-mark (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 ((interactive-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (push-mark (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (insert text)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (defun mouse-select ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 "Select Emacs window the mouse is on."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 (interactive "@"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 (defun mouse-delete-window ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 "Delete the Emacs window the mouse is on."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (interactive "@")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (delete-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (defun mouse-keep-one-window ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 "Select Emacs window mouse is on, then kill all other Emacs windows."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (interactive "@")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (delete-other-windows))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (defun mouse-select-and-split ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 "Select Emacs window mouse is on, then split it vertically in half."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 (interactive "@")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (split-window-vertically nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (defun mouse-set-point (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 "Select Emacs window mouse is on, and move point to mouse position."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (let ((window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 (pos (event-point event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (close-pos (event-closest-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 (or window (error "not in a window"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (select-window window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (if (and pos (> pos 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 ;; If the event was over a text char, it's easy.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (goto-char (max (min pos (point-max)) (point-min)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 (if (and close-pos (> close-pos 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (goto-char (max (min close-pos (point-max)) (point-min)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 ;; When the event occurs outside of the frame directly to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 ;; left or right of a modeline, close-point is nil, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 ;; event-over-modeline is also nil. That will drop us to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 ;; point. So instead of erroring, just return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (defun mouse-yank (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 "Paste text with the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 If the variable `mouse-yank-at-point' is nil, then pasting occurs at the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 location of the click; otherwise, pasting occurs at the current cursor
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
184 location. This calls the value of the variable `mouse-yank-function'
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
185 (normally the function `mouse-consolidated-yank') to do the actual work.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
186 This is normally called as a result of a click of button2 by
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
187 `default-mouse-track-click-hook'."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (and (not mouse-yank-at-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (mouse-set-point event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 (funcall mouse-yank-function))
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 (defun click-inside-extent-p (click extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 "Return non-nil if the button event is within the primary selection-extent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 Return nil otherwise."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (let ((ewin (event-window click))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (epnt (event-point click)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (and ewin
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 epnt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (eq (window-buffer ewin)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (extent-object extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 (extent-start-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (> epnt (extent-start-position extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (> (extent-end-position extent) epnt))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 (defun click-inside-selection-p (click)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (or (click-inside-extent-p click primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (click-inside-extent-p click zmacs-region-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (defun point-inside-extent-p (extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 "Return t if point is within the bounds of the primary selection extent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 Return t is point is at the end position of the extent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 Return nil otherwise."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (and extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (eq (current-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (extent-object extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (> (point) (extent-start-position extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (>= (extent-end-position extent) (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (defun point-inside-selection-p ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 (or (point-inside-extent-p primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (point-inside-extent-p zmacs-region-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
226 (defun mouse-begin-drag-n-drop (event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
227 "Begin a drag-n-drop operation.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
228 EVENT should be the button event that initiated the drag.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
229 Returns whether a drag was begun."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
230 ;; #### barely implemented.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
231 (when (click-inside-selection-p event)
4790
bc4f2511bbea Remove support for the OffiX drag-and-drop protocol. See xemacs-patches
Jerry James <james@xemacs.org>
parents: 4783
diff changeset
232 (cond ((featurep 'cde)
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 776
diff changeset
233 (declare-fboundp
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 776
diff changeset
234 (cde-start-drag-region event
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 776
diff changeset
235 (extent-start-position zmacs-region-extent)
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 776
diff changeset
236 (extent-end-position zmacs-region-extent)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 t))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (defun mouse-eval-sexp (click force-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 "Evaluate the sexp under the mouse. Usually, this is the last sexp before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 the click, but if you click on a left paren, then it is the sexp beginning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 with the paren that is evaluated. Also, since strings evaluate to themselves,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
243 they're fed to `re-search-forward' and the matched region is highlighted until
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 the mouse button is released.
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 Perhaps the most useful thing about this function is that the evaluation of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 the expression which is clicked upon is relative not to the window where you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 click, but to the current window and the current position of point. Thus,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 you can use `mouse-eval-sexp' to interactively test code that acts upon a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 buffer...something you cannot do with the standard `eval-last-sexp' function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 It's also fantastic for debugging regular expressions."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 (interactive "e\nP")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (let (exp val result-str)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (setq exp (save-window-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (mouse-set-point click)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (or (looking-at "(") (forward-sexp -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (read (point-marker))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 (cond ((stringp exp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (if (setq val (re-search-forward exp nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (let* ((oo (make-extent (match-beginning 0) (match-end 0))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 (set-extent-face oo 'highlight)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 (set-extent-priority oo 1000)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 ;; wait for button release...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (setq unread-command-event (next-command-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 (delete-extent oo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (message "Regex \"%s\" not found" exp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (ding nil 'quiet)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 (t (setq val (if (fboundp 'eval-interactive)
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
271 (eval-interactive exp)
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
272 (list (eval exp))))))
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
273 (setq result-str (mapconcat #'prin1-to-string val " ;\n"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 ;; #### -- need better test
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (if (and (not force-window)
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
276 (<= (length result-str) (window-width (selected-window)))
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
277 (not (string-match "\n" result-str)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (message "%s" result-str)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 (with-output-to-temp-buffer "*Mouse-Eval*"
4677
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
280 (loop
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
281 for value in val
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
282 with seen-first = nil
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
283 do
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
284 (if seen-first
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
285 (princ " ;\n")
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
286 (setq seen-first t))
8f1ee2d15784 Support full Common Lisp multiple values in C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 3061
diff changeset
287 (cl-prettyprint value))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 (defun mouse-line-length (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 "Print the length of the line indicated by the pointer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 (message "Line length: %d" (- (point-at-eol) (point-at-bol))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 (sleep-for 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (defun mouse-set-mark (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 "Select Emacs window mouse is on, and set mark at mouse position.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 Display cursor at that position for a second."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (let ((point-save (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (progn (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (push-mark nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 (sit-for 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (goto-char point-save))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (defun mouse-scroll (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 "Scroll point to the mouse position."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (recenter 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (scroll-right (event-x event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 (defun mouse-del-char (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 "Delete the char pointed to by the mouse."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (delete-char 1 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 (defun mouse-kill-line (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 "Kill the line pointed to by the mouse."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (kill-line nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 (defun mouse-bury-buffer (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 "Bury the buffer pointed to by the mouse, thus selecting the next one."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (select-window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 (bury-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 (defun mouse-unbury-buffer (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 "Unbury and select the most recently buried buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 (select-window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 (let* ((bufs (buffer-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 (entry (1- (length bufs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 (while (not (setq val (nth entry bufs)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 val (and (/= (aref (buffer-name val) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 ? )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 (setq entry (1- entry)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 (switch-to-buffer val))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 (defun narrow-window-to-region (m n)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
353 "Narrow window to region between point and last mark."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 (interactive "r")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 (if (eq (selected-window) (next-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 (split-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 (goto-char m)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 (recenter 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 (if (eq (selected-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 (if (zerop (minibuffer-depth))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 (next-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 (shrink-window (- (- (window-height) (count-lines m n)) 1))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 (defun mouse-window-to-region (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 "Narrow window to region between cursor and mouse pointer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 (interactive "@e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 (let ((point-save (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 (progn (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 (push-mark nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 (sit-for 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 (goto-char point-save)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 (narrow-window-to-region (region-beginning) (region-end)))))
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 mouse-ignore ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 "Don't do anything."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 (interactive))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 ;;; mouse/selection tracking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 ;;; generalized mouse-track
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (defvar default-mouse-track-normalize-point-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 'default-mouse-track-normalize-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 "Function called to normalize position of point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 Called with two arguments: TYPE depends on the number of times that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 mouse has been clicked and is a member of `default-mouse-track-type-list',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 FORWARDP determines the direction in which the point should be moved.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 (defvar mouse-track-down-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 "Function or functions called when the user presses the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 This hook is invoked by `mouse-track'; thus, it will not be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 for any buttons with a different binding. The functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 called with two arguments: the button-press event and a click
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 count (see `mouse-track-click-hook').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 If any function returns non-nil, the remaining functions will not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 Note that most applications should take action when the mouse is
3061
fd1acd2f457a [xemacs-hg @ 2005-11-13 07:39:26 by ben]
ben
parents: 2504
diff changeset
404 released, not when it is pressed.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 (defvar mouse-track-drag-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 "Function or functions called when the user drags the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 This hook is invoked by `mouse-track'; thus, it will not be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 for any buttons with a different binding. The functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 called with three arguments: the mouse-motion event, a click
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 count (see `mouse-track-click-hook'), and whether the call to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 this hook occurred as a result of a drag timeout (see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 `mouse-track-scroll-delay').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 If any function returns non-nil, the remaining functions will not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 Note that no calls to this function will be made until the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 initiates a drag (i.e. moves the mouse more than a certain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 threshold in either the X or the Y direction, as defined by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 `mouse-track-x-threshold' and `mouse-track-y-threshold').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 See also `mouse-track-drag-up-hook'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (defvar mouse-track-drag-up-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 "Function or functions called when the user finishes a drag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 This hook is invoked by `mouse-track'; thus, it will not be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 for any buttons with a different binding. The functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 called with two arguments: the button-press event and a click
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 count (see `mouse-track-click-hook').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 If any function returns non-nil, the remaining functions will not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 Note that this hook will not be invoked unless the user has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 initiated a drag, i.e. moved the mouse more than a certain threshold
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 (see `mouse-track-drag-hook'). When this function is invoked,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 `mouse-track-drag-hook' will have been invoked at least once.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 See also `mouse-track-click-hook'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 (defvar mouse-track-click-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 "Function or functions called when the user clicks the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 `Clicking' means pressing and releasing the mouse without having
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 initiated a drag (i.e. without having moved more than a certain
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 threshold -- see `mouse-track-drag-hook').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 This hook is invoked by `mouse-track'; thus, it will not be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 for any buttons with a different binding. The functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 called with two arguments: the button-release event and a click
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 count, which specifies the number of times that the mouse has been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 clicked in a series of clicks, each of which is separated by at most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 `mouse-track-multi-click-time'. This can be used to implement actions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 that are called on double clicks, triple clicks, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 If any function returns non-nil, the remaining functions will not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 See also `mouse-track-drag-up-hook.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (defvar mouse-track-up-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 "Function or functions called when the user releases the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 This hook is invoked by `mouse-track'; thus, it will not be called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 for any buttons with a different binding. The functions will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 called with two arguments: the button-release event and a click
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 count (see `mouse-track-click-hook').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 For many applications, it is more appropriate to use one or both
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 of `mouse-track-click-hook' and `mouse-track-drag-up-hook'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (defvar mouse-track-cleanup-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 "Function or functions called when `mouse-track' terminates.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 This hook will be called in all circumstances, even upon a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 non-local exit out of `mouse-track', and so is useful for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 doing cleanup work such as removing extents that may have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 been created during the operation of `mouse-track'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 Unlike all of the other mouse-track hooks, this is a \"normal\"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 hook: the hook functions are called with no arguments, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 all hook functions are called regardless of their return
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 446
diff changeset
481 values.
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 446
diff changeset
482
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 446
diff changeset
483 This function is called with the buffer where the mouse was clicked
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 446
diff changeset
484 set to the current buffer, unless that buffer was killed.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (defcustom mouse-track-multi-click-time 400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 "*Maximum number of milliseconds allowed between clicks for a multi-click.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 See `mouse-track-click-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 :type 'integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 :group 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 (defcustom mouse-track-scroll-delay 100
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 "Maximum of milliseconds between calls to `mouse-track-drag-hook'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 If the user is dragging the mouse (i.e. the button is held down and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 a drag has been initiated) and does not move the mouse for this many
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 milliseconds, the hook will be called with t as the value of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 WAS-TIMEOUT parameter. This can be used to implement scrolling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 in a selection when the user drags the mouse out the window it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 was in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 A value of nil disables the timeout feature."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 :type '(choice integer (const :tag "Disabled" nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 :group 'mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
505 (defcustom mouse-track-activate-strokes '(button1-click button1-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
506 button2-click)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
507 "Mouse strokes causing \"activation\" of the text extent under the mouse.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
508 The exact meaning of \"activation\" is dependent on the text clicked on and
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
509 the mode of the buffer, but typically entails actions such as following a
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
510 hyperlink or selecting an entry in a completion buffer.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
511
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
512 See also `mouse-track-conservative-activate-strokes'.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
513
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
514 Possible list entries are
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
515
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
516 button1-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
517 button1-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
518 button1-triple-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
519 button1-down
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
520 button2-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
521 button2-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
522 button2-triple-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
523 button2-down
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
524
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
525 As a general rule, you should not use the \"-down\" values, because this
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
526 makes it impossible to have other simultaneous actions, such as selection."
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
527 :type '(set
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
528 button1-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
529 button1-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
530 button1-triple-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
531 button1-down
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
532 button2-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
533 button2-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
534 button2-triple-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
535 button2-down)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
536 :group 'mouse)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
537
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
538 (defcustom mouse-track-conservative-activate-strokes
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
539 '(button1-double-click button2-click)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
540 "Mouse strokes causing \"conservative activation\" of text extent under mouse.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
541 The exact meaning of \"activation\" is dependent on the text clicked on and
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
542 the mode of the buffer, but typically entails actions such as following a
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
543 hyperlink or selecting an entry in a completion buffer.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
544
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
545 \"Conservative activation\" differs from regular activation in that it is
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
546 not meant to be triggered by a button1 click, and thus is suitable for larger
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
547 regions of text where the user might want to position the cursor inside of
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
548 the region.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
549
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
550 See also `mouse-track-activate-strokes'.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
552 Possible list entries are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
553
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
554 button1-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
555 button1-double-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
556 button1-triple-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
557 button1-down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
558 button2-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
559 button2-double-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560 button2-triple-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
561 button2-down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
562
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 As a general rule, you should not use the \"-down\" values, because this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
564 makes it impossible to have other simultaneous actions, such as selection."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 :type '(set
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 button1-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
567 button1-double-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 button1-triple-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 button1-down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 button2-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571 button2-double-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
572 button2-triple-click
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
573 button2-down)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 :group 'mouse)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (defvar mouse-track-x-threshold '(face-width 'default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 "Minimum number of pixels in the X direction for a drag to be initiated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 If the mouse is moved more than either the X or Y threshold while the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 button is held down (see also `mouse-track-y-threshold'), then a drag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 is initiated; otherwise the gesture is considered to be a click.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 See `mouse-track'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
539
eec22eb29327 [xemacs-hg @ 2001-05-14 10:00:08 by adrian]
adrian
parents: 502
diff changeset
583 The value should be either a number or a form to be evaluated to
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 produce a number.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (defvar mouse-track-y-threshold '(face-height 'default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 "Minimum number of pixels in the Y direction for a drag to be initiated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 If the mouse is moved more than either the X or Y threshold while the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 button is held down (see also `mouse-track-x-threshold'), then a drag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 is initiated; otherwise the gesture is considered to be a click.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 See `mouse-track'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 The value should be either a number of a form to be evaluated to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 produce a number.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 ;; these variables are private to mouse-track.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 (defvar mouse-track-up-time nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 (defvar mouse-track-up-x nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 (defvar mouse-track-up-y nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (defvar mouse-track-timeout-id nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (defvar mouse-track-click-count nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (defun mouse-track-set-timeout (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (if mouse-track-timeout-id
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (disable-timeout mouse-track-timeout-id))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (if mouse-track-scroll-delay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (setq mouse-track-timeout-id
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (add-timeout (/ mouse-track-scroll-delay 1000.0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 'mouse-track-scroll-undefined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (copy-event event)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
612 (defvar Mouse-track-gensym (gensym))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
613
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
614 (defun mouse-track-run-hook (hook override event &rest args)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 ;; ugh, can't use run-hook-with-args-until-success because we have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 ;; to get the value using symbol-value-in-buffer. Doing a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 ;; save-excursion/set-buffer is wrong because the hook might want to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 ;; change the buffer, but just doing a set-buffer is wrong because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 ;; the hook might not want to change the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 ;; #### What we need here is a Lisp interface to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 ;; run_hook_with_args_in_buffer. Here is a poor man's version.
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
622 (let ((overridden (plist-get override hook Mouse-track-gensym)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
623 (if (not (eq overridden Mouse-track-gensym))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
624 (if (and (listp overridden) (not (eq (car overridden) 'lambda)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
625 (some #'(lambda (val) (apply val event args)) overridden)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
626 (apply overridden event args))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
627 (let ((buffer (event-buffer event)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
628 (and mouse-grabbed-buffer (setq buffer mouse-grabbed-buffer))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
629 (when buffer
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
630 (let ((value (symbol-value-in-buffer hook buffer nil)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
631 (if (and (listp value) (not (eq (car value) 'lambda)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
632 ;; List of functions.
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
633 (let (retval)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
634 (while (and value (null retval))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
635 ;; Found `t': should process default value. We could
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
636 ;; splice it into the buffer-local value, but that
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
637 ;; would cons, which is not a good thing for
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
638 ;; mouse-track hooks.
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
639 (if (eq (car value) t)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
640 (let ((global (default-value hook)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
641 (if (and (listp global) (not (eq (car global)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
642 'lambda)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
643 ;; List of functions.
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
644 (while (and global
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
645 (null (setq retval
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
646 (apply (car global)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
647 event args))))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
648 (pop global))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
649 ;; lambda
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
650 (setq retval (apply (car global) event args))))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
651 (setq retval (apply (car value) event args)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
652 (pop value))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
653 retval)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
654 ;; lambda
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
655 (apply value event args))))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 (defun mouse-track-scroll-undefined (random)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 ;; the old implementation didn't actually define this function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 ;; and in normal use it won't ever be called because the timeout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 ;; will either be removed before it fires or will be picked off
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 ;; with next-event and not dispatched. However, if you're
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 ;; attempting to debug a click-hook (which is pretty damn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 ;; difficult to do), this function may get called.
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
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
666 (defun mouse-track (event &optional overriding-hooks)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
667 "Generalized mouse-button handler.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
668 This is the function that handles standard mouse behavior -- moving point
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
669 when clicked, selecting text when dragged, etc. -- and should be bound to a
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
670 mouse button (normally, button1 and button2).
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
671
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
672 This allows for overloading of different mouse strokes with different
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
673 commands. The behavior of this function is customizable using various
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
674 hooks and variables: see `mouse-track-click-hook', `mouse-track-drag-hook',
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 `mouse-track-drag-up-hook', `mouse-track-down-hook', `mouse-track-up-hook',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 `mouse-track-cleanup-hook', `mouse-track-multi-click-time',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 `mouse-track-scroll-delay', `mouse-track-x-threshold', and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 `mouse-track-y-threshold'.
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 Default handlers are provided to implement standard selecting/positioning
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 behavior. You can explicitly request this default behavior, and override
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 any custom-supplied handlers, by using the function `mouse-track-default'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 instead of `mouse-track'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
685 \(In general, you can override specific hooks by using the argument
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
686 OVERRIDING-HOOKS, which should be a plist of alternating hook names
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
687 and values.)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
688
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 Default behavior is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 If you click-and-drag, the selection will be set to the region between the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 point of the initial click and the point at which you release the button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 These positions need not be ordered.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 If you click-and-release without moving the mouse, then the point is moved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 and the selection is disowned (there will be no selection owner). The mark
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 will be set to the previous position of point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 If you double-click, the selection will extend by symbols instead of by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 characters. If you triple-click, the selection will extend by lines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 If you drag the mouse off the top or bottom of the window, you can select
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 pieces of text which are larger than the visible part of the buffer; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 buffer will scroll as necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
706 The point will be left at the position at which you released the button,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
707 and the mark will be left at the initial click position.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
708
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
709 Under X Windows, the selected text becomes the current X Selection, and can
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
710 be immediately inserted elsewhere using button2. Under MS Windows, this
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
711 also works, because the behavior is emulated."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 (let ((mouse-down t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 (xthresh (eval mouse-track-x-threshold))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 (ythresh (eval mouse-track-y-threshold))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 (orig-x (event-x-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 (orig-y (event-y-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 (buffer (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 (mouse-grabbed-buffer (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 mouse-moved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 (if (or (not mouse-track-up-x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 (not mouse-track-up-y)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 (not mouse-track-up-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 (> (- (event-timestamp event) mouse-track-up-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 mouse-track-multi-click-time)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 (> (abs (- mouse-track-up-x orig-x)) xthresh)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 (> (abs (- mouse-track-up-y orig-y)) ythresh))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 (setq mouse-track-click-count 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 (setq mouse-track-click-count (1+ mouse-track-click-count)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 (if (not (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (error "Not over a window."))
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
732 (mouse-track-run-hook 'mouse-track-down-hook overriding-hooks
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 event mouse-track-click-count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 (while mouse-down
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 (setq event (next-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (cond ((motion-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 (if (and (not mouse-moved)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 (or (> (abs (- (event-x-pixel event) orig-x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 xthresh)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 (> (abs (- (event-y-pixel event) orig-y))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 ythresh)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 (setq mouse-moved t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 (if mouse-moved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 (mouse-track-run-hook 'mouse-track-drag-hook
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
746 overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
747 event mouse-track-click-count nil))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 (mouse-track-set-timeout event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 ((and (timeout-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 (eq (event-function event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 'mouse-track-scroll-undefined))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 (if mouse-moved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 (mouse-track-run-hook 'mouse-track-drag-hook
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
754 overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
755 (event-object event)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
756 mouse-track-click-count t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 (mouse-track-set-timeout (event-object event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 ((button-release-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 (setq mouse-track-up-time (event-timestamp event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 (setq mouse-track-up-x (event-x-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 (setq mouse-track-up-y (event-y-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 (setq mouse-down nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 (mouse-track-run-hook 'mouse-track-up-hook
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
764 overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
765 event mouse-track-click-count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (if mouse-moved
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 (mouse-track-run-hook 'mouse-track-drag-up-hook
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
768 overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
769 event mouse-track-click-count)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (mouse-track-run-hook 'mouse-track-click-hook
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
771 overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
772 event mouse-track-click-count)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 ((or (key-press-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (and (misc-user-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (eq (event-function event) 'cancel-mode-internal)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 (error "Selection aborted"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 (dispatch-event event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 ;; protected
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (if mouse-track-timeout-id
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 (disable-timeout mouse-track-timeout-id))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 (setq mouse-track-timeout-id nil)
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 446
diff changeset
783 (and (buffer-live-p buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (set-buffer buffer)
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
786 (let ((override (plist-get overriding-hooks
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
787 'mouse-track-cleanup-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
788 Mouse-track-gensym)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
789 (if (not (eq override Mouse-track-gensym))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
790 (if (and (listp override) (not (eq (car override) 'lambda)))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
791 (mapc #'funcall override)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
792 (funcall override))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
793 (run-hooks 'mouse-track-cleanup-hook))))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 ;;;;;;;;;;;; default handlers: new version of mouse-track
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 (defvar default-mouse-track-type nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 (defvar default-mouse-track-type-list '(char word line))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (defvar default-mouse-track-window nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (defvar default-mouse-track-extent nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 (defvar default-mouse-track-adjust nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 (defvar default-mouse-track-min-anchor nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 (defvar default-mouse-track-max-anchor nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 (defvar default-mouse-track-result nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 (defvar default-mouse-track-down-event nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 ;; D. Verna Feb. 17 1998
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 ;; This function used to assume that when (event-window event) differs from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 ;; window, we have to scroll. This is WRONG, for instance when there are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 ;; toolbars on the side, in which case window-event returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (defun default-mouse-track-set-point-in-window (event window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 (if (event-over-modeline-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 nil ;; Scroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 ;; Not over a modeline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (if (eq (event-window event) window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 (let ((p (event-closest-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 (if (or (not p) (not (pos-visible-in-window-p p window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 nil ;; Scroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (mouse-set-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 ;; Not over a modeline, not the same window. Check if the Y position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 ;; is still overlapping the original window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 (let* ((edges (window-pixel-edges window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (row (event-y-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (text-start (nth 1 edges))
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 444
diff changeset
827 (text-end (nth 3 edges)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (if (or (< row text-start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (> row text-end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 nil ;; Scroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 ;; The Y pos in overlapping the original window. Check however if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 ;; the position is really visible, because there could be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 ;; scrollbar or a modeline at this place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 ;; Find the mean line height (height / lines nb), and approximate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 ;; the line number for Y pos.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (select-window window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 (let ((line (/ (* (- row text-start) (window-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 (- text-end text-start))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 (if (not (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (goto-char (window-start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 (pos-visible-in-window-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 (point-at-bol (+ 1 line)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 nil ;; Scroll
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 ;; OK, we can go to that position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 (goto-char (window-start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 (forward-line line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 ;; On the right side: go to end-of-line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 (when (>= (event-x-pixel event) (nth 2 edges))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 (goto-char (point-at-eol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 )))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (defun default-mouse-track-scroll-and-set-point (event window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 (select-window window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (let ((edges (window-pixel-edges window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 (row (event-y-pixel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 (height (face-height 'default)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 (cond ((< (abs (- row (nth 1 edges))) (abs (- row (nth 3 edges))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 ;; closer to window's top than to bottom, so move up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 (let ((delta (max 1 (/ (- (nth 1 edges) row) height))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (condition-case () (scroll-down delta) (error))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (goto-char (window-start))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 ((>= (point) (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 ;; scroll by one line if over the modeline or a clipped line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 (let ((delta (if (or (event-over-modeline-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 (< row (nth 3 edges)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 (+ (/ (- row (nth 3 edges)) height) 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 (close-pos (event-closest-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 (condition-case () (scroll-up delta) (error))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 (if (and close-pos (pos-visible-in-window-p close-pos))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 (goto-char close-pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 (goto-char (window-end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (vertical-motion delta)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 ;; window-end reports the end of the clipped line, even if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 ;; scroll-on-clipped-lines is t. compensate.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 ;; (If window-end gets fixed this can be removed.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 (if (not (pos-visible-in-window-p (max (1- (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 (point-min))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 (vertical-motion -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 (condition-case () (backward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 (error (end-of-line)))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 ;; This remembers the last position at which the user clicked, for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 ;; benefit of mouse-track-adjust (for example, button1; scroll until the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 ;; position of the click is off the frame; then Sh-button1 to select the
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
890 ;; new region).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (defvar default-mouse-track-previous-point nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 (defun default-mouse-track-set-point (event window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (if (default-mouse-track-set-point-in-window event window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 (default-mouse-track-scroll-and-set-point event window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (defsubst default-mouse-track-beginning-of-word (symbolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (let ((word-constituent (cond ((eq symbolp t) "\\w\\|\\s_\\|\\s'")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 ((null symbolp) "\\w")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 (t "[^ \t\n]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 (white-space "[ \t]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 (cond ((bobp) nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 ((looking-at word-constituent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 (backward-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 (while (and (not (bobp)) (looking-at word-constituent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 (backward-char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 (if (or (not (bobp)) (not (looking-at word-constituent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 (forward-char)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 ((looking-at white-space)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 (backward-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 (while (looking-at white-space)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 (backward-char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 (forward-char)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 (defun default-mouse-track-end-of-word (symbolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 (let ((word-constituent (cond ((eq symbolp t) "\\w\\|\\s_\\|\\s'")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 ((null symbolp) "\\w")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 (t "[^ \t\n]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 (white-space "[ \t]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 (cond ((looking-at word-constituent) ; word or symbol constituent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 (while (looking-at word-constituent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 (forward-char)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 ((looking-at white-space) ; word or symbol constituent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 (while (looking-at white-space)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (forward-char))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 ;; Decide what will be the SYMBOLP argument to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 ;; default-mouse-track-{beginning,end}-of-word, according to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 ;; syntax of the current character and value of mouse-highlight-text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 (defsubst default-mouse-track-symbolp (syntax)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 (cond ((eq mouse-highlight-text 'context)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 (eq syntax ?_))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 ((eq mouse-highlight-text 'symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 ;; Return t if point is at an opening quote character. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 ;; determined by testing whether the syntax of the following character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 ;; is `string', which will always be true for opening quotes and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 ;; always false for closing quotes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 (defun default-mouse-track-point-at-opening-quote-p ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 (forward-char 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 (eq (buffer-syntactic-context) 'string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 (defun default-mouse-track-normalize-point (type forwardp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 (cond ((eq type 'word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 ;; trap the beginning and end of buffer errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 (ignore-errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (setq type (char-syntax (char-after (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 (if forwardp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 (if (or (= type ?\()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 (and (= type ?\")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 (default-mouse-track-point-at-opening-quote-p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 (goto-char (scan-sexps (point) 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 (default-mouse-track-end-of-word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 (default-mouse-track-symbolp type)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 (if (or (= type ?\))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 (and (= type ?\")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 (not (default-mouse-track-point-at-opening-quote-p))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 (goto-char (scan-sexps (1+ (point)) -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 (default-mouse-track-beginning-of-word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 (default-mouse-track-symbolp type))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 ((eq type 'line)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
967 (if forwardp
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
968 ;; Counter-kludge. If we are adjusting a line-oriented
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
969 ;; selection, default-mouse-track-return-dragged-selection
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
970 ;; fixed it to include the final newline. Unfortunately, that
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
971 ;; will cause us to add another line at the end (the wrong
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
972 ;; side of the selection) unless we take evasive action.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
973 (unless (and default-mouse-track-adjust
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
974 (bolp))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
975 (end-of-line))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
976 (beginning-of-line)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 ((eq type 'buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 (if forwardp (end-of-buffer) (beginning-of-buffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 (defun default-mouse-track-next-move (min-anchor max-anchor extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 (let ((anchor (if (<= (point) min-anchor) max-anchor min-anchor)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 (funcall default-mouse-track-normalize-point-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 default-mouse-track-type (> (point) anchor))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 (if (consp extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 (default-mouse-track-next-move-rect anchor (point) extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 (if extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 (if (<= anchor (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 (set-extent-endpoints extent anchor (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 (set-extent-endpoints extent (point) anchor))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 (defun default-mouse-track-next-move-rect (start end extents &optional pad-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 (if (< end start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 (let ((tmp start)) (setq start end end tmp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 ((= start end) ; never delete the last remaining extent
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
996 (mapc 'delete-extent (cdr extents))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 (setcdr extents nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 (set-extent-endpoints (car extents) start start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 (let ((indent-tabs-mode nil) ; if pad-p, don't use tabs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 (rest extents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 left right last p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 (save-restriction
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 (goto-char end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 (setq right (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 (setq left (current-column))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 (if (< right left)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 (let ((tmp left))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 (setq left right right tmp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 (setq start (- start (- right left))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 end (+ end (- right left)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 ;; End may have been set to a value greater than point-max if drag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 ;; or movement extends to end of buffer, so reset it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 (setq end (min end (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 (beginning-of-line)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 (narrow-to-region (point) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 (goto-char start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 (while (and rest (not (eobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 (setq p (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 (move-to-column right pad-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 (set-extent-endpoints (car rest) p (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 ;; this code used to look at the return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 ;; of forward-line, but that doesn't work because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 ;; forward-line has bogus behavior: If you're on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 ;; the last line of a buffer but not at the very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 ;; end, forward-line will move you to the very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 ;; end and return 0 instead of 1, like it should.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 ;; the result was frequent infinite loops here,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 ;; creating very large numbers of extents at
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 ;; the same position. There was an N^2 sorting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 ;; algorithm in extents.c for extents at a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 ;; particular position, and the result was very
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 ;; bad news.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 (if (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 (move-to-column left pad-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 (setq last rest
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 rest (cdr rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041 (cond (rest
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1042 (mapc 'delete-extent rest)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 (setcdr last nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 ((not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 (while (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 (setq p (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 (move-to-column right pad-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (let ((e (make-extent p (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 (set-extent-face e (extent-face (car extents)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 (set-extent-priority e (extent-priority (car extents)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (setcdr last (cons e nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 (setq last (cdr last)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 (forward-line 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 (if (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 (move-to-column left pad-p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 )))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 ))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 (defun default-mouse-track-has-selection-p (buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 (and (selection-owner-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 (extent-live-p primary-selection-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 (not (extent-detached-p primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 (eq buffer (extent-object primary-selection-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 (defun default-mouse-track-anchor (adjust previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 (if adjust
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 (if (default-mouse-track-has-selection-p (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 (let ((start (extent-start-position primary-selection-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 (end (extent-end-position primary-selection-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 (cond ((< (point) start) end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 ((> (point) end) start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 ((> (- (point) start) (- end (point))) start)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 (t end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077 (defun default-mouse-track-maybe-own-selection (pair type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 (let ((start (car pair))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079 (end (cdr pair)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 (or (= start end) (push-mark (if (= (point) start) end start)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 (cond (zmacs-regions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 (if (= start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 ;; #### UTTER KLUDGE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 ;; If we don't have this sit-for here, then triple-clicking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 ;; will result in the line not being highlighted as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 ;; should. What appears to be happening is this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089 ;; -- each time the button goes down, the selection is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 ;; disowned (see comment "remove the existing selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 ;; to unclutter the display", below).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 ;; -- this causes a SelectionClear event to be sent to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 ;; XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 ;; -- each time the button goes up except the first, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 ;; selection is owned again.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 ;; -- later, XEmacs processes the SelectionClear event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 ;; The selection code attempts to keep track of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 ;; time that it last asserted the selection, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 ;; compare it to the time of the SelectionClear event,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 ;; to see if it's a bogus notification or not (as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101 ;; is the case here). However, for some unknown
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 ;; reason this doesn't work in the triple-clicking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 ;; case, and the selection code bogusly thinks this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 ;; SelectionClear event is the real thing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 ;; -- putting the sit-for in causes the pending
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 ;; SelectionClear events to get processed before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 ;; the selection is reasserted, so everything works
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 ;; out OK.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 ;; Presumably(?) this means there is a weird timing bug
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 ;; in the selection code, but there's not a chance in hell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 ;; that I have the patience to track it down. Blame the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 ;; designers of X for fucking everything up so badly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 ;; This was originally a sit-for 0 but that wasn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 ;; sufficient to make things work. Even this isn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 ;; always sufficient but it seems to give something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 ;; approaching a 99% success rate. Making it higher yet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 ;; would help guarantee success with the price that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 ;; delay would start to become noticeable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 (and (eq (console-type) 'x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 (sit-for 0.15 t))
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1124 ;; zmacs-activate-region -> zmacs-activate-region-hook ->
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1125 ;; activate-region-as-selection -> either own-selection or
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1126 ;; mouse-track-activate-rectangular-selection
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 (zmacs-activate-region)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 ((console-on-window-system-p)
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1129 ;; #### do we need this? we don't do it when zmacs-regions = t
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 (if (= start end)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 (disown-selection type)
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1132 (activate-region-as-selection))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 (if (and (eq 'x (console-type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 (not (= start end)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 ;; I guess cutbuffers should do something with rectangles too.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 ;; does anybody use them?
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 487
diff changeset
1137 (declare-fboundp (x-store-cutbuffer (buffer-substring start end))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138
487
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1139 (defun mouse-track-activate-rectangular-selection ()
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1140 (if (consp default-mouse-track-extent)
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1141 ;; own the rectangular region
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1142 ;; this is a hack
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1143 (let ((r default-mouse-track-extent))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1144 (save-excursion
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1145 (set-buffer (get-buffer-create " *rect yank temp buf*"))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1146 (erase-buffer)
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1147 (while r
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1148 (insert (extent-string (car r)) "\n")
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1149 (setq r (cdr r)))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1150 (own-selection (buffer-substring (point-min) (point-max)))))))
54fa1a5c2d12 [xemacs-hg @ 2001-04-28 07:48:36 by ben]
ben
parents: 479
diff changeset
1151
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 (defun default-mouse-track-deal-with-down-event (click-count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 (let ((event default-mouse-track-down-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 (if (null event) nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 (select-frame (event-frame event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 (let ((adjust default-mouse-track-adjust)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 ;; ####When you click on the splash-screen,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 ;; event-{closest-,}point can be out of bounds. Should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 ;; event-closest-point really be allowed to return a bad
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 ;; position like that? Maybe pixel_to_glyph_translation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 ;; needs to invalidate its cache when the buffer changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1162 ;; -dkindred@cs.cmu.edu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 (close-pos (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 (set-buffer (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 (let ((p (event-closest-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 (and p (min (max p (point-min)) (point-max))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167 extent previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 (if (not (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 (error "not over window?"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 (setq default-mouse-track-type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 (nth (mod (1- click-count)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 (length default-mouse-track-type-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 default-mouse-track-type-list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 (setq default-mouse-track-window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 ;; Note that the extent used here is NOT the extent which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 ;; ends up as the value of zmacs-region-extent - this one is used
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 ;; just during mouse-dragging.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 (setq default-mouse-track-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 (make-extent close-pos close-pos (event-buffer event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 (setq extent default-mouse-track-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 (set-extent-face extent 'zmacs-region)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 ;; While the selection is being dragged out, give the selection extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 ;; slightly higher priority than any mouse-highlighted extent, so that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 ;; the exact endpoints of the selection will be visible while the mouse
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 ;; is down. Normally, the selection and mouse highlighting have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 ;; same priority, so that conflicts between the two of them are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 ;; resolved by the usual size-and-endpoint-comparison method.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 (set-extent-priority extent (1+ mouse-highlight-priority))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 (if mouse-track-rectangle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 (setq default-mouse-track-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 (list default-mouse-track-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 (setq previous-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 (if (and adjust
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 (markerp default-mouse-track-previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 (eq (current-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 (marker-buffer default-mouse-track-previous-point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 (marker-position default-mouse-track-previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 (default-mouse-track-set-point event default-mouse-track-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 (if (not adjust)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 (if (markerp default-mouse-track-previous-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 (set-marker default-mouse-track-previous-point (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 (setq default-mouse-track-previous-point (point-marker))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 ;; adjust point to a word or line boundary if appropriate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 (let ((anchor (default-mouse-track-anchor adjust previous-point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 (setq default-mouse-track-min-anchor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 (save-excursion (goto-char anchor)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 (funcall
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 default-mouse-track-normalize-point-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 default-mouse-track-type nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 (setq default-mouse-track-max-anchor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 (save-excursion (goto-char anchor)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 (funcall
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 default-mouse-track-normalize-point-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 default-mouse-track-type t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 ;; remove the existing selection to unclutter the display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 (if (not adjust)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 (cond (zmacs-regions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 (zmacs-deactivate-region))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 ((console-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 (disown-selection)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 (setq default-mouse-track-down-event nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1230 ;; return t if the button or motion event involved the specified button.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231 (defun default-mouse-track-event-is-with-button (event n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 (cond ((button-event-p event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1233 (= n (event-button event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 ((motion-event-p event)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 (memq (cdr
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 (assq n '((1 . button1) (2 . button2) (3 . button3)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237 (4 . button4) (5 . button5))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1238 (event-modifiers event)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1239
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1240 ;; return t if an activation function was called. This checks to see
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1241 ;; if the appropriate stroke for the click count and the button that
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1242 ;; was pressed is present in `mouse-track-activate-strokes'; if so, it
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1243 ;; looks for an extent under the mouse with an `activate-function'
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1244 ;; property, calls it and returns t. Else, it repeats the whole
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1245 ;; process with `mouse-track-conservative-activate-strokes' and
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1246 ;; `conservative-activate-function'.
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1247 (defun default-mouse-track-check-for-activation (event click-count
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1248 count-list button-list)
5567
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1249 (labels ((do-activate (event property)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1250 (let ((ex (extent-at-event event property)))
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1251 (when ex
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1252 (funcall (extent-property ex property) event ex)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1253 t))))
5576
071b810ceb18 Declare labels as line where appropriate; use #'labels, not #'flet, tests.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5567
diff changeset
1254 (declare (inline do-activate))
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1255 (or
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1256 (and (some #'(lambda (count button)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1257 (and (= click-count count)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1258 (memq button
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1259 mouse-track-activate-strokes)))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1260 count-list button-list)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1261 (do-activate event 'activate-function))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1262 (and (some #'(lambda (count button)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1263 (and (= click-count count)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1264 (memq button
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1265 mouse-track-conservative-activate-strokes)))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1266 count-list button-list)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1267 (do-activate event 'conservative-activate-function)))))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1268
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 (defun default-mouse-track-down-hook (event click-count)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1270 (cond ((default-mouse-track-event-is-with-button event 1)
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1271 (if (default-mouse-track-check-for-activation
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1272 event 1 '(1) '(button1-down))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1273 t
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1274 (setq default-mouse-track-down-event (copy-event event))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1275 nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1276 ((default-mouse-track-event-is-with-button event 2)
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1277 (default-mouse-track-check-for-activation
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1278 event 1 '(1) '(button2-down)))))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1279
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1280 (defun default-mouse-track-click-hook (event click-count)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1281 (cond ((default-mouse-track-event-is-with-button event 1)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1282 (if (default-mouse-track-check-for-activation
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1283 event click-count '(1 2 3) '(button1-click button1-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1284 button1-triple-click))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1285 t
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1286 (default-mouse-track-drag-hook event click-count nil)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1287 (default-mouse-track-drag-up-hook event click-count)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1288 t))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1289 ((default-mouse-track-event-is-with-button event 2)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1290 (if (default-mouse-track-check-for-activation
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1291 event click-count '(1 2 3) '(button2-click button2-double-click
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1292 button2-triple-click))
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1293 t
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1294 (mouse-yank event)
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1295 t))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 (defun default-mouse-track-cleanup-extents-hook ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 (remove-hook 'pre-command-hook 'default-mouse-track-cleanup-extents-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 (let ((extent default-mouse-track-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 (if (consp extent) ; rectangle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301 (mapcar 'delete-extent extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 (if extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 (delete-extent extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 (defun default-mouse-track-cleanup-hook ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 (if zmacs-regions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 (funcall 'default-mouse-track-cleanup-extents-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 (let ((extent default-mouse-track-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 (func #'(lambda (e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 (and (extent-live-p e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 (set-extent-face e 'primary-selection)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 (add-hook 'pre-command-hook 'default-mouse-track-cleanup-extents-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 (if (consp extent) ; rectangle-p
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1314 (mapc func extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 (if extent
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1316 (funcall func extent)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1317 t)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 (defun default-mouse-track-cleanup-extent ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 (let ((dead-func
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321 (function (lambda (x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 (or (not (extent-live-p x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 (extent-detached-p x)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 (extent default-mouse-track-extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 (if (consp extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 (if (funcall dead-func extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 (let (newval)
4783
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1328 (mapc (function (lambda (x)
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1329 (if (not (funcall dead-func x))
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1330 (setq newval (cons x newval)))))
e29fcfd8df5f Eliminate most core code byte-compile warnings.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4677
diff changeset
1331 extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 (setq default-mouse-track-extent (nreverse newval))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 (if (funcall dead-func extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 (setq default-mouse-track-extent nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 (defun default-mouse-track-drag-hook (event click-count was-timeout)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1337 (cond ((default-mouse-track-event-is-with-button event 1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1338 (default-mouse-track-deal-with-down-event click-count)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1339 (default-mouse-track-set-point event default-mouse-track-window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1340 (default-mouse-track-cleanup-extent)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1341 (default-mouse-track-next-move default-mouse-track-min-anchor
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1342 default-mouse-track-max-anchor
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1343 default-mouse-track-extent)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1344 t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1345 ((default-mouse-track-event-is-with-button event 2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1346 (mouse-begin-drag-n-drop event))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 (defun default-mouse-track-return-dragged-selection (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 (default-mouse-track-cleanup-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 (let ((extent default-mouse-track-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 (default-mouse-track-set-point-in-window event default-mouse-track-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 (default-mouse-track-next-move default-mouse-track-min-anchor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 default-mouse-track-max-anchor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 (cond ((consp extent) ; rectangle-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 (let ((first (car extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 (last (car (setq extent (nreverse extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 ;; nreverse is destructive so we need to reset this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 (setq default-mouse-track-extent extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 (setq result (cons (extent-start-position first)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 (extent-end-position last)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 ;; kludge to fix up region when dragging backwards...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 (if (and (/= (point) (extent-start-position first))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 (/= (point) (extent-end-position last))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 (= (point) (extent-end-position first)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1367 (goto-char (car result)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1368 (extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 (setq result (cons (extent-start-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 (extent-end-position extent)))))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1371 ;; Minor kludge: if we're selecting in line-mode, include the final
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1372 ;; newline. It's hard to do this in *-normalize-point. Unfortunately
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1373 ;; this necessitates a counter-kludge in
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1374 ;; default-mouse-track-normalize-point.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 (if (and result (eq default-mouse-track-type 'line))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376 (let ((end-p (= (point) (cdr result))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 (goto-char (cdr result))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1378 (if (and (eolp) (not (eobp)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 (setcdr result (1+ (cdr result))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380 (goto-char (if end-p (cdr result) (car result)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 ;;; ;; Minor kludge sub 2. If in char mode, and we drag the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 ;;; ;; mouse past EOL, include the newline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 ;;; ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 ;;; ;; Major problem: can't easily distinguish between being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 ;;; ;; just past the last char on a line, and well past it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 ;;; ;; to determine whether or not to include it in the region
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 ;;; ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 ;;; (if nil ; (eq default-mouse-track-type 'char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 ;;; (let ((after-end-p (and (not (eobp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 ;;; (eolp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 ;;; (> (point) (car result)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 ;;; (if after-end-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 ;;; (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 ;;; (setcdr result (1+ (cdr result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 ;;; (goto-char (cdr result))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 result))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 (defun default-mouse-track-drag-up-hook (event click-count)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1399 (when (default-mouse-track-event-is-with-button event 1)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1400 (let ((result (default-mouse-track-return-dragged-selection event)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1401 (if result
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1402 (default-mouse-track-maybe-own-selection result 'PRIMARY)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1403 t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 (add-hook 'mouse-track-down-hook 'default-mouse-track-down-hook)
2504
e17beacca645 [xemacs-hg @ 2005-01-26 04:47:13 by ben]
ben
parents: 793
diff changeset
1406 (add-hook 'mouse-track-click-hook 'default-mouse-track-click-hook)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 (add-hook 'mouse-track-drag-hook 'default-mouse-track-drag-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 (add-hook 'mouse-track-drag-up-hook 'default-mouse-track-drag-up-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 (add-hook 'mouse-track-cleanup-hook 'default-mouse-track-cleanup-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 ;;;;;;;;;;;; other mouse-track stuff (mostly associated with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 ;;;;;;;;;;;; default handlers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 (defun mouse-track-default (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 "Invoke `mouse-track' with only the default handlers active."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 (interactive "e")
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1418 (mouse-track event
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1419 '(mouse-track-down-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1420 default-mouse-track-down-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1421 mouse-track-up-hook nil
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1422 mouse-track-drag-hook default-mouse-track-drag-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1423 mouse-track-drag-up-hook default-mouse-track-drag-up-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1424 mouse-track-click-hook default-mouse-track-click-hook
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1425 mouse-track-cleanup-hook default-mouse-track-cleanup-hook)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 (defun mouse-track-do-rectangle (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 "Like `mouse-track' but selects rectangles instead of regions."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 (let ((mouse-track-rectangle-p t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 (mouse-track event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1433 (defun mouse-track-by-lines (event)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1434 "Make a line-by-line selection with the mouse.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1435 This actually works the same as `mouse-track' (which handles all
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1436 mouse-button behavior) but forces whole lines to be selected."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1437 (interactive "e")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1438 (let ((default-mouse-track-type-list '(line)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1439 (mouse-track event)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1440
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 (defun mouse-track-adjust (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 "Extend the existing selection. This should be bound to a mouse button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 The selection will be enlarged or shrunk so that the point of the mouse
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 click is one of its endpoints. This function in fact behaves fairly
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 similarly to `mouse-track', but begins by extending the existing selection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 (or creating a new selection from the previous text cursor position to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 the current mouse position) instead of creating a new, empty selection.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 The mouse-track handlers are run from this command just like from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 `mouse-track'. Therefore, do not call this command from a mouse-track
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 handler!"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 (let ((default-mouse-track-adjust t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 (mouse-track event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 (defun mouse-track-adjust-default (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 "Extend the existing selection, using only the default handlers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 This is just like `mouse-track-adjust' but will override any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 custom mouse-track handlers that the user may have installed."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 (let ((default-mouse-track-adjust t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 (mouse-track-default event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1464 (defun mouse-track-adjust-by-lines (event)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1465 "Extend the existing selection by lines.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1466 This works the same as `mouse-track-adjust' (bound to \\[mouse-track-adjust])
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1467 but forces whole lines to be selected."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1468 (interactive "e")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1469 (let ((default-mouse-track-type-list '(line))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1470 (default-mouse-track-adjust t))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1471 (mouse-track event)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1472
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1473 (defun mouse-track-insert-1 (event &optional delete line-p)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1474 "Guts of mouse-track-insert and friends.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1475 If DELETE, delete the selection as well as inserting it at the new place.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1476 If LINE-P, select by lines and insert before current line."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 (interactive "*e")
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1478 (let ((default-mouse-track-type-list
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1479 (if line-p '(line) default-mouse-track-type-list))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1480 s selreg)
5567
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1481 (labels ((Mouse-track-insert-drag-up-hook (event count)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1482 (setq selreg
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1483 (default-mouse-track-return-dragged-selection event))
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1484 t)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1485 (Mouse-track-insert-click-hook (event count)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1486 (default-mouse-track-drag-hook event count nil)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1487 (setq selreg
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1488 (default-mouse-track-return-dragged-selection event))
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1489 t))
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1490 (save-excursion
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1491 (save-window-excursion
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1492 (mouse-track
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1493 event
5567
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1494 (list 'mouse-track-drag-up-hook
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1495 #'Mouse-track-insert-drag-up-hook
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1496 'mouse-track-click-hook
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5473
diff changeset
1497 #'Mouse-track-insert-click-hook))
546
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1498 (if (consp selreg)
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1499 (let ((pair selreg))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1500 (setq s (prog1
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1501 (buffer-substring (car pair) (cdr pair))
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1502 (if delete
666d73d6ac56 [xemacs-hg @ 2001-05-20 01:17:07 by ben]
ben
parents: 539
diff changeset
1503 (kill-region (car pair) (cdr pair))))))))))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1504 (or (null s) (equal s "")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1505 (progn
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1506 (if line-p (beginning-of-line))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1507 (insert s)))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1508
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1509 (defun mouse-track-insert (event)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1510 "Make a selection with the mouse and insert it at point.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1511 This works the same as just selecting text using the mouse (the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1512 `mouse-track' command), except that point is not moved; the selected text
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1513 is immediately inserted after being selected\; and the selection is
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1514 immediately disowned afterwards."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1515 (interactive "*e")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1516 (mouse-track-insert-1 event))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 (defun mouse-track-delete-and-insert (event)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1519 "Make a selection with the mouse and move it to point.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1520 This works the same as just selecting text using the mouse (the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1521 `mouse-track' command), except that point is not moved; the selected text
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1522 is immediately inserted after being selected\; and the text of the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1523 selection is deleted."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 (interactive "*e")
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1525 (mouse-track-insert-1 event t))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1526
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1527 (defun mouse-track-insert-by-lines (event)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1528 "Make a line-oriented selection with the mouse and insert it at line start.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1529 This is similar to `mouse-track-insert' except that it always selects
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1530 entire lines and inserts the lines before the current line rather than at
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1531 point."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1532 (interactive "*e")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1533 (mouse-track-insert-1 event nil t))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1534
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1535 (defun mouse-track-delete-and-insert-by-lines (event)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1536 "Make a line-oriented selection with the mouse and move it to line start.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1537 This is similar to `mouse-track-insert' except that it always selects
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1538 entire lines and inserts the lines before the current line rather than at
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1539 point."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1540 (interactive "*e")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
1541 (mouse-track-insert-1 event nil t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 ;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 (defvar inhibit-help-echo nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 "Inhibits display of `help-echo' extent properties in the minibuffer.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 (defvar last-help-echo-object nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 (defvar help-echo-owns-message nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 (defun clear-help-echo (&optional ignored-frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 (if help-echo-owns-message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 (setq help-echo-owns-message nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 last-help-echo-object nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 (clear-message 'help-echo))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 (defun show-help-echo (mess)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 ;; (clear-help-echo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 (setq help-echo-owns-message t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 (display-message 'help-echo mess))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 (add-hook 'mouse-leave-frame-hook 'clear-help-echo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 ;; It may be a good idea to move this to C, for better performance of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 ;; extent highlighting and pointer changes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 (defun default-mouse-motion-handler (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 "For use as the value of `mouse-motion-handler'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 This implements the various pointer-shape variables,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 as well as extent highlighting, help-echo, toolbar up/down,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 and `mode-motion-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 (let* ((frame (or (event-frame event) (selected-frame)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 (window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 (buffer (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 (modeline-point (and buffer (event-modeline-position event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 (modeline-string (and modeline-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 (symbol-value-in-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 'generated-modeline-string buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 ;; point must be invalidated by modeline-point.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 (point (and buffer (not modeline-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 (event-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 (extent (or (and point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 (extent-at point buffer 'mouse-face))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 (and modeline-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 (extent-at modeline-point modeline-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 ;; Modeline extents don't have a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 ;; mouse-face property set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588 'help-echo))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 (glyph-extent1 (event-glyph-extent event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 (glyph-extent (and glyph-extent1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 (extent-live-p glyph-extent1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 glyph-extent1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 ;; This is an extent:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 (user-pointer1 (or (and glyph-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 (extent-property glyph-extent 'pointer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 glyph-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 (and point (extent-at point buffer 'pointer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 (and modeline-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 (extent-at modeline-point modeline-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 'pointer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 ;; And this should be a glyph:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 (user-pointer (and user-pointer1 (extent-live-p user-pointer1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 (extent-property user-pointer1 'pointer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 (button (event-toolbar-button event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 (help (or (and glyph-extent (extent-property glyph-extent 'help-echo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 glyph-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 (and button (not (null (toolbar-button-help-string button)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 button)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 (and point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 (extent-at point buffer 'help-echo))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 (and modeline-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 (extent-at modeline-point modeline-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 'help-echo))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 ;; vars is a list of glyph variables to check for a pointer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 ;; value.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 (vars (cond
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1617 ;; Checking if button is non-nil is not sufficient
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 ;; since the pointer could be over a blank portion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 ;; of the toolbar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 ((event-over-toolbar-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 '(toolbar-pointer-glyph nontext-pointer-glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 ((or extent glyph-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 '(selection-pointer-glyph text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 ((event-over-modeline-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 '(modeline-pointer-glyph nontext-pointer-glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 ((and (event-over-vertical-divider-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 ;; #### I disagree with the check below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 ;; Discuss it with Kirill for 21.1. --hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 (specifier-instance vertical-divider-always-visible-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 '(divider-pointer-glyph nontext-pointer-glyph
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635 (point '(text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 (buffer '(nontext-pointer-glyph text-pointer-glyph))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 (t '(nontext-pointer-glyph text-pointer-glyph))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 pointer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 (and user-pointer (glyphp user-pointer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640 (push 'user-pointer vars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 (while (and vars (not (pointer-image-instance-p pointer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 (setq pointer (glyph-image-instance (symbol-value (car vars))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 (or window frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 vars (cdr vars)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 (if (pointer-image-instance-p pointer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 (set-frame-pointer frame pointer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 ;; If last-pressed-toolbar-button is not nil, then check and see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 ;; if we have moved to a new button and adjust the down flags
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 ;; accordingly.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 (when (and (featurep 'toolbar) toolbar-active)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 (unless (eq last-pressed-toolbar-button button)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 (release-previous-toolbar-button event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 (and button (press-toolbar-button event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 (cond (extent (highlight-extent extent t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 (glyph-extent (highlight-extent glyph-extent t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 (t (highlight-extent nil nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 (cond ((extentp help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 (or inhibit-help-echo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 (eq help last-help-echo-object) ;save some time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 (eq (selected-window) (minibuffer-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 (let ((hprop (extent-property help 'help-echo)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 (setq last-help-echo-object help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 (or (stringp hprop)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 (setq hprop (funcall hprop help)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 (and hprop (show-help-echo hprop)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 ((and (featurep 'toolbar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 (toolbar-button-p help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 (toolbar-button-enabled-p help))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 (or (not toolbar-help-enabled)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 (eq help last-help-echo-object) ;save some time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 (eq (selected-window) (minibuffer-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 (let ((hstring (toolbar-button-help-string button)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 (setq last-help-echo-object help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 (or (stringp hstring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678 (setq hstring (funcall hstring help)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 (and hstring (show-help-echo hstring)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 (last-help-echo-object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 (clear-help-echo)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 (if mouse-grabbed-buffer (setq buffer mouse-grabbed-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 (if (and buffer (symbol-value-in-buffer 'mode-motion-hook buffer nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 (with-current-buffer buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 (run-hook-with-args 'mode-motion-hook event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 ;; If the mode-motion-hook created a highlightable extent around
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 ;; the mouse-point, highlight it right away. Otherwise it wouldn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 ;; be highlighted until the *next* motion event came in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 (if (and point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 (null extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 (setq extent (extent-at point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 (event-buffer event) ; not buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 'mouse-face)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 (highlight-extent extent t)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 (setq mouse-motion-handler 'default-mouse-motion-handler)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 ;; Vertical divider dragging
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 (defun drag-window-divider (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 "Handle resizing windows by dragging window dividers.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1705 This is an internal function, normally bound to button1 event in
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 window-divider-map. You would not call it, but you may bind it to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 other mouse buttons."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 ;; #### I disagree with the check below.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 ;; Discuss it with Kirill for 21.1. --hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 (if (not (specifier-instance vertical-divider-always-visible-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 (error "Not over a window"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 (let-specifier ((vertical-divider-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 (- (specifier-instance vertical-divider-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 (let* ((window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 (frame (event-channel event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 (last-timestamp (event-timestamp event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 (while (not done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 (let* ((edges (window-pixel-edges window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 (old-right (caddr edges))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 (old-left (car edges))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726 (backup-conf (current-window-configuration frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 (old-edges-all-windows (mapcar 'window-pixel-edges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 (window-list))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 ;; This is borrowed from modeline.el:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 ;; requeue event and quit if this is a misc-user, eval or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 ;; keypress event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 ;; quit if this is a button press or release event, or if the event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 ;; occurred in some other frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 ;; drag if this is a mouse motion event and the time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 ;; between this event and the last event is greater than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 ;; drag-divider-event-lag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 ;; do nothing if this is any other kind of event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 (setq event (next-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 (cond ((or (misc-user-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 (key-press-event-p event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 (setq unread-command-events (nconc unread-command-events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 (list event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 ((button-release-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 ((button-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 ((not (motion-event-p event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 (dispatch-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 ((not (eq frame (event-frame event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 ((< (abs (- (event-timestamp event) last-timestamp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 drag-divider-event-lag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 (setq last-timestamp (event-timestamp event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 ;; Enlarge the window, calculating change in characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 ;; of default font. Do not let the window to become
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1759 ;; less than allowed minimum (not because that's critical
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 ;; for the code performance, just the visual effect is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 ;; better: when cursor goes to the left of the next left
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1762 ;; divider, the window being resized shrinks to minimal
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 ;; size.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 (enlarge-window (max (- window-min-width (window-width window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 (/ (- (event-x-pixel event) old-right)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 (face-width 'default window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 t window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768 ;; Backout the change if some windows got deleted, or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 ;; if the change caused more than two windows to resize
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 ;; (shifting the whole stack right is ugly), or if the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 ;; left window side has slipped (right side cannot be
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1772 ;; moved any further to the right, so enlarge-window
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 ;; plays bad games with the left edge.
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 4790
diff changeset
1774 (if (or (not (eql (count-windows)
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 4790
diff changeset
1775 (length old-edges-all-windows)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 (/= old-left (car (window-pixel-edges window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 ;; This check is very hairy. We allow any number
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 ;; of left edges to change, but only to the same
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 ;; new value. Similar procedure is for the right edges.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 (let ((all-that-bad nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 (new-left-ok nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782 (new-right-ok nil))
5369
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1783 (mapc (lambda (window old-edges)
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1784 (let ((new
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1785 (car (window-pixel-edges window))))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1786 (if (/= new (car old-edges))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1787 (if (and new-left-ok
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1788 (/= new-left-ok new))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1789 (setq all-that-bad t)
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1790 (setq new-left-ok new)))))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1791 (window-list) old-edges-all-windows)
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1792 (mapc (lambda (window old-edges)
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1793 (let ((new
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1794 (caddr (window-pixel-edges window))))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1795 (if (/= new (caddr old-edges))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1796 (if (and new-right-ok
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1797 (/= new-right-ok new))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1798 (setq all-that-bad t)
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1799 (setq new-right-ok new)))))
4141aeddc55b Eliminate byte-compile warnings, core Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
1800 (window-list) old-edges-all-windows)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 all-that-bad))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 (set-window-configuration backup-conf)))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 (setq vertical-divider-map (make-keymap))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 (define-key vertical-divider-map 'button1 'drag-window-divider)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 ;;; mouse.el ends here