]> code.delx.au - gnu-emacs/blobdiff - lisp/window.el
Merge from CEDET upstream (8569).
[gnu-emacs] / lisp / window.el
index 5b001988ddfb0e1cfacd844688214732c3297de8..86d93c0a9f6fbd4bf725bf0cc0721c886f7a223b 100644 (file)
@@ -4258,7 +4258,8 @@ specific buffers."
             (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
@@ -4346,6 +4347,9 @@ value can be also stored on disk and read back in a new session."
 (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)))
@@ -4428,9 +4432,14 @@ value can be also stored on disk and read back in a new session."
          (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
@@ -4490,6 +4499,7 @@ Optional argument IGNORE non-nil means ignore minimum window
 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))
@@ -4538,6 +4548,10 @@ windows can get as small as `window-safe-min-height' and
        (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)
@@ -5456,6 +5470,9 @@ argument, ACTION is t."
   (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))