aboutsummaryrefslogtreecommitdiff
path: root/perspective.el
diff options
context:
space:
mode:
authorNicholas Hubbard <nicholashubbard@posteo.net>2022-03-15 12:55:06 -0400
committerNicholas Hubbard <nicholashubbard@posteo.net>2022-03-15 12:55:06 -0400
commite6637c4e9e193ffb924d29b6cb9acb75fa4fb87d (patch)
treedfabd602204e7f402778f5dc14a913ba7e30a719 /perspective.el
parent1d94436bd5ba25b079bfe2ccda8c59e799919a00 (diff)
Make persp-merge-list restorable regardless of frame count.
Diffstat (limited to 'perspective.el')
-rw-r--r--perspective.el42
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