diff options
| author | Nicholas Hubbard <nicholashubbard@posteo.net> | 2022-03-15 12:55:06 -0400 |
|---|---|---|
| committer | Nicholas Hubbard <nicholashubbard@posteo.net> | 2022-03-15 12:55:06 -0400 |
| commit | e6637c4e9e193ffb924d29b6cb9acb75fa4fb87d (patch) | |
| tree | dfabd602204e7f402778f5dc14a913ba7e30a719 /perspective.el | |
| parent | 1d94436bd5ba25b079bfe2ccda8c59e799919a00 (diff) | |
Make persp-merge-list restorable regardless of frame count.
Diffstat (limited to 'perspective.el')
| -rw-r--r-- | perspective.el | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/perspective.el b/perspective.el index 26abbef..0d1dc5c 100644 --- a/perspective.el +++ b/perspective.el @@ -1881,7 +1881,7 @@ visible in a perspective as windows, they will be saved as FILE defaults to the value of persp-state-default-file if it is set. -Frames are restored, along with each frame's perspective list. +Frames are restored, along with each frame's perspective list and merge list. Each perspective's buffer list and window layout are also restored." (interactive (list @@ -1909,25 +1909,27 @@ restored." ;; iterate over the frames (cl-loop for frame in (persp--state-complete-frames state-complete) do (cl-incf frame-count) - (when (> frame-count 1) - (make-frame-command)) - (let* ((frame-persp-table (persp--state-frame-v2-persps frame)) - (frame-persp-order (reverse (persp--state-frame-v2-order frame))) - (frame-persp-merge-list (persp--state-frame-v2-merge-list frame))) - ;; iterate over the perspectives in the frame in the appropriate order - (cl-loop for persp in frame-persp-order do - (let ((state-single (gethash persp frame-persp-table))) - (persp-switch persp) - (set-frame-parameter nil 'persp-merge-list frame-persp-merge-list) - (cl-loop for buffer in (persp--state-single-buffers state-single) do - (persp-add-buffer buffer)) - ;; XXX: split-window-horizontally is necessary for - ;; window-state-put to succeed? Something goes haywire with root - ;; windows without it. - (split-window-horizontally) - (window-state-put (persp--state-single-windows state-single) - (frame-root-window (selected-frame)) - 'safe))))) + (let ((emacs-frame (if (> frame-count 1) (make-frame-command) (selected-frame))) + (frame-persp-table (persp--state-frame-v2-persps frame)) + (frame-persp-order (reverse (persp--state-frame-v2-order frame))) + (frame-persp-merge-list (persp--state-frame-v2-merge-list frame))) + (with-selected-frame emacs-frame + ;; restore the merge list + (set-frame-parameter emacs-frame 'persp-merge-list frame-persp-merge-list) + ;; iterate over the perspectives in the frame in the appropriate order + (cl-loop for persp in frame-persp-order do + (let ((state-single (gethash persp frame-persp-table))) + (persp-switch persp) + (set-frame-parameter nil 'persp-merge-list frame-persp-merge-list) + (cl-loop for buffer in (persp--state-single-buffers state-single) do + (persp-add-buffer buffer)) + ;; XXX: split-window-horizontally is necessary for + ;; window-state-put to succeed? Something goes haywire with root + ;; windows without it. + (split-window-horizontally) + (window-state-put (persp--state-single-windows state-single) + (frame-root-window emacs-frame) + 'safe)))))) ;; cleanup (persp-kill tmp-persp-name)) ;; after hook |
