summaryrefslogtreecommitdiff
path: root/src/frame.c
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>2008-02-08 02:38:15 +0000
committerRichard M. Stallman <rms@gnu.org>2008-02-08 02:38:15 +0000
commita31787b1e9fc5d63511ff7a85f67dbfa22596a9c (patch)
tree23239340ce85f27f5a1f0189a43497f1e44cc3d8 /src/frame.c
parentec6d1b14133d0a48061c98d77d12ef983b712f06 (diff)
downloademacs-a31787b1e9fc5d63511ff7a85f67dbfa22596a9c.tar.gz
(Fdelete_frame): If FORCE, don't call hooks.
If FORCE, and frame has a surrogate minibuffer for another frame, delete the other frame first.
Diffstat (limited to 'src/frame.c')
-rw-r--r--src/frame.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/frame.c b/src/frame.c
index 30c5e5e9d36..fec911f4b0c 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -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. */