Convert consecutive FSF copyright years to ranges.
[bpt/emacs.git] / lisp / menu-bar.el
index 9d8e474..42caeee 100644 (file)
@@ -1,7 +1,6 @@
 ;;; 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.
@@ -561,18 +583,15 @@ Do the same for the keys of the same name."
 
 (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]
@@ -600,6 +619,9 @@ Do the same for the keys of the same name."
 (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"))
 
@@ -994,10 +1016,24 @@ mail status in mode line"))
              :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)
@@ -1028,47 +1064,55 @@ mail status in mode line"))
       (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)
@@ -1084,8 +1128,10 @@ mail status in mode line"))
     `(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))
@@ -1097,7 +1143,7 @@ mail status in mode line"))
   ;; 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)
@@ -1688,6 +1734,13 @@ key, a click, or a menu-item")))
   `(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."
@@ -2040,7 +2093,8 @@ With a numeric argument, if the argument is positive,
 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)))
@@ -2075,7 +2129,10 @@ turn on menu bars; otherwise, turn off menu bars."
 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))