diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2015-06-24 03:23:14 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2015-06-24 03:40:06 +0200 |
commit | ae2f607a19b12a30374de059ec29beaf41f82c73 (patch) | |
tree | 448afc2f95e5cb7465e30c4f8612a92d568a5449 /src/main.cpp | |
parent | 81a1270a56bf1f6a13e709e653598c69c7d9334b (diff) | |
download | sciteco-ae2f607a19b12a30374de059ec29beaf41f82c73.tar.gz |
added "^FCLOSE" function key macro and defined SIGTERM behaviour
* ^FCLOSE is inserted when the "Close" key is pressed.
It is used by the GTK+ UI to deliver window close requests
and SIGTERM occurrences.
(this replaces the "Break" key used before in the GTK+ UI).
* The default action of ^FCLOSE is to quit SciTECO, therefore
window closing is possible even in --no-profile mode for instance.
* fixed a minor memleak in Cmdline::fnmacro()
* added ^FCLOSE implementation to fnkeys.tes to insert EX.
This currently has the disadvantage of overwriting
the error message with syntax errors if there are modified buffers
but it will at least not close the window if there are modified
buffers.
* SIGTERM will now be similar to SIGINT by default instead of
terminating SciTECO right away.
* the GTK+ UI handles SIGTERM by emulating the "close" key while
still interrupting like SIGINT.
* GTK+: SIGTERM and ^C will interrupt by sending SIGINT to the
entire process group instead of simply setting `sigint_occurred`.
This fixes interrupting EC and EG commands with long-running
or hanging programs and is relevant to the solution of #4.
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp index 120d73e..951e5b3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -88,6 +88,31 @@ static gpointer g_realloc_exception(gpointer mem, gsize n_bytes); static void sigint_handler(int signal); } +#ifdef G_OS_UNIX + +void +interrupt(void) +{ + /* + * This sends SIGINT to the entire process group, + * which makes sure that subprocesses are signalled, + * even when called from the wrong thread. + */ + if (kill(0, SIGINT)) + sigint_occurred = TRUE; +} + +#else + +void +interrupt(void) +{ + if (raise(SIGINT)) + sigint_occurred = TRUE; +} + +#endif + const gchar * get_eol_seq(gint eol_mode) { @@ -338,6 +363,7 @@ main(int argc, char **argv) #endif signal(SIGINT, sigint_handler); + signal(SIGTERM, sigint_handler); g_mem_set_vtable(&vtable); |