(Fdelete_frame): If FORCE, don't call hooks.

If FORCE, and frame has a surrogate minibuffer for another frame,
delete the other frame first.
This commit is contained in:
Richard M. Stallman 2008-02-08 02:38:15 +00:00
parent ec6d1b1413
commit a31787b1e9
2 changed files with 24 additions and 4 deletions

View file

@ -1,3 +1,9 @@
2008-02-08 Richard Stallman <rms@gnu.org>
* frame.c (Fdelete_frame): If FORCE, don't call hooks.
If FORCE, and frame has a surrogate minibuffer for another frame,
delete the other frame first.
2008-02-07 Timo Savola <timo.savola@iki.fi>
* xterm.c (x_detect_focus_change): Handle embed client message.

View file

@ -1342,7 +1342,9 @@ but if the second optional argument FORCE is non-nil, you may do so.
This function runs `delete-frame-functions' before actually deleting the
frame, unless the frame is a tooltip.
The functions are run with one arg, the frame to be deleted. */)
The functions are run with one arg, the frame to be deleted.
But FORCE inhibits this too. */)
/* FORCE is non-nil when handling a disconnected terminal. */
(frame, force)
Lisp_Object frame, force;
{
@ -1393,12 +1395,21 @@ The functions are run with one arg, the frame to be deleted. */)
&& EQ (frame,
WINDOW_FRAME (XWINDOW
(FRAME_MINIBUF_WINDOW (XFRAME (this))))))
error ("Attempt to delete a surrogate minibuffer frame");
{
/* If we MUST delete this frame, delete the other first. */
if (!NILP (force))
Fdelete_frame (this, force);
else
error ("Attempt to delete a surrogate minibuffer frame");
}
}
}
/* Run `delete-frame-functions' unless frame is a tooltip. */
if (!NILP (Vrun_hooks)
/* Run `delete-frame-functions'
unless FORCE is true or frame is a tooltip.
FORCE is set when handling a disconnect from the terminal,
so we don't dare call Lisp code. */
if (!NILP (Vrun_hooks) && NILP (force)
&& NILP (Fframe_parameter (frame, intern ("tooltip"))))
{
Lisp_Object args[2];
@ -1418,6 +1429,9 @@ The functions are run with one arg, the frame to be deleted. */)
if (! FRAME_LIVE_P (f))
return Qnil;
/* At this point, we are committed to deleting the frame.
There is no more chance for errors to prevent it. */
minibuffer_selected = EQ (minibuf_window, selected_window);
/* Don't let the frame remain selected. */