summaryrefslogtreecommitdiff
path: root/lisp/window.el
diff options
context:
space:
mode:
authorTino Calancha <f92capac@gmail.com>2019-06-25 15:42:17 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2019-06-25 15:42:17 +0200
commit0454bfd3313c069ca395f02ab6f377a17ff44965 (patch)
tree208cb2709d91b7d02c25facdde8cf4c5f23825b4 /lisp/window.el
parente195bbd95a35a5aeaf3689ff9e9293d350bb4056 (diff)
downloademacs-0454bfd3313c069ca395f02ab6f377a17ff44965.tar.gz
Make winner restore point in all windows that display a buffer
* lisp/window.el (window--before-delete-windows): New defun. (delete-window, delete-other-windows): Use it. * lisp/winner.el (winner-set): Use marker in 'window-prev-buffers' when available and different than the value returned by 'winner-get-point' (bug#23621).
Diffstat (limited to 'lisp/window.el')
-rw-r--r--lisp/window.el39
1 files changed, 39 insertions, 0 deletions
diff --git a/lisp/window.el b/lisp/window.el
index a2335a6798c..726d022dfe9 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -3706,6 +3706,8 @@ WINDOW must be a valid window and defaults to the selected one.
If the option `window-resize-pixelwise' is non-nil minimize
WINDOW pixelwise."
(interactive)
+ (when switch-to-buffer-preserve-window-point
+ (window--before-delete-windows window))
(setq window (window-normalize-window window))
(window-resize
window
@@ -4043,6 +4045,41 @@ frame can be safely deleted."
(throw 'done t)
(setq parent (window-parent parent))))))))
+;; This function is called by `delete-window' and
+;; `delete-other-windows' when `switch-to-buffer-preserve-window-point'
+;; evaluates non-nil: it allows `winner-undo' to restore the
+;; buffer point from deleted windows (Bug#23621).
+(defun window--before-delete-windows (&optional window)
+ "Update `window-prev-buffers' before delete a window.
+Optional arg WINDOW, if non-nil, update WINDOW-START and POS
+in `window-prev-buffers' for all windows displaying same
+buffer as WINDOW. Otherwise, update `window-prev-buffers' for
+all windows.
+
+The new values for WINDOW-START and POS are those
+returned by `window-start' and `window-point' respectively.
+
+This function is called only if `switch-to-buffer-preserve-window-point'
+evaluates non-nil."
+ (dolist (win (window-list))
+ (let* ((buf (window-buffer (or window win)))
+ (start (window-start win))
+ (pos (window-point win))
+ (entry (assq buf (window-prev-buffers win))))
+ (cond (entry
+ (let ((marker (nth 2 entry)))
+ (unless (= pos marker)
+ (set-marker (nth 1 entry) start buf)
+ (set-marker marker pos buf))))
+ (t
+ (let ((prev-buf (window-prev-buffers win))
+ (start-m (make-marker))
+ (pos-m (make-marker)))
+ (set-marker start-m start buf)
+ (set-marker pos-m pos buf)
+ (push (list buf start-m pos-m) prev-buf)
+ (set-window-prev-buffers win prev-buf)))))))
+
(defun delete-window (&optional window)
"Delete WINDOW.
WINDOW must be a valid window and defaults to the selected one.
@@ -4061,6 +4098,8 @@ argument. Signal an error if WINDOW is either the only window on
its frame, the last non-side window, or part of an atomic window
that is its frame's root window."
(interactive)
+ (when switch-to-buffer-preserve-window-point
+ (window--before-delete-windows))
(setq window (window-normalize-window window))
(let* ((frame (window-frame window))
(function (window-parameter window 'delete-window))