From f63d0028c0cb44c5bf4ca7f36b66ab19595f6ecc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Sun, 2 May 2010 20:44:04 +0200 Subject: [PATCH 1/1] 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. --- doc/emacs/ChangeLog | 4 ++++ doc/emacs/cmdargs.texi | 9 +++++++++ src/ChangeLog | 15 +++++++++++++++ src/emacs.c | 14 ++++++++++++++ src/xsmfns.c | 27 ++++++++++++++++++++++----- src/xterm.c | 8 ++++---- 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index d2df84e2aa..5c144833e1 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -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 --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index a139e0eb0f..ff8e4f84ab 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 4d3c6dca4e..2e0a77ce18 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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 --git a/src/emacs.c b/src/emacs.c index 400a6b0e59..d40ff3662f 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 ec5ca3b1a9..48fd1b7e76 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 4f19192256..ec550100ce 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. */ -- 2.39.2