From 4b1c60b2ecb030550716647bffb0f9dd7e97c31a Mon Sep 17 00:00:00 2001 From: dequis Date: Sat, 17 Jun 2017 13:47:13 -0300 Subject: [PATCH] term-terminfo: Avoid switching out of alt screen on unexpected exits Perl sucks and kills the whole process when there's a version mismatch in Perl_xs_handshake(). Our atexit handler catches the exit and deinitializes the terminal, removing the error. This commit uses the 'quitting' global variable which is set when irssi is voluntarily quitting, and avoids sending TI_rmcup, which restores the original screen and makes the error invisible. --- src/fe-text/term-terminfo.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/fe-text/term-terminfo.c b/src/fe-text/term-terminfo.c index 3098a4e4..bca37efc 100644 --- a/src/fe-text/term-terminfo.c +++ b/src/fe-text/term-terminfo.c @@ -102,6 +102,17 @@ static GSourceFuncs sigcont_funcs = { .dispatch = sigcont_dispatch }; +static void term_atexit(void) +{ + if (!quitting && current_term && current_term->TI_rmcup) { + /* Unexpected exit, avoid switching out of alternate screen + to keep any on-screen errors (like noperl_die()'s) */ + current_term->TI_rmcup = NULL; + } + + term_deinit(); +} + int term_init(void) { struct sigaction act; @@ -140,7 +151,7 @@ int term_init(void) term_set_input_type(TERM_TYPE_8BIT); term_common_init(); - atexit(term_deinit); + atexit(term_atexit); return TRUE; }