summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Meyer <kyle@kyleam.com>2015-01-04 22:18:46 -0500
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2015-01-05 12:49:44 +0100
commit7e945107ced488344fd78cd1388cf000b29733e8 (patch)
tree4cca515b9726de6c41a6519afd994f310b6fa296
parent460f31efa03ceb18c8177dd1da76ae9d8650e0aa (diff)
downloadorg-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.el82
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.