diff --git a/mu4e/mu4e-headers.el b/mu4e/mu4e-headers.el index 4389dda9..30155277 100644 --- a/mu4e/mu4e-headers.el +++ b/mu4e/mu4e-headers.el @@ -1611,6 +1611,9 @@ _not_ refresh the last search with the new setting for threading." (if (functionp mu4e-view-auto-mark-as-read) (funcall mu4e-view-auto-mark-as-read msg) mu4e-view-auto-mark-as-read))) + (when-let ((buf (mu4e-get-view-buffer nil nil))) + (with-current-buffer buf + (mu4e-loading-mode 1))) (mu4e--server-view docid mark-as-read))) @@ -1767,28 +1770,28 @@ other windows." ;;; Loading messages ;; -(defvar mu4e-loading-mode-map - (let ((map (make-sparse-keymap))) - (define-key map "n" #'ignore) - (define-key map "p" #'ignore) - (define-key map "q" #'bury-buffer) - map) - "Keymap for *mu4e-loading* buffers.") -(define-derived-mode mu4e-loading-mode special-mode - "mu4e:loading" - (use-local-map mu4e-loading-mode-map) - (let ((inhibit-read-only t)) - (erase-buffer) - (insert (propertize "Loading message..." - 'face 'mu4e-system-face 'intangible t)))) - -(defun mu4e~loading-close () - "Bury the mu4e Loading... buffer, if any." - (let* ((buf mu4e~headers-loading-buf) - (win (and (buffer-live-p buf) (get-buffer-window buf t)))) - (when (window-live-p win) - (delete-window win)))) +(define-minor-mode mu4e-loading-mode + "Minor mode for buffers awaiting data from mu" + :init-value nil :lighter " Loading" :keymap nil + (if mu4e-loading-mode + (progn + (when mu4e-dim-when-loading + (set (make-variable-buffer-local 'mu4e--loading-overlay-bg) + (let ((overlay (make-overlay (point-min) (point-max)))) + (overlay-put overlay 'face `(:foreground "gray22" :background + ,(face-attribute 'default :background))) + (overlay-put overlay 'priority 9998) + overlay))) + (set (make-variable-buffer-local 'mu4e--loading-overlay-text) + (let ((overlay (make-overlay (point-min) (point-min)))) + (overlay-put overlay 'priority 9999) + (overlay-put overlay 'before-string (propertize "Loading…\n" 'face 'mu4e-header-title-face)) + overlay))) + (when mu4e--loading-overlay-bg + (delete-overlay mu4e--loading-overlay-bg)) + (when mu4e--loading-overlay-text + (delete-overlay mu4e--loading-overlay-text)))) (provide 'mu4e-headers) ;;; mu4e-headers.el ends here diff --git a/mu4e/mu4e-helpers.el b/mu4e/mu4e-helpers.el index 325647b3..dd6bfc01 100644 --- a/mu4e/mu4e-helpers.el +++ b/mu4e/mu4e-helpers.el @@ -163,8 +163,6 @@ Create [mu4e]-prefixed error based on format FRM and ARGS. Does a local-exit and does not return, and raises a debuggable (backtrace) error." (mu4e-log 'error (apply 'mu4e-format frm args)) - ;; opportunistically close the "loading" window. - (mu4e~loading-close) (error "%s" (apply 'mu4e-format frm args))) (defun mu4e-warn (frm &rest args) diff --git a/mu4e/mu4e-vars.el b/mu4e/mu4e-vars.el index 1a79d9ab..fa94bc80 100644 --- a/mu4e/mu4e-vars.el +++ b/mu4e/mu4e-vars.el @@ -56,6 +56,12 @@ Follows the format of `format-time-string'." :type 'string :group 'mu4e) +(defcustom mu4e-dim-when-loading t + "Dim buffer text when loading new data. +If non-nil, dim some buffers during data retrieval and rendering. Disable this if you" + :type 'boolean + :group 'mu4e) + ;;; Faces diff --git a/mu4e/mu4e-view.el b/mu4e/mu4e-view.el index 697c7db4..e75a52ef 100644 --- a/mu4e/mu4e-view.el +++ b/mu4e/mu4e-view.el @@ -619,7 +619,8 @@ As a side-effect, a message that is being viewed loses its (insert-file-contents-literally (mu4e-message-readable-path msg) nil nil nil t) (setq-local mu4e~view-message msg) - (mu4e~view-render-buffer msg))) + (mu4e~view-render-buffer msg)) + (mu4e-loading-mode 0)) (unless (mu4e--view-detached-p gnus-article-buffer) (with-current-buffer mu4e-linked-headers-buffer ;; We need this here as we want to avoid displaying the buffer until diff --git a/mu4e/mu4e-window.el b/mu4e/mu4e-window.el index 4ef74f3d..c50fc7cf 100644 --- a/mu4e/mu4e-window.el +++ b/mu4e/mu4e-window.el @@ -24,9 +24,6 @@ ;;; Buffer names for internal use -(defvar mu4e~headers-loading-buf nil - "A buffer for loading a message view.") - (defconst mu4e--sexp-buffer-name "*mu4e-sexp-at-point*" "Buffer name for sexp buffers.") @@ -110,7 +107,6 @@ tested." (and pred (funcall pred buf))))) (buffer-list))) - (defun mu4e--view-detached-p (buffer) "Return non-nil if BUFFER is a detached view buffer." (with-current-buffer buffer @@ -121,7 +117,6 @@ tested." (defun mu4e--get-current-buffer-type () "Return an internal symbol that corresponds to each mu4e major mode." (cond ((derived-mode-p 'mu4e-view-mode 'mu4e-raw-view-mode) 'view) - ((derived-mode-p 'mu4e-loading-mode) 'loading) ((derived-mode-p 'mu4e-headers-mode) 'headers) ((derived-mode-p 'mu4e-compose-mode) 'compose) ((derived-mode-p 'mu4e-main-mode) 'main) @@ -130,8 +125,7 @@ tested." (defun mu4e-current-buffer-type-p (type) "Return non-nil if the current buffer is a mu4e buffer of TYPE. -Where TYPE is `view', `loading', `headers', `compose', -`main' or `unknown'. +Where TYPE is `view', `headers', `compose', `main' or `unknown'. Checks are performed using `derived-mode-p' and the current buffer's major mode." @@ -226,7 +220,6 @@ for BUFFER-OR-NAME to be displayed in." ('(view . vertical) '((window-min-width . fit-window-to-buffer))) (`(,_ . t) nil))) (window-action (cond - ((memq buffer-type '(loader)) '(display-buffer-same-window)) ((memq buffer-type '(headers compose)) '(display-buffer-reuse-mode-window display-buffer-same-window)) ((memq mu4e-split-view '(horizontal vertical))