diff options
| author | Martin Rudalics | 2025-10-13 10:22:04 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2025-10-13 10:22:04 +0200 |
| commit | 750499e4b717882f44461c46fc2fa0ea4c4a55dc (patch) | |
| tree | 72f1c58073af8b386710474821147e11d960d7a2 | |
| parent | a184ae8eda0678da5dda608722c06f7f929a74ff (diff) | |
| download | emacs-750499e4b717882f44461c46fc2fa0ea4c4a55dc.tar.gz emacs-750499e4b717882f44461c46fc2fa0ea4c4a55dc.zip | |
Rewrite 'minibuffer-nonselected-mode' to use 'window-state-change-functions'
* lisp/minibuffer.el (minibuffer-nonselected): Rewrite
doc-string.
(minibuffer--nonselected-overlay): Define it global. Rewrite
doc-string.
(minibuffer--nonselected-check): Rewrite by comparing the active
minibuffer window with the selected window.
(minibuffer--nonselected-setup): Globally add
'minibuffer--nonselected-check' to list of functions called by
'window-state-change-functions'.
(minibuffer--nonselected-exit): Remove
'minibuffer--nonselected-check' from list of functions called by
'window-state-change-functions' when exiting last recursive
minibuffer.
(minibuffer-nonselected-mode): Globally add/remove
'minibuffer--nonselected-setup' to/from list of functions called
by 'minibuffer-setup-hook' and 'minibuffer--nonselected-exit'
to/from list of functions called by 'minibuffer-exit-hook' when
activating/deactivating 'minibuffer-nonselected-mode'. Rewrite
doc-string.
| -rw-r--r-- | lisp/minibuffer.el | 100 |
1 files changed, 66 insertions, 34 deletions
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el index 472bcf618bf..b002087d14d 100644 --- a/lisp/minibuffer.el +++ b/lisp/minibuffer.el | |||
| @@ -5644,51 +5644,83 @@ interactions is customizable via `minibuffer-regexp-prompts'." | |||
| 5644 | 5644 | ||
| 5645 | (defface minibuffer-nonselected | 5645 | (defface minibuffer-nonselected |
| 5646 | '((t (:background "yellow" :foreground "dark red" :weight bold))) | 5646 | '((t (:background "yellow" :foreground "dark red" :weight bold))) |
| 5647 | "Face for non-selected minibuffer prompts. | 5647 | "Face for highlighting contents of non-selected minibuffer window. |
| 5648 | It's displayed on the minibuffer window when the minibuffer | 5648 | Used by `minibuffer-nonselected-mode' for the contents of the minibuffer |
| 5649 | remains active, but the minibuffer window is no longer selected." | 5649 | window when the minibuffer remains active but its window is currently |
| 5650 | not selected." | ||
| 5650 | :version "31.1") | 5651 | :version "31.1") |
| 5651 | 5652 | ||
| 5652 | (defvar-local minibuffer--nonselected-overlay nil) | 5653 | (defvar minibuffer--nonselected-overlay nil |
| 5653 | 5654 | "Overlay for highlighting contents of non-selected minibuffer window. | |
| 5654 | (defun minibuffer--nonselected-check (window) | 5655 | Used by `minibuffer-nonselected-mode'.") |
| 5655 | "Check if the active minibuffer's window is no longer selected. | 5656 | |
| 5656 | Use overlay to highlight the minibuffer window when another window | 5657 | (defun minibuffer--nonselected-check (_frame) |
| 5657 | is selected. But don't warn in case when the *Completions* window | 5658 | "Check if active minibuffer window is no longer selected. |
| 5658 | becomes selected." | 5659 | Use overlay to highlight its contents when another window is selected. |
| 5659 | (if (eq window (selected-window)) | 5660 | But don't highlight when the *Completions* window is selected." |
| 5660 | (with-current-buffer (window-buffer window) | 5661 | (let* ((active-minibuffer-window (active-minibuffer-window)) |
| 5661 | (when (overlayp minibuffer--nonselected-overlay) | 5662 | (active-minibuffer (when active-minibuffer-window |
| 5662 | (delete-overlay minibuffer--nonselected-overlay))) | 5663 | (window-buffer active-minibuffer-window)))) |
| 5663 | (unless (eq (buffer-local-value 'completion-reference-buffer | 5664 | (cond |
| 5664 | (window-buffer)) | 5665 | ((or (not active-minibuffer-window) |
| 5665 | (window-buffer window)) | 5666 | (eq active-minibuffer-window (selected-window)) |
| 5666 | (with-current-buffer (window-buffer window) | 5667 | (equal (buffer-name (window-buffer)) "*Completions*")) |
| 5667 | (let ((ov (make-overlay (point-min) (point-max)))) | 5668 | ;; When there's no active minibuffer window or either the |
| 5668 | (overlay-put ov 'face 'minibuffer-nonselected) | 5669 | ;; minibuffer or *the Completions* window is selected, remove the |
| 5669 | (overlay-put ov 'evaporate t) | 5670 | ;; overlay if it exists. |
| 5670 | (setq minibuffer--nonselected-overlay ov)))))) | 5671 | (when minibuffer--nonselected-overlay |
| 5672 | (delete-overlay minibuffer--nonselected-overlay))) | ||
| 5673 | ((not minibuffer--nonselected-overlay) | ||
| 5674 | ;; When there's an active minibuffer window and neither it nor the | ||
| 5675 | ;; *Completions* window is selected and there is no overlay, make | ||
| 5676 | ;; the overlay in the active minibuffer. | ||
| 5677 | (with-current-buffer active-minibuffer | ||
| 5678 | (setq minibuffer--nonselected-overlay | ||
| 5679 | (make-overlay (point-min) (point-max))) | ||
| 5680 | (overlay-put | ||
| 5681 | minibuffer--nonselected-overlay 'face 'minibuffer-nonselected) | ||
| 5682 | (overlay-put | ||
| 5683 | minibuffer--nonselected-overlay 'evaporate t))) | ||
| 5684 | ((not (eq (overlay-buffer minibuffer--nonselected-overlay) | ||
| 5685 | active-minibuffer)) | ||
| 5686 | ;; When there is an overlay but it is not in the active minibuffer | ||
| 5687 | ;; move it to that buffer. | ||
| 5688 | (with-current-buffer active-minibuffer | ||
| 5689 | (move-overlay minibuffer--nonselected-overlay | ||
| 5690 | (point-min) (point-max) active-minibuffer)))))) | ||
| 5671 | 5691 | ||
| 5672 | (defun minibuffer--nonselected-setup () | 5692 | (defun minibuffer--nonselected-setup () |
| 5673 | "Setup hooks for `minibuffer-nonselected-mode' to update the overlay." | 5693 | "Set up hook for `minibuffer-nonselected-mode' unless it's there already." |
| 5674 | (add-hook 'window-buffer-change-functions | 5694 | (add-hook 'window-state-change-functions |
| 5675 | #'minibuffer--nonselected-check nil t) | 5695 | #'minibuffer--nonselected-check)) |
| 5676 | (add-hook 'window-selection-change-functions | 5696 | |
| 5677 | #'minibuffer--nonselected-check nil t)) | 5697 | (defun minibuffer--nonselected-exit () |
| 5698 | "Remove hook for `minibuffer-nonselected-mode' if it is there." | ||
| 5699 | (when (= (minibuffer-depth) 1) | ||
| 5700 | (remove-hook 'window-state-change-functions | ||
| 5701 | #'minibuffer--nonselected-check))) | ||
| 5678 | 5702 | ||
| 5679 | (define-minor-mode minibuffer-nonselected-mode | 5703 | (define-minor-mode minibuffer-nonselected-mode |
| 5680 | "Minor mode to warn about non-selected active minibuffer. | 5704 | "Minor mode to warn about non-selected active minibuffer window. |
| 5681 | Use the face `minibuffer-nonselected' to highlight the minibuffer | 5705 | Use the face `minibuffer-nonselected' to highlight the contents of the |
| 5682 | window when the minibuffer remains active, but the minibuffer window | 5706 | minibuffer window when the minibuffer remains active but its window is |
| 5683 | is no longer selected." | 5707 | no longer selected." |
| 5684 | :global t | 5708 | :global t |
| 5685 | :initialize #'custom-initialize-delay | 5709 | :initialize #'custom-initialize-delay |
| 5686 | :init-value t | 5710 | :init-value t |
| 5687 | :version "31.1" | 5711 | :version "31.1" |
| 5688 | (if minibuffer-nonselected-mode | 5712 | (if minibuffer-nonselected-mode |
| 5689 | (add-hook 'minibuffer-setup-hook #'minibuffer--nonselected-setup) | 5713 | (progn |
| 5690 | (remove-hook 'minibuffer-setup-hook #'minibuffer--nonselected-setup))) | 5714 | (add-hook 'minibuffer-setup-hook #'minibuffer--nonselected-setup) |
| 5691 | 5715 | (add-hook 'minibuffer-exit-hook #'minibuffer--nonselected-exit) | |
| 5716 | (when (active-minibuffer-window) | ||
| 5717 | (minibuffer--nonselected-check (selected-frame)))) | ||
| 5718 | (remove-hook 'minibuffer-setup-hook #'minibuffer--nonselected-setup) | ||
| 5719 | (remove-hook 'minibuffer-exit-hook #'minibuffer--nonselected-exit) | ||
| 5720 | (remove-hook 'window-state-change-functions | ||
| 5721 | #'minibuffer--nonselected-check) | ||
| 5722 | (when (overlayp minibuffer--nonselected-overlay) | ||
| 5723 | (delete-overlay minibuffer--nonselected-overlay)))) | ||
| 5692 | 5724 | ||
| 5693 | (provide 'minibuffer) | 5725 | (provide 'minibuffer) |
| 5694 | 5726 | ||