;; `frameset-filter-params' can be useful, even if you're not using
;; framesets. The interface of `frameset-filter-params' is generic
;; and does not depend of global state, with one exception: it uses
-;; the internal variable `frameset--target-display' to decide if, and
-;; how, to modify the `display' parameter of FILTERED. But that
-;; should not represent any problem, because it's only meaningful
-;; when restoring, and customized uses of `frameset-filter-params'
-;; are likely to use their own filter alist and just call
+;; the dynamically bound variable `frameset--target-display' to decide
+;; if, and how, to modify the `display' parameter of FILTERED. That
+;; should not represent a problem, because it's only meaningful when
+;; restoring, and customized uses of `frameset-filter-params' are
+;; likely to use their own filter alist and just call
;;
;; (setq my-filtered (frameset-filter-params my-params my-filters t))
;;
Frame parameters not on this alist are passed intact, as if they were
defined with ACTION = nil.")
-(defvar frameset--target-display nil
- ;; Either (minibuffer . VALUE) or nil.
- ;; This refers to the current frame config being processed inside
- ;; `frameset-restore' and its auxiliary functions (like filtering).
- ;; If nil, there is no need to change the display.
- ;; If non-nil, display parameter to use when creating the frame.
- "Internal use only.")
+;; Dynamically bound in `frameset-save', `frameset-restore'.
+(defvar frameset--target-display)
+;; Either (display . VALUE) or nil.
+;; This refers to the current frame config being processed with
+;; `frameset-filter-params' and its auxiliary filtering functions.
+;; If nil, there is no need to change the display.
+;; If non-nil, display parameter to use when creating the frame.
(defun frameset-switch-to-gui-p (parameters)
"True when switching to a graphic display.
should be saved; if PREDICATE is nil, all frames from FRAME-LIST are saved.
PROPERTIES is a user-defined property list to add to the frameset."
(let* ((list (or (copy-sequence frame-list) (frame-list)))
+ (frameset--target-display nil)
(frames (cl-delete-if-not #'frame-live-p
(if predicate
(cl-delete-if-not predicate list)
Setting position and size parameters as soon as possible helps reducing
flickering; other parameters, like `minibuffer' and `border-width', can
not be changed once the frame has been created. Internal use only."
- (cl-loop for param in '(left top with height border-width minibuffer)
+ (cl-loop for param in '(left top width height border-width minibuffer)
when (assq param parameters) collect it))
(defun frameset--restore-frame (parameters window-state filters force-onscreen)
For the meaning of FILTERS and FORCE-ONSCREEN, see `frameset-restore'.
Internal use only."
(let* ((fullscreen (cdr (assq 'fullscreen parameters)))
- (lines (assq 'tool-bar-lines parameters))
(filtered-cfg (frameset-filter-params parameters filters nil))
(display (cdr (assq 'display filtered-cfg))) ;; post-filtering
alt-cfg frame)
- ;; This works around bug#14795 (or feature#14795, if not a bug :-)
- (setq filtered-cfg (assq-delete-all 'tool-bar-lines filtered-cfg))
- (push '(tool-bar-lines . 0) filtered-cfg)
-
(when fullscreen
;; Currently Emacs has the limitation that it does not record the size
;; and position of a frame before maximizing it, so we cannot save &
(not (eq (frame-parameter frame 'visibility) 'icon)))
(frameset-move-onscreen frame force-onscreen))
- ;; Let's give the finishing touches (visibility, tool-bar, maximization).
- (when lines (push lines alt-cfg))
+ ;; Let's give the finishing touches (visibility, maximization).
(when alt-cfg (modify-frame-parameters frame alt-cfg))
;; Now restore window state.
(window-state-put window-state (frame-root-window frame) 'safe)
(force-display (if (functionp force-display)
(funcall force-display frame-cfg window-cfg)
force-display))
+ (frameset--target-display nil)
frame to-tty duplicate)
;; Only set target if forcing displays and the target display is different.
- (cond ((frameset-keep-original-display-p force-display)
- (setq frameset--target-display nil))
- ((eq (frame-parameter nil 'display) (cdr (assq 'display frame-cfg)))
- (setq frameset--target-display nil))
- (t
- (setq frameset--target-display (cons 'display
- (frame-parameter nil 'display))
- to-tty (null (cdr frameset--target-display)))))
+ (unless (or (frameset-keep-original-display-p force-display)
+ (equal (frame-parameter nil 'display)
+ (cdr (assq 'display frame-cfg))))
+ (setq frameset--target-display (cons 'display
+ (frame-parameter nil 'display))
+ to-tty (null (cdr frameset--target-display))))
;; Time to restore frames and set up their minibuffers as they were.
;; We only skip a frame (thus deleting it) if either:
;; - we're switching displays, and the user chose the option to delete, or
;; other frames are already visible (discussed in thread for bug#14841).
(sit-for 0 t)
- ;; Clean temporary caches
- (setq frameset--target-display nil)
-
;; Clean up the frame list
(when cleanup-frames
(let ((map nil)
(delay-warning 'frameset (error-message-string err) :warning))))))
;; Make sure there's at least one visible frame.
- (unless (or (daemonp) (visible-frame-list))
+ (unless (or (daemonp)
+ (catch 'visible
+ (maphash (lambda (frame _)
+ (and (frame-live-p frame) (frame-visible-p frame)
+ (throw 'visible t)))
+ frameset--action-map)))
(make-frame-visible (selected-frame)))))
\f
;; Register support
+;;;###autoload
(defun frameset--jump-to-register (data)
"Restore frameset from DATA stored in register.
Called from `jump-to-register'. Internal use only."