-(when (and (boundp 'menu-bar-update-hook)
- (not (fboundp 'frame-or-buffer-changed-p)))
- (defvar msb--buffer-count 0)
- (defun frame-or-buffer-changed-p ()
- (let ((count (length (buffer-list))))
- (when (/= count msb--buffer-count)
- (setq msb--buffer-count count)
- t))))
-
-(unless (or (not (boundp 'menu-bar-update-hook))
- (memq 'menu-bar-update-buffers menu-bar-update-hook))
- (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers))
-
-(and (fboundp 'mouse-buffer-menu)
- (substitute-key-definition 'mouse-buffer-menu 'msb (current-global-map)))
+;; Snarf current bindings of `mouse-buffer-menu' (normally
+;; C-down-mouse-1).
+(defvar msb-mode-map
+ (let ((map (make-sparse-keymap "Msb")))
+ (substitute-key-definition 'mouse-buffer-menu 'msb map global-map)
+ map))
+
+;;;###autoload
+(define-minor-mode msb-mode
+ "Toggle Msb mode.
+With arg, turn Msb mode on if and only if arg is positive.
+This mode overrides the binding(s) of `mouse-buffer-menu' to provide a
+different buffer menu using the function `msb'."
+ :global t
+ (if msb-mode
+ (progn
+ (add-hook 'menu-bar-update-hook 'msb-menu-bar-update-buffers)
+ (remove-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
+ (msb-menu-bar-update-buffers t))
+ (remove-hook 'menu-bar-update-hook 'msb-menu-bar-update-buffers)
+ (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)
+ (menu-bar-update-buffers t)))
+
+(defun msb-unload-hook ()
+ (msb-mode 0))