# HG changeset patch # User Jan D. # Date 1292005423 -3600 # Node ID 898651f668537b5817dbe24763b59fe8bbd769ab # Parent 5032326a2135c454179635e25edd646e4e06c48a 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. diff -r 5032326a2135 -r 898651f66853 src/ChangeLog --- 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 + + * 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 * xsmfns.c (smc_die_CB): Call Fkill_emacs (Bug#7552). diff -r 5032326a2135 -r 898651f66853 src/keyboard.c --- 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. diff -r 5032326a2135 -r 898651f66853 src/xsmfns.c --- 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; } + /***********************************************************************