From cfaf18a27c262694750400005e882f1cfc7ff2b0 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 5 Sep 2016 19:50:59 +0300 Subject: Treat SIGINT correctly in GUI sessions on MS-Windows * src/w32proc.c (sys_signal): Don't reject SIGINT, as it is supported by MS runtime. * src/term.c (DEV_TTY): Move from here ... * src/conf_post.h (DEV_TTY): ... to here. Separate definitions for WINDOWSNT and for the rest. * src/keyboard.c (handle_interrupt_signal): Use DEV_TTY instead of a literal "/dev/tty". * etc/NEWS: Mention the behavior change. --- etc/NEWS | 7 +++++++ src/conf_post.h | 9 +++++++++ src/keyboard.c | 2 +- src/term.c | 3 --- src/w32proc.c | 4 ++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 3092e9f22b..79a476ca66 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -607,6 +607,13 @@ still apply.) Previously, on MS-Windows this function converted slash characters in file names into backslashes. It no longer does that. +** GUI sessions now treat SIGINT like Posix platforms do. +The effect of delivering a Ctrl-C (SIGINT) signal to a GUI Emacs on +MS-Windows is now the same as on Posix platforms -- Emacs saves the +session and exits. In particular, this will happen if you start +emacs.exe from the Windows shell, then type Ctrl-C into that shell's +window. + * Installation Changes in Emacs 25.1 diff --git a/src/conf_post.h b/src/conf_post.h index 865d0183a5..bc8b096488 100644 --- a/src/conf_post.h +++ b/src/conf_post.h @@ -140,6 +140,10 @@ typedef bool bool_bf; #undef HAVE_RINT #endif /* HPUX */ +#ifdef WINDOWSNT +# define DEV_TTY "CONOUT$" +#endif + #ifdef MSDOS #ifndef __DJGPP__ You lose; /* Emacs for DOS must be compiled with DJGPP */ @@ -242,6 +246,11 @@ extern int emacs_setenv_TZ (char const *); #include #include +#ifndef DEV_TTY +# define DEV_TTY "/dev/tty" +#endif + + #if __GNUC__ >= 3 /* On GCC 3.0 we might get a warning. */ #define NO_INLINE __attribute__((noinline)) #else diff --git a/src/keyboard.c b/src/keyboard.c index e44155260f..3ef797c11c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -10241,7 +10241,7 @@ static void handle_interrupt_signal (int sig) { /* See if we have an active terminal on our controlling tty. */ - struct terminal *terminal = get_named_terminal ("/dev/tty"); + struct terminal *terminal = get_named_terminal (DEV_TTY); if (!terminal) { /* If there are no frames there, let's pretend that we are a diff --git a/src/term.c b/src/term.c index d54ff115f9..cb684b3aaa 100644 --- a/src/term.c +++ b/src/term.c @@ -58,10 +58,7 @@ static int been_here = -1; /* The name of the default console device. */ #ifdef WINDOWSNT -#define DEV_TTY "CONOUT$" #include "w32term.h" -#else -#define DEV_TTY "/dev/tty" #endif static void tty_set_scroll_region (struct frame *f, int start, int stop); diff --git a/src/w32proc.c b/src/w32proc.c index 11a121f7c0..217d005a36 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -86,9 +86,9 @@ sys_signal (int sig, signal_handler handler) /* SIGCHLD is needed for supporting subprocesses, see sys_kill below. SIGALRM and SIGPROF are used by setitimer. All the others are the only ones supported by the MS runtime. */ - if (!(sig == SIGCHLD || sig == SIGSEGV || sig == SIGILL + if (!(sig == SIGINT || sig == SIGSEGV || sig == SIGILL || sig == SIGFPE || sig == SIGABRT || sig == SIGTERM - || sig == SIGALRM || sig == SIGPROF)) + || sig == SIGCHLD || sig == SIGALRM || sig == SIGPROF)) { errno = EINVAL; return SIG_ERR; -- cgit v1.2.3