diff --git a/mu4e/mu4e-draft.el b/mu4e/mu4e-draft.el index b4edf711..2dcb1f0b 100644 --- a/mu4e/mu4e-draft.el +++ b/mu4e/mu4e-draft.el @@ -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 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) ;; 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 @@ -647,11 +649,14 @@ After this, user is presented with a message composition buffer." ;; interference. (setq draft-buffer (mu4e--validate-hidden-buffer (funcall compose-func))) (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))) ;; we're ready for composition; let's display it in the way user configured - ;; things. - (mu4e-display-buffer draft-buffer 'do-select) + ;; things: directly through display buffer (via pop-t or otherwise through mu4e-window. + (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) (mu4e--prepare-message-actions oldframe) draft-buffer)) diff --git a/mu4e/mu4e-window.el b/mu4e/mu4e-window.el index 4714eedc..af2e9335 100644 --- a/mu4e/mu4e-window.el +++ b/mu4e/mu4e-window.el @@ -1,6 +1,7 @@ ;;; mu4e-window.el --- Window management -*- lexical-binding: t; -*- ;; Copyright (C) 2022 Mickey Petersen +;; Copyright (C) 2023-2024 Dirk-Jan C. Binnema ;; Author: Mickey Petersen ;; Keywords: mail @@ -33,7 +34,6 @@ (defvar mu4e-embedded-buffer-name " *mu4e-embedded*" "Name for the embedded message view buffer.") - ;; Buffer names for public use (defvar mu4e-headers-buffer-name "*mu4e-headers*" @@ -89,6 +89,20 @@ vertical split-view." :type 'integer :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-error "mu4e-helpers") (declare-function mu4e-warn "mu4e-helpers") @@ -196,20 +210,24 @@ being created if CREATE is non-nil." (let ((buffer) ;; 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. - (buffer-name (or (and mu4e-view-buffer-name-func - (funcall mu4e-view-buffer-name-func headers-buffer)) - ;; If the variable is nil, use the default - ;; name - mu4e-view-buffer-name)) + (buffer-name + (or (and mu4e-view-buffer-name-func + (funcall mu4e-view-buffer-name-func headers-buffer)) + ;; If the variable is nil, use the default + ;; name + mu4e-view-buffer-name)) ;; Search all view buffers and return those that are linked to ;; `headers-buffer'. - (linked-buffer (mu4e-get-view-buffers - (lambda (buf) - (and (mu4e--buffer-local-boundp 'mu4e-linked-headers-buffer buf) - (eq mu4e-linked-headers-buffer headers-buffer)))))) - ;; If such a linked buffer exists and its buffer is live, we use that buffer. + (linked-buffer + (mu4e-get-view-buffers + (lambda (buf) + (and (mu4e--buffer-local-boundp 'mu4e-linked-headers-buffer buf) + (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))) - ;; 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 ;; 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)) (let* ((buffer-name (or (get-buffer buffer-or-name) - (mu4e-error "Buffer `%s' does not exist" buffer-or-name))) - (buffer-type (with-current-buffer buffer-name (mu4e--get-current-buffer-type))) + (mu4e-error "Buffer `%s' does not exist" + buffer-or-name))) + (buffer-type + (with-current-buffer buffer-name (mu4e--get-current-buffer-type))) (direction (cons 'direction (pcase (cons buffer-type mu4e-split-view) ;; views or headers can display @@ -289,19 +309,34 @@ for BUFFER-OR-NAME to be displayed in." ;; views or headers can display ;; horz/vert depending on the value of ;; `mu4e-split-view' - ('(view . horizontal) '((window-height . shrink-window-if-larger-than-buffer))) - ('(view . vertical) '((window-min-width . fit-window-to-buffer))) + ('(view . horizontal) + '((window-height . shrink-window-if-larger-than-buffer))) + ('(view . vertical) + '((window-min-width . fit-window-to-buffer))) (`(,_ . t) nil))) (window-action (cond - ((eq buffer-type 'main) '(display-buffer-reuse-window - display-buffer-reuse-mode-window - display-buffer-full-frame)) - ((memq buffer-type '(headers compose)) + ;; main-buffer + ((eq buffer-type 'main) + '(display-buffer-reuse-window + 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-mode-window display-buffer-same-window)) + ((memq mu4e-split-view '(horizontal vertical)) '(display-buffer-in-direction)) + ((memq mu4e-split-view '(single-window)) '(display-buffer-reuse-window display-buffer-reuse-mode-window @@ -314,8 +349,7 @@ for BUFFER-OR-NAME to be displayed in." display-buffer-same-window)))) (arg `((,@window-action) ,@window-size - ,direction - ))) + ,direction))) (funcall (if select #'pop-to-buffer #'display-buffer) buffer-name arg))) @@ -339,11 +373,11 @@ This function is best called from the hook ;; cause for error. (ignore-errors (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)) ((eq mu4e-split-view 'horizontal) (set-window-text-height win mu4e-headers-visible-lines)))))) - (provide 'mu4e-window) ;;; mu4e-window.el ends here