Add color to tags
parent
238f74efac
commit
6b97c59756
25
chat.h
25
chat.h
|
@ -52,18 +52,6 @@ void eventWait(const char *argv[static 2]);
|
||||||
void eventPipe(const char *argv[static 2]);
|
void eventPipe(const char *argv[static 2]);
|
||||||
noreturn void eventLoop(void);
|
noreturn void eventLoop(void);
|
||||||
|
|
||||||
struct Tag {
|
|
||||||
size_t id;
|
|
||||||
const char *name;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum { TagsLen = 256 };
|
|
||||||
const struct Tag TagNone;
|
|
||||||
const struct Tag TagStatus;
|
|
||||||
const struct Tag TagRaw;
|
|
||||||
struct Tag tagFind(const char *name);
|
|
||||||
struct Tag tagFor(const char *name);
|
|
||||||
|
|
||||||
enum IRCColor {
|
enum IRCColor {
|
||||||
IRCWhite,
|
IRCWhite,
|
||||||
IRCBlack,
|
IRCBlack,
|
||||||
|
@ -92,6 +80,19 @@ enum {
|
||||||
IRCUnderline = 037,
|
IRCUnderline = 037,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Tag {
|
||||||
|
size_t id;
|
||||||
|
const char *name;
|
||||||
|
enum IRCColor color;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum { TagsLen = 256 };
|
||||||
|
const struct Tag TagNone;
|
||||||
|
const struct Tag TagStatus;
|
||||||
|
const struct Tag TagRaw;
|
||||||
|
struct Tag tagFind(const char *name);
|
||||||
|
struct Tag tagFor(const char *name, enum IRCColor color);
|
||||||
|
|
||||||
struct Format {
|
struct Format {
|
||||||
const wchar_t *str;
|
const wchar_t *str;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
24
handle.c
24
handle.c
|
@ -214,7 +214,7 @@ static void handleErrorNoSuchNick(char *prefix, char *params) {
|
||||||
static void handleJoin(char *prefix, char *params) {
|
static void handleJoin(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan;
|
char *nick, *user, *chan;
|
||||||
parse(prefix, &nick, &user, NULL, params, 1, 0, &chan);
|
parse(prefix, &nick, &user, NULL, params, 1, 0, &chan);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
if (!strcmp(nick, self.nick)) {
|
if (!strcmp(nick, self.nick)) {
|
||||||
tabTouch(TagNone, chan);
|
tabTouch(TagNone, chan);
|
||||||
|
@ -234,7 +234,7 @@ static void handleJoin(char *prefix, char *params) {
|
||||||
static void handlePart(char *prefix, char *params) {
|
static void handlePart(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan, *mesg;
|
char *nick, *user, *chan, *mesg;
|
||||||
parse(prefix, &nick, &user, NULL, params, 1, 1, &chan, &mesg);
|
parse(prefix, &nick, &user, NULL, params, 1, 1, &chan, &mesg);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
if (!strcmp(nick, self.nick)) {
|
if (!strcmp(nick, self.nick)) {
|
||||||
tabClear(tag);
|
tabClear(tag);
|
||||||
|
@ -263,7 +263,7 @@ static void handlePart(char *prefix, char *params) {
|
||||||
static void handleKick(char *prefix, char *params) {
|
static void handleKick(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan, *kick, *mesg;
|
char *nick, *user, *chan, *kick, *mesg;
|
||||||
parse(prefix, &nick, &user, NULL, params, 2, 1, &chan, &kick, &mesg);
|
parse(prefix, &nick, &user, NULL, params, 2, 1, &chan, &kick, &mesg);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
bool kicked = !strcmp(kick, self.nick);
|
bool kicked = !strcmp(kick, self.nick);
|
||||||
|
|
||||||
if (kicked) {
|
if (kicked) {
|
||||||
|
@ -324,7 +324,7 @@ static void handleQuit(char *prefix, char *params) {
|
||||||
static void handleReplyTopic(char *prefix, char *params) {
|
static void handleReplyTopic(char *prefix, char *params) {
|
||||||
char *chan, *topic;
|
char *chan, *topic;
|
||||||
parse(prefix, NULL, NULL, NULL, params, 3, 0, NULL, &chan, &topic);
|
parse(prefix, NULL, NULL, NULL, params, 3, 0, NULL, &chan, &topic);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
urlScan(tag, topic);
|
urlScan(tag, topic);
|
||||||
uiFmt(
|
uiFmt(
|
||||||
|
@ -338,7 +338,7 @@ static void handleReplyTopic(char *prefix, char *params) {
|
||||||
static void handleTopic(char *prefix, char *params) {
|
static void handleTopic(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan, *topic;
|
char *nick, *user, *chan, *topic;
|
||||||
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &topic);
|
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &topic);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
if (strcmp(nick, self.nick)) tabTouch(tag, nick);
|
if (strcmp(nick, self.nick)) tabTouch(tag, nick);
|
||||||
|
|
||||||
|
@ -369,7 +369,7 @@ static void handleReplyWho(char *prefix, char *params) {
|
||||||
params, 6, 0, NULL, &chan, &user, NULL, NULL, &nick
|
params, 6, 0, NULL, &chan, &user, NULL, NULL, &nick
|
||||||
);
|
);
|
||||||
if (user[0] == '~') user = &user[1];
|
if (user[0] == '~') user = &user[1];
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
tabAdd(tag, nick);
|
tabAdd(tag, nick);
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ static void handleReplyWho(char *prefix, char *params) {
|
||||||
static void handleReplyEndOfWho(char *prefix, char *params) {
|
static void handleReplyEndOfWho(char *prefix, char *params) {
|
||||||
char *chan;
|
char *chan;
|
||||||
parse(prefix, NULL, NULL, NULL, params, 2, 0, NULL, &chan);
|
parse(prefix, NULL, NULL, NULL, params, 2, 0, NULL, &chan);
|
||||||
struct Tag tag = tagFor(chan);
|
struct Tag tag = tagFor(chan, formatColor(chan));
|
||||||
|
|
||||||
uiFmt(
|
uiFmt(
|
||||||
tag, UICold,
|
tag, UICold,
|
||||||
|
@ -441,7 +441,9 @@ static void handlePrivmsg(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan, *mesg;
|
char *nick, *user, *chan, *mesg;
|
||||||
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &mesg);
|
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &mesg);
|
||||||
bool direct = !strcmp(chan, self.nick);
|
bool direct = !strcmp(chan, self.nick);
|
||||||
struct Tag tag = (direct ? tagFor(nick) : tagFor(chan));
|
struct Tag tag = direct
|
||||||
|
? tagFor(nick, formatColor(user))
|
||||||
|
: tagFor(chan, formatColor(chan));
|
||||||
if (mesg[0] == '\1') {
|
if (mesg[0] == '\1') {
|
||||||
handleCTCP(tag, nick, user, mesg);
|
handleCTCP(tag, nick, user, mesg);
|
||||||
return;
|
return;
|
||||||
|
@ -466,7 +468,11 @@ static void handleNotice(char *prefix, char *params) {
|
||||||
char *nick, *user, *chan, *mesg;
|
char *nick, *user, *chan, *mesg;
|
||||||
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &mesg);
|
parse(prefix, &nick, &user, NULL, params, 2, 0, &chan, &mesg);
|
||||||
struct Tag tag = TagStatus;
|
struct Tag tag = TagStatus;
|
||||||
if (user) tag = (strcmp(chan, self.nick) ? tagFor(chan) : tagFor(nick));
|
if (user) {
|
||||||
|
tag = strcmp(chan, self.nick)
|
||||||
|
? tagFor(chan, formatColor(chan))
|
||||||
|
: tagFor(nick, formatColor(user));
|
||||||
|
}
|
||||||
|
|
||||||
if (strcmp(nick, self.nick)) tabTouch(tag, nick);
|
if (strcmp(nick, self.nick)) tabTouch(tag, nick);
|
||||||
|
|
||||||
|
|
4
input.c
4
input.c
|
@ -66,8 +66,8 @@ static void inputQuery(struct Tag tag, char *params) {
|
||||||
char *nick = strsep(¶ms, " ");
|
char *nick = strsep(¶ms, " ");
|
||||||
if (nick) {
|
if (nick) {
|
||||||
tabTouch(TagNone, nick);
|
tabTouch(TagNone, nick);
|
||||||
uiShowTag(tagFor(nick));
|
uiShowTag(tagFor(nick, IRCDefault));
|
||||||
logReplay(tagFor(nick));
|
logReplay(tagFor(nick, IRCDefault));
|
||||||
} else {
|
} else {
|
||||||
uiLog(tag, UIHot, L"/query requires a nickname");
|
uiLog(tag, UIHot, L"/query requires a nickname");
|
||||||
}
|
}
|
||||||
|
|
15
tag.c
15
tag.c
|
@ -23,30 +23,33 @@
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
char *name[TagsLen];
|
char *name[TagsLen];
|
||||||
|
enum IRCColor color[TagsLen];
|
||||||
size_t len;
|
size_t len;
|
||||||
} tags = {
|
} tags = {
|
||||||
.name = { "<none>", "<status>", "<raw>" },
|
.name = { "<none>", "<status>", "<raw>" },
|
||||||
|
.color = { IRCBlack, IRCDefault, IRCRed },
|
||||||
.len = 3,
|
.len = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct Tag TagNone = { 0, "<none>" };
|
const struct Tag TagNone = { 0, "<none>", IRCBlack };
|
||||||
const struct Tag TagStatus = { 1, "<status>" };
|
const struct Tag TagStatus = { 1, "<status>", IRCDefault };
|
||||||
const struct Tag TagRaw = { 2, "<raw>" };
|
const struct Tag TagRaw = { 2, "<raw>", IRCRed };
|
||||||
|
|
||||||
struct Tag tagFind(const char *name) {
|
struct Tag tagFind(const char *name) {
|
||||||
for (size_t id = 0; id < tags.len; ++id) {
|
for (size_t id = 0; id < tags.len; ++id) {
|
||||||
if (strcmp(tags.name[id], name)) continue;
|
if (strcmp(tags.name[id], name)) continue;
|
||||||
return (struct Tag) { id, tags.name[id] };
|
return (struct Tag) { id, tags.name[id], tags.color[id] };
|
||||||
}
|
}
|
||||||
return TagNone;
|
return TagNone;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Tag tagFor(const char *name) {
|
struct Tag tagFor(const char *name, enum IRCColor color) {
|
||||||
struct Tag tag = tagFind(name);
|
struct Tag tag = tagFind(name);
|
||||||
if (tag.id != TagNone.id) return tag;
|
if (tag.id != TagNone.id) return tag;
|
||||||
if (tags.len == TagsLen) return TagStatus;
|
if (tags.len == TagsLen) return TagStatus;
|
||||||
size_t id = tags.len++;
|
size_t id = tags.len++;
|
||||||
tags.name[id] = strdup(name);
|
tags.name[id] = strdup(name);
|
||||||
if (!tags.name[id]) err(EX_OSERR, "strdup");
|
if (!tags.name[id]) err(EX_OSERR, "strdup");
|
||||||
return (struct Tag) { id, tags.name[id] };
|
tags.color[id] = color;
|
||||||
|
return (struct Tag) { id, tags.name[id], color };
|
||||||
}
|
}
|
||||||
|
|
7
ui.c
7
ui.c
|
@ -335,10 +335,11 @@ static void uiStatus(void) {
|
||||||
int unread;
|
int unread;
|
||||||
wchar_t *str;
|
wchar_t *str;
|
||||||
int len = aswprintf(
|
int len = aswprintf(
|
||||||
&str, L"%c %d %s %n(\3%02d%u\3) ",
|
&str, L"%c\3%d %d %s %n(\3%02d%u\3%d) ",
|
||||||
(windows.active == win ? IRCReverse : IRCReset),
|
(windows.active == win ? IRCReverse : IRCReset), win->tag.color,
|
||||||
num, win->tag.name,
|
num, win->tag.name,
|
||||||
&unread, (win->hot ? IRCYellow : IRCDefault), win->unread
|
&unread, (win->hot ? IRCWhite : win->tag.color), win->unread,
|
||||||
|
win->tag.color
|
||||||
);
|
);
|
||||||
if (len < 0) err(EX_OSERR, "aswprintf");
|
if (len < 0) err(EX_OSERR, "aswprintf");
|
||||||
if (!win->unread) str[unread] = L'\0';
|
if (!win->unread) str[unread] = L'\0';
|
||||||
|
|
Loading…
Reference in New Issue