From 56f2de103fd8ee430ae3d2f6a1b83d4aa2012f90 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Mon, 22 Dec 2008 09:40:33 +0000 Subject: [PATCH] * 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. --- src/ChangeLog | 15 +++++++++++++++ src/frame.c | 60 ++++++++++++++++++++++++++++++++++------------------------ src/frame.h | 1 + src/terminal.c | 12 ++++++------ src/w32fns.c | 2 +- src/window.c | 6 +++--- src/xfns.c | 2 +- src/xterm.c | 24 +++++++++++------------ 8 files changed, 74 insertions(+), 48 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 015f8f3dc7c..844b641d696 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,18 @@ +2008-12-22 Martin Rudalics + + * 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 * w32uniscribe.c (uniscribe_encode_char): Return FONT_INVALID_CHAR diff --git a/src/frame.c b/src/frame.c index a21bacc80da..307e68bdb01 100644 --- a/src/frame.c +++ b/src/frame.c @@ -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. */ diff --git a/src/frame.h b/src/frame.h index 5cab1f42c5d..32f60f8f0e1 100644 --- a/src/frame.h +++ b/src/frame.h @@ -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 */ diff --git a/src/terminal.c b/src/terminal.c index 6b6edf14316..0b1e9f32576 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -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); } } @@ -283,7 +283,7 @@ delete_terminal (struct terminal *terminal) terminal->keyboard_coding = NULL; xfree (terminal->terminal_coding); terminal->terminal_coding = NULL; - + if (terminal->kboard && --terminal->kboard->reference_count == 0) { delete_kboard (terminal->kboard); @@ -315,7 +315,7 @@ but if the second argument FORCE is non-nil, you may do so. */) 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"); } @@ -376,7 +376,7 @@ possible return values. */) Lisp_Object object; { struct terminal *t; - + t = get_terminal (object, 0); if (!t) diff --git a/src/w32fns.c b/src/w32fns.c index 2c932017239..237299c4379 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -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; } diff --git a/src/window.c b/src/window.c index c74b163cb9f..81fb70a17fd 100644 --- a/src/window.c +++ b/src/window.c @@ -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); } diff --git a/src/xfns.c b/src/xfns.c index 5b4d40100c2..d9e2cef30af 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -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 diff --git a/src/xterm.c b/src/xterm.c index 505100c6488..37c187486d8 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -4017,7 +4017,7 @@ x_window_to_scroll_bar (display, window_id) 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)); @@ -6467,7 +6467,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit) inev.ie.code = XFASTINT (c); goto done_keysym; } - + /* Random non-modifier sorts of keysyms. */ if (((keysym >= XK_BackSpace && keysym <= XK_Escape) || keysym == XK_Delete @@ -7172,7 +7172,7 @@ XTread_socket (terminal, expected, hold_quit) 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. */ @@ -7871,7 +7871,7 @@ x_connection_closed (dpy, error_message) 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) @@ -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 @@ -10170,7 +10170,7 @@ x_term_init (display_name, xrm_option, resource_name) 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 */ @@ -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; @@ -10664,7 +10664,7 @@ static struct terminal * x_create_terminal (struct x_display_info *dpyinfo) { struct terminal *terminal; - + terminal = create_terminal (); terminal->type = output_x_window; @@ -10672,7 +10672,7 @@ x_create_terminal (struct x_display_info *dpyinfo) 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; @@ -10695,7 +10695,7 @@ x_create_terminal (struct x_display_info *dpyinfo) 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; -- 2.11.4.GIT