emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: delete-other-frames


From: martin rudalics
Subject: Re: delete-other-frames
Date: Wed, 24 Aug 2016 11:06:49 +0200

> IMO, amend the code.
[...]
> The latter, I think.

I have two versions to accomplish that: One based on calling
‘next-frame’ exhaustively ...

(defun delete-other-frames (&optional frame)
  "Delete all frames on FRAME's terminal, except FRAME.
If FRAME uses another frame's minibuffer, the minibuffer frame is
left untouched.  FRAME must be a live frame.  FRAME nil or
omitted means use the selected frame."
  (interactive)
  (unless frame
    (setq frame (selected-frame)))
  (let ((minibuffer-frame (window-frame (minibuffer-window frame)))
        (this (next-frame frame t))
        next)
    ;; In a first round consider minibuffer-less frames only.
    (while (not (eq this frame))
      (setq next (next-frame this t))
      (unless (eq (window-frame (minibuffer-window this)) this)
        (delete-frame this))
      (setq this next))
    ;; In a second round consider all remaining frames.
    (setq this (next-frame frame t))
    (while (not (eq this frame))
      (setq next (next-frame this t))
      (unless (eq this minibuffer-frame)
        (delete-frame this))
      (setq this next))))

... and a more conservative one using ‘frame-list’.

(defun delete-other-frames (&optional frame)
  "Delete all frames on FRAME's terminal, except FRAME.
If FRAME uses another frame's minibuffer, the minibuffer frame is
left untouched.  FRAME must be a live frame.  FRAME nil or
omitted means use the selected frame."
  (interactive)
  (unless frame
    (setq frame (selected-frame)))
  (let ((terminal (frame-terminal frame))
        (minibuffer-frame (window-frame (minibuffer-window frame)))
        (frames (frame-list)))
    ;; Clean up candidate frames.
    (dolist (this (prog1 frames (setq frames nil)))
      (when (and (eq (frame-terminal this) terminal)
                 (not (eq this frame))
                 (not (eq this minibuffer-frame)))
        (push this frames)))
    ;; In a first round consider minibuffer-less frames only.
    (dolist (this frames)
      (unless (eq (window-frame (minibuffer-window this)) this)
        (delete-frame this)))
    ;; In a second round consider all remaining frames.
    (dolist (this frames)
      (when (frame-live-p this)
        (delete-frame this)))))

If someone sees weaknesses with either of these approaches, please
tell me.

martin




reply via email to

[Prev in Thread] Current Thread [Next in Thread]