-(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))
+;; Snarf current bindings of `mouse-buffer-menu' (normally
+;; C-down-mouse-1).
+(defvar msb-mode-map
+ (let ((map (make-sparse-keymap)))
+ (mapcar (lambda (key)
+ (define-key map key #'msb))
+ (where-is-internal 'mouse-buffer-menu (make-sparse-keymap)))
+ map))
+
+;;;###autoload
+(defun msb-mode (&optional arg)
+ "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'."
+ (interactive "P")
+ (setq msb-mode (if arg
+ (> (prefix-numeric-value arg) 0)
+ (not msb-mode)))
+ (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))
+ (remove-hook 'menu-bar-update-hook 'msb-menu-bar-update-buffers)