mu4e-draft/window: handle buffer display in mu4e-window

Handle buffer display where all mu4e's buffer display is done: in mu4e-window.el.

Avoid overly long lines in mu4e-window.el.
This commit is contained in:
Dirk-Jan C. Binnema 2024-04-24 12:52:54 +03:00
parent 813ce795ff
commit a9b78718b2
2 changed files with 67 additions and 28 deletions

View File

@ -635,7 +635,9 @@ Optionally, PARENT is the message parent or nil. For compose-type
`reply' and `forward' we require a PARENT; for the other compose `reply' and `forward' we require a PARENT; for the other compose
it must be nil. it must be nil.
After this, user is presented with a message composition buffer." After this, user is presented with a message composition buffer.
Returns the new buffer."
(mu4e--prepare-draft parent) (mu4e--prepare-draft parent)
;; evaluate BODY; this must yield a hidden, live buffer. This is evaluated in ;; evaluate BODY; this must yield a hidden, live buffer. This is evaluated in
;; a temp buffer with contains the parent-message, if any. if there's a ;; a temp buffer with contains the parent-message, if any. if there's a
@ -647,11 +649,14 @@ After this, user is presented with a message composition buffer."
;; interference. ;; interference.
(setq draft-buffer (mu4e--validate-hidden-buffer (funcall compose-func))) (setq draft-buffer (mu4e--validate-hidden-buffer (funcall compose-func)))
(with-current-buffer draft-buffer (with-current-buffer draft-buffer
;; we have our basic buffer; turn it into a full mu4e composition buffer. ;; we have our basic buffer; turn it into a full mu4e composition
;; buffer.
(mu4e--prepare-draft-buffer compose-type parent))) (mu4e--prepare-draft-buffer compose-type parent)))
;; we're ready for composition; let's display it in the way user configured ;; we're ready for composition; let's display it in the way user configured
;; things. ;; things: directly through display buffer (via pop-t or otherwise through mu4e-window.
(mu4e-display-buffer draft-buffer 'do-select) (if (eq mu4e-compose-switch 'display-buffer)
(pop-to-buffer draft-buffer)
(mu4e-display-buffer draft-buffer 'do-select))
;; prepare possible message actions (such as cleaning-up) ;; prepare possible message actions (such as cleaning-up)
(mu4e--prepare-message-actions oldframe) (mu4e--prepare-message-actions oldframe)
draft-buffer)) draft-buffer))

View File

@ -1,6 +1,7 @@
;;; mu4e-window.el --- Window management -*- lexical-binding: t; -*- ;;; mu4e-window.el --- Window management -*- lexical-binding: t; -*-
;; Copyright (C) 2022 Mickey Petersen ;; Copyright (C) 2022 Mickey Petersen
;; Copyright (C) 2023-2024 Dirk-Jan C. Binnema
;; Author: Mickey Petersen <mickey@masteringemacs.org> ;; Author: Mickey Petersen <mickey@masteringemacs.org>
;; Keywords: mail ;; Keywords: mail
@ -33,7 +34,6 @@
(defvar mu4e-embedded-buffer-name " *mu4e-embedded*" (defvar mu4e-embedded-buffer-name " *mu4e-embedded*"
"Name for the embedded message view buffer.") "Name for the embedded message view buffer.")
;; Buffer names for public use ;; Buffer names for public use
(defvar mu4e-headers-buffer-name "*mu4e-headers*" (defvar mu4e-headers-buffer-name "*mu4e-headers*"
@ -89,6 +89,20 @@ vertical split-view."
:type 'integer :type 'integer
:group 'mu4e-headers) :group 'mu4e-headers)
(defcustom mu4e-compose-switch nil
"Where to display the new message?
A symbol:
- nil : default (new buffer)
- window : compose in new window
- frame or t : compose in new frame
- display-buffer: use `display-buffer' / `display-buffer-alist'
(for fine-tuning).
For backward compatibility with `mu4e-compose-in-new-frame', t is
treated as =\\'frame."
:type 'symbol
:group 'mu4e-compose)
(declare-function mu4e-view-mode "mu4e-view") (declare-function mu4e-view-mode "mu4e-view")
(declare-function mu4e-error "mu4e-helpers") (declare-function mu4e-error "mu4e-helpers")
(declare-function mu4e-warn "mu4e-helpers") (declare-function mu4e-warn "mu4e-helpers")
@ -196,20 +210,24 @@ being created if CREATE is non-nil."
(let ((buffer) (let ((buffer)
;; If `mu4e-view-buffer-name-func' is non-nil, then use that ;; If `mu4e-view-buffer-name-func' is non-nil, then use that
;; to source the name of the view buffer to create or re-use. ;; to source the name of the view buffer to create or re-use.
(buffer-name (or (and mu4e-view-buffer-name-func (buffer-name
(funcall mu4e-view-buffer-name-func headers-buffer)) (or (and mu4e-view-buffer-name-func
;; If the variable is nil, use the default (funcall mu4e-view-buffer-name-func headers-buffer))
;; name ;; If the variable is nil, use the default
mu4e-view-buffer-name)) ;; name
mu4e-view-buffer-name))
;; Search all view buffers and return those that are linked to ;; Search all view buffers and return those that are linked to
;; `headers-buffer'. ;; `headers-buffer'.
(linked-buffer (mu4e-get-view-buffers (linked-buffer
(lambda (buf) (mu4e-get-view-buffers
(and (mu4e--buffer-local-boundp 'mu4e-linked-headers-buffer buf) (lambda (buf)
(eq mu4e-linked-headers-buffer headers-buffer)))))) (and (mu4e--buffer-local-boundp 'mu4e-linked-headers-buffer buf)
;; If such a linked buffer exists and its buffer is live, we use that buffer. (eq mu4e-linked-headers-buffer headers-buffer))))))
;; If such a linked buffer exists and its buffer is live, we use that
;; buffer.
(if (and linked-buffer (buffer-live-p (car linked-buffer))) (if (and linked-buffer (buffer-live-p (car linked-buffer)))
;; NOTE: It's possible for there to be more than one linked view buffer. ;; NOTE: It's possible for there to be more than one linked view
;; buffer.
;; ;;
;; What, if anything, should the heuristic be to pick the ;; What, if anything, should the heuristic be to pick the
;; one to use? Presently `car' is used, but there are better ;; one to use? Presently `car' is used, but there are better
@ -274,8 +292,10 @@ for BUFFER-OR-NAME to be displayed in."
(setq mu4e-split-view 'horizontal)) (setq mu4e-split-view 'horizontal))
(let* ((buffer-name (or (get-buffer buffer-or-name) (let* ((buffer-name (or (get-buffer buffer-or-name)
(mu4e-error "Buffer `%s' does not exist" buffer-or-name))) (mu4e-error "Buffer `%s' does not exist"
(buffer-type (with-current-buffer buffer-name (mu4e--get-current-buffer-type))) buffer-or-name)))
(buffer-type
(with-current-buffer buffer-name (mu4e--get-current-buffer-type)))
(direction (cons 'direction (direction (cons 'direction
(pcase (cons buffer-type mu4e-split-view) (pcase (cons buffer-type mu4e-split-view)
;; views or headers can display ;; views or headers can display
@ -289,19 +309,34 @@ for BUFFER-OR-NAME to be displayed in."
;; views or headers can display ;; views or headers can display
;; horz/vert depending on the value of ;; horz/vert depending on the value of
;; `mu4e-split-view' ;; `mu4e-split-view'
('(view . horizontal) '((window-height . shrink-window-if-larger-than-buffer))) ('(view . horizontal)
('(view . vertical) '((window-min-width . fit-window-to-buffer))) '((window-height . shrink-window-if-larger-than-buffer)))
('(view . vertical)
'((window-min-width . fit-window-to-buffer)))
(`(,_ . t) nil))) (`(,_ . t) nil)))
(window-action (cond (window-action (cond
((eq buffer-type 'main) '(display-buffer-reuse-window ;; main-buffer
display-buffer-reuse-mode-window ((eq buffer-type 'main)
display-buffer-full-frame)) '(display-buffer-reuse-window
((memq buffer-type '(headers compose)) display-buffer-reuse-mode-window
display-buffer-full-frame))
;; compose-buffer
((eq buffer-type 'compose)
(pcase mu4e-compose-switch
('window #'display-buffer-pop-up-window)
((or 'frame 't) #'display-buffer-pop-up-frame)
(_ '(display-buffer-reuse-window
display-buffer-reuse-mode-window
display-buffer-same-window))))
;; headers buffer
((memq buffer-type '(headers))
'(display-buffer-reuse-window '(display-buffer-reuse-window
display-buffer-reuse-mode-window display-buffer-reuse-mode-window
display-buffer-same-window)) display-buffer-same-window))
((memq mu4e-split-view '(horizontal vertical)) ((memq mu4e-split-view '(horizontal vertical))
'(display-buffer-in-direction)) '(display-buffer-in-direction))
((memq mu4e-split-view '(single-window)) ((memq mu4e-split-view '(single-window))
'(display-buffer-reuse-window '(display-buffer-reuse-window
display-buffer-reuse-mode-window display-buffer-reuse-mode-window
@ -314,8 +349,7 @@ for BUFFER-OR-NAME to be displayed in."
display-buffer-same-window)))) display-buffer-same-window))))
(arg `((,@window-action) (arg `((,@window-action)
,@window-size ,@window-size
,direction ,direction)))
)))
(funcall (if select #'pop-to-buffer #'display-buffer) (funcall (if select #'pop-to-buffer #'display-buffer)
buffer-name buffer-name
arg))) arg)))
@ -339,11 +373,11 @@ This function is best called from the hook
;; cause for error. ;; cause for error.
(ignore-errors (ignore-errors
(cond ((eq mu4e-split-view 'vertical) (cond ((eq mu4e-split-view 'vertical)
(window-resize win (- mu4e-headers-visible-columns (window-width win nil)) (window-resize win (- mu4e-headers-visible-columns
(window-width win nil))
t t nil)) t t nil))
((eq mu4e-split-view 'horizontal) ((eq mu4e-split-view 'horizontal)
(set-window-text-height win mu4e-headers-visible-lines)))))) (set-window-text-height win mu4e-headers-visible-lines))))))
(provide 'mu4e-window) (provide 'mu4e-window)
;;; mu4e-window.el ends here ;;; mu4e-window.el ends here