-(defvar activate-popup-menu-hook nil
- "Function or functions run before a mode-specific popup menu is made visible.
-These functions are called with no arguments, and should interrogate and
-modify the value of `global-popup-menu' or `mode-popup-menu' as desired.
-Note: this hook is only run if you use `popup-mode-menu' for activating the
-global and mode-specific commands; if you have your own binding for button3,
-this hook won't be run.")
-
-(defun popup-mode-menu ()
- "Pop up a menu of global and mode-specific commands.
-The menu is computed by combining `global-popup-menu' and `mode-popup-menu'."
- (interactive "@_")
- (run-hooks 'activate-popup-menu-hook)
- (popup-menu
- (cond ((and global-popup-menu mode-popup-menu)
- ;; Merge global-popup-menu and mode-popup-menu
- (check-menu-syntax mode-popup-menu)
- (let* ((title (car mode-popup-menu))
- (items (cdr mode-popup-menu))
- mode-filters)
- ;; Strip keywords from local menu for attaching them at the top
- (while (and items
- (keywordp (car items)))
- ;; Push both keyword and its argument.
- (push (pop items) mode-filters)
- (push (pop items) mode-filters))
- (setq mode-filters (nreverse mode-filters))
- ;; If mode-filters contains a keyword already present in
- ;; `global-popup-menu', you will probably lose.
- (append (list (car global-popup-menu))
- mode-filters
- (cdr global-popup-menu)
- '("---" "---")
- (if popup-menu-titles (list title))
- (if popup-menu-titles '("---" "---"))
- items)))
- (t
- (or mode-popup-menu
- global-popup-menu
- (error "No menu defined in this buffer"))))))
-
-(defun popup-buffer-menu (event)
- "Pop up a copy of the Buffers menu (from the menubar) where the mouse is clicked."
- (interactive "e")
- (let ((window (and (event-over-text-area-p event) (event-window event)))
- (bmenu nil))
- (or window
- (error "Pointer must be in a normal window"))
- (select-window window)
- (if current-menubar
- (setq bmenu (assoc "%_Buffers" current-menubar)))
- (if (null bmenu)
- (setq bmenu (assoc "%_Buffers" default-menubar)))
- (if (null bmenu)
- (error "Can't find the Buffers menu"))
- (popup-menu bmenu)))
-
-(defun popup-menubar-menu (event)
- "Pop up a copy of menu that also appears in the menubar."
- (interactive "e")
- (let ((window (and (event-over-text-area-p event) (event-window event)))
- popup-menubar)
- (or window
- (error "Pointer must be in a normal window"))
- (select-window window)
- (and current-menubar (run-hooks 'activate-menubar-hook))
- ;; #### Instead of having to copy this just to safely get rid of
- ;; any nil what we should really do is fix up the internal menubar
- ;; code to just ignore nil if generating a popup menu
- (setq popup-menubar (delete nil (copy-sequence (or current-menubar
- default-menubar))))
- (popup-menu (cons "%_Menubar Menu" popup-menubar))
- ))
-
-(global-set-key 'button3 'popup-mode-menu)
-;; shift button3 and shift button2 are reserved for Hyperbole
-(global-set-key '(meta control button3) 'popup-buffer-menu)
-;; The following command is way too dangerous with Custom.
-;; (global-set-key '(meta shift button3) 'popup-menubar-menu)
-
-;; Here's a test of the cool new menu features (from Stig).
-
-;;(setq mode-popup-menu
-;; '("Test Popup Menu"
-;; :filter cdr
-;; ["this item won't appear because of the menu filter" ding t]
-;; "--:singleLine"
-;; "singleLine"
-;; "--:doubleLine"
-;; "doubleLine"
-;; "--:singleDashedLine"
-;; "singleDashedLine"
-;; "--:doubleDashedLine"
-;; "doubleDashedLine"
-;; "--:noLine"
-;; "noLine"
-;; "--:shadowEtchedIn"
-;; "shadowEtchedIn"
-;; "--:shadowEtchedOut"
-;; "shadowEtchedOut"
-;; "--:shadowDoubleEtchedIn"
-;; "shadowDoubleEtchedIn"
-;; "--:shadowDoubleEtchedOut"
-;; "shadowDoubleEtchedOut"
-;; "--:shadowEtchedInDash"
-;; "shadowEtchedInDash"
-;; "--:shadowEtchedOutDash"
-;; "shadowEtchedOutDash"
-;; "--:shadowDoubleEtchedInDash"
-;; "shadowDoubleEtchedInDash"
-;; "--:shadowDoubleEtchedOutDash"
-;; "shadowDoubleEtchedOutDash"
-;; ))