From 9972ca4995e2e43cfaff9b550f2b73c72ae76bb6 Mon Sep 17 00:00:00 2001 From: Jared Finder Date: Sat, 19 Sep 2020 00:43:29 -0700 Subject: [PATCH 1/2] Adding mouse controls to menu-bar.el. --- lisp/menu-bar.el | 12 +++++++++ lisp/tmm.el | 64 ++++++++++++++++++++++++++++-------------------- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index d3e434aec9..9021be8eff 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -2660,6 +2660,18 @@ menu-bar-open (global-set-key [f10] 'menu-bar-open) +(defun menu-bar-open-mouse (event) + "Mosue-triggered version of `menu-bar-open'. +This command is to be used when you click the mouse in the menubar." + (interactive "e") + (require 'tmm) ; Possibly have tmm depend on menu-bar instead? + (let* ((x-position (car (posn-x-y (event-start event)))) + (menu-bar-item-cons (tmm-menubar-item-at-x x-position))) + (menu-bar-open nil + (if menu-bar-item-cons + (cdr menu-bar-item-cons) + 0)))) + (defun buffer-menu-open () "Start key navigation of the buffer menu. This is the keyboard interface to \\[mouse-buffer-menu]." diff --git a/lisp/tmm.el b/lisp/tmm.el index 1e18c8b4ae..710295c776 100644 --- a/lisp/tmm.el +++ b/lisp/tmm.el @@ -59,6 +59,40 @@ tmm-menubar-keymap (tmm-get-keybind [menu-bar])) `(keymap ,@(nreverse menu-bar) ,@menu-end))) +(defun tmm-menubar-item-at-x (x-position) + "Return a cons of the form (KEY . X) for the item clicked on. + +If nothing is clicked on, returns nil." + (let ((column 0) + (menu-bar (tmm-menubar-keymap)) + prev-key + prev-column + found) + (catch 'done + (map-keymap + (lambda (key binding) + (when (> column x-position) + (setq found t) + (throw 'done nil)) + (setq prev-key key) + (pcase binding + ((or `(,(and (pred stringp) name) . ,_) ;Simple menu item. + `(menu-item ,name ,_cmd ;Extended menu item. + . ,(and props + (guard (let ((visible + (plist-get props :visible))) + (or (null visible) + (eval visible))))))) + (setq prev-column column + column (+ column (length name) 1))))) + menu-bar) + ;; Check the last menu item. + (when (> column x-position) + (setq found t))) + (if found + (cons prev-key prev-column) + nil))) + ;;;###autoload (define-key global-map "\M-`" 'tmm-menubar) ;;;###autoload (define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse) @@ -74,33 +108,11 @@ tmm-menubar `tty-menu-open-use-tmm' to a non-nil value." (interactive) (run-hooks 'menu-bar-update-hook) - ;; Obey menu-bar-final-items; put those items last. (let ((menu-bar (tmm-menubar-keymap)) - menu-bar-item) - (if x-position - (let ((column 0) - prev-key) - (catch 'done - (map-keymap - (lambda (key binding) - (when (> column x-position) - (setq menu-bar-item prev-key) - (throw 'done nil)) - (setq prev-key key) - (pcase binding - ((or `(,(and (pred stringp) name) . ,_) ;Simple menu item. - `(menu-item ,name ,_cmd ;Extended menu item. - . ,(and props - (guard (let ((visible - (plist-get props :visible))) - (or (null visible) - (eval visible))))))) - (setq column (+ column (length name) 1))))) - menu-bar) - ;; Check the last menu item. - (when (> column x-position) - (setq menu-bar-item prev-key))))) - (tmm-prompt menu-bar nil menu-bar-item))) + (menu-bar-item-cons (tmm-menubar-item-at-x x-position))) + (tmm-prompt menu-bar + nil + (and menu-bar-item-cons (car menu-bar-item-cons))))) ;;;###autoload (defun tmm-menubar-mouse (event) -- 2.20.1