From a31787b1e9fc5d63511ff7a85f67dbfa22596a9c Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Fri, 8 Feb 2008 02:38:15 +0000 Subject: [PATCH] (Fdelete_frame): If FORCE, don't call hooks. If FORCE, and frame has a surrogate minibuffer for another frame, delete the other frame first. --- src/ChangeLog | 6 ++++++ src/frame.c | 22 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 7cd786a22ff..350e5573d17 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2008-02-08 Richard Stallman + + * 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 * xterm.c (x_detect_focus_change): Handle embed client message. 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. */ -- 2.39.5