From c53956feade4a83a7f3a18379aa83657f8976aa1 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Sun, 10 Feb 2008 21:56:38 +0000 Subject: [PATCH] * frame.c (Qnoelisp): New symbol. (syms_of_frame): Initialize it. (Fdelete_frame): Use it to distinguish a mere `force' passed from someharmles Elisp code, from a strong `force' from x_connection_closed. * frame.h (Qnoelisp): Declare. * xterm.c (x_connection_closed): Pass `noelisp'. --- src/ChangeLog | 7 +++++++ src/frame.c | 9 ++++++--- src/frame.h | 1 + src/terminal.c | 1 + src/xterm.c | 6 +++--- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 67f281919a9..782b2de8086 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,12 @@ 2008-02-10 Stefan Monnier + * frame.c (Qnoelisp): New symbol. + (syms_of_frame): Initialize it. + (Fdelete_frame): Use it to distinguish a mere `force' passed from + someharmles Elisp code, from a strong `force' from x_connection_closed. + * frame.h (Qnoelisp): Declare. + * xterm.c (x_connection_closed): Pass `noelisp'. + * lisp.h (struct Lisp_Misc_Any, struct Lisp_Marker) (struct Lisp_Overlay, struct Lisp_Kboard_Objfwd) (struct Lisp_Save_Value, struct Lisp_Free): Use enum Lisp_Misc_Type diff --git a/src/frame.c b/src/frame.c index fec911f4b0c..3328b307cbf 100644 --- a/src/frame.c +++ b/src/frame.c @@ -76,6 +76,7 @@ Lisp_Object Qx, Qw32, Qmac, Qpc; Lisp_Object Qvisible; Lisp_Object Qdisplay_type; Lisp_Object Qbackground_mode; +Lisp_Object Qnoelisp; Lisp_Object Qx_frame_parameter; Lisp_Object Qx_resource_name; @@ -1406,10 +1407,10 @@ But FORCE inhibits this too. */) } /* Run `delete-frame-functions' - unless FORCE is true or frame is a tooltip. - FORCE is set when handling a disconnect from the terminal, + 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 (force) + if (!NILP (Vrun_hooks) && EQ (force, Qnoelisp) && NILP (Fframe_parameter (frame, intern ("tooltip")))) { Lisp_Object args[2]; @@ -4395,6 +4396,8 @@ syms_of_frame () staticpro (&Qdisplay_type); Qbackground_mode = intern ("background-mode"); staticpro (&Qbackground_mode); + Qnoelisp = intern ("noelisp"); + staticpro (&Qnoelisp); Qtty_color_mode = intern ("tty-color-mode"); staticpro (&Qtty_color_mode); Qtty = intern ("tty"); diff --git a/src/frame.h b/src/frame.h index 5b02b330440..b0b7cc383d3 100644 --- a/src/frame.h +++ b/src/frame.h @@ -795,6 +795,7 @@ typedef struct frame *FRAME_PTR; extern Lisp_Object Qframep, Qframe_live_p; extern Lisp_Object Qtty, Qtty_type; extern Lisp_Object Qterminal, Qterminal_live_p; +extern Lisp_Object Qnoelisp; extern struct frame *last_nonminibuf_frame; diff --git a/src/terminal.c b/src/terminal.c index 914db8818f3..2e0bcbb45a6 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -271,6 +271,7 @@ 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); } } diff --git a/src/xterm.c b/src/xterm.c index 840c874950b..418e59448e9 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -8062,7 +8062,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, Qt); + Fdelete_frame (frame, Qnoelisp); } /* Now delete all remaining frames on the dead display. @@ -8075,7 +8075,7 @@ x_connection_closed (dpy, error_message) /* Set this to t so that Fdelete_frame won't get confused trying to find a replacement. */ FRAME_KBOARD (XFRAME (frame))->Vdefault_minibuffer_frame = Qt; - Fdelete_frame (frame, Qt); + Fdelete_frame (frame, Qnoelisp); } /* We have to close the display to inform Xt that it doesn't @@ -8087,7 +8087,7 @@ x_connection_closed (dpy, error_message) M-x make-frame-on-display RET :1 RET will indefinitely wait in Xt for events for display `:1', opened - in the first class to make-frame-on-display. + in the first call to make-frame-on-display. Closing the display is reported to lead to a bus error on OpenWindows in certain situations. I suspect that is a bug -- 2.39.5