From: Eli Zaretskii Date: Mon, 5 Sep 2016 16:50:59 +0000 (+0300) Subject: Treat SIGINT correctly in GUI sessions on MS-Windows X-Git-Tag: emacs-26.0.90~1648 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=cfaf18a27c262694750400005e882f1cfc7ff2b0;p=emacs.git 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. --- diff --git a/etc/NEWS b/etc/NEWS index 3092e9f22b9..79a476ca665 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 865d0183a57..bc8b0964882 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 e44155260f8..3ef797c11c3 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 d54ff115f9d..cb684b3aaa6 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 11a121f7c09..217d005a363 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;