aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Rudalics2025-10-13 10:22:04 +0200
committerMartin Rudalics2025-10-13 10:22:04 +0200
commit750499e4b717882f44461c46fc2fa0ea4c4a55dc (patch)
tree72f1c58073af8b386710474821147e11d960d7a2
parenta184ae8eda0678da5dda608722c06f7f929a74ff (diff)
downloademacs-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.el100
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.
5648It's displayed on the minibuffer window when the minibuffer 5648Used by `minibuffer-nonselected-mode' for the contents of the minibuffer
5649remains active, but the minibuffer window is no longer selected." 5649window when the minibuffer remains active but its window is currently
5650not 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) 5655Used by `minibuffer-nonselected-mode'.")
5655 "Check if the active minibuffer's window is no longer selected. 5656
5656Use overlay to highlight the minibuffer window when another window 5657(defun minibuffer--nonselected-check (_frame)
5657is selected. But don't warn in case when the *Completions* window 5658 "Check if active minibuffer window is no longer selected.
5658becomes selected." 5659Use overlay to highlight its contents when another window is selected.
5659 (if (eq window (selected-window)) 5660But 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.
5681Use the face `minibuffer-nonselected' to highlight the minibuffer 5705Use the face `minibuffer-nonselected' to highlight the contents of the
5682window when the minibuffer remains active, but the minibuffer window 5706minibuffer window when the minibuffer remains active but its window is
5683is no longer selected." 5707no 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