(total-width . ,(window-total-size window t))
(normal-height . ,(window-normal-size window))
(normal-width . ,(window-normal-size window t))
- (combination-limit . ,(window-combination-limit window))
+ ,@(unless (window-live-p window)
+ `((combination-limit . ,(window-combination-limit window))))
,@(let ((parameters (window-parameters window))
list)
;; Make copies of those window parameters whose
(defvar window-state-put-list nil
"Helper variable for `window-state-put'.")
+(defvar window-state-put-stale-windows nil
+ "Helper variable for `window-state-put'.")
+
(defun window--state-put-1 (state &optional window ignore totals)
"Helper function for `window-state-put'."
(let ((type (car state)))
(set-window-parameter window (car parameter) (cdr parameter))))
;; Process buffer related state.
(when state
- ;; We don't want to raise an error here so we create a buffer if
- ;; there's none.
- (set-window-buffer window (get-buffer-create (car state)))
+ ;; We don't want to raise an error in case the buffer does not
+ ;; exist anymore, so we switch to a previous one and save the
+ ;; window with the intention of deleting it later if possible.
+ (let ((buffer (get-buffer (car state))))
+ (if buffer
+ (set-window-buffer window buffer)
+ (switch-to-prev-buffer window)
+ (push window window-state-put-stale-windows)))
(with-current-buffer (window-buffer window)
(set-window-hscroll window (cdr (assq 'hscroll state)))
(apply 'set-window-fringes
sizes and fixed size restrictions. IGNORE equal `safe' means
windows can get as small as `window-safe-min-height' and
`window-safe-min-width'."
+ (setq window-state-put-stale-windows nil)
(setq window (window-normalize-window window t))
(let* ((frame (window-frame window))
(head (car state))
(set-window-buffer window (current-buffer))
(window--state-put-1 state window nil totals)
(window--state-put-2 ignore))
+ (while window-state-put-stale-windows
+ (let ((window (pop window-state-put-stale-windows)))
+ (when (eq (window-deletable-p window) t)
+ (delete-window window))))
(window--check frame))))
\f
(defun display-buffer-record-window (type window buffer)
(let ((buffer (if (bufferp buffer-or-name)
buffer-or-name
(get-buffer buffer-or-name)))
+ ;; Make sure that when we split windows the old window keeps
+ ;; point, bug#14829.
+ (split-window-keep-point t)
;; Handle the old form of the first argument.
(inhibit-same-window (and action (not (listp action)))))
(unless (listp action) (setq action nil))