Implement window switching and status line
parent
0728eb39a4
commit
ec83332e15
15
chat.c
15
chat.c
|
@ -76,19 +76,8 @@ int main(int argc, char *argv[]) {
|
||||||
ircConfig(insecure, cert, priv);
|
ircConfig(insecure, cert, priv);
|
||||||
|
|
||||||
uiInit();
|
uiInit();
|
||||||
uiFormat(Network, Cold, NULL, C "3Trave" U "ling" U C "0,3.." C "0,4." R);
|
uiShowID(Network);
|
||||||
uiFormat(
|
uiFormat(Network, Cold, NULL, "Traveling...");
|
||||||
Network, Cold, NULL,
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
"The quick brown fox jumps over the lazy dog. "
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
"The quick brown fox jumps over the lazy dog. "
|
|
||||||
"The quick brown fox jumps over the lazy dog. "
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
"Jackdaws love my big sphinx of quartz. "
|
|
||||||
);
|
|
||||||
uiDraw();
|
uiDraw();
|
||||||
|
|
||||||
int irc = ircConnect(host, port);
|
int irc = ircConnect(host, port);
|
||||||
|
|
1
chat.h
1
chat.h
|
@ -117,6 +117,7 @@ void handle(struct Message msg);
|
||||||
enum Heat { Cold, Warm, Hot };
|
enum Heat { Cold, Warm, Hot };
|
||||||
void uiInit(void);
|
void uiInit(void);
|
||||||
void uiDraw(void);
|
void uiDraw(void);
|
||||||
|
void uiShowID(size_t id);
|
||||||
void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str);
|
void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str);
|
||||||
void uiFormat(
|
void uiFormat(
|
||||||
size_t id, enum Heat heat, const struct tm *time, const char *format, ...
|
size_t id, enum Heat heat, const struct tm *time, const char *format, ...
|
||||||
|
|
22
handle.c
22
handle.c
|
@ -65,9 +65,11 @@ static void set(char **field, const char *value) {
|
||||||
if (!*field) err(EX_OSERR, "strdup");
|
if (!*field) err(EX_OSERR, "strdup");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void require(const struct Message *msg, bool origin, size_t len) {
|
static void require(struct Message *msg, bool origin, size_t len) {
|
||||||
if (origin && !msg->nick) {
|
if (origin) {
|
||||||
errx(EX_PROTOCOL, "%s missing origin", msg->cmd);
|
if (!msg->nick) errx(EX_PROTOCOL, "%s missing origin", msg->cmd);
|
||||||
|
if (!msg->user) msg->user = msg->nick;
|
||||||
|
if (!msg->host) msg->host = msg->user;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < len; ++i) {
|
for (size_t i = 0; i < len; ++i) {
|
||||||
if (msg->params[i]) continue;
|
if (msg->params[i]) continue;
|
||||||
|
@ -177,6 +179,19 @@ static void handleReplyMOTD(struct Message *msg) {
|
||||||
uiFormat(Network, Cold, tagTime(msg), "%s", line);
|
uiFormat(Network, Cold, tagTime(msg), "%s", line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void handleJoin(struct Message *msg) {
|
||||||
|
require(msg, true, 1);
|
||||||
|
size_t id = idFor(msg->params[0]);
|
||||||
|
if (self.nick && !strcmp(msg->nick, self.nick)) {
|
||||||
|
uiShowID(id);
|
||||||
|
}
|
||||||
|
uiFormat(
|
||||||
|
id, Cold, tagTime(msg),
|
||||||
|
C"%02d%s"C" arrives in "C"%02d%s"C,
|
||||||
|
hash(msg->user), msg->nick, hash(idNames[id]), idNames[id]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static void handlePing(struct Message *msg) {
|
static void handlePing(struct Message *msg) {
|
||||||
require(msg, false, 1);
|
require(msg, false, 1);
|
||||||
ircFormat("PONG :%s\r\n", msg->params[0]);
|
ircFormat("PONG :%s\r\n", msg->params[0]);
|
||||||
|
@ -197,6 +212,7 @@ static const struct Handler {
|
||||||
{ "906", handleErrorSASLFail },
|
{ "906", handleErrorSASLFail },
|
||||||
{ "AUTHENTICATE", handleAuthenticate },
|
{ "AUTHENTICATE", handleAuthenticate },
|
||||||
{ "CAP", handleCap },
|
{ "CAP", handleCap },
|
||||||
|
{ "JOIN", handleJoin },
|
||||||
{ "PING", handlePing },
|
{ "PING", handlePing },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
34
ui.c
34
ui.c
|
@ -262,6 +262,40 @@ static void styleAdd(WINDOW *win, const char *str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void statusUpdate(void) {
|
||||||
|
wmove(status, 0, 0);
|
||||||
|
int num;
|
||||||
|
const struct Window *window;
|
||||||
|
for (num = 0, window = windows.head; window; ++num, window = window->next) {
|
||||||
|
if (!window->unread && window != windows.active) continue;
|
||||||
|
enum Color color = hash(idNames[window->id]); // FIXME: queries.
|
||||||
|
int unread;
|
||||||
|
char buf[256];
|
||||||
|
snprintf(
|
||||||
|
buf, sizeof(buf), C"%d%s %d %s %n("C"%02d%d"C"%d) ",
|
||||||
|
color, (window == windows.active ? V : ""),
|
||||||
|
num, idNames[window->id],
|
||||||
|
&unread, (window->heat > Warm ? White : color), window->unread,
|
||||||
|
color
|
||||||
|
);
|
||||||
|
if (!window->unread) buf[unread] = '\0';
|
||||||
|
styleAdd(status, buf);
|
||||||
|
}
|
||||||
|
wclrtoeol(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
void uiShowID(size_t id) {
|
||||||
|
struct Window *window = windowFor(id);
|
||||||
|
window->heat = Cold;
|
||||||
|
window->unread = 0;
|
||||||
|
window->mark = false;
|
||||||
|
if (windows.active) windows.active->mark = true;
|
||||||
|
windows.other = windows.active;
|
||||||
|
windows.active = window;
|
||||||
|
touchwin(window->pad);
|
||||||
|
statusUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str) {
|
void uiWrite(size_t id, enum Heat heat, const struct tm *time, const char *str) {
|
||||||
(void)time;
|
(void)time;
|
||||||
struct Window *window = windowFor(id);
|
struct Window *window = windowFor(id);
|
||||||
|
|
Loading…
Reference in New Issue