From 59006d18bb3119a3cdf6ff1494aebaf8bdc82dd9 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Mon, 12 Oct 2020 19:25:08 -0400 Subject: [PATCH] Avoid eating C-c while connecting Split UI initialization into two steps either side of the call to connect, so that C-c works as interrupt while it's blocked. --- chat.c | 3 ++- chat.h | 3 ++- ui.c | 45 ++++++++++++++++++++++++--------------------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/chat.c b/chat.c index 6befdde..223583e 100644 --- a/chat.c +++ b/chat.c @@ -222,7 +222,7 @@ int main(int argc, char *argv[]) { ircConfig(insecure, cert, priv); - uiInit(); + uiInitEarly(); if (save) { uiLoad(save); atexit(exitSave); @@ -244,6 +244,7 @@ int main(int argc, char *argv[]) { ircFormat("NICK :%s\r\n", nick); ircFormat("USER %s 0 * :%s\r\n", user, real); + uiInitLate(); signal(SIGHUP, signalHandler); signal(SIGINT, signalHandler); signal(SIGTERM, signalHandler); diff --git a/chat.h b/chat.h index 89d5797..19e4eeb 100644 --- a/chat.h +++ b/chat.h @@ -270,7 +270,8 @@ void commandCompleteAdd(void); enum Heat { Ice, Cold, Warm, Hot }; extern struct Util uiNotifyUtil; -void uiInit(void); +void uiInitEarly(void); +void uiInitLate(void); void uiShow(void); void uiHide(void); void uiDraw(void); diff --git a/ui.c b/ui.c index e2b832e..2958c30 100644 --- a/ui.c +++ b/ui.c @@ -219,23 +219,6 @@ enum { #undef X }; -// Gain use of C-q, C-s, C-c, C-z, C-y, C-v, C-o. -static void acquireKeys(void) { - struct termios term; - int error = tcgetattr(STDOUT_FILENO, &term); - if (error) err(EX_OSERR, "tcgetattr"); - term.c_iflag &= ~IXON; - term.c_cc[VINTR] = _POSIX_VDISABLE; - term.c_cc[VSUSP] = _POSIX_VDISABLE; -#ifdef VDSUSP - term.c_cc[VDSUSP] = _POSIX_VDISABLE; -#endif - term.c_cc[VLNEXT] = _POSIX_VDISABLE; - term.c_cc[VDISCARD] = _POSIX_VDISABLE; - error = tcsetattr(STDOUT_FILENO, TCSADRAIN, &term); - if (error) err(EX_OSERR, "tcsetattr"); -} - // XXX: Assuming terminals will be fine with these even if they're unsupported, // since they're "private" modes. static const char *EnterFocusMode = "\33[?1004h"; @@ -249,14 +232,12 @@ static void errExit(void) { reset_shell_mode(); } -void uiInit(void) { +void uiInitEarly(void) { initscr(); cbreak(); noecho(); - acquireKeys(); - def_prog_mode(); - atexit(errExit); colorInit(); + atexit(errExit); if (!to_status_line && !strncmp(termname(), "xterm", 5)) { to_status_line = "\33]2;"; @@ -282,6 +263,28 @@ void uiInit(void) { uiShow(); } +// Avoid disabling VINTR until main loop. +void uiInitLate(void) { + struct termios term; + int error = tcgetattr(STDOUT_FILENO, &term); + if (error) err(EX_OSERR, "tcgetattr"); + + // Gain use of C-q, C-s, C-c, C-z, C-y, C-v, C-o. + term.c_iflag &= ~IXON; + term.c_cc[VINTR] = _POSIX_VDISABLE; + term.c_cc[VSUSP] = _POSIX_VDISABLE; +#ifdef VDSUSP + term.c_cc[VDSUSP] = _POSIX_VDISABLE; +#endif + term.c_cc[VLNEXT] = _POSIX_VDISABLE; + term.c_cc[VDISCARD] = _POSIX_VDISABLE; + + error = tcsetattr(STDOUT_FILENO, TCSANOW, &term); + if (error) err(EX_OSERR, "tcsetattr"); + + def_prog_mode(); +} + static bool hidden = true; static bool waiting;