summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2010-05-02 20:44:04 +0200
committerJan Djärv <jan.h.d@swipnet.se>2010-05-02 20:44:04 +0200
commitf63d0028c0cb44c5bf4ca7f36b66ab19595f6ecc (patch)
treea72ebe53b4ac0a453ee7b37a37f61cfdcc264cc8
parent8f92b8ad07a0af0d0fe7784feaa56cf1ff5b16f9 (diff)
downloademacs-f63d0028c0cb44c5bf4ca7f36b66ab19595f6ecc.tar.gz
Run kill-emacs when exiting for display closed or SIGTERM/HUP.
* xsmfns.c (CHDIR_OPT): New define. (smc_save_yourself_CB): Add CHDIR_OPT to options to use when restarting emacs. * xterm.c (x_connection_closed): Call Fkill_emacs instead of shut_down_emacs. * emacs.c (USAGE1): Mention --chdir. (main): Handle --chdir. (standard_args): Add --chdir. (fatal_error_signal): Call Fkill_emacs for SIGTERM and SIGHUP (Bug #5552). * cmdargs.texi (Initial Options): Mention --chdir.
-rw-r--r--doc/emacs/ChangeLog4
-rw-r--r--doc/emacs/cmdargs.texi9
-rw-r--r--src/ChangeLog15
-rw-r--r--src/emacs.c14
-rw-r--r--src/xsmfns.c27
-rw-r--r--src/xterm.c8
6 files changed, 68 insertions, 9 deletions
diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog
index d2df84e2aae..5c144833e1d 100644
--- a/doc/emacs/ChangeLog
+++ b/doc/emacs/ChangeLog
@@ -1,3 +1,7 @@
+2010-05-02 Jan Djärv <jan.h.d@swipnet.se>
+
+ * cmdargs.texi (Initial Options): Mention --chdir.
+
2010-04-21 Jan Djärv <jan.h.d@swipnet.se>
* frames.texi (Tool Bars): Add tool-bar-style.
diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi
index a139e0eb0f4..ff8e4f84abd 100644
--- a/doc/emacs/cmdargs.texi
+++ b/doc/emacs/cmdargs.texi
@@ -193,6 +193,15 @@ Certain options prevent loading of some of these files or substitute
other files for them.
@table @samp
+@item -chdir @var{directory}
+@opindex -chdir
+@itemx --chdir=@var{directory}
+@opindex --chdir
+@cindex change Emacs directory
+Change to @var{directory} before doing anything else. This is mainly used
+by session management in X so that Emacs starts in the same directory as it
+stopped. This makes desktop saving and restoring easier.
+
@item -t @var{device}
@opindex -t
@itemx --terminal=@var{device}
diff --git a/src/ChangeLog b/src/ChangeLog
index 4d3c6dca4e1..2e0a77ce187 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,18 @@
+2010-05-02 Jan Djärv <jan.h.d@swipnet.se>
+
+ * xsmfns.c (CHDIR_OPT): New define.
+ (smc_save_yourself_CB): Add CHDIR_OPT to options to use when
+ restarting emacs.
+
+ * xterm.c (x_connection_closed): Call Fkill_emacs instead of
+ shut_down_emacs.
+
+ * emacs.c (USAGE1): Mention --chdir.
+ (main): Handle --chdir.
+ (standard_args): Add --chdir.
+ (fatal_error_signal): Call Fkill_emacs for SIGTERM and SIGHUP (Bug
+ #5552).
+
2010-05-01 Dan Nicolaescu <dann@ics.uci.edu>
Remove LD_SWITCH_MACHINE.
diff --git a/src/emacs.c b/src/emacs.c
index 400a6b0e594..d40ff3662f0 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -268,6 +268,7 @@ read the main documentation for these command-line arguments.\n\
Initialization options:\n\
\n\
--batch do not do interactive display; implies -q\n\
+--chdir DIR change to directory DIR\n\
--daemon start a server in the background\n\
--debug-init enable Emacs Lisp debugger for init file\n\
--display, -d DISPLAY use X server DISPLAY\n\
@@ -385,6 +386,9 @@ fatal_error_signal (sig)
{
fatal_error_in_progress = 1;
+ if (sig == SIGTERM || sig == SIGHUP)
+ Fkill_emacs (make_number (sig));
+
shut_down_emacs (sig, 0, Qnil);
}
@@ -765,6 +769,7 @@ main (int argc, char **argv)
#ifdef NS_IMPL_COCOA
char dname_arg2[80];
#endif
+ char *ch_to_dir;
#if GC_MARK_STACK
extern Lisp_Object *stack_base;
@@ -832,6 +837,14 @@ main (int argc, char **argv)
exit (0);
}
}
+ if (argmatch (argv, argc, "-chdir", "--chdir", 2, &ch_to_dir, &skip_args))
+ if (chdir (ch_to_dir) == -1)
+ {
+ fprintf (stderr, "%s: Can't chdir to %s: %s\n",
+ argv[0], ch_to_dir, strerror (errno));
+ exit (1);
+ }
+
#ifdef HAVE_PERSONALITY_LINUX32
if (!initialized
@@ -1802,6 +1815,7 @@ struct standard_args
const struct standard_args standard_args[] =
{
{ "-version", "--version", 150, 0 },
+ { "-chdir", "--chdir", 130, 1 },
{ "-t", "--terminal", 120, 1 },
{ "-nw", "--no-window-system", 110, 0 },
{ "-nw", "--no-windows", 110, 0 },
diff --git a/src/xsmfns.c b/src/xsmfns.c
index ec5ca3b1a9f..48fd1b7e76d 100644
--- a/src/xsmfns.c
+++ b/src/xsmfns.c
@@ -90,6 +90,10 @@ Lisp_Object Vx_session_previous_id;
#define NOSPLASH_OPT "--no-splash"
+/* The option to make Emacs start in the given directory. */
+
+#define CHDIR_OPT "--chdir="
+
static void
ice_connection_closed ()
{
@@ -206,7 +210,7 @@ smc_save_yourself_CB (smcConn,
int props_idx = 0;
char *cwd = NULL;
- char *smid_opt;
+ char *smid_opt, *chdir_opt = NULL;
/* How to start a new instance of Emacs. */
props[props_idx] = &prop_ptr[props_idx];
@@ -228,11 +232,12 @@ smc_save_yourself_CB (smcConn,
props[props_idx]->vals[0].value = SDATA (Vinvocation_name);
++props_idx;
- /* How to restart Emacs (i.e.: /path/to/emacs --smid=xxxx --no-splash). */
+ /* How to restart Emacs. */
props[props_idx] = &prop_ptr[props_idx];
props[props_idx]->name = SmRestartCommand;
props[props_idx]->type = SmLISTofARRAY8;
- props[props_idx]->num_vals = 3; /* /path/to/emacs, --smid=xxx --no-splash */
+ /* /path/to/emacs, --smid=xxx --no-splash --chdir=dir */
+ props[props_idx]->num_vals = 4;
props[props_idx]->vals = &values[val_idx];
props[props_idx]->vals[0].length = strlen (emacs_program);
props[props_idx]->vals[0].value = emacs_program;
@@ -246,7 +251,19 @@ smc_save_yourself_CB (smcConn,
props[props_idx]->vals[2].length = strlen (NOSPLASH_OPT);
props[props_idx]->vals[2].value = NOSPLASH_OPT;
- val_idx += 3;
+
+ cwd = get_current_dir_name ();
+ if (cwd)
+ {
+ chdir_opt = xmalloc (strlen (CHDIR_OPT) + strlen (client_id) + 1);
+ strcpy (chdir_opt, CHDIR_OPT);
+ strcat (chdir_opt, cwd);
+
+ props[props_idx]->vals[3].length = strlen (chdir_opt);
+ props[props_idx]->vals[3].value = chdir_opt;
+ }
+
+ val_idx += cwd ? 4 : 3;
++props_idx;
/* User id. */
@@ -259,7 +276,6 @@ smc_save_yourself_CB (smcConn,
props[props_idx]->vals[0].value = SDATA (Vuser_login_name);
++props_idx;
- cwd = get_current_dir_name ();
if (cwd)
{
@@ -277,6 +293,7 @@ smc_save_yourself_CB (smcConn,
SmcSetProperties (smcConn, props_idx, props);
xfree (smid_opt);
+ xfree (chdir_opt);
free (cwd);
diff --git a/src/xterm.c b/src/xterm.c
index 4f191922561..ec550100cea 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -7936,8 +7936,8 @@ x_connection_closed (dpy, error_message)
if (terminal_list->next_terminal == NULL)
{
fprintf (stderr, "%s\n", error_msg);
- shut_down_emacs (0, 0, Qnil);
- exit (70);
+ Fkill_emacs (make_number (70));
+ /* NOTREACHED */
}
xg_display_close (dpyinfo->display);
#endif
@@ -7963,8 +7963,8 @@ x_connection_closed (dpy, error_message)
if (terminal_list == 0)
{
fprintf (stderr, "%s\n", error_msg);
- shut_down_emacs (0, 0, Qnil);
- exit (70);
+ Fkill_emacs (make_number (70));
+ /* NOTREACHED */
}
/* Ordinary stack unwind doesn't deal with these. */