summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chat.c3
-rw-r--r--chat.h3
-rw-r--r--ui.c45
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;