summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-02-04 03:58:56 -0500
committerJune McEnroe <june@causal.agency>2020-02-04 03:58:56 -0500
commit43845c61156bf27955891d68c2e1a2504786b587 (patch)
treee8cb5c9c104c23f5d60b920d24c21b1677bda5cc
parentUse time_t rather than struct tm (diff)
downloadcatgirl-43845c61156bf27955891d68c2e1a2504786b587.tar.gz
catgirl-43845c61156bf27955891d68c2e1a2504786b587.zip
Add beginnings of input handling
-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;
+	}
+}