Function: frame-deletable-p
frame-deletable-p is a byte-compiled function defined in frame.el.gz.
Signature
(frame-deletable-p &optional FRAME)
Documentation
Return non-nil if specified FRAME can be safely deleted.
FRAME must be a live frame and defaults to the selected frame.
FRAME cannot be safely deleted in the following cases:
- FRAME is the only visible or iconified frame.
- FRAME hosts the active minibuffer window that does not follow the
selected frame.
- All other visible or iconified frames are either child frames or have
a non-nil delete-before parameter.
- FRAME or one of its descendants hosts the minibuffer window of a frame
that is not a descendant of FRAME.
This covers most cases where delete-frame might fail when called from
top-level. It does not catch some special cases like, for example,
deleting a frame during a drag-and-drop operation. In any such case, it
will be better to wrap the delete-frame call in a condition-case
form.
Probably introduced at or before Emacs version 31.1.
Source Code
;; Defined in /usr/src/emacs/lisp/frame.el.gz
(defun frame-deletable-p (&optional frame)
"Return non-nil if specified FRAME can be safely deleted.
FRAME must be a live frame and defaults to the selected frame.
FRAME cannot be safely deleted in the following cases:
- FRAME is the only visible or iconified frame.
- FRAME hosts the active minibuffer window that does not follow the
selected frame.
- All other visible or iconified frames are either child frames or have
a non-nil `delete-before' parameter.
- FRAME or one of its descendants hosts the minibuffer window of a frame
that is not a descendant of FRAME.
This covers most cases where `delete-frame' might fail when called from
top-level. It does not catch some special cases like, for example,
deleting a frame during a drag-and-drop operation. In any such case, it
will be better to wrap the `delete-frame' call in a `condition-case'
form."
(setq frame (window-normalize-frame frame))
(let ((active-minibuffer-window (active-minibuffer-window))
deletable)
(catch 'deletable
(when (and active-minibuffer-window
(eq (window-frame active-minibuffer-window) frame)
(not (eq (default-toplevel-value
'minibuffer-follows-selected-frame)
t)))
(setq deletable nil)
(throw 'deletable nil))
(let ((frames (delq frame (frame-list))))
(dolist (other frames)
;; A suitable "other" frame must be either visible or
;; iconified. Child frames and frames with a non-nil
;; 'delete-before' parameter do not qualify as other frame -
;; either of these will depend on a "suitable" frame found in
;; this loop.
(unless (or (frame-parent other)
(frame-parameter other 'delete-before)
(not (frame-visible-p other)))
(setq deletable t))
;; Some frame not descending from FRAME may use the minibuffer
;; window of FRAME or the minibuffer window of a frame
;; descending from FRAME.
(when (let* ((minibuffer-window (minibuffer-window other))
(minibuffer-frame
(and minibuffer-window
(window-frame minibuffer-window))))
(and minibuffer-frame
;; If the other frame is a descendant of
;; FRAME, it will be deleted together with
;; FRAME ...
(not (frame-ancestor-p frame other))
;; ... but otherwise the other frame must
;; neither use FRAME nor any descendant of
;; it as minibuffer frame.
(or (eq minibuffer-frame frame)
(frame-ancestor-p frame minibuffer-frame))))
(setq deletable nil)
(throw 'deletable nil))))
deletable)))