summary refs log tree commit diff
path: root/chat.h
diff options
context:
space:
mode:
authorCurtis McEnroe2018-08-10 23:31:20 -0400
committerCurtis McEnroe2018-08-10 23:31:20 -0400
commit07c750d25cf26883507d46bf319e55d2e35d6a94 (patch)
treedcf7dbc50dd717a1190c2f034ff440badf5a525c /chat.h
parente9793b4bceac009e09598a7b98048b604c745daa (diff)
Become multi-channel
There's a lot of UI missing for it, but it technically works.
Diffstat (limited to 'chat.h')
-rw-r--r--chat.h104
1 files changed, 67 insertions, 37 deletions
diff --git a/chat.h b/chat.h
index 9a1b855..9219334 100644
--- a/chat.h
+++ b/chat.h
@@ -30,18 +30,23 @@ struct {
 	char *nick;
 	char *user;
 	char *join;
-} chat;
+} self;
 
-void spawn(char *const argv[]);
+void selfNick(const char *nick);
+void selfUser(const char *user);
+void selfJoin(const char *join);
 
-int ircConnect(
-	const char *host, const char *port, const char *pass, const char *webPass
-);
-void ircRead(void);
-void ircWrite(const char *ptr, size_t len);
+struct Tag {
+	size_t id;
+	const char *name;
+};
 
-__attribute__((format(printf, 1, 2)))
-void ircFmt(const char *format, ...);
+enum { TAGS_LEN = 256 };
+const struct Tag TAG_ALL;
+const struct Tag TAG_DEFAULT;
+struct Tag tagFor(const char *name);
+struct Tag tagName(const char *name);
+struct Tag tagNum(size_t num);
 
 enum {
 	IRC_BOLD      = 002,
@@ -52,47 +57,72 @@ enum {
 	IRC_UNDERLINE = 037,
 };
 
+void handle(char *line);
+void input(struct Tag tag, char *line);
+void inputTab(void);
+
+int ircConnect(
+	const char *host, const char *port, const char *pass, const char *webPass
+);
+void ircRead(void);
+void ircWrite(const char *ptr, size_t len);
+void ircFmt(const char *format, ...) __attribute__((format(printf, 1, 2)));
+
 void uiInit(void);
 void uiHide(void);
 void uiExit(void);
 void uiDraw(void);
 void uiBeep(void);
 void uiRead(void);
-void uiTopic(const wchar_t *topic);
-void uiTopicStr(const char *topic);
-void uiLog(const wchar_t *line);
-void uiFmt(const wchar_t *format, ...);
-
-// HACK: clang won't check wchar_t *format strings.
-#ifdef NDEBUG
-#define uiFmt(format, ...) uiFmt(L##format, __VA_ARGS__)
-#else
-#define uiFmt(format, ...) do { \
-	snprintf(NULL, 0, format, __VA_ARGS__); \
-	uiFmt(L##format, __VA_ARGS__); \
-} while(0)
-#endif
-
+void uiFocus(struct Tag tag);
+void uiTopic(struct Tag tag, const char *topic);
+void uiLog(struct Tag tag, const wchar_t *line);
+void uiFmt(struct Tag tag, const wchar_t *format, ...);
+
+enum Edit {
+	EDIT_LEFT,
+	EDIT_RIGHT,
+	EDIT_HOME,
+	EDIT_END,
+	EDIT_BACK_WORD,
+	EDIT_FORE_WORD,
+	EDIT_INSERT,
+	EDIT_BACKSPACE,
+	EDIT_DELETE,
+	EDIT_KILL_BACK_WORD,
+	EDIT_KILL_FORE_WORD,
+	EDIT_KILL_LINE,
+	EDIT_COMPLETE,
+	EDIT_ENTER,
+};
+void edit(struct Tag tag, enum Edit op, wchar_t ch);
 const wchar_t *editHead(void);
 const wchar_t *editTail(void);
-bool edit(bool meta, bool ctrl, wchar_t ch);
-
-void handle(char *line);
-
-void inputTab(void);
-void input(char *line);
-
-void urlScan(const char *str);
-void urlList(void);
-void urlOpen(size_t i);
 
-void tabTouch(const char *word);
-void tabRemove(const char *word);
+void tabTouch(struct Tag tag, const char *word);
+void tabRemove(struct Tag tag, const char *word);
+void tabClear(struct Tag tag);
 void tabReplace(const char *prev, const char *next);
-const char *tabNext(const char *prefix);
+const char *tabNext(struct Tag tag, const char *prefix);
 void tabAccept(void);
 void tabReject(void);
 
+void urlScan(struct Tag tag, const char *str);
+void urlList(struct Tag tag);
+void urlOpen(struct Tag tag, size_t fromEnd);
+
+void spawn(char *const argv[]);
+
 wchar_t *ambstowcs(const char *src);
 char *awcstombs(const wchar_t *src);
 int vaswprintf(wchar_t **ret, const wchar_t *format, va_list ap);
+
+// HACK: clang won't check wchar_t *format strings.
+#ifdef NDEBUG
+#define uiFmt(tag, format, ...) uiFmt(tag, L##format, __VA_ARGS__)
+#else
+#define uiFmt(tag, format, ...) do { \
+	snprintf(NULL, 0, format, __VA_ARGS__); \
+	uiFmt(tag, L##format, __VA_ARGS__); \
+} while(0)
+#endif