Commit 56f2de10 authored by Martin Rudalics's avatar Martin Rudalics
Browse files

* frame.c (delete_frame): New function derived from

Fdelete_frame to handle Qnoelisp value for FORCE argument.
Delete last frame iff FORCE equals Qnoelisp.  (Bug#1450)
(Fdelete_frame): Call delete_frame.  Remove line from doc-string
saying that FORCE non-nil doesn't run `delete-frame-functions'.
* frame.h: Extern delete_frame.
* window.c (window_loop):
* terminal.c (delete_terminal):
* xterm.c (x_connection_closed):
* xfns.c (Fx_hide_tip):
* w32fns.c (Fx_hide_tip): Call delete_frame instead of
Fdelete_frame.
parent caf857eb
2008-12-22 Martin Rudalics <rudalics@gmx.at>
* frame.c (delete_frame): New function derived from
Fdelete_frame to handle Qnoelisp value for FORCE argument.
Delete last frame iff FORCE equals Qnoelisp. (Bug#1450)
(Fdelete_frame): Call delete_frame. Remove line from doc-string
saying that FORCE non-nil doesn't run `delete-frame-functions'.
* frame.h: Extern delete_frame.
* window.c (window_loop):
* terminal.c (delete_terminal):
* xterm.c (x_connection_closed):
* xfns.c (Fx_hide_tip):
* w32fns.c (Fx_hide_tip): Call delete_frame instead of
Fdelete_frame.
2008-12-21 Jason Rumney <jasonr@gnu.org>
 
* w32uniscribe.c (uniscribe_encode_char): Return FONT_INVALID_CHAR
......
......@@ -1322,20 +1322,13 @@ delete_frame_handler (Lisp_Object arg)
extern Lisp_Object Qrun_hook_with_args;
DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
doc: /* Delete FRAME, permanently eliminating it from use.
If omitted, FRAME defaults to the selected frame.
A frame may not be deleted if its minibuffer is used by other frames.
Normally, you may not delete a frame if all other frames are invisible,
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.
But FORCE inhibits this too. */)
/* FORCE is non-nil when handling a disconnected terminal. */
(frame, force)
Lisp_Object frame, force;
/* Delete FRAME. When FORCE equals Qnoelisp, delete FRAME
unconditionally. x_connection_closed and delete_terminal use
this. Any other value of FORCE implements the semantics
described for Fdelete_frame. */
Lisp_Object
delete_frame (frame, force)
register Lisp_Object frame, force;
{
struct frame *f;
struct frame *sf = SELECTED_FRAME ();
......@@ -1360,12 +1353,10 @@ But FORCE inhibits this too. */)
if (NILP (force) && !other_visible_frames (f))
error ("Attempt to delete the sole visible or iconified frame");
#if 0
/* This is a nice idea, but x_connection_closed needs to be able
/* x_connection_closed must have set FORCE to `noelisp' in order
to delete the last frame, if it is gone. */
if (NILP (XCDR (Vframe_list)))
if (NILP (XCDR (Vframe_list)) && !EQ (force, Qnoelisp))
error ("Attempt to delete the only frame");
#endif
/* Does this frame have a minibuffer, and is it the surrogate
minibuffer for any other frame? */
......@@ -1385,19 +1376,20 @@ But FORCE inhibits this too. */)
WINDOW_FRAME (XWINDOW
(FRAME_MINIBUF_WINDOW (XFRAME (this))))))
{
/* If we MUST delete this frame, delete the other first. */
if (!NILP (force))
Fdelete_frame (this, force);
/* If we MUST delete this frame, delete the other first.
But do this only if FORCE equals `noelisp'. */
if (EQ (force, Qnoelisp))
delete_frame (this, Qnoelisp);
else
error ("Attempt to delete a surrogate minibuffer frame");
}
}
}
/* Run `delete-frame-functions'
unless FORCE is `noelisp' or frame is a tooltip.
FORCE is set to `noelisp' when handling a disconnect from the terminal,
so we don't dare call Lisp code. */
/* Run `delete-frame-functions' unless FORCE is `noelisp' or
frame is a tooltip. FORCE is set to `noelisp' when handling
a disconnect from the terminal, so we don't dare call Lisp
code. */
if (NILP (Vrun_hooks) || !NILP (Fframe_parameter (frame, intern ("tooltip"))))
;
if (EQ (force, Qnoelisp))
......@@ -1641,6 +1633,24 @@ But FORCE inhibits this too. */)
return Qnil;
}
DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "",
doc: /* Delete FRAME, permanently eliminating it from use.
FRAME defaults to the selected frame.
A frame may not be deleted if its minibuffer is used by other frames.
Normally, you may not delete a frame if all other frames are invisible,
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 argument, the frame to be deleted. */)
(frame, force)
Lisp_Object frame, force;
{
return delete_frame (frame, !NILP (force) ? Qt : Qnil);
}
/* Return mouse position in character cell units. */
......
......@@ -1115,6 +1115,7 @@ extern Lisp_Object display_x_get_resource (Display_Info *,
Lisp_Object component,
Lisp_Object subclass);
extern Lisp_Object delete_frame P_ ((Lisp_Object, Lisp_Object));
#endif /* HAVE_WINDOW_SYSTEM */
......
......@@ -256,7 +256,7 @@ delete_terminal (struct terminal *terminal)
struct terminal **tp;
Lisp_Object tail, frame;
/* Protect against recursive calls. Fdelete_frame calls the
/* Protect against recursive calls. delete_frame calls the
delete_terminal_hook when we delete our last frame. */
if (!terminal->name)
return;
......@@ -269,8 +269,8 @@ delete_terminal (struct terminal *terminal)
struct frame *f = XFRAME (frame);
if (FRAME_LIVE_P (f) && f->terminal == terminal)
{
/* Maybe this should pass Qnoelisp rather than Qt? */
Fdelete_frame (frame, Qt);
/* Pass Qnoelisp rather than Qt. */
delete_frame (frame, Qnoelisp);
}
}
......
......@@ -5944,7 +5944,7 @@ Value is t if tooltip was open, nil otherwise. */)
if (FRAMEP (frame))
{
Fdelete_frame (frame, Qnil);
delete_frame (frame, Qnil);
deleted = Qt;
}
......
......@@ -2273,7 +2273,7 @@ window_loop (type, obj, mini, frames)
windows = XCDR (windows);
/* Now we can safely delete the frame. */
Fdelete_frame (w->frame, Qnil);
delete_frame (w->frame, Qnil);
}
else if (NILP (w->parent))
{
......@@ -2334,7 +2334,7 @@ window_loop (type, obj, mini, frames)
windows = XCDR (windows);
/* Now we can safely delete the frame. */
Fdelete_frame (w->frame, Qnil);
delete_frame (w->frame, Qnil);
}
else if (!NILP (w->dedicated) && !NILP (w->parent))
{
......@@ -6909,7 +6909,7 @@ foreach_window (f, fn, user_data)
int (* fn) P_ ((struct window *, void *));
void *user_data;
{
/* Fdelete_frame may set FRAME_ROOT_WINDOW (f) to Qnil. */
/* delete_frame may set FRAME_ROOT_WINDOW (f) to Qnil. */
if (WINDOWP (FRAME_ROOT_WINDOW (f)))
foreach_window_1 (XWINDOW (FRAME_ROOT_WINDOW (f)), fn, user_data);
}
......
......@@ -5248,7 +5248,7 @@ Value is t if tooltip was open, nil otherwise. */)
if (FRAMEP (frame))
{
Fdelete_frame (frame, Qnil);
delete_frame (frame, Qnil);
deleted = Qt;
#ifdef USE_LUCID
......
......@@ -7883,7 +7883,7 @@ x_connection_closed (dpy, error_message)
&& FRAME_X_P (XFRAME (minibuf_frame))
&& ! EQ (frame, minibuf_frame)
&& FRAME_X_DISPLAY_INFO (XFRAME (minibuf_frame)) == dpyinfo)
Fdelete_frame (frame, Qnoelisp);
delete_frame (frame, Qnoelisp);
}
/* Now delete all remaining frames on the dead display.
......@@ -7893,10 +7893,10 @@ x_connection_closed (dpy, error_message)
if (FRAME_X_P (XFRAME (frame))
&& FRAME_X_DISPLAY_INFO (XFRAME (frame)) == dpyinfo)
{
/* Set this to t so that Fdelete_frame won't get confused
/* Set this to t so that delete_frame won't get confused
trying to find a replacement. */
FRAME_KBOARD (XFRAME (frame))->Vdefault_minibuffer_frame = Qt;
Fdelete_frame (frame, Qnoelisp);
delete_frame (frame, Qnoelisp);
}
/* We have to close the display to inform Xt that it doesn't
......@@ -10622,7 +10622,7 @@ x_delete_terminal (struct terminal *terminal)
struct x_display_info *dpyinfo = terminal->display_info.x;
int i;
/* Protect against recursive calls. Fdelete_frame in
/* Protect against recursive calls. delete_frame in
delete_terminal calls us back when it deletes our last frame. */
if (!terminal->name)
return;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment