Handle terminal resizing
parent
6e4f98d6eb
commit
39507f0f8f
7
chat.c
7
chat.c
|
@ -80,8 +80,11 @@ int main(int argc, char *argv[]) {
|
|||
};
|
||||
for (;;) {
|
||||
int nfds = poll(fds, 2, -1);
|
||||
if (nfds < 0 && errno == EINTR) continue;
|
||||
if (nfds < 0) err(EX_IOERR, "poll");
|
||||
if (nfds < 0) {
|
||||
if (errno != EINTR) err(EX_IOERR, "poll");
|
||||
fds[0].revents = POLLIN;
|
||||
fds[1].revents = 0;
|
||||
}
|
||||
|
||||
if (fds[0].revents) uiRead();
|
||||
if (fds[1].revents) clientRead();
|
||||
|
|
34
ui.c
34
ui.c
|
@ -71,6 +71,12 @@ void uiInit(void) {
|
|||
ui.input = newpad(2, INPUT_COLS);
|
||||
mvwhline(ui.input, 0, 0, ACS_HLINE, INPUT_COLS);
|
||||
wmove(ui.input, 1, 0);
|
||||
nodelay(ui.input, true);
|
||||
}
|
||||
|
||||
static void uiResize(void) {
|
||||
wresize(ui.chat, CHAT_LINES, COLS);
|
||||
wmove(ui.chat, CHAT_LINES - 1, COLS - 1);
|
||||
}
|
||||
|
||||
void uiHide(void) {
|
||||
|
@ -194,19 +200,21 @@ void uiRead(void) {
|
|||
static size_t len;
|
||||
|
||||
wint_t ch;
|
||||
wget_wch(ui.input, &ch);
|
||||
switch (ch) {
|
||||
break; case '\b': case '\177': {
|
||||
if (len) len--;
|
||||
}
|
||||
break; case '\n': {
|
||||
if (!len) break;
|
||||
buf[len] = '\0';
|
||||
input(buf);
|
||||
len = 0;
|
||||
}
|
||||
break; default: {
|
||||
if (iswprint(ch)) buf[len++] = ch;
|
||||
while (wget_wch(ui.input, &ch) != ERR) {
|
||||
switch (ch) {
|
||||
break; case KEY_RESIZE: uiResize();
|
||||
break; case '\b': case '\177': {
|
||||
if (len) len--;
|
||||
}
|
||||
break; case '\n': {
|
||||
if (!len) break;
|
||||
buf[len] = '\0';
|
||||
input(buf);
|
||||
len = 0;
|
||||
}
|
||||
break; default: {
|
||||
if (iswprint(ch)) buf[len++] = ch;
|
||||
}
|
||||
}
|
||||
}
|
||||
wmove(ui.input, 1, 0);
|
||||
|
|
Loading…
Reference in New Issue