diff --git a/emacs/mu4e-headers.el b/emacs/mu4e-headers.el index c90885da..fb939e32 100644 --- a/emacs/mu4e-headers.el +++ b/emacs/mu4e-headers.el @@ -134,7 +134,7 @@ are of the form: (let ((inhibit-read-only t)) (with-current-buffer mu4e~headers-buffer (erase-buffer) - (mu4e~mark-clear))))) +(mu4e~mark-clear))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; handler functions @@ -347,8 +347,8 @@ after the end of the search results." (define-key map "P" 'mu4e-headers-toggle-threading) (define-key map "Q" 'mu4e-headers-toggle-full-search) - (define-key map "q" 'mu4e~headers-kill-buffer-and-window) - (define-key map "z" 'mu4e~headers-kill-buffer-and-window) + (define-key map "q" 'mu4e~headers-quit-buffer) + (define-key map "z" 'mu4e~headers-quit-buffer) (define-key map "r" 'mu4e-headers-rerun-search) (define-key map "g" 'mu4e-headers-rerun-search) ;; for compatibility @@ -415,8 +415,8 @@ after the end of the search results." (let ((menumap (make-sparse-keymap "Headers"))) (define-key map [menu-bar headers] (cons "Headers" menumap)) - (define-key menumap [mu4e~headers-kill-buffer-and-window] - '("Quit view" . mu4e~headers-kill-buffer-and-window)) + (define-key menumap [mu4e~headers-quit-buffer] + '("Quit view" . mu4e~headers-quit-buffer)) (define-key menumap [display-help] '("Help" . mu4e-display-manual)) (define-key menumap [sepa0] '("--")) @@ -663,6 +663,7 @@ buffer for the results. If IGNORE-HISTORY is true, do *not* update the query history stack." ;; note: we don't want to update the history if this query comes from ;; `mu4e~headers-query-next' or `mu4e~headers-query-prev'. + (mu4e-hide-other-mu4e-buffers) (let ((buf (get-buffer-create mu4e~headers-buffer-name)) (inhibit-read-only t)) (with-current-buffer buf @@ -682,18 +683,15 @@ the query history stack." mu4e-headers-show-threads mu4e-headers-sortfield mu4e-headers-sort-revert - (unless mu4e-headers-full-search mu4e-search-results-limit)) -;;; when we're starting a new search, we also kill the -;;; view window, if any - (ignore-errors (delete-window mu4e~headers-view-win)))) + (unless mu4e-headers-full-search mu4e-search-results-limit)))) (defun mu4e~headers-redraw-get-view-window () "Close all windows, redraw the headers buffer based on the value of `mu4e-split-view', and return a window for the message view." + (mu4e-hide-other-mu4e-buffers) (unless (buffer-live-p mu4e~headers-buffer) (error "No headers buffer available")) (switch-to-buffer mu4e~headers-buffer) - (delete-other-windows) (setq mu4e~headers-view-win (cond ((eq mu4e-split-view 'horizontal) ;; split horizontally @@ -959,7 +957,6 @@ rerun the last search with the new setting for threading." (when rerun (mu4e-headers-rerun-search))) - (defun mu4e-headers-view-message () "View message at point. If there's an existing window for the view, re-use that one. If not, create a new one, depending on the @@ -981,15 +978,13 @@ current window. " 'face 'mu4e-system-face 'intangible t)) (mu4e~proc-view docid mu4e-view-show-images)))) -(defun mu4e~headers-kill-buffer-and-window () +(defun mu4e~headers-quit-buffer () "Quit the headers view and return to the main view." (interactive) + (unless (eq major-mode 'mu4e-headers-mode) + (error "Must be in mu4e-headers-mode (%S)" major-mode)) (mu4e-mark-handle-when-leaving) - (let ((buf mu4e~headers-buffer)) - (when (buffer-live-p buf) - (bury-buffer) - (delete-windows-on buf) ;; destroy all windows for this buffer - (kill-buffer buf))) + (mu4e-quit-buffer) (mu4e~main-view)) (defun mu4e-headers-rerun-search () @@ -1032,12 +1027,18 @@ backward (if LINES is negative). If this succeeds, return the new docid. Otherwise, return nil." (unless (eq major-mode 'mu4e-headers-mode) (error "Must be in mu4e-headers-mode (%S)" major-mode)) - (let ((succeeded (= 0 (forward-line lines))) + (let ((succeeded (zerop (forward-line lines))) (docid (mu4e~headers-docid-at-point))) ;; move point, even if this function is called when this window is not ;; visible (when docid - (set-window-point (get-buffer-window mu4e~headers-buffer) (point)) + ;; update all windows showing the headers buffer + (walk-windows + (lambda (win) + (when (eq (window-buffer win) mu4e~headers-buffer) + (set-window-point win (point)))) + nil t) + ;;(set-window-point (get-buffer-window mu4e~headers-buffer t) (point)) ;; attempt to highlight the new line, display the message (mu4e~headers-highlight docid) ;; update message view if it was already showing diff --git a/emacs/mu4e-main.el b/emacs/mu4e-main.el index 6b403abf..7a3d1404 100644 --- a/emacs/mu4e-main.el +++ b/emacs/mu4e-main.el @@ -133,8 +133,7 @@ clicked." (mu4e~main-action-str "\t* [H]elp\n" 'mu4e-display-manual) (mu4e~main-action-str "\t* [q]uit\n" 'mu4e-quit)) (mu4e-main-mode) - (switch-to-buffer buf) - (delete-other-windows)))) + (switch-to-buffer buf)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Interactive functions diff --git a/emacs/mu4e-utils.el b/emacs/mu4e-utils.el index eb824baa..ae5f1485 100644 --- a/emacs/mu4e-utils.el +++ b/emacs/mu4e-utils.el @@ -625,8 +625,14 @@ FUNC (if non-nil) afterwards." mu4e-update-timer nil mu4e~maildir-list nil)) (mu4e~proc-kill) - (kill-buffer)) - + ;; kill all main/view/headers buffer + (mapcar + (lambda (buf) + (with-current-buffer buf + (when (member major-mode '(mu4e-headers-mode mu4e-view-mode mu4e-main-mode)) + (kill-buffer)))) + (buffer-list))) + (defvar mu4e-update-timer nil "*internal* The mu4e update timer.") @@ -790,5 +796,33 @@ is ignored." (newline) (insert-image img imgpath nil t)))) + +(defun mu4e-quit-buffer () + "Bury the current buffer (and delete all windows displaying it)." + (interactive) + (walk-windows + ;; kill any window that: + ;; a) displays the current buffer + ;; b) is not the only win + (lambda (win) + (when (eq (window-buffer win) (current-buffer)) + (unless (one-window-p t) + (delete-window win)))) nil t)) + + +(defun mu4e-hide-other-mu4e-buffers () + "Bury mu4e-buffers (main, headers, view) (and delete all windows +displaying it). Do _not_ bury the current buffer, though." + (interactive) + (let ((curbuf (current-buffer))) + (walk-windows + (lambda (win) + (with-current-buffer (window-buffer win) + (unless (eq curbuf (current-buffer)) + (when (member major-mode '(mu4e-headers-mode mu4e-view-mode mu4e-main-mode)) + (unless (one-window-p t) + (delete-window win)))))) nil t))) + + (provide 'mu4e-utils) ;;; End of mu4e-utils.el diff --git a/emacs/mu4e-view.el b/emacs/mu4e-view.el index 9c0381e9..574a055e 100644 --- a/emacs/mu4e-view.el +++ b/emacs/mu4e-view.el @@ -350,11 +350,11 @@ is nil, and otherwise open it." (setq mu4e-view-mode-map (let ((map (make-sparse-keymap))) - (define-key map "q" 'mu4e-view-kill-buffer-and-window) + (define-key map "q" 'mu4e-quit-buffer) ;; note, 'z' is by-default bound to 'bury-buffer' ;; but that's not very useful in this case - (define-key map "z" 'mu4e-view-kill-buffer-and-window) + (define-key map "z" 'mu4e-quit-buffer) (define-key map "s" 'mu4e-headers-search) (define-key map "S" 'mu4e-view-search-edit) @@ -449,7 +449,7 @@ is nil, and otherwise open it." (define-key map [menu-bar headers] (cons "View" menumap)) (define-key menumap [quit-buffer] - '("Quit view" . mu4e-view-kill-buffer-and-window)) + '("Quit view" . mu4e-quit-buffer)) (define-key menumap [display-help] '("Help" . mu4e-display-manual)) (define-key menumap [sepa0] '("--")) @@ -695,21 +695,7 @@ citations." (setq mu4e~view-lines-wrapped nil mu4e~view-cited-hidden nil)) - -(defun mu4e-view-kill-buffer-and-window () - "Quit the message view and return to the headers." - (interactive) - (when (buffer-live-p mu4e~view-buffer) - (with-current-buffer mu4e~view-buffer - (if (fboundp 'window-parent) ;; window-parent is an emacs24ism - (if (window-parent) - (kill-buffer-and-window) - (kill-buffer)) - ;; emacs23 hack: trial and error - (condition-case nil - (kill-buffer-and-window) - (kill-buffer)))))) - + (defun mu4e-view-action (&optional msg) "Ask user for some action to apply on MSG (or message-at-point, if nil), then do it. The actions are specified in @@ -995,7 +981,7 @@ user that unmarking only works in the header list." (let ((url (gethash num mu4e~view-link-map))) (unless url (error "Invalid number for URL")) (browse-url url))) - + (defconst mu4e~view-raw-buffer-name "*mu4e-raw-view*" "*internal* Name for the raw message view buffer")