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.
weechat-hashes
C. McEnroe 2020-10-12 19:25:08 -04:00
parent 53f23942a4
commit 59006d18bb
3 changed files with 28 additions and 23 deletions

3
chat.c
View File

@ -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);

3
chat.h
View File

@ -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);

45
ui.c
View File

@ -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;