;;; menu-bar.el --- define a default menu bar
-;; Copyright (C) 1993, 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005,
-;; 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+;; Copyright (C) 1993-1995, 2000-2011 Free Software Foundation, Inc.
;; Author: RMS
;; Maintainer: FSF
(define-key global-map [menu-bar] (make-sparse-keymap "menu-bar")))
(defvar menu-bar-help-menu (make-sparse-keymap "Help"))
-;; Force Help item to come last, after the major mode's own items.
-;; The symbol used to be called `help', but that gets confused with the
-;; help key.
-(setq menu-bar-final-items '(help-menu))
+(if (not (featurep 'ns))
+ ;; Force Help item to come last, after the major mode's own items.
+ ;; The symbol used to be called `help', but that gets confused with the
+ ;; help key.
+ (setq menu-bar-final-items '(help-menu))
+ (if (eq system-type 'darwin)
+ (setq menu-bar-final-items '(buffer services help-menu))
+ (setq menu-bar-final-items '(buffer services hide-app quit))
+ ;; Add standard top-level items to GNUstep menu.
+ (define-key global-map [menu-bar quit]
+ `(menu-item ,(purecopy "Quit") save-buffers-kill-emacs
+ :help ,(purecopy "Save unsaved buffers, then exit")))
+ (define-key global-map [menu-bar hide-app]
+ `(menu-item ,(purecopy "Hide") ns-do-hide-emacs
+ :help ,(purecopy "Hide Emacs"))))
+ (define-key global-map [menu-bar services] ; set-up in ns-win
+ (cons (purecopy "Services") (make-sparse-keymap "Services"))))
+
+;; If running under GNUstep, "Help" is moved and renamed "Info" (see below).
+(or (and (featurep 'ns)
+ (not (eq system-type 'darwin)))
+ (define-key global-map [menu-bar help-menu]
+ (cons (purecopy "Help") menu-bar-help-menu)))
-(define-key global-map [menu-bar help-menu] (cons (purecopy "Help") menu-bar-help-menu))
(defvar menu-bar-tools-menu (make-sparse-keymap "Tools"))
-(define-key global-map [menu-bar tools] (cons (purecopy "Tools") menu-bar-tools-menu))
+(define-key global-map [menu-bar tools]
+ (cons (purecopy "Tools") menu-bar-tools-menu))
;; This definition is just to show what this looks like.
;; It gets modified in place when menu-bar-update-buffers is called.
(defvar global-buffers-menu-map (make-sparse-keymap "Buffers"))
(define-key global-map [menu-bar options]
(cons (purecopy "Options") menu-bar-options-menu))
(defvar menu-bar-edit-menu (make-sparse-keymap "Edit"))
-(define-key global-map [menu-bar edit] (cons (purecopy "Edit") menu-bar-edit-menu))
+(define-key global-map [menu-bar edit]
+ (cons (purecopy "Edit") menu-bar-edit-menu))
(defvar menu-bar-file-menu (make-sparse-keymap "File"))
-(define-key global-map [menu-bar file] (cons (purecopy "File") menu-bar-file-menu))
+(define-key global-map [menu-bar file]
+ (cons (purecopy "File") menu-bar-file-menu))
-;; This alias is for compatibility with 19.28 and before.
-(defvar menu-bar-files-menu menu-bar-file-menu)
+;; Put "Help" menu at the front, called "Info".
+(and (featurep 'ns)
+ (not (eq system-type 'darwin))
+ (define-key global-map [menu-bar help-menu]
+ (cons (purecopy "Info") menu-bar-help-menu)))
+
+;; Only declared obsolete (and only made a proper alias) in 23.3.
+(define-obsolete-variable-alias 'menu-bar-files-menu 'menu-bar-file-menu "22.1")
;; This is referenced by some code below; it is defined in uniquify.el
(defvar uniquify-buffer-name-style)
(define-key menu-bar-edit-menu [clear]
`(menu-item ,(purecopy "Clear") delete-region
:enable (and mark-active
- (not buffer-read-only)
- (not (mouse-region-match)))
+ (not buffer-read-only))
:help
,(purecopy "Delete the text in region between mark and current position")))
(defvar yank-menu (cons (purecopy "Select Yank") nil))
(fset 'yank-menu (cons 'keymap yank-menu))
-;; The ns differences here seem silly.
(define-key menu-bar-edit-menu (if (featurep 'ns) [select-paste]
[paste-from-menu])
;; ns-win.el said: Change text to be more consistent with
;; under X (for GNUstep).
`(menu-item ,(purecopy "Copy") ,(if (featurep 'ns)
'ns-copy-including-secondary
- 'menu-bar-kill-ring-save)
+ 'kill-ring-save)
:enable mark-active
:help ,(purecopy "Copy text in region between mark and current position")
:keys ,(purecopy (if (featurep 'ns)
,(purecopy "Cut (kill) text in region between mark and current position")))
;; ns-win.el said: Separate undo from cut/paste section.
(if (featurep 'ns)
- (define-key menu-bar-edit-menu [separator-undo] `(,(purecopy "--"))))
+ (define-key menu-bar-edit-menu [separator-undo] menu-bar-separator))
+
(define-key menu-bar-edit-menu [undo]
`(menu-item ,(purecopy "Undo") undo
:enable (and (not buffer-read-only)
(consp buffer-undo-list)))
:help ,(purecopy "Undo last operation")))
-(defun menu-bar-kill-ring-save (beg end)
- (interactive "r")
- (if (mouse-region-match)
- (message "Selecting a region with the mouse does `copy' automatically")
- (kill-ring-save beg end)))
+(define-obsolete-function-alias
+ 'menu-bar-kill-ring-save 'kill-ring-save "24.1")
;; These are alternative definitions for the cut, paste and copy
;; menu items. Use them if your system expects these to use the clipboard.
(defvar menu-bar-custom-menu (make-sparse-keymap "Customize"))
-(define-key menu-bar-custom-menu [customize-apropos-groups]
- `(menu-item ,(purecopy "Groups Matching Regexp...") customize-apropos-groups
- :help ,(purecopy "Browse groups whose names match regexp")))
(define-key menu-bar-custom-menu [customize-apropos-faces]
- `(menu-item ,(purecopy "Faces Matching Regexp...") customize-apropos-faces
- :help ,(purecopy "Browse faces whose names match regexp")))
+ `(menu-item ,(purecopy "Faces Matching...") customize-apropos-faces
+ :help ,(purecopy "Browse faces matching a regexp or word list")))
(define-key menu-bar-custom-menu [customize-apropos-options]
- `(menu-item ,(purecopy "Options Matching Regexp...") customize-apropos-options
- :help ,(purecopy "Browse options whose names match regexp")))
+ `(menu-item ,(purecopy "Options Matching...") customize-apropos-options
+ :help ,(purecopy "Browse options matching a regexp or word list")))
(define-key menu-bar-custom-menu [customize-apropos]
- `(menu-item ,(purecopy "Settings Matching Regexp...") customize-apropos
- :help ,(purecopy "Browse customizable settings whose names match regexp")))
+ `(menu-item ,(purecopy "All Settings Matching...") customize-apropos
+ :help ,(purecopy "Browse customizable settings matching a regexp or word list")))
(define-key menu-bar-custom-menu [separator-1]
menu-bar-separator)
(define-key menu-bar-custom-menu [customize-group]
(define-key menu-bar-custom-menu [customize]
`(menu-item ,(purecopy "Top-level Customization Group") customize
:help ,(purecopy "The master group called `Emacs'")))
+(define-key menu-bar-custom-menu [customize-themes]
+ `(menu-item ,(purecopy "Custom Themes") customize-themes
+ :help ,(purecopy "Choose a pre-defined customization theme")))
;(defvar menu-bar-preferences-menu (make-sparse-keymap "Preferences"))
:visible (and (display-graphic-p) (fboundp 'x-show-tip))
:button (:toggle . tooltip-mode)))
+(defun menu-bar-frame-for-menubar ()
+ "Return the frame suitable for updating the menu bar."
+ (or (and (framep menu-updating-frame)
+ menu-updating-frame)
+ (selected-frame)))
+
+(defun menu-bar-positive-p (val)
+ "Return non-nil iff VAL is a positive number."
+ (and (numberp val)
+ (> val 0)))
+
(define-key menu-bar-showhide-menu [menu-bar-mode]
`(menu-item ,(purecopy "Menu-bar") toggle-menu-bar-mode-from-frame
:help ,(purecopy "Turn menu-bar on/off")
- :button (:toggle . (> (frame-parameter nil 'menu-bar-lines) 0))))
+ :button
+ (:toggle . (menu-bar-positive-p
+ (frame-parameter (menu-bar-frame-for-menubar)
+ 'menu-bar-lines)))))
(defun menu-bar-set-tool-bar-position (position)
(customize-set-variable 'tool-bar-mode t)
(defvar menu-bar-showhide-tool-bar-menu (make-sparse-keymap "Tool-bar"))
(define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-left]
- `(menu-item ,(purecopy "On the left")
+ `(menu-item ,(purecopy "On the left")
menu-bar-showhide-tool-bar-menu-customize-enable-left
:help ,(purecopy "Tool-bar at the left side")
:visible (display-graphic-p)
- :button
- (:radio . (and tool-bar-mode
- (eq (frame-parameter nil 'tool-bar-position)
+ :button
+ (:radio . (and tool-bar-mode
+ (eq (frame-parameter
+ (menu-bar-frame-for-menubar)
+ 'tool-bar-position)
'left)))))
(define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-right]
- `(menu-item ,(purecopy "On the right")
+ `(menu-item ,(purecopy "On the right")
menu-bar-showhide-tool-bar-menu-customize-enable-right
:help ,(purecopy "Tool-bar at the right side")
:visible (display-graphic-p)
:button
- (:radio . (and tool-bar-mode
- (eq (frame-parameter nil 'tool-bar-position)
+ (:radio . (and tool-bar-mode
+ (eq (frame-parameter
+ (menu-bar-frame-for-menubar)
+ 'tool-bar-position)
'right)))))
(define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-bottom]
- `(menu-item ,(purecopy "On the bottom")
+ `(menu-item ,(purecopy "On the bottom")
menu-bar-showhide-tool-bar-menu-customize-enable-bottom
:help ,(purecopy "Tool-bar at the bottom")
:visible (display-graphic-p)
:button
- (:radio . (and tool-bar-mode
- (eq (frame-parameter nil 'tool-bar-position)
+ (:radio . (and tool-bar-mode
+ (eq (frame-parameter
+ (menu-bar-frame-for-menubar)
+ 'tool-bar-position)
'bottom)))))
(define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-top]
- `(menu-item ,(purecopy "On the top")
+ `(menu-item ,(purecopy "On the top")
menu-bar-showhide-tool-bar-menu-customize-enable-top
:help ,(purecopy "Tool-bar at the top")
:visible (display-graphic-p)
:button
- (:radio . (and tool-bar-mode
- (eq (frame-parameter nil 'tool-bar-position)
+ (:radio . (and tool-bar-mode
+ (eq (frame-parameter
+ (menu-bar-frame-for-menubar)
+ 'tool-bar-position)
'top)))))
(define-key menu-bar-showhide-tool-bar-menu [showhide-tool-bar-none]
- `(menu-item ,(purecopy "None")
+ `(menu-item ,(purecopy "None")
menu-bar-showhide-tool-bar-menu-customize-disable
:help ,(purecopy "Turn tool-bar off")
:visible (display-graphic-p)
`(menu-item ,(purecopy "Tool-bar") toggle-tool-bar-mode-from-frame
:help ,(purecopy "Turn tool-bar on/off")
:visible (display-graphic-p)
- :button (:toggle . (> (frame-parameter nil 'tool-bar-lines) 0))))
-)
+ :button
+ (:toggle . (menu-bar-positive-p
+ (frame-parameter (menu-bar-frame-for-menubar)
+ 'tool-bar-lines))))))
(define-key menu-bar-options-menu [showhide]
`(menu-item ,(purecopy "Show/Hide") ,menu-bar-showhide-menu))
;; It is better not to use backquote here,
;; because that makes a bootstrapping problem
;; if you need to recompile all the Lisp files using interpreted code.
- `(menu-item ,(purecopy "Mule (Multilingual Environment)") ,mule-menu-keymap
+ `(menu-item ,(purecopy "Multilingual Environment") ,mule-menu-keymap
;; Most of the MULE menu actually does make sense in unibyte mode,
;; e.g. language selection.
;;; :visible '(default-value 'enable-multibyte-characters)
`(menu-item ,(purecopy "Emacs Tutorial") help-with-tutorial
:help ,(purecopy "Learn how to use Emacs")))
+;; In OS X it's in the app menu already.
+;; FIXME? There already is an "About Emacs" (sans ...) entry in the Help menu.
+(and (featurep 'ns)
+ (not (eq system-type 'darwin))
+ (define-key menu-bar-help-menu [info-panel]
+ `(menu-item ,(purecopy "About Emacs...") ns-do-emacs-info-panel)))
+
(defun menu-bar-menu-frame-live-and-visible-p ()
"Return non-nil if the menu frame is alive and visible.
The menu frame is the frame for which we are updating the menu."
turn on menu bars; otherwise, turn off menu bars."
:init-value t
:global t
- :group 'frames
+ ;; It's defined in C/cus-start, this stops the d-m-m macro defining it again.
+ :variable menu-bar-mode
;; Turn the menu-bars on all frames on or off.
(let ((val (if menu-bar-mode 1 0)))
See `menu-bar-mode' for more information."
(interactive (list (or current-prefix-arg 'toggle)))
(if (eq arg 'toggle)
- (menu-bar-mode (if (> (frame-parameter nil 'menu-bar-lines) 0) 0 1))
+ (menu-bar-mode
+ (if (menu-bar-positive-p
+ (frame-parameter (menu-bar-frame-for-menubar) 'menu-bar-lines))
+ 0 1))
(menu-bar-mode arg)))
(declare-function x-menu-bar-open "term/x-win" (&optional frame))