annotate lisp/modeline.el @ 5753:dbd8305e13cb

Warn about non-string non-integer ARG to #'gensym, bytecomp.el. lisp/ChangeLog addition: 2013-08-21 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (gensym): * bytecomp.el (byte-compile-gensym): New. Warn that gensym called in a for-effect context is unlikely to be useful. Warn about non-string non-integer ARGs, this is incorrect. Am not changing the function to error with same, most code that makes the mistake is has no problems, which is why it has survived so long. * window-xemacs.el (save-window-excursion/mapping): * window.el (save-window-excursion): Call #'gensym with a string, not a symbol.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 21 Aug 2013 19:02:59 +0100
parents cf2733b1ff4b
children
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 ;;; modeline.el --- modeline hackery.
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-1994, 1997 Free Software Foundation, Inc.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
4 ;; Copyright (C) 1995, 1996, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Keywords: extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
11 ;; 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: 5267
diff changeset
12 ;; 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: 5267
diff changeset
13 ;; 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: 5267
diff changeset
14 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
16 ;; 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: 5267
diff changeset
17 ;; 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: 5267
diff changeset
18 ;; 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: 5267
diff changeset
19 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ;; 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: 5267
diff changeset
22 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;;; Synched up with: Not in FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;;; General mouse modeline stuff ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 (defgroup modeline nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 "Modeline customizations."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 :group 'environment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
40 (defcustom modeline-3d-p ;; added for the options menu
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
41 (let ((thickness
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
42 (specifier-instance modeline-shadow-thickness)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
43 (and (integerp thickness)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
44 (> thickness 0)))
4578
49e17f7182f5 Fix docstring copy-pasto.
"Ville Skyttä <scop@xemacs.org>"
parents: 4043
diff changeset
45 "Whether the modeline is displayed with raised, 3-d appearance.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
46 This option only has an effect when set using `customize-set-variable',
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
47 or through the Options menu."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
48 :group 'display
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
49 :type 'boolean
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
50 :set #'(lambda (var val)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
51 (if val
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
52 (set-specifier modeline-shadow-thickness 2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
53 (set-specifier modeline-shadow-thickness 0))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
54 (redraw-modeline t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
55 (setq modeline-3d-p val))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
56 )
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
57
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 (defcustom drag-divider-event-lag 150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 "*The pause (in msecs) between divider drag events before redisplaying.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 If this value is too small, dragging will be choppy because redisplay cannot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 keep up. If it is too large, dragging will be choppy because of the explicit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 redisplay delay specified."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 :type 'integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 ;; #### Fix group.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 :group 'modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 (define-obsolete-variable-alias
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 'drag-modeline-event-lag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 'drag-divider-event-lag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 (defcustom modeline-click-swaps-buffers nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 "*If non-nil, clicking on the modeline changes the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 Click on the left half of the modeline cycles forward through the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 buffer list and clicking on the right half cycles backward."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 :group 'modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
78 (defcustom modeline-scrolling-method nil
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
79 "*If non-nil, dragging the modeline with the mouse may also scroll its
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
80 text horizontally (vertical motion controls window resizing and horizontal
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
81 motion controls modeline scrolling).
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
82
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
83 With a value of t, the modeline text is scrolled in the same direction as
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
84 the mouse motion. With a value of 'scrollbar, the modeline is considered as
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
85 a scrollbar for its own text, which then moves in the opposite direction.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
86
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
87 This option should be set using `customize-set-variable'."
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
88 :type '(choice (const :tag "none" nil)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
89 (const :tag "text" t)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
90 (const :tag "scrollbar" scrollbar))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
91 :set (lambda (sym val)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
92 (set-default sym val)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
93 (when (featurep 'x)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
94 (cond ((eq val t)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
95 (set-glyph-image modeline-pointer-glyph "hand2" 'global 'x))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
96 ((eq val 'scrollbar)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
97 (set-glyph-image modeline-pointer-glyph "fleur" 'global 'x))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
98 (t
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
99 (set-glyph-image modeline-pointer-glyph "sb_v_double_arrow"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
100 'global 'x))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
101 (when (featurep 'mswindows)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
102 (cond ((eq val t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
103 (set-glyph-image modeline-pointer-glyph
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
104 [mswindows-resource :resource-type cursor
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
105 :resource-id "SizeAll"]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
106 'global 'mswindows))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
107 ((eq val 'scrollbar)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
108 (set-glyph-image modeline-pointer-glyph
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
109 [mswindows-resource :resource-type cursor
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
110 :resource-id "Normal"]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
111 'global 'mswindows))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
112 (t
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
113 (set-glyph-image modeline-pointer-glyph
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
114 [mswindows-resource :resource-type cursor
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
115 :resource-id "SizeNS"]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
116 'global 'mswindows)))))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
117 :group 'modeline)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
118
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 (defun mouse-drag-modeline (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 "Resize a window by dragging its modeline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 This command should be bound to a button-press event in modeline-map.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 Holding down a mouse button and moving the mouse up and down will
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
123 make the clicked-on window taller or shorter.
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
124
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
125 See also the variable `modeline-scrolling-method'."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (or (button-press-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (error "%s must be invoked by a mouse-press" this-command))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (or (event-over-modeline-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (error "not over a modeline"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 ;; Give the modeline a "pressed" look. --hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (let-specifier ((modeline-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 (- (specifier-instance modeline-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 (let ((done nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (depress-line (event-y event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (start-event-frame (event-frame event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (start-event-window (event-window event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (start-nwindows (count-windows t))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
141 (hscroll-delta (face-width 'modeline))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
142 (start-hscroll (modeline-hscroll (event-window event)))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
143 (start-x-pixel (event-x-pixel event))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 (last-timestamp 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 default-line-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 modeline-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 should-enlarge-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 event min-height minibuffer y top bot edges wconfig growth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (setq minibuffer (minibuffer-window start-event-frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 default-line-height (face-height 'default start-event-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 min-height (+ (* window-min-height default-line-height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 ;; Don't let the window shrink by a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 ;; non-multiple of the default line
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 ;; height. (enlarge-window -1) will do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 ;; this if the difference between the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 ;; current window height and the minimum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 ;; window height is less than the height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 ;; of the default font. These extra
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 ;; lost pixels of height don't come back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 ;; if you grow the window again. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 ;; can make it impossible to drag back
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 ;; to the exact original size, which is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 ;; disconcerting.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (% (window-pixel-height start-event-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 default-line-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 modeline-height
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 (if (specifier-instance has-modeline-p start-event-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (+ (face-height 'modeline start-event-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (* 2 (specifier-instance modeline-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 start-event-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (* 2 (specifier-instance modeline-shadow-thickness
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 start-event-window))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (if (not (eq (window-frame minibuffer) start-event-frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (setq minibuffer nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 (if (and (null minibuffer) (one-window-p t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 (error "Attempt to resize sole window"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 ;; if this is the bottommost ordinary window, then to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 ;; move its modeline the minibuffer must be enlarged.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (setq should-enlarge-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (and minibuffer (window-lowest-p start-event-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 ;; loop reading events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 (while (not done)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (setq event (next-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 ;; requeue event and quit if this is a misc-user, eval or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 ;; keypress event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 ;; 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
187 ;; occurred in some other frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 ;; drag if this is a mouse motion event and the time
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 ;; between this event and the last event is greater than
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 ;; drag-divider-event-lag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 ;; do nothing if this is any other kind of event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (cond ((or (misc-user-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (key-press-event-p event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (setq unread-command-events (nconc unread-command-events
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (list event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 ((button-release-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (setq done t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 ;; Consider we have a mouse click neither X pos (modeline
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 ;; scroll) nore Y pos (modeline drag) have changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 (and modeline-click-swaps-buffers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 (= depress-line (event-y event))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
203 (or (not modeline-scrolling-method)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
204 (= start-hscroll
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
205 (modeline-hscroll start-event-window)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (modeline-swap-buffers event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 ((button-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 ((not (motion-event-p event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (dispatch-event event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 ((not (eq start-event-frame (event-frame event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (setq done t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ((< (abs (- (event-timestamp event) last-timestamp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 drag-divider-event-lag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (t
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
217 (when modeline-scrolling-method
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
218 (let ((delta (/ (- (event-x-pixel event) start-x-pixel)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
219 hscroll-delta)))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
220 (set-modeline-hscroll start-event-window
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
221 (if (eq modeline-scrolling-method t)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
222 (- start-hscroll delta)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
223 (+ start-hscroll delta)))
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
224 ))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 (setq last-timestamp (event-timestamp event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 y (event-y-pixel event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 edges (window-pixel-edges start-event-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 top (nth 1 edges)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 bot (nth 3 edges))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 ;; scale back a move that would make the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 ;; window too short.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (cond ((< (- y top (- modeline-height)) min-height)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (setq y (+ top min-height (- modeline-height)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 ;; compute size change needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (setq growth (- y bot (/ (- modeline-height) 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 wconfig (current-window-configuration))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 ;; grow/shrink minibuffer?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (if should-enlarge-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 ;; yes. scale back shrinkage if it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 ;; would make the minibuffer less than 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 ;; line tall.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 ;; also flip the sign of the computed growth,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 ;; since if we want to grow the window with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 ;; modeline we need to shrink the minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 ;; and vice versa.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (if (and (> growth 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (< (- (window-pixel-height minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 growth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 default-line-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 (setq growth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (- (window-pixel-height minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 default-line-height)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (setq growth (- growth))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 ;; window grow and shrink by lines not pixels, so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 ;; divide the pixel height by the height of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 ;; default face.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 (setq growth (/ growth default-line-height))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;; grow/shrink the window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 (enlarge-window growth nil (if should-enlarge-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 start-event-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 ;; if this window's growth caused another
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 ;; window to be deleted because it was too
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 ;; short, rescind the change.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 ;; if size change caused space to be stolen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 ;; from a window above this one, rescind the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 ;; change, but only if we didn't grow/shrink
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 ;; the minibuffer. minibuffer size changes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 ;; can cause all windows to shrink... no way
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 ;; around it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 (if (or (/= start-nwindows (count-windows t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 (and (not should-enlarge-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 (/= top (nth 1 (window-pixel-edges
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 start-event-window)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 (set-window-configuration wconfig))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ;; from Bob Weiner (bob_weiner@pts.mot.com)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 ;; Whether this function should be called is now decided in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 ;; mouse-drag-modeline - dverna feb. 98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 (defun modeline-swap-buffers (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 "Handle mouse clicks on modeline by switching buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 If click on left half of a frame's modeline, bury current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 If click on right half of a frame's modeline, raise bottommost buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 Arg EVENT is the button release event that occurred on the modeline."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (or (event-over-modeline-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 (error "not over a modeline"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 (or (button-release-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 (error "not a button release event"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (if (< (event-x event) (/ (window-width (event-window event)) 2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 ;; On left half of modeline, bury current buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 ;; displaying second buffer on list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 (mouse-bury-buffer event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 ;; On right half of modeline, raise and display bottommost
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 ;; buffer in buffer list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 (mouse-unbury-buffer event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (defconst modeline-menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 '("Window Commands"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 ["Delete Window Above" delete-window t]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 ["Delete Other Windows" delete-other-windows t]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 ["Split Window Above" split-window-vertically t]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 ["Split Window Horizontally" split-window-horizontally t]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 ["Balance Windows" balance-windows t]
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (defun modeline-menu (event)
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 (popup-menu-and-execute-in-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (cons (format "Window Commands for %S:"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (buffer-name (event-buffer event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 (cdr modeline-menu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 (defvar modeline-map (make-sparse-keymap 'modeline-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 "Keymap consulted for mouse-clicks on the modeline of a window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 This variable may be buffer-local; its value will be looked up in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 the buffer of the window whose modeline was clicked upon.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (define-key modeline-map 'button1 'mouse-drag-modeline)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 ;; button2 selects the window without setting point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 (define-key modeline-map 'button2 (lambda () (interactive "@")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (define-key modeline-map 'button3 'modeline-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (make-face 'modeline-mousable "Face for mousable portions of the modeline.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 (set-face-parent 'modeline-mousable 'modeline nil '(default))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (when (featurep 'window-system)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
330 (set-face-foreground 'modeline-mousable "firebrick" nil '(default color win))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
331 (set-face-font 'modeline-mousable [bold] nil '(default mono win))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
332 (set-face-font 'modeline-mousable [bold] nil '(default grayscale win)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 (defmacro make-modeline-command-wrapper (command)
5513
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
335 "Return a function object wrapping COMMAND, for use with the modeline.
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
336
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
337 The function (itself a command, with \"e\" as its interactive spec) calls
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
338 COMMAND with the appropriate window selected, and is suitable as a binding
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
339 in the keymaps associated with the modeline."
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
340 (cond
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
341 ((and-fboundp 'cl-const-expr-p (cl-const-expr-p command))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
342 `#'(lambda (event)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
343 (interactive "e")
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
344 (save-selected-window
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
345 (select-window (event-window event))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
346 (call-interactively ,command))))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
347 ((eval-when-compile (cl-compiling-file))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
348 (let ((compiled
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
349 (eval-when-compile
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
350 (byte-compile-sexp
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
351 #'(lambda (event)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
352 (interactive "e")
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
353 (save-selected-window
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
354 (select-window (event-window event))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
355 (call-interactively 'placeholder)))))))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
356 `(make-byte-code ',(compiled-function-arglist compiled)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
357 ,(compiled-function-instructions compiled)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
358 (vector ,@(subst command ''placeholder
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
359 (mapcar 'quote-maybe
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
360 (compiled-function-constants compiled))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
361 :test 'equal))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
362 ,(compiled-function-stack-depth compiled)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
363 ,(compiled-function-doc-string compiled)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
364 ,(quote-maybe (second (compiled-function-interactive compiled))))))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
365 (t
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
366 `(lexical-let ((command ,command))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
367 #'(lambda (event)
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
368 (interactive "e")
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
369 (save-selected-window
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
370 (select-window (event-window event))
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
371 (call-interactively command)))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 ;;; Minor modes ;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 (defvar minor-mode-alist nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 "Alist saying how to show minor modes in the modeline.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 Each element looks like (VARIABLE STRING);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 STRING is included in the modeline iff VARIABLE's value is non-nil.
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 Actually, STRING need not be a string; any possible modeline element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 is okay. See `modeline-format'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 ;; Used by C code (lookup-key and friends) but defined here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 (defvar minor-mode-map-alist nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 "Alist of keymaps to use for minor modes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 Each element looks like (VARIABLE . KEYMAP); KEYMAP is used to read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 key sequences and look up bindings iff VARIABLE's value is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 If two active keymaps bind the same key, the keymap appearing earlier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 in the list takes precedence.")
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 (make-face 'modeline-mousable-minor-mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 "Face for mousable minor-mode strings in the modeline.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 (set-face-parent 'modeline-mousable-minor-mode 'modeline-mousable nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 '(default))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 (when (featurep 'window-system)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
398 (set-face-foreground 'modeline-mousable-minor-mode '("green4" "forestgreen")
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
399 nil '(default color win)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 (defvar modeline-mousable-minor-mode-extent (make-extent nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 ;; alliteration at its finest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 "Extent managing the mousable minor mode modeline strings.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 (set-extent-face modeline-mousable-minor-mode-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 'modeline-mousable-minor-mode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 ;; This replaces the idiom
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 ;; (or (assq 'isearch-mode minor-mode-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 ;; (setq minor-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 ;; (purecopy
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 ;; (append minor-mode-alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 ;; '((isearch-mode isearch-mode))))))
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 (defun add-minor-mode (toggle name &optional keymap after toggle-fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
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 TOGGLE is a symbol whose value as a variable specifies whether the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 minor mode is active.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 NAME is the name that should appear in the modeline. It should either
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 be a string beginning with a space, or a symbol with a similar string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 as its value.
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 KEYMAP is a keymap to make active when the minor mode is active.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 AFTER is the toggling symbol used for another minor mode. If AFTER is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 non-nil, then it is used to position the new mode in the minor-mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 alists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 TOGGLE-FUN specifies an interactive function that is called to toggle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 the mode on and off; this affects what happens when button2 is pressed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 on the mode, and when button3 is pressed somewhere in the list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 modes. If TOGGLE-FUN is nil and TOGGLE names an interactive function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 TOGGLE is used as the toggle function.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 Example: (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 (let* ((add-elt #'(lambda (elt sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (let (place)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (cond ((null after) ; add to front
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (push elt (symbol-value sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 ((and (not (eq after t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (setq place (memq (assq after
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 (symbol-value sym))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 (symbol-value sym))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (push elt (cdr place)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (set sym (append (symbol-value sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (list elt))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (symbol-value sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 el toggle-keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (if toggle-fun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 (check-argument-type 'commandp toggle-fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 (when (commandp toggle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 (setq toggle-fun toggle)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 (when (and toggle-fun name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 (setq toggle-keymap (make-sparse-keymap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (intern (concat "modeline-minor-"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 (symbol-name toggle)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 "-map"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (define-key toggle-keymap 'button2
5513
cf2733b1ff4b Be more reasonable in the implementation of #'make-modeline-command-wrapper.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
462 (make-modeline-command-wrapper toggle-fun))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 (put toggle 'modeline-toggle-function toggle-fun))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (when name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (let ((hacked-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (if toggle-keymap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (cons (let ((extent (make-extent nil nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (set-extent-keymap extent toggle-keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (set-extent-property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 extent 'help-echo
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 (concat "button2 turns off "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 (if (symbolp toggle-fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (symbol-name toggle-fun)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (symbol-name toggle))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (cons modeline-mousable-minor-mode-extent name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (if (setq el (assq toggle minor-mode-alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (setcdr el (list hacked-name))
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
480 (funcall add-elt
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (list toggle hacked-name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 'minor-mode-alist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (when keymap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (if (setq el (assq toggle minor-mode-map-alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (setcdr el keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (funcall add-elt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (cons toggle keymap)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 'minor-mode-map-alist)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
490 (defcustom abbrev-mode-line-string " Abbrev"
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
491 "*String to display in the modeline when `abbrev-mode' is active.
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
492 Set this to nil if you don't want a modeline indicator."
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
493 :type '(choice string
729
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
494 (const :tag "none" nil))
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
495 :group 'abbrev-mode)
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
496
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
497 (defcustom overwrite-mode-line-string " Ovwrt"
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
498 "*String to display in the modeline when `overwrite-mode' is active.
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
499 Set this to nil if you don't want a modeline indicator."
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
500 :type '(choice string
729
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
501 (const :tag "none" nil))
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
502 :group 'editing-basics)
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
503
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
504 (defcustom auto-fill-mode-line-string " Fill"
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
505 "*String to display in the modeline when `auto-fill-mode' is active.
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
506 Set this to nil if you don't want a modeline indicator."
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
507 :type '(choice string
729
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
508 (const :tag "none" nil))
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
509 :group 'fill)
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
510
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
511 (defcustom defining-kbd-macro-mode-line-string " Def"
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
512 "*String to display in the modeline when `defining-kbd-macro' is active.
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
513 Set this to nil if you don't want a modeline indicator."
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
514 :type '(choice string
729
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
515 (const :tag "none" nil))
217aff1c578d [xemacs-hg @ 2002-01-11 02:55:05 by youngs]
youngs
parents: 695
diff changeset
516 :group 'keyboard)
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
517
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 ;; #### TODO: Add `:menu-tag' keyword to add-minor-mode. Or create a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 ;; separate function to manage the minor mode menu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 ;(put 'abbrev-mode :menu-tag "Abbreviation Expansion")
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
522 (add-minor-mode 'abbrev-mode 'abbrev-mode-line-string)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 ;; only when visiting a file...
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
524 (add-minor-mode 'overwrite-mode 'overwrite-mode-line-string)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 ;(put 'auto-fill-function :menu-tag "Auto Fill")
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
526 (add-minor-mode 'auto-fill-function 'auto-fill-mode-line-string
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
527 nil nil 'auto-fill-mode)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 ;(put 'defining-kbd-macro :menu-tag "Keyboard Macro")
695
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
530 (add-minor-mode 'defining-kbd-macro 'defining-kbd-macro-mode-line-string
74f176715ed2 [xemacs-hg @ 2001-12-15 11:46:33 by youngs]
youngs
parents: 502
diff changeset
531 nil nil
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (lambda ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 (if defining-kbd-macro
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 ;; #### This means to disregard the last event.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 ;; It is needed because the last recorded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 ;; event is usually the mouse event that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 ;; invoked the menu item (and this function),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 ;; and having it in the macro causes problems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 (zap-last-kbd-macro-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (end-kbd-macro nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (start-kbd-macro nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (defun modeline-minor-mode-menu (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 "The menu that pops up when you press `button3' inside the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 parentheses on the modeline."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (set-buffer (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (popup-menu-and-execute-in-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (cons
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 "Minor Mode Toggles"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (sort
5267
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
555 (mapcan
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
556 #'(lambda (x)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
557 (let* ((toggle-sym (car x))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
558 (toggle-fun (or (get toggle-sym
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
559 'modeline-toggle-function)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
560 (and (commandp toggle-sym)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
561 toggle-sym)))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
562 (menu-tag (symbol-name (if (symbolp toggle-fun)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
563 toggle-fun
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
564 toggle-sym))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
565 ;; Here a function should maybe be invoked to
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
566 ;; beautify the symbol's menu appearance.
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
567 ))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
568 (and toggle-fun
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
569 (list (vector menu-tag
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
570 toggle-fun
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
571 ;; The following two are wrong because of
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
572 ;; possible name clashes.
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
573 ;:active (get toggle-sym :active t)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
574 ;:included (get toggle-sym :included t)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
575 :style 'toggle
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
576 :selected (and (boundp toggle-sym)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
577 toggle-sym))))))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
578 minor-mode-alist)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4578
diff changeset
579 (lambda (e1 e2) (string< (aref e1 0) (aref e2 0)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (defvar modeline-minor-mode-map (make-sparse-keymap 'modeline-minor-mode-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 "Keymap consulted for mouse-clicks on the minor-mode modeline list.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (define-key modeline-minor-mode-map 'button3 'modeline-minor-mode-menu)
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 modeline-minor-mode-extent (make-extent nil nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 "Extent covering the minor mode modeline strings.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (set-extent-face modeline-minor-mode-extent 'modeline-mousable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (set-extent-keymap modeline-minor-mode-extent modeline-minor-mode-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
593 ;;; Modeline definition ;;;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
596 (defmacro define-modeline-control (name contents doc-string &optional face
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
597 help-echo)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
598 "Define a modeline control named NAME, a symbol.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
599 A modeline control is a section of the modeline whose contents can easily
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
600 be changed independently of the rest of the modeline, which can have its
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
601 own color, and which can have its own mouse commands, which apply when the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
602 mouse is over the control.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
603
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
604 Logically, a modeline control should be an object; but we have terrible
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
605 object support in XEmacs, and so history has given us a series of related
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
606 variables, which [hopefully] all follow the same conventions.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
607
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
608 Three variables are created:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
609
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
610 1. The variable holding the control specification is called
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
611 `modeline-NAME', and is automatically buffer-local.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
612
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
613 2. The variable holding the extent that covers the control area in the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
614 modeline is called `modeline-NAME-extent'. Onto this extent, colors and
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
615 keymaps (and possibly glyphs?) can be added, and will be noticed by the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
616 modeline redisplay code. The attachment of the extent and its control
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
617 is done somewhere in the modeline specification: either in the main spec
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
618 in `modeline-format', or in some other control, like this:
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
619
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
620 (cons modeline-NAME-extent 'modeline-NAME)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
621
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
622 3. The keymap holding the mousable commands for the control is called
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
623 `modeline-NAME-map'. This is automatically attached to the extent by
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
624 this macro.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
625
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
626 Initial contents of the control are CONTENTS (see `modeline-format' for
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
627 information about the structure of this contents). DOC-STRING specifies
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
628 help text that will be placed in the control variable's documentation,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
629 indicating what's supposed to be in the control.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
630
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
631 Optional argument FACE specifies the face of the control's
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
632 extent. (`modeline-mousable' is a good choice if your control is, in fact,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
633 mousable (i.e. it has some mouse commands defined for it). Optional
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
634 argument HELP-ECHO specifies some help-echo to be displayed when the mouse
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
635 moves over the control, indicating what mouse strokes are available. "
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
636 (let ((control-var (intern (format "modeline-%s" name)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
637 (extent-var (intern (format "modeline-%s-extent" name)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
638 (map-var (intern (format "modeline-%s-map" name)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
639 )
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
640 `(progn
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
641 (defconst ,control-var ,contents
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
642 ,(format "%s
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
643
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
644 The format of the contents of this variable is documented in
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
645 `modeline-format'. The way the control is displayed can be changed by
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
646 setting the face of `%s'. Mouse commands
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
647 for the control can be set using `%s'." doc-string extent-var map-var))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
648 (make-variable-buffer-local ',control-var)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
649 (defvar ,extent-var (make-extent nil nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
650 ,(format "Extent covering the `%s' control." control-var))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
651 (defvar ,map-var (make-sparse-keymap 'modeline-narrowed-map)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
652 ,(format "Keymap consulted for mouse-clicks on the `%s' control."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
653 control-var))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
654 (set-extent-face ,extent-var ,face)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
655 (set-extent-keymap ,extent-var ,map-var)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
656 (set-extent-property ,extent-var 'help-echo ,help-echo))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
657 (put 'define-modeline-control 'lisp-indent-function 2)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
658
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
659 ;; ------------------------ modeline buffer id -------------------
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
660
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 (defun modeline-buffers-menu (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (popup-menu-and-execute-in-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 '("Buffers Popup Menu"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 :filter buffers-menu-filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 ["List All Buffers" list-buffers t]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 "--"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
671 (define-modeline-control buffer-id-left
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
672 'modeline-modified-buffer-highlighted-name ;; "XEmacs:"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
673 "Modeline control for left half of buffer ID."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
674 'modeline-mousable
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
675 "button2 cycles to the previous buffer")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
677 (define-modeline-control buffer-id-right
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
678 'modeline-modified-buffer-non-highlighted-name ;; " %17b"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
679 "Modeline control for right half of buffer ID."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
680 nil
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
681 "button2 cycles to the next buffer")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 (define-key modeline-buffer-id-left-map 'button2 'mouse-unbury-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 (define-key modeline-buffer-id-right-map 'button2 'mouse-bury-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 (define-key modeline-buffer-id-left-map 'button3 'modeline-buffers-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 (define-key modeline-buffer-id-right-map 'button3 'modeline-buffers-menu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 (make-face 'modeline-buffer-id
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 "Face for the buffer ID string in the modeline.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 (set-face-parent 'modeline-buffer-id 'modeline nil '(default))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 (when (featurep 'window-system)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
692 (set-face-foreground 'modeline-buffer-id "blue4" nil '(default color win))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
693 (set-face-font 'modeline-buffer-id [bold-italic] nil '(default mono win))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
694 (set-face-font 'modeline-buffer-id [bold-italic] nil '(default grayscale
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
695 win)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 (when (featurep 'tty)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 (set-face-font 'modeline-buffer-id [bold-italic] nil '(default tty)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
699 (define-modeline-control buffer-id
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
700 (list (cons modeline-buffer-id-left-extent 'modeline-buffer-id-left)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
701 (cons modeline-buffer-id-right-extent 'modeline-buffer-id-right))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 "Modeline control for identifying the buffer being displayed.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 Its default value is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
705 (list (cons modeline-buffer-id-left-extent 'modeline-buffer-id-left)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
706 (cons modeline-buffer-id-right-extent 'modeline-buffer-id-right))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 Major modes that edit things other than ordinary files may change this
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
709 (e.g. Info, Dired,...)."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
710 'modeline-buffer-id)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
711
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
712 (defvaralias 'modeline-buffer-identification 'modeline-buffer-id)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
713
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
714 (defvar modeline-modified-buffer-non-highlighted-name nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
715 (make-variable-buffer-local 'modeline-modified-buffer-non-highlighted-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
716 (put 'modeline-modified-buffer-non-highlighted-name 'permanent-local t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
717
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
718 (defvar modeline-modified-buffer-highlighted-name nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
719 (make-variable-buffer-local 'modeline-modified-buffer-highlighted-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
720 (put 'modeline-modified-buffer-highlighted-name 'permanent-local t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
721
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
722 (defvar modeline-recorded-buffer-name nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
723 (make-variable-buffer-local 'modeline-recorded-buffer-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
724 (put 'modeline-recorded-buffer-name 'permanent-local t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
725
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
726 (defvar modeline-recorded-buffer-file-name nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
727 (make-variable-buffer-local 'modeline-recorded-buffer-file-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
728 (put 'modeline-recorded-buffer-file-name 'permanent-local t)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
729
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
730 (add-hook 'buffer-list-changed-hook 'modeline-update-buffer-names)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
731
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
732 (defvar modeline-max-buffer-name-size 30)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
733
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
734 (defun modeline-update-buffer-names (frame)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
735 (mapc #'(lambda (buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
736 (when (or (not (eq (buffer-name buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
737 (symbol-value-in-buffer
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
738 'modeline-recorded-buffer-name buf)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
739 (not (eq (buffer-file-name buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
740 (symbol-value-in-buffer
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
741 'modeline-recorded-buffer-file-name buf))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
742 ;(dp "processing %s" buf)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
743 (with-current-buffer buf
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
744 (setq modeline-recorded-buffer-name (buffer-name))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
745 (setq modeline-recorded-buffer-file-name (buffer-file-name))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
746 (if (not modeline-recorded-buffer-file-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
747 (setq modeline-modified-buffer-non-highlighted-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
748 modeline-recorded-buffer-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
749 modeline-modified-buffer-highlighted-name nil)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
750 (let ((fn
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
751 (if (<= (length modeline-recorded-buffer-file-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
752 modeline-max-buffer-name-size)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
753 modeline-recorded-buffer-file-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
754 (concat "..."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
755 (substring
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
756 modeline-recorded-buffer-file-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
757 (- modeline-max-buffer-name-size))))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
758 (setq modeline-modified-buffer-non-highlighted-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
759 ;; if the filename is very long, the entire
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
760 ;; directory will get truncated to
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
761 ;; non-existence.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
762 (let ((dir (file-name-directory fn)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
763 (if dir
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
764 (concat " ("
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
765 (directory-file-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
766 (file-name-directory fn))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
767 ")")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
768 ""))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
769 modeline-modified-buffer-highlighted-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
770 (file-name-nondirectory fn))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
771 (redraw-modeline))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
772 (buffer-list)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
773
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
774 (defcustom modeline-new-buffer-id-format t
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
775 "Whether the new format for the modeline buffer ID (with directory) is used.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
776 This option only has an effect when set using `customize-set-variable',
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
777 or through the Options menu."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
778 :group 'modeline
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
779 :type 'boolean
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
780 :set #'(lambda (var val)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
781 (if val
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
782 (progn
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
783 (setq-default modeline-buffer-id-left
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
784 'modeline-modified-buffer-highlighted-name
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
785 modeline-buffer-id-right
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
786 'modeline-modified-buffer-non-highlighted-name)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
787 (set-extent-face modeline-buffer-id-left-extent
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
788 'modeline-mousable))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
789 (setq-default modeline-buffer-id-left "XEmacs:"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
790 modeline-buffer-id-right '(" %17b"))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
791 (set-extent-face modeline-buffer-id-left-extent nil))))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
792
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
793 ;; ------------------------ other modeline controls -------------------
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 ;; These are for the sake of minor mode menu. #### All of this is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 ;; kind of dirty. `add-minor-mode' started out as a simple substitute
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 ;; for (or (assq ...) ...) FSF stuff, but now is used for all kind of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 ;; stuff. There should perhaps be a separate function to add toggles
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 ;; to the minor-mode-menu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (add-minor-mode 'line-number-mode "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (add-minor-mode 'column-number-mode "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
803 (define-modeline-control coding-system '("%C")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
804 "Modeline control for showing current coding system.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
805 ;; added March 7, 2002
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
806 (define-obsolete-variable-alias 'modeline-multibyte-status
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
807 'modeline-coding-system)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
809 (define-modeline-control modified '("--%1*%1+-")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
810 "Modeline control for displaying whether current buffer is modified."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
811 'modeline-mousable
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
812 "button2 toggles the buffer's read-only status")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 (define-key modeline-modified-map 'button2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 (make-modeline-command-wrapper 'modeline-toggle-read-only))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 ;;; Added for XEmacs 20.3. Provide wrapper for vc since it may not always be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 ;;; present, and its symbols are not visible this early in the dump if it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 ;;; is.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 (defun modeline-toggle-read-only ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 "Change whether this buffer is visiting its file read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 With arg, set read-only iff arg is positive.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 This function is designed to be called when the read-only indicator on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 modeline is clicked. It will call `vc-toggle-read-only' if available,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 otherwise it will call the usual `toggle-read-only'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (interactive)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 444
diff changeset
827 (if-fboundp 'vc-toggle-read-only
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (vc-toggle-read-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 (toggle-read-only)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
831 (define-modeline-control line-number (list 'line-number-mode "L%l ")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
832 "Modeline control for displaying the line number of point.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
833 (define-modeline-control column-number (list 'column-number-mode "C%c ")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
834 "Modeline control for displaying the column number of point.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
835 (define-modeline-control percentage (cons -3 "%p")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
836 "Modeline control for displaying percentage of file above point.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
837
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
838 (define-modeline-control position-status
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
839 (cons 15 (list
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
840 (cons modeline-line-number-extent
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
841 'modeline-line-number)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
842 (cons modeline-column-number-extent
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
843 'modeline-column-number)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
844 (cons modeline-percentage-extent
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
845 'modeline-percentage)))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
846 "Modeline control for providing status about the location of point.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
847 Generally includes the line number of point, its column number, and the
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
848 percentage of the file above point."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
849 'modeline-buffer-id)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
850
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
851 (defconst modeline-tty-frame-specifier (make-specifier 'boolean))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
852 (add-hook 'create-frame-hook 'modeline-update-tty-frame-specifier)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
853 (defun modeline-update-tty-frame-specifier (f)
4043
b325de44db27 [xemacs-hg @ 2007-06-29 08:17:44 by stephent]
stephent
parents: 771
diff changeset
854 (if (and (eq (frame-type f) 'tty)
b325de44db27 [xemacs-hg @ 2007-06-29 08:17:44 by stephent]
stephent
parents: 771
diff changeset
855 (> (frame-property f 'frame-number) 1))
b325de44db27 [xemacs-hg @ 2007-06-29 08:17:44 by stephent]
stephent
parents: 771
diff changeset
856 (set-specifier modeline-tty-frame-specifier t f)))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
857
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
858 (define-modeline-control tty-frame-id (list modeline-tty-frame-specifier
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
859 " [%S]"
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
860 )
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
861 "Modeline control for showing which TTY frame is selected.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
862
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
863 (define-modeline-control narrowed '("%n")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
864 "Modeline control for displaying whether current buffer is narrowed."
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
865 'modeline-mousable
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
866 "button2 widens the buffer")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
867 (define-key modeline-narrowed-map 'button2
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
868 (make-modeline-command-wrapper 'widen))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
869
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
870 (define-modeline-control process nil
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
871 "Modeline control for displaying info on process status.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
872 Normally nil in most modes, since there is no process to display.")
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
873
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
874 (setq-default
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
875 modeline-format
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
876 (list
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
877 ""
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
878 (cons modeline-coding-system-extent 'modeline-coding-system)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
879 (cons modeline-modified-extent 'modeline-modified)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
880 (cons modeline-position-status-extent 'modeline-position-status)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
881 (cons modeline-tty-frame-id-extent 'modeline-tty-frame-id)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
882 (cons modeline-buffer-id-extent 'modeline-buffer-id)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
883 " "
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
884 'global-mode-string
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
885 " %[("
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
886 (cons modeline-minor-mode-extent
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
887 (list "" 'mode-name 'minor-mode-alist))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
888 (cons modeline-narrowed-extent 'modeline-narrowed)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
889 (cons modeline-process-extent 'modeline-process)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
890 ")%]%-"))
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 729
diff changeset
891
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 ;;; modeline.el ends here