Add color to tags

master
Curtis McEnroe 2019-02-25 16:02:41 -05:00
parent 238f74efac
commit 6b97c59756
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
5 changed files with 43 additions and 32 deletions

25
chat.h
View File

@ -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;

View File

@ -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);

View File

@ -66,8 +66,8 @@ static void inputQuery(struct Tag tag, char *params) {
char *nick = strsep(&params, " "); char *nick = strsep(&params, " ");
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
View File

@ -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
View File

@ -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';