-(defvar mode-line-mouse-sensitive-p nil
- "Non-nil means mode line has been made mouse-sensitive.")
-
-(defun make-mode-line-mouse-sensitive ()
- (when (and window-system
- (not mode-line-mouse-sensitive-p))
- (setq mode-line-mouse-sensitive-p t)
- (require 'easymenu)
- (easy-menu-define mode-line-mode-menu mode-line-mode-menu-keymap
- "Menu of mode operations in the mode line."
- '("Minor Modes"
- ["Abbrev" abbrev-mode :active t :style toggle
- :selected abbrev-mode]
- ["Auto revert" auto-revert-mode :active t :style toggle
- :selected auto-revert-mode]
- ["Auto-fill" auto-fill-mode :active t :style toggle
- :selected auto-fill-function]
- ["Column number" column-number-mode :active t :style toggle
- :selected column-number-mode]
- ["Flyspell" flyspell-mode :active t :style toggle
- :selected flyspell-mode]
- ["Font-lock" font-lock-mode :active t :style toggle
- :selected font-lock-mode]
- ["Hide ifdef" hide-ifdef-mode :active t :style toggle
- :selected hide-ifdef-mode]
- ["Highlight changes" highlight-changes-mode :active t :style toggle
- :selected highlight-changes-mode]
- ["Line number" line-number-mode :active t :style toggle
- :selected line-number-mode]
- ["Outline" outline-minor-mode :active t :style toggle
- :selected outline-minor-mode]
- ["Overwrite" overwrite-mode :active t :style toggle
- :selected overwrite-mode]))
-
- ;; Add menu of buffer operations to the buffer identification part
- ;; of the mode line.
- (let ((map (make-sparse-keymap))
- (s (copy-sequence "%12b")))
- (define-key map [mode-line mouse-1] 'mode-line-other-buffer)
- (define-key map [top-line mouse-1] 'mode-line-other-buffer)
- (define-key map [mode-line M-mouse-2] 'mode-line-unbury-buffer)
- (define-key map [top-line M-mouse-2] 'mode-line-unbury-buffer)
- (define-key map [mode-line mouse-2] 'bury-buffer)
- (define-key map [top-line mouse-2] 'bury-buffer)
- (define-key map [mode-line down-mouse-3] 'mouse-buffer-menu)
- (define-key map [top-line down-mouse-3] 'mouse-buffer-menu)
- (setq mode-line-buffer-identification-keymap map)
- (setq-default mode-line-buffer-identification (list s))
- (put-text-property 0 (length s) 'face '(:weight bold) s)
- (put-text-property 0 (length s) 'help-echo
- "mouse-1: other buffer, mouse-2: prev, M-mouse-2: next, mouse-3: buffer menu" s)
- (put-text-property 0 (length s) 'local-map map s))
-
- ;; Menu of minor modes.
- (let ((map (make-sparse-keymap)))
- (define-key map [mode-line down-mouse-3] 'mode-line-mode-menu-1)
- (define-key map [top-line down-mouse-3] 'mode-line-mode-menu-1)
- (setq mode-line-minor-mode-keymap map))
-
- (force-mode-line-update)))
-
+(defmacro bound-and-true-p (var)
+ "Return the value of symbol VAR if it is bound, else nil."
+ `(and (boundp (quote ,var)) ,var))
+
+(define-key mode-line-mode-menu [abbrev-mode]
+ `(menu-item ,(purecopy "Abbrev") abbrev-mode
+ :button (:toggle . abbrev-mode)))
+(define-key mode-line-mode-menu [auto-revert-mode]
+ `(menu-item ,(purecopy "Auto revert") auto-revert-mode
+ :button (:toggle . auto-revert-mode)))
+(define-key mode-line-mode-menu [auto-fill-mode]
+ `(menu-item ,(purecopy "Auto-fill") auto-fill-mode
+ :button (:toggle . auto-fill-function)))
+(define-key mode-line-mode-menu [column-number-mode]
+ `(menu-item ,(purecopy "Column number") column-number-mode
+ :button (:toggle . column-number-mode)))
+(define-key mode-line-mode-menu [flyspell-mode]
+ `(menu-item ,(purecopy "Flyspell") flyspell-mode
+ :button (:toggle . (bound-and-true-p flyspell-mode))))
+(define-key mode-line-mode-menu [font-lock-mode]
+ `(menu-item ,(purecopy "Font-lock") font-lock-mode
+ :button (:toggle . font-lock-mode)))
+(define-key mode-line-mode-menu [hide-ifdef-mode]
+ `(menu-item ,(purecopy "Hide ifdef") hide-ifdef-mode
+ :button (:toggle . (bound-and-true-p hide-ifdef-mode))))
+(define-key mode-line-mode-menu [highlight-changes-mode]
+ `(menu-item ,(purecopy "Highlight changes") highlight-changes-mode
+ :button (:toggle . highlight-changes-mode)))
+(define-key mode-line-mode-menu [line-number-mode]
+ `(menu-item ,(purecopy "Line number") line-number-mode
+ :button (:toggle . line-number-mode)))
+(define-key mode-line-mode-menu [outline-minor-mode]
+ `(menu-item ,(purecopy "Outline") outline-minor-mode
+ :button (:toggle . (bound-and-true-p outline-minor-mode))))
+(define-key mode-line-mode-menu [overwrite-mode]
+ `(menu-item ,(purecopy "Overwrite") overwrite-mode
+ :button (:toggle . overwrite-mode)))
+
+(defun mode-line-mode-menu (event)
+ (interactive "@e")
+ (x-popup-menu event mode-line-mode-menu))
+
+;; Add menu of buffer operations to the buffer identification part
+;; of the mode line.
+(let ((map (make-sparse-keymap)))
+ (define-key map [mode-line mouse-1] 'mode-line-other-buffer)
+ (define-key map [header-line mouse-1] 'mode-line-other-buffer)
+ (define-key map [mode-line M-mouse-2] 'mode-line-unbury-buffer)
+ (define-key map [header-line M-mouse-2] 'mode-line-unbury-buffer)
+ (define-key map [mode-line mouse-2] 'bury-buffer)
+ (define-key map [header-line mouse-2] 'bury-buffer)
+ (define-key map [mode-line down-mouse-3] 'mouse-buffer-menu)
+ (define-key map [header-line down-mouse-3] 'mouse-buffer-menu)
+ (setq mode-line-buffer-identification-keymap map))
+
+(defun propertized-buffer-identification (fmt)
+ "Return a list suitable for `mode-line-buffer-identification'.
+FMT is a format specifier such as \"%12b\". This function adds
+text properties for face, help-echo, and local-map to it."
+ (list (propertize fmt
+ 'face '(:weight bold)
+ 'help-echo (purecopy "mouse-1: other \
+buffer, mouse-2: prev, M-mouse-2: next, mouse-3: buffer menu")
+ 'local-map mode-line-buffer-identification-keymap)))
+
+(setq-default mode-line-buffer-identification
+ (propertized-buffer-identification "%12b"))
+
+;; Menu of minor modes.
+(let ((map (make-sparse-keymap)))
+ (define-key map [mode-line down-mouse-3] 'mode-line-mode-menu-1)
+ (define-key map [header-line down-mouse-3] 'mode-line-mode-menu-1)
+ (setq mode-line-minor-mode-keymap map))