Mercurial > emacs
changeset 9488:114fe3739aa3
(mouse-major-mode-menu): Use minor-mode-map-alist
instead of overriding-local-map. Display equiv keys using
mouse-major-mode-menu-compute-equiv-keys.
(mouse-major-mode-menu-compute-equiv-keys): New function.
(mouse-major-mode-menu): New function, on C-mouse-3.
(mouse-major-mode-menu-1): New function
(mouse-set-font): Move it to C-mouse-2.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 12 Oct 1994 09:27:49 +0000 |
parents | f80b2a33df03 |
children | 07dd35326963 |
files | lisp/mouse.el |
diffstat | 1 files changed, 59 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/mouse.el Wed Oct 12 09:23:37 1994 +0000 +++ b/lisp/mouse.el Wed Oct 12 09:27:49 1994 +0000 @@ -39,6 +39,61 @@ (defvar mouse-yank-at-point nil "*If non-nil, mouse yank commands yank at point instead of at click.") +;; Provide a mode-specific menu on a mouse button. + +(defun mouse-major-mode-menu (event) + "Pop up a mode-specific menu of mouse commands." + ;; Switch to the window clicked on, because otherwise + ;; the mode's commands may not make sense. + (interactive "@e") + (let ((newmap (make-sparse-keymap)) + (unread-command-events (list event))) + ;; Make a keymap in which our last command leads to a menu + (define-key newmap (vector (car event)) + (nconc (make-sparse-keymap "Menu") + (mouse-major-mode-menu-1 + (lookup-key (current-local-map) [menu-bar])))) + (mouse-major-mode-menu-compute-equiv-keys newmap) + (command-execute + ;; Make NEWMAP override the usual definition + ;; of the mouse button that got us here. + ;; Then read the user's menu choice. + (let ((minor-mode-map-alist + (cons (cons t newmap) minor-mode-map-alist))) + (lookup-key newmap (read-key-sequence "")))))) + +;; Compute and cache the equivalent keys in MENU and all its submenus. +(defun mouse-major-mode-menu-compute-equiv-keys (menu) + (and (eq (car menu) 'keymap) + (x-popup-menu nil menu)) + (while menu + (and (consp (car menu)) + (consp (cdr (car menu))) + (let ((tail (cdr (car menu)))) + (while (and (consp tail) + (not (eq (car tail) 'keymap))) + (setq tail (cdr tail))) + (if (consp tail) + (mouse-major-mode-menu-compute-equiv-keys tail)))) + (setq menu (cdr menu)))) + +;; Given a mode's menu bar keymap, +;; if it defines exactly one menu bar menu, +;; return just that menu. +;; Otherwise return a menu for all of them. +(defun mouse-major-mode-menu-1 (menubar) + (if menubar + (let ((tail menubar) + submap) + (while tail + (if (consp (car tail)) + (if submap + (setq submap t) + (setq submap (cdr (car tail))))) + (setq tail (cdr tail))) + (if (eq submap t) menubar + submap)))) + ;; Commands that operate on windows. (defun mouse-minibuffer-check (event) @@ -1437,8 +1492,10 @@ ;; By binding these to down-going events, we let the user use the up-going ;; event to make the selection, saving a click. -(global-set-key [C-down-mouse-1] 'mouse-buffer-menu) -(global-set-key [C-down-mouse-3] 'mouse-set-font) +(global-set-key [C-down-mouse-1] 'mouse-buffer-menu) +(global-set-key [C-down-mouse-2] 'mouse-set-font) +(global-set-key [C-down-mouse-3] 'mouse-major-mode-menu) + ;; Replaced with dragging mouse-1 ;; (global-set-key [S-mouse-1] 'mouse-set-mark)