aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-03-22 19:53:22 +0100
committerMarc André Tanner <mat@brain-dump.org>2017-03-22 19:53:22 +0100
commitfc0efcc89825ef1f61ffe5744b58f7d4e16c2aae (patch)
tree607fa0c0469e026e220c25a646cd0ec649eb7916
parentc9a259bbe118d60558a8891e0bd701e8fb0ba91d (diff)
downloadvis-fc0efcc89825ef1f61ffe5744b58f7d4e16c2aae.tar.gz
vis-fc0efcc89825ef1f61ffe5744b58f7d4e16c2aae.tar.xz
ui: try to fix job control issues with certain shells
Make sure that curses and libtermkey don't fight over the terminal state. Also send use SIGTSTP instead of SIGSTOP. Previously certain shells (e.g. csh, dash) would get stuck after the editor process was suspended for the second time. Not completely sure whether this is correct, but it seems to work in my limited tests.
-rw-r--r--ui-terminal-curses.c9
-rw-r--r--ui-terminal-vt100.c10
-rw-r--r--ui-terminal.c8
3 files changed, 17 insertions, 10 deletions
diff --git a/ui-terminal-curses.c b/ui-terminal-curses.c
index 849c617..0d39306 100644
--- a/ui-terminal-curses.c
+++ b/ui-terminal-curses.c
@@ -2,6 +2,8 @@
#include <stdio.h>
#include <curses.h>
+#define UI_TERMKEY_FLAGS (TERMKEY_FLAG_UTF8|TERMKEY_FLAG_NOTERMIOS)
+
#define ui_term_backend_init ui_curses_init
#define ui_term_backend_blit ui_curses_blit
#define ui_term_backend_clear ui_curses_clear
@@ -12,7 +14,7 @@
#define ui_term_backend_new ui_curses_new
#define ui_term_backend_resume ui_curses_resume
#define ui_term_backend_suspend ui_curses_suspend
-#define ui_term_backend_free ui_curses_suspend
+#define ui_term_backend_free ui_curses_free
#define CELL_COLOR_BLACK COLOR_BLACK
#define CELL_COLOR_RED COLOR_RED
@@ -281,6 +283,9 @@ static void ui_curses_resume(UiTerm *term) { }
static void ui_curses_suspend(UiTerm *term) {
if (change_colors == 1)
undo_palette();
- endwin();
}
+static void ui_curses_free(UiTerm *term) {
+ ui_curses_suspend(term);
+ endwin();
+}
diff --git a/ui-terminal-vt100.c b/ui-terminal-vt100.c
index 309261a..b584276 100644
--- a/ui-terminal-vt100.c
+++ b/ui-terminal-vt100.c
@@ -39,6 +39,8 @@
#include <stdio.h>
#include "buffer.h"
+#define UI_TERMKEY_FLAGS TERMKEY_FLAG_UTF8
+
#define ui_term_backend_init ui_vt100_init
#define ui_term_backend_blit ui_vt100_blit
#define ui_term_backend_clear ui_vt100_clear
@@ -92,7 +94,7 @@ static void output_literal(const char *data) {
}
static void screen_alternate(bool alternate) {
- output_literal(alternate ? "\x1b[?1049h" : "\x1b[0m" "\x1b[?1049l");
+ output_literal(alternate ? "\x1b[?1049h" : "\x1b[0m" "\x1b[?1049l" "\x1b[0m" );
}
static void cursor_visible(bool visible) {
@@ -183,14 +185,16 @@ static int ui_vt100_colors(Ui *ui) {
return (term && strstr(term, "-256color")) ? 256 : 16;
}
-static void ui_vt100_suspend(UiTerm *term) {
+static void ui_vt100_suspend(UiTerm *tui) {
+ termkey_stop(tui->termkey);
cursor_visible(true);
screen_alternate(false);
}
-static void ui_vt100_resume(UiTerm *term) {
+static void ui_vt100_resume(UiTerm *tui) {
screen_alternate(true);
cursor_visible(false);
+ termkey_start(tui->termkey);
}
static bool ui_vt100_init(UiTerm *tui, char *term) {
diff --git a/ui-terminal.c b/ui-terminal.c
index 4b4a60b..e790785 100644
--- a/ui-terminal.c
+++ b/ui-terminal.c
@@ -563,7 +563,7 @@ static void ui_info_hide(Ui *ui) {
}
static TermKey *ui_termkey_new(int fd) {
- TermKey *termkey = termkey_new(fd, TERMKEY_FLAG_UTF8);
+ TermKey *termkey = termkey_new(fd, UI_TERMKEY_FLAGS);
if (termkey)
termkey_set_canonflags(termkey, TERMKEY_CANON_DELBS);
return termkey;
@@ -589,13 +589,11 @@ static TermKey *ui_termkey_get(Ui *ui) {
static void ui_suspend(Ui *ui) {
UiTerm *tui = (UiTerm*)ui;
ui_term_backend_suspend(tui);
- termkey_stop(tui->termkey);
- kill(0, SIGSTOP);
+ kill(0, SIGTSTP);
}
static void ui_resume(Ui *ui) {
UiTerm *tui = (UiTerm*)ui;
- termkey_start(tui->termkey);
ui_term_backend_resume(tui);
}
@@ -650,7 +648,7 @@ static bool ui_init(Ui *ui, Vis *vis) {
if (errno == EBADF && !isatty(STDIN_FILENO)) {
errno = 0;
if (!(tui->termkey = ui_termkey_reopen(ui, STDIN_FILENO)) && errno == ENXIO)
- tui->termkey = termkey_new_abstract(term, TERMKEY_FLAG_UTF8);
+ tui->termkey = termkey_new_abstract(term, UI_TERMKEY_FLAGS);
}
if (!tui->termkey)
goto err;