Mercurial > emacs
changeset 111934:898651f66853
Move call to Fkill_emacs from signal handler (session event) (Bug#7552).
* keyboard.c (kbd_buffer_get_event): Construct SAVE_SESSION_EVENT
as (Qsave_session arg).
* xsmfns.c (smc_interact_CB): Set arg to Qnil.
(smc_die_CB): Make an event with arg Qt.
(Fhandle_save_session): If event has Qt as argument,
call Fkill_emacs.
author | Jan D. <jan.h.d@swipnet.se> |
---|---|
date | Fri, 10 Dec 2010 19:23:43 +0100 |
parents | 5032326a2135 |
children | bab066ba345e |
files | src/ChangeLog src/keyboard.c src/xsmfns.c |
diffstat | 3 files changed, 29 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog Fri Dec 10 12:46:40 2010 -0500 +++ b/src/ChangeLog Fri Dec 10 19:23:43 2010 +0100 @@ -1,3 +1,13 @@ +2010-12-10 Jan Djärv <jan.h.d@swipnet.se> + + * keyboard.c (kbd_buffer_get_event): Construct SAVE_SESSION_EVENT + as (Qsave_session arg). + + * xsmfns.c (smc_interact_CB): Set arg to Qnil. + (smc_die_CB): Make an event with arg Qt. + (Fhandle_save_session): If event has Qt as argument, + call Fkill_emacs (Bug#7552). + 2010-12-07 Jan Djärv <jan.h.d@swipnet.se> * xsmfns.c (smc_die_CB): Call Fkill_emacs (Bug#7552).
--- a/src/keyboard.c Fri Dec 10 12:46:40 2010 -0500 +++ b/src/keyboard.c Fri Dec 10 19:23:43 2010 +0100 @@ -4305,7 +4305,7 @@ #endif else if (event->kind == SAVE_SESSION_EVENT) { - obj = Fcons (Qsave_session, Qnil); + obj = Fcons (Qsave_session, Fcons (event->arg, Qnil)); kbd_fetch_ptr = event + 1; } /* Just discard these, by returning nil.
--- a/src/xsmfns.c Fri Dec 10 12:46:40 2010 -0500 +++ b/src/xsmfns.c Fri Dec 10 19:23:43 2010 +0100 @@ -172,6 +172,7 @@ { doing_interact = True; emacs_event.kind = SAVE_SESSION_EVENT; + emacs_event.arg = Qnil; } /* This is called when the session manager tells us to save ourselves. @@ -298,12 +299,8 @@ SmcConn smcConn; SmPointer clientData; { - /* This may behave badly if desktop.el tries to ask questions. */ - Fkill_emacs (Qnil); - - /* This will not be reached, but we want kill-emacs-hook to be run. */ - SmcCloseConnection (smcConn, 0, 0); - ice_connection_closed (); + emacs_event.kind = SAVE_SESSION_EVENT; + emacs_event.arg = Qt; } /* We don't use the next two but they are mandatory, leave them empty. @@ -540,9 +537,12 @@ (event) Lisp_Object event; { + int kill_emacs = CONSP (event) && CONSP (XCDR (event)) + && EQ (Qt, XCAR (XCDR (event))); + /* Check doing_interact so that we don't do anything if someone called this at the wrong time. */ - if (doing_interact) + if (doing_interact && ! kill_emacs) { Bool cancel_shutdown = False; @@ -553,9 +553,20 @@ doing_interact = False; } + else if (kill_emacs) + { + /* We should not do user interaction here, but it is not easy to + prevent. Fix this in next version. */ + Fkill_emacs (Qnil); + /* This will not be reached, but we want kill-emacs-hook to be run. */ + SmcCloseConnection (smc_conn, 0, 0); + ice_connection_closed (); + } + return Qnil; } + /***********************************************************************