summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chat.c12
-rw-r--r--chat.h1
-rw-r--r--ui.c45
3 files changed, 56 insertions, 2 deletions
diff --git a/chat.c b/chat.c
index 162f68f..3402621 100644
--- a/chat.c
+++ b/chat.c
@@ -15,7 +15,9 @@
*/
#include <err.h>
+#include <errno.h>
#include <locale.h>
+#include <poll.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
@@ -98,8 +100,16 @@ int main(int argc, char *argv[]) {
ircFormat("NICK :%s\r\n", nick);
ircFormat("USER %s 0 * :%s\r\n", user, real);
+ struct pollfd fds[2] = {
+ { .events = POLLIN, .fd = STDIN_FILENO },
+ { .events = POLLIN, .fd = irc },
+ };
for (;;) {
+ int nfds = poll(fds, 2, -1);
+ if (nfds < 0 && errno != EINTR) err(EX_IOERR, "poll");
+
+ if (fds[0].revents) uiRead();
+ if (fds[1].revents) ircRecv();
uiDraw();
- ircRecv();
}
}
diff --git a/chat.h b/chat.h
index 9165c13..8de5df1 100644
--- a/chat.h
+++ b/chat.h
@@ -115,6 +115,7 @@ void uiShow(void);
void uiHide(void);
void uiDraw(void);
void uiShowID(size_t id);
+void uiRead(void);
void uiWrite(size_t id, enum Heat heat, const time_t *time, const char *str);
void uiFormat(
size_t id, enum Heat heat, const time_t *time, const char *format, ...
diff --git a/ui.c b/ui.c
index e2746f1..d69e706 100644
--- a/ui.c
+++ b/ui.c
@@ -14,6 +14,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+#define _XOPEN_SOURCE_EXTENDED
+
#include <assert.h>
#include <ctype.h>
#include <curses.h>
@@ -192,7 +194,7 @@ void uiInit(void) {
keypad(input, true);
nodelay(input, true);
windows.active = windowFor(Network);
- //uiShow();
+ uiShow();
}
void uiDraw(void) {
@@ -397,3 +399,44 @@ void uiFormat(
assert((size_t)len < sizeof(buf));
uiWrite(id, heat, time, buf);
}
+
+static void keyCode(int code) {
+ switch (code) {
+ break; case KEY_RESIZE:; // TODO
+ break; case KeyFocusIn:; // TODO
+ break; case KeyFocusOut: windows.active->mark = true;
+ break; case KeyPasteOn:; // TODO
+ break; case KeyPasteOff:; // TODO
+ }
+}
+
+static void keyMeta(wchar_t ch) {
+ switch (ch) {
+ break; case L'm': uiWrite(windows.active->id, Cold, NULL, "");
+ }
+}
+
+static void keyChar(wchar_t ch) {
+ switch (ch) {
+ break; case CTRL(L'L'): clearok(curscr, true);
+ }
+}
+
+void uiRead(void) {
+ int ret;
+ wint_t ch;
+ static bool meta;
+ while (ERR != (ret = wget_wch(input, &ch))) {
+ if (ret == KEY_CODE_YES) {
+ keyCode(ch);
+ } else if (ch == '\33') {
+ meta = true;
+ continue;
+ } else if (meta) {
+ keyMeta(ch);
+ } else {
+ keyChar(ch);
+ }
+ meta = false;
+ }
+}