diff options
author | Kyle Meyer <kyle@kyleam.com> | 2015-01-04 22:18:46 -0500 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2015-01-05 12:49:44 +0100 |
commit | 7e945107ced488344fd78cd1388cf000b29733e8 (patch) | |
tree | 4cca515b9726de6c41a6519afd994f310b6fa296 | |
parent | 460f31efa03ceb18c8177dd1da76ae9d8650e0aa (diff) | |
download | org-mode-7e945107ced488344fd78cd1388cf000b29733e8.tar.gz |
org-agenda: Fix issues with restoring windows
* lisp/org-agenda.el (org-agenda-prepare-window): Update window
configuration even when agenda buffer exists in background.
* lisp/org-agenda.el (org-agenda-Quit): Use buffer value for
org-agenda-pre-window-conf to allow for local values used with sticky
agenda buffers.
* lisp/org-agenda.el (org-agenda-quit): Reset local, not global, value for
org-agenda-pre-window-conf.
* lisp/org-agenda.el (org-agenda--quit): New function.
Update the pre-agenda window configuration on the next agenda call even
if org-agenda-pre-window-conf is non-nil (which occurs when the agenda
buffer is exited without q, Q, or X). This prevents restoring a window
configuration that is not the one prior to the most recent agenda call.
Make org-agenda-Quit (Q) restore the buffer-local, not the global, value
for org-agenda-pre-window-conf so that it works correctly with sticky
agenda buffers.
Along with these changes, merge the duplicated functionality of
org-agenda-quit and org-agenda-Quit into a new function,
org-agenda--quit.
-rw-r--r-- | lisp/org-agenda.el | 82 |
1 files changed, 32 insertions, 50 deletions
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 6e2e953..8d5655f 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -3633,7 +3633,7 @@ FILTER-ALIST is an alist of filters we need to apply when (unless (equal (current-buffer) abuf) (org-pop-to-buffer-same-window abuf)) (setq org-agenda-pre-window-conf - (or org-agenda-pre-window-conf wconf)))) + (or wconf org-agenda-pre-window-conf)))) (defun org-agenda-prepare (&optional name) (let ((filter-alist (if org-agenda-persistent-filter @@ -7180,32 +7180,7 @@ Allowed types are 'agenda 'timeline 'todo 'tags 'search." Like `org-agenda-quit', but kill the buffer even when `org-agenda-sticky' is non-nil." (interactive) - (let ((org-agenda-last-indirect-window - (and (eq org-indirect-buffer-display 'other-window) - org-agenda-last-indirect-buffer - (get-buffer-window org-agenda-last-indirect-buffer)))) - (when org-agenda-last-indirect-window - (delete-window org-agenda-last-indirect-window))) - (if org-agenda-columns-active - (org-columns-quit) - (let ((buf (current-buffer))) - (if (eq org-agenda-window-setup 'other-frame) - (progn - (kill-buffer buf) - (setq org-agenda-archives-mode nil) - (delete-frame)) - (and (not (eq org-agenda-window-setup 'current-window)) - (not (one-window-p)) - (delete-window)) - (kill-buffer buf) - (setq org-agenda-archives-mode nil))) - (setq org-agenda-buffer nil) - ;; Maybe restore the pre-agenda window configuration. - (and org-agenda-restore-windows-after-quit - (not (eq org-agenda-window-setup 'other-frame)) - org-agenda-pre-window-conf - (set-window-configuration org-agenda-pre-window-conf) - (setq org-agenda-pre-window-conf nil)))) + (org-agenda--quit)) (defun org-agenda-quit () "Exit the agenda. @@ -7219,31 +7194,38 @@ the pre-agenda window configuration. When column view is active, exit column view instead of the agenda." (interactive) - (let ((org-agenda-last-indirect-window - (and (eq org-indirect-buffer-display 'other-window) - org-agenda-last-indirect-buffer - (get-buffer-window org-agenda-last-indirect-buffer)))) - (when org-agenda-last-indirect-window - (delete-window org-agenda-last-indirect-window))) + (org-agenda--quit org-agenda-sticky)) + +(defun org-agenda--quit (&optional bury) (if org-agenda-columns-active (org-columns-quit) - (if org-agenda-sticky - (let ((buf (current-buffer))) - (if (eq org-agenda-window-setup 'other-frame) - (progn - (delete-frame)) - (and (not (eq org-agenda-window-setup 'current-window)) - (not (one-window-p)) - (delete-window))) - (with-current-buffer buf - (bury-buffer) - ;; Maybe restore the pre-agenda window configuration. - (and org-agenda-restore-windows-after-quit - (not (eq org-agenda-window-setup 'other-frame)) - org-agenda-pre-window-conf - (set-window-configuration org-agenda-pre-window-conf) - (setq org-agenda-pre-window-conf nil)))) - (org-agenda-Quit)))) + (let ((buf (current-buffer)) + (wconf org-agenda-pre-window-conf) + (org-agenda-last-indirect-window + (and (eq org-indirect-buffer-display 'other-window) + org-agenda-last-indirect-buffer + (get-buffer-window org-agenda-last-indirect-buffer)))) + (cond + ((eq org-agenda-window-setup 'other-frame) + (delete-frame)) + ((and org-agenda-restore-windows-after-quit + wconf) + ;; Maybe restore the pre-agenda window configuration. Reset + ;; `org-agenda-pre-window-conf' before running + ;; `set-window-configuration', which loses the current buffer. + (setq org-agenda-pre-window-conf nil) + (set-window-configuration wconf)) + (t + (when org-agenda-last-indirect-window + (delete-window org-agenda-last-indirect-window)) + (and (not (eq org-agenda-window-setup 'current-window)) + (not (one-window-p)) + (delete-window)))) + (if bury + (bury-buffer buf) + (kill-buffer buf) + (setq org-agenda-archives-mode nil + org-agenda-buffer nil))))) (defun org-agenda-exit () "Exit the agenda, killing Org buffers loaded by the agenda. |