# HG changeset patch # User Jan D. # Date 1272825844 -7200 # Node ID e6266e624471841be37b619f8a6092923353173b # Parent 41a25ee894272dadb4a36d542b325c1da57364c7 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. diff -r 41a25ee89427 -r e6266e624471 doc/emacs/ChangeLog --- a/doc/emacs/ChangeLog Sun May 02 01:56:30 2010 -0400 +++ b/doc/emacs/ChangeLog Sun May 02 20:44:04 2010 +0200 @@ -1,3 +1,7 @@ +2010-05-02 Jan Djärv + + * cmdargs.texi (Initial Options): Mention --chdir. + 2010-04-21 Jan Djärv * frames.texi (Tool Bars): Add tool-bar-style. diff -r 41a25ee89427 -r e6266e624471 doc/emacs/cmdargs.texi --- a/doc/emacs/cmdargs.texi Sun May 02 01:56:30 2010 -0400 +++ b/doc/emacs/cmdargs.texi Sun May 02 20:44:04 2010 +0200 @@ -193,6 +193,15 @@ 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 -r 41a25ee89427 -r e6266e624471 src/ChangeLog --- a/src/ChangeLog Sun May 02 01:56:30 2010 -0400 +++ b/src/ChangeLog Sun May 02 20:44:04 2010 +0200 @@ -1,3 +1,18 @@ +2010-05-02 Jan Djärv + + * 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 Remove LD_SWITCH_MACHINE. diff -r 41a25ee89427 -r e6266e624471 src/emacs.c --- a/src/emacs.c Sun May 02 01:56:30 2010 -0400 +++ b/src/emacs.c Sun May 02 20:44:04 2010 +0200 @@ -268,6 +268,7 @@ 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_in_progress = 1; + if (sig == SIGTERM || sig == SIGHUP) + Fkill_emacs (make_number (sig)); + shut_down_emacs (sig, 0, Qnil); } @@ -765,6 +769,7 @@ #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 @@ 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 @@ 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 -r 41a25ee89427 -r e6266e624471 src/xsmfns.c --- a/src/xsmfns.c Sun May 02 01:56:30 2010 -0400 +++ b/src/xsmfns.c Sun May 02 20:44:04 2010 +0200 @@ -90,6 +90,10 @@ #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 @@ 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 @@ 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 @@ 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 @@ props[props_idx]->vals[0].value = SDATA (Vuser_login_name); ++props_idx; - cwd = get_current_dir_name (); if (cwd) { @@ -277,6 +293,7 @@ SmcSetProperties (smcConn, props_idx, props); xfree (smid_opt); + xfree (chdir_opt); free (cwd); diff -r 41a25ee89427 -r e6266e624471 src/xterm.c --- a/src/xterm.c Sun May 02 01:56:30 2010 -0400 +++ b/src/xterm.c Sun May 02 20:44:04 2010 +0200 @@ -7936,8 +7936,8 @@ 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 @@ 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. */