--- a/lisp/window.el +++ b/lisp/window.el @@ -5620,21 +5620,29 @@ window-state-put ;; minimum possible state. But such configurations hardly make ;; sense anyway. (error "Window %s too small to accommodate state" window) - (setq state (cdr state)) - (setq window-state-put-list nil) - ;; Work on the windows of a temporary buffer to make sure that - ;; splitting proceeds regardless of any buffer local values of - ;; `window-size-fixed'. Release that buffer after the buffers of - ;; all live windows have been set by `window--state-put-2'. - (with-temp-buffer - (set-window-buffer window (current-buffer)) - (window--state-put-1 state window nil totals pixelwise) - (window--state-put-2 ignore pixelwise)) - (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)))) + + + (unwind-protect + (progn + (frame-after-make-frame frame nil) + (setq state (cdr state)) + (setq window-state-put-list nil) + ;; Work on the windows of a temporary buffer to make sure that + ;; splitting proceeds regardless of any buffer local values of + ;; `window-size-fixed'. Release that buffer after the buffers of + ;; all live windows have been set by `window--state-put-2'. + (with-temp-buffer + (set-window-buffer window (current-buffer)) + (window--state-put-1 state window nil totals pixelwise) + (window--state-put-2 ignore pixelwise)) + (while window-state-put-stale-windows + (let ((window (pop window-state-put-stale-windows))) + (when (eq (window-deletable-p window) t) + (delete-window window))))) + (frame-after-make-frame frame t) + (prog1 + (window--check frame) + (run-window-configuration-change-hook frame)))))) (defun display-buffer-record-window (type window buffer) "Record information for window used by `display-buffer'.