From 0bc88a7bbfacdce3caa5dd26dabe046ab20b2f6d Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 5 Mar 2016 21:35:59 +0100 Subject: [PATCH] gui.c: Reset terminal on shutdown in external mode. If para_gui receives a terminating signal while an external program is running, the terminal might be left in an unusable state. This patch handles this case by first returning to program mode, which sets the terminal to in-curses state, then calling endwin(). The def_prog_mode() call made no sense here at all. --- gui.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gui.c b/gui.c index a2d4b5f6..e85edba9 100644 --- a/gui.c +++ b/gui.c @@ -498,9 +498,18 @@ static __printf_2_3 void curses_log(int ll, const char *fmt,...) /** The log function of para_gui, always set to curses_log(). */ __printf_2_3 void (*para_log)(int, const char*, ...) = curses_log; +/* Call endwin() to reset the terminal into non-visual mode. */ static void shutdown_curses(void) { - def_prog_mode(); + /* + * If para_gui received a terminating signal in external mode, the + * terminal can be in an unusable state at this point because the child + * process might not have caught the signal. In this case endwin() has + * already been called and must not be called again. So we first return + * to program mode, then call endwin(). + */ + if (!curses_active()) + reset_prog_mode(); endwin(); } -- 2.39.5