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/cmdline.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/cmdline.cpp')
-rw-r--r-- | src/cmdline.cpp | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/cmdline.cpp b/src/cmdline.cpp index 94e68ba..06cb76e 100644 --- a/src/cmdline.cpp +++ b/src/cmdline.cpp @@ -556,7 +556,7 @@ Cmdline::fnmacro(const gchar *name) if (!(Flags::ed & Flags::ED_FNKEYS)) /* function key macros disabled */ - return; + goto default_action; gchar macro_name[1 + strlen(name) + 1]; QRegister *reg; @@ -569,7 +569,7 @@ Cmdline::fnmacro(const gchar *name) reg = QRegisters::globals[macro_name]; if (!reg) /* macro undefined */ - return; + goto default_action; mask = reg->get_integer(); if (States::current == &States::start) { @@ -584,8 +584,30 @@ Cmdline::fnmacro(const gchar *name) } macro = reg->get_string(); - keypress(macro); + try { + keypress(macro); + } catch (...) { + /* could be "Quit" for instance */ + g_free(macro); + throw; + } g_free(macro); + + return; + + /* + * Most function key macros have no default action, + * except "CLOSE" which quits the application + * (this may loose unsaved data but is better than + * not doing anything if the user closes the window). + * NOTE: Doing the check here is less efficient than + * doing it in the UI implementations, but defines + * the default actions centrally. + * Also, fnmacros are only handled after key presses. + */ +default_action: + if (!strcmp(name, "CLOSE")) + throw Quit(); } static gchar * |