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-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
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 ();
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? */
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))
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);
+}
+
\f
/* Return mouse position in character cell units. */
Lisp_Object component,
Lisp_Object subclass);
+extern Lisp_Object delete_frame P_ ((Lisp_Object, Lisp_Object));
#endif /* HAVE_WINDOW_SYSTEM */
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;
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);
}
}
terminal->keyboard_coding = NULL;
xfree (terminal->terminal_coding);
terminal->terminal_coding = NULL;
-
+
if (terminal->kboard && --terminal->kboard->reference_count == 0)
{
delete_kboard (terminal->kboard);
struct terminal *p = terminal_list;
while (p && (p == t || !TERMINAL_ACTIVE_P (p)))
p = p->next_terminal;
-
+
if (!p)
error ("Attempt to delete the sole active display terminal");
}
Lisp_Object object;
{
struct terminal *t;
-
+
t = get_terminal (object, 0);
if (!t)
if (FRAMEP (frame))
{
- Fdelete_frame (frame, Qnil);
+ delete_frame (frame, Qnil);
deleted = Qt;
}
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))
{
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))
{
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);
}
if (FRAMEP (frame))
{
- Fdelete_frame (frame, Qnil);
+ delete_frame (frame, Qnil);
deleted = Qt;
#ifdef USE_LUCID
if (! FRAME_X_P (XFRAME (frame)))
continue;
-
+
/* Scan this frame's scroll bar list for a scroll bar with the
right window ID. */
condemned = FRAME_CONDEMNED_SCROLL_BARS (XFRAME (frame));
inev.ie.code = XFASTINT (c);
goto done_keysym;
}
-
+
/* Random non-modifier sorts of keysyms. */
if (((keysym >= XK_BackSpace && keysym <= XK_Escape)
|| keysym == XK_Delete
XTread_socket_fake_io_error = 0;
x_io_error_quitter (terminal->display_info.x->display);
}
-
+
#if 0 /* This loop is a noop now. */
/* Find the display we are supposed to read input for.
It's the one communicating on descriptor SD. */
dpyinfo->reference_count++;
dpyinfo->terminal->reference_count++;
}
-
+
/* First delete frames whose mini-buffers are on frames
that are on the dead display. */
FOR_EACH_FRAME (tail, frame)
&& 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.
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
terminal->name = (char *) xmalloc (SBYTES (display_name) + 1);
strncpy (terminal->name, SDATA (display_name), SBYTES (display_name));
terminal->name[SBYTES (display_name)] = 0;
-
+
#if 0
XSetAfterFunction (x_current_display, x_trace_wire);
#endif /* ! 0 */
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;
x_create_terminal (struct x_display_info *dpyinfo)
{
struct terminal *terminal;
-
+
terminal = create_terminal ();
terminal->type = output_x_window;
dpyinfo->terminal = terminal;
/* kboard is initialized in x_term_init. */
-
+
terminal->clear_frame_hook = x_clear_frame;
terminal->ins_del_lines_hook = x_ins_del_lines;
terminal->delete_glyphs_hook = x_delete_glyphs;
terminal->delete_frame_hook = x_destroy_window;
terminal->delete_terminal_hook = x_delete_terminal;
-
+
terminal->rif = &x_redisplay_interface;
terminal->scroll_region_ok = 1; /* We'll scroll partial frames. */
terminal->char_ins_del_ok = 1;