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.master
parent
53f23942a4
commit
59006d18bb
3
chat.c
3
chat.c
|
@ -222,7 +222,7 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
ircConfig(insecure, cert, priv);
|
ircConfig(insecure, cert, priv);
|
||||||
|
|
||||||
uiInit();
|
uiInitEarly();
|
||||||
if (save) {
|
if (save) {
|
||||||
uiLoad(save);
|
uiLoad(save);
|
||||||
atexit(exitSave);
|
atexit(exitSave);
|
||||||
|
@ -244,6 +244,7 @@ int main(int argc, char *argv[]) {
|
||||||
ircFormat("NICK :%s\r\n", nick);
|
ircFormat("NICK :%s\r\n", nick);
|
||||||
ircFormat("USER %s 0 * :%s\r\n", user, real);
|
ircFormat("USER %s 0 * :%s\r\n", user, real);
|
||||||
|
|
||||||
|
uiInitLate();
|
||||||
signal(SIGHUP, signalHandler);
|
signal(SIGHUP, signalHandler);
|
||||||
signal(SIGINT, signalHandler);
|
signal(SIGINT, signalHandler);
|
||||||
signal(SIGTERM, signalHandler);
|
signal(SIGTERM, signalHandler);
|
||||||
|
|
3
chat.h
3
chat.h
|
@ -270,7 +270,8 @@ void commandCompleteAdd(void);
|
||||||
|
|
||||||
enum Heat { Ice, Cold, Warm, Hot };
|
enum Heat { Ice, Cold, Warm, Hot };
|
||||||
extern struct Util uiNotifyUtil;
|
extern struct Util uiNotifyUtil;
|
||||||
void uiInit(void);
|
void uiInitEarly(void);
|
||||||
|
void uiInitLate(void);
|
||||||
void uiShow(void);
|
void uiShow(void);
|
||||||
void uiHide(void);
|
void uiHide(void);
|
||||||
void uiDraw(void);
|
void uiDraw(void);
|
||||||
|
|
45
ui.c
45
ui.c
|
@ -219,23 +219,6 @@ enum {
|
||||||
#undef X
|
#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,
|
// XXX: Assuming terminals will be fine with these even if they're unsupported,
|
||||||
// since they're "private" modes.
|
// since they're "private" modes.
|
||||||
static const char *EnterFocusMode = "\33[?1004h";
|
static const char *EnterFocusMode = "\33[?1004h";
|
||||||
|
@ -249,14 +232,12 @@ static void errExit(void) {
|
||||||
reset_shell_mode();
|
reset_shell_mode();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiInit(void) {
|
void uiInitEarly(void) {
|
||||||
initscr();
|
initscr();
|
||||||
cbreak();
|
cbreak();
|
||||||
noecho();
|
noecho();
|
||||||
acquireKeys();
|
|
||||||
def_prog_mode();
|
|
||||||
atexit(errExit);
|
|
||||||
colorInit();
|
colorInit();
|
||||||
|
atexit(errExit);
|
||||||
|
|
||||||
if (!to_status_line && !strncmp(termname(), "xterm", 5)) {
|
if (!to_status_line && !strncmp(termname(), "xterm", 5)) {
|
||||||
to_status_line = "\33]2;";
|
to_status_line = "\33]2;";
|
||||||
|
@ -282,6 +263,28 @@ void uiInit(void) {
|
||||||
uiShow();
|
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 hidden = true;
|
||||||
static bool waiting;
|
static bool waiting;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue