summaryrefslogtreecommitdiff
path: root/src/xsmfns.c
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2010-12-10 19:23:43 +0100
committerJan Djärv <jan.h.d@swipnet.se>2010-12-10 19:23:43 +0100
commit0b9fc69a7651c4a36ab4616f5f7d1c2f48fed783 (patch)
treea36fb239082c71619eea44171798e2d75a5b3a6e /src/xsmfns.c
parent1f10e75066b557174bb475c735bd74a725000a4a (diff)
downloademacs-0b9fc69a7651c4a36ab4616f5f7d1c2f48fed783.tar.gz
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.
Diffstat (limited to 'src/xsmfns.c')
-rw-r--r--src/xsmfns.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/src/xsmfns.c b/src/xsmfns.c
index f6260d00a56..8a16f68b255 100644
--- a/src/xsmfns.c
+++ b/src/xsmfns.c
@@ -172,6 +172,7 @@ smc_interact_CB (smcConn, clientData)
{
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 @@ smc_die_CB (smcConn, clientData)
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 @@ Do not call this function yourself. */)
(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 @@ Do not call this function yourself. */)
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;
}
+
/***********************************************************************