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.

View in manual

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)))