From: Po Lu Date: Tue, 18 Jul 2023 08:15:05 +0000 (+0800) Subject: Fix display of minor mode menus when mode-line-compact is enabled X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c4f8ead08d12d1f82224e9af60482329771e254a;p=emacs.git Fix display of minor mode menus when mode-line-compact is enabled * lisp/mouse.el (minor-mode-menu-from-indicator): New arg WINDOW. If INDICATOR is a string object and mode-line-compat is enabled within WINDOW, use the symbol within the object at its position instead. (mouse-minor-mode-menu): Pass posn-object and posn-window to minor-mode-menu-from-indicator. --- diff --git a/lisp/mouse.el b/lisp/mouse.el index 3c30361ad7d..1e1f0808f9f 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -206,8 +206,13 @@ always return a positive integer or zero." ;; Provide a mode-specific menu on a mouse button. -(defun minor-mode-menu-from-indicator (indicator) +(defun minor-mode-menu-from-indicator (indicator &optional window) "Show menu for minor mode specified by INDICATOR. + +INDICATOR is either a string object returned by `posn-object' or +the car of such an object. WINDOW may be the window whose mode +line is being displayed. + Interactively, INDICATOR is read using completion. If there is no menu defined for the minor mode, then create one with items `Turn Off' and `Help'." @@ -215,6 +220,21 @@ items `Turn Off' and `Help'." (list (completing-read "Minor mode indicator: " (describe-minor-mode-completion-table-for-indicator)))) + ;; If INDICATOR is a string object and `mode-line-compact' might be + ;; enabled, look for the word at its position and use that instead. + (when (and (consp indicator) + window + (with-selected-window window + mode-line-compact)) + (with-temp-buffer + (insert (car indicator)) + (goto-char (cdr indicator)) + (if-let ((thing (thing-at-point 'word))) + (setq indicator thing) + (setq indicator (car indicator))))) + ;; If INDICATOR is still a cons, use its car. + (when (consp indicator) + (setq indicator (car indicator))) (let* ((minor-mode (lookup-minor-mode-from-indicator indicator)) (mm-fun (or (get minor-mode :minor-mode-function) minor-mode))) (unless minor-mode (error "Cannot find minor mode for `%s'" indicator)) @@ -240,8 +260,10 @@ items `Turn Off' and `Help'." (defun mouse-minor-mode-menu (event) "Show minor-mode menu for EVENT on minor modes area of the mode line." (interactive "@e") - (let ((indicator (car (nth 4 (car (cdr event)))))) - (minor-mode-menu-from-indicator indicator))) + (let* ((posn (event-start event)) + (indicator (posn-object posn)) + (window (posn-window posn))) + (minor-mode-menu-from-indicator indicator window))) (defun mouse-menu-major-mode-map () (run-hooks 'activate-menubar-hook 'menu-bar-update-hook)