- (let* ((delete (and current-prefix-arg t))
- (iconify-list (if delete nil (frame-list))))
- (frameset-restore (aref data 0)
- :filters frameset-session-filter-alist
- :reuse-frames (if delete t :keep))
- (mapc #'iconify-frame iconify-list)
- (let ((frame (frameset-frame-with-id (aref data 1))))
- (when frame
- (select-frame-set-input-focus frame)
- (goto-char (aref data 2))))))
+ (frameset-restore
+ (aref data 0)
+ :filters frameset-session-filter-alist
+ :reuse-frames (if current-prefix-arg t 'match)
+ :cleanup-frames (if current-prefix-arg
+ ;; delete frames
+ nil
+ ;; iconify frames
+ (lambda (frame action)
+ (pcase action
+ (`rejected (iconify-frame frame))
+ ;; In the unexpected case that a frame was a candidate
+ ;; (matching frame id) and yet not restored, remove it
+ ;; because it is in fact a duplicate.
+ (`ignored (delete-frame frame))))))
+
+ ;; Restore selected frame, buffer and point.
+ (let ((frame (frameset-frame-with-id (aref data 1)))
+ buffer window)
+ (when frame
+ (select-frame-set-input-focus frame)
+ (when (and (buffer-live-p (setq buffer (marker-buffer (aref data 2))))
+ (window-live-p (setq window (get-buffer-window buffer frame))))
+ (set-frame-selected-window frame window)
+ (with-current-buffer buffer (goto-char (aref data 2)))))))