(toggle-scroll-bar): Renamed from toggle-vertical-scroll...
[bpt/emacs.git] / lisp / menu-bar.el
CommitLineData
235aa29b
ER
1;;; menu-bar.el --- define a default menu bar.
2
3;; Author: RMS
4;; Keywords: internals
5
1db87953
RS
6;; Copyright (C) 1993 Free Software Foundation, Inc.
7
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
12;; the Free Software Foundation; either version 2, or (at your option)
13;; any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
21;; along with GNU Emacs; see the file COPYING. If not, write to
22;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23
235aa29b 24;;; Code:
1db87953 25
db774a16 26(define-key global-map [menu-bar] (make-sparse-keymap "menu-bar"))
db774a16 27(setq menu-bar-help-menu (make-sparse-keymap "Help"))
2f1139a4 28(define-key global-map [menu-bar help] (cons "Help" menu-bar-help-menu))
40954111
RS
29(setq menu-bar-edit-menu (make-sparse-keymap "Edit"))
30(define-key global-map [menu-bar edit] (cons "Edit" menu-bar-edit-menu))
31(setq menu-bar-file-menu (make-sparse-keymap "File"))
32(define-key global-map [menu-bar file] (cons "File" menu-bar-file-menu))
db774a16 33
ca9b40a1 34(define-key menu-bar-file-menu [exit-emacs]
db774a16 35 '("Exit Emacs" . save-buffers-kill-emacs))
2f1139a4
RS
36(define-key menu-bar-file-menu [kill-buffer]
37 '("Kill Buffer" . kill-this-buffer))
38(define-key menu-bar-file-menu [delete-frame] '("Delete Frame" . delete-frame))
39(define-key menu-bar-file-menu [print-buffer] '("Print Buffer" . print-buffer))
40(define-key menu-bar-file-menu [revert-buffer]
41 '("Revert Buffer" . revert-buffer))
42(define-key menu-bar-file-menu [write-file]
43 '("Save Buffer As..." . write-file))
44(define-key menu-bar-file-menu [save-buffer] '("Save Buffer" . save-buffer))
45(define-key menu-bar-file-menu [open-file] '("Open File..." . find-file))
46(define-key menu-bar-file-menu [new-frame] '("New Frame" . new-frame))
db774a16 47
ca9b40a1 48(define-key menu-bar-edit-menu [clear] '("Clear" . x-delete-primary-selection))
2f1139a4
RS
49(define-key menu-bar-edit-menu [paste] '("Paste" . x-yank-clipboard-selection))
50(define-key menu-bar-edit-menu [copy] '("Copy" . x-copy-primary-selection))
51(define-key menu-bar-edit-menu [cut] '("Cut" . x-kill-primary-selection))
52(define-key menu-bar-edit-menu [undo] '("Undo" . advertised-undo))
db774a16 53
ca9b40a1 54(define-key menu-bar-help-menu [emacs-tutorial]
db774a16 55 '("Emacs Tutorial" . help-with-tutorial))
2f1139a4
RS
56(define-key menu-bar-help-menu [man] '("Man..." . manual-entry))
57(define-key menu-bar-help-menu [describe-variable]
58 '("Describe Variable..." . describe-variable))
59(define-key menu-bar-help-menu [describe-function]
60 '("Describe Function..." . describe-function))
61(define-key menu-bar-help-menu [describe-key]
62 '("Describe Key..." . describe-key))
63(define-key menu-bar-help-menu [list-keybindings]
64 '("List Keybindings" . describe-bindings))
65(define-key menu-bar-help-menu [command-apropos]
66 '("Command Apropos..." . command-apropos))
67(define-key menu-bar-help-menu [describe-mode]
68 '("Describe Mode" . describe-mode))
69(define-key menu-bar-help-menu [info] '("Info" . info))
db774a16 70
2f1139a4 71(define-key menu-bar-help-menu [emacs-news] '("Emacs News" . view-emacs-news))
db774a16
RS
72(defun kill-this-buffer () ; for the menubar
73 "Kills the current buffer."
74 (interactive)
75 (kill-buffer (current-buffer)))
76
2f1139a4
RS
77(defun kill-this-buffer-enabled-p ()
78 (let ((count 0)
79 (buffers (buffer-list)))
80 (while buffers
81 (or (string-match "^ " (buffer-name (car buffers)))
82 (setq count (1+ count)))
83 (setq buffers (cdr buffers)))
84 (> count 1)))
85
db774a16 86(put 'save-buffer 'menu-enable '(buffer-modified-p))
2f1139a4
RS
87(put 'revert-buffer 'menu-enable '(and (buffer-modified-p) (buffer-file-name)))
88(put 'delete-frame 'menu-enable '(cdr (visible-frame-list)))
89(put 'kill-this-buffer 'menu-enable '(kill-this-buffer-enabled-p))
90
db774a16
RS
91(put 'x-kill-primary-selection 'menu-enable '(x-selection-owner-p))
92(put 'x-copy-primary-selection 'menu-enable '(x-selection-owner-p))
93(put 'x-yank-clipboard-selection 'menu-enable '(x-selection-owner-p))
94(put 'x-delete-primary-selection 'menu-enable
95 '(x-selection-exists-p 'CLIPBOARD))
2f1139a4 96
db774a16
RS
97(put 'advertised-undo 'menu-enable
98 '(and (not (eq t buffer-undo-list))
99 (if (eq last-command 'undo)
2f1139a4
RS
100 (and (boundp 'pending-undo-list)
101 pending-undo-list)
102 buffer-undo-list)))
40954111
RS
103\f
104(define-key global-map [menu-bar buffer] '("Buffers" . mouse-buffer-menu))
105
106(defvar complex-buffers-menu-p nil
107 "*Non-nil says, offer a choice of actions after you pick a buffer.
108This applies to the Buffers menu from the menu bar.")
109
110(defvar buffers-menu-max-size 10
111 "*Maximum number of entries which may appear on the Buffers menu.
112If this is 10, then only the ten most-recently-selected buffers are shown.
113If this is nil, then all buffers are shown.
114A large number or nil slows down menu responsiveness.")
115
116(defun mouse-buffer-menu (event)
117 "Pop up a menu of buffers for selection with the mouse.
118This switches buffers in the window that you clicked on,
119and selects that window."
120 (interactive "e")
121 (let ((buffers (buffer-list))
122 menu)
123 ;; If requested, list only the N most recently selected buffers.
124 (if (and (integerp buffers-menu-max-size)
125 (> buffers-menu-max-size 1))
126 (if (> (length buffers) buffers-menu-max-size)
127 (setcdr (nthcdr buffers-menu-max-size buffers) nil)))
128 (setq menu
129 (list "Buffer Menu"
130 (cons "Select Buffer"
131 (let ((tail buffers)
132 (maxlen 0)
133 head)
134 (while tail
135 (let ((elt (car tail)))
136 (if (not (string-match "^ "
137 (buffer-name elt)))
138 (setq head (cons
139 (cons
140 (format
141 "%14s %s"
142 (buffer-name elt)
143 (or (buffer-file-name elt) ""))
144 elt)
145 head)))
146 (and head (> (length (car (car head))) maxlen)
147 (setq maxlen (length (car (car head))))))
148 (setq tail (cdr tail)))
149 (nconc (reverse head)
150 (list (cons (concat (make-string (- (/ maxlen 2) 8) ?\ )
151 "List All Buffers")
152 'list-buffers)))))))
153
154
155 (let ((buf (x-popup-menu (if (listp event) event
156 (cons '(0 0) (selected-frame)))
157 menu))
158 (window (and (listp event) (posn-window (event-start event)))))
159 (if (eq buf 'list-buffers)
160 (list-buffers)
161 (if buf
162 (if complex-buffers-menu-p
163 (let ((action (x-popup-menu (if (listp event) event
164 (cons '(0 0) (selected-frame)))
165 '("Buffer Action"
166 (""
167 ("Save Buffer" . save-buffer)
168 ("Kill Buffer" . kill-buffer)
169 ("Select Buffer" . switch-to-buffer))))))
170 (if (eq action 'save-buffer)
171 (save-excursion
172 (set-buffer buf)
173 (save-buffer))
174 (funcall action buf)))
175 (and (windowp window)
176 (select-window window))
177 (switch-to-buffer buf)))))))
2f1139a4 178
40954111
RS
179;; this version is too slow
180;;;(defun format-buffers-menu-line (buffer)
181;;; "Returns a string to represent the given buffer in the Buffer menu.
182;;;nil means the buffer shouldn't be listed. You can redefine this."
183;;; (if (string-match "\\` " (buffer-name buffer))
184;;; nil
185;;; (save-excursion
186;;; (set-buffer buffer)
187;;; (let ((size (buffer-size)))
188;;; (format "%s%s %-19s %6s %-15s %s"
189;;; (if (buffer-modified-p) "*" " ")
190;;; (if buffer-read-only "%" " ")
191;;; (buffer-name)
192;;; size
193;;; mode-name
194;;; (or (buffer-file-name) ""))))))
195\f
1db87953 196;; Give all existing frames a menu bar.
e5a10c81 197;; (Except for minibuffer-only frames.)
2f1139a4
RS
198(let ((frames (frame-list)))
199 (while frames
e5a10c81
RS
200 (or (eq 'only (cdr (assq 'minibuffer (frame-parameters (car frames)))))
201 (modify-frame-parameters (car frames) '((menu-bar-lines . 1))))
2f1139a4 202 (setq frames (cdr frames))))
1db87953
RS
203
204;; Make frames created from now on have a menu bar.
2f1139a4
RS
205(or (assq 'menu-bar-lines default-frame-alist)
206 (setq default-frame-alist
207 (cons '(menu-bar-lines . 1) default-frame-alist)))
1db87953 208
bffa5d4d
RS
209(provide 'menu-bar)
210
235aa29b 211;;; menu-bar.el ends here