Add support for mIRC colors
parent
0a1528796b
commit
9e0bcb3805
84
chat.c
84
chat.c
|
@ -38,7 +38,14 @@ static void curse(void) {
|
||||||
initscr();
|
initscr();
|
||||||
keypad(stdscr, true);
|
keypad(stdscr, true);
|
||||||
start_color();
|
start_color();
|
||||||
assume_default_colors(-1, -1);
|
use_default_colors();
|
||||||
|
for (short pair = 0; pair < 077; ++pair) {
|
||||||
|
if (pair < 010) {
|
||||||
|
init_pair(1 + pair, pair, -1);
|
||||||
|
} else {
|
||||||
|
init_pair(1 + pair, pair & 007, (pair & 070) >> 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int CHAT_LINES = 100;
|
static const int CHAT_LINES = 100;
|
||||||
|
@ -75,22 +82,77 @@ static void uiDraw(void) {
|
||||||
doupdate();
|
doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
attr_t attr;
|
||||||
|
short color;
|
||||||
|
} MIRC_COLORS[16] = {
|
||||||
|
{ A_BOLD, COLOR_WHITE }, // white
|
||||||
|
{ A_NORMAL, COLOR_BLACK }, // black
|
||||||
|
{ A_NORMAL, COLOR_BLUE }, // blue
|
||||||
|
{ A_NORMAL, COLOR_GREEN }, // green
|
||||||
|
{ A_BOLD, COLOR_RED }, // red
|
||||||
|
{ A_NORMAL, COLOR_RED }, // "brown"
|
||||||
|
{ A_NORMAL, COLOR_MAGENTA }, // magenta
|
||||||
|
{ A_NORMAL, COLOR_YELLOW }, // "orange"
|
||||||
|
{ A_BOLD, COLOR_YELLOW }, // yellow
|
||||||
|
{ A_BOLD, COLOR_GREEN }, // light green
|
||||||
|
{ A_NORMAL, COLOR_CYAN }, // cyan
|
||||||
|
{ A_BOLD, COLOR_CYAN }, // light cyan
|
||||||
|
{ A_BOLD, COLOR_BLUE }, // light blue
|
||||||
|
{ A_BOLD, COLOR_MAGENTA }, // "pink"
|
||||||
|
{ A_BOLD, COLOR_BLACK }, // grey
|
||||||
|
{ A_NORMAL, COLOR_WHITE }, // light grey
|
||||||
|
};
|
||||||
|
|
||||||
static void uiAdd(WINDOW *win, const char *str) {
|
static void uiAdd(WINDOW *win, const char *str) {
|
||||||
attr_t attrs = A_NORMAL;
|
attr_t attr = A_NORMAL;
|
||||||
short pair = 0;
|
short colorPair = -1;
|
||||||
|
attr_t colorAttr = A_NORMAL;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
size_t cc = strcspn(str, "\x02\x03\x1D\x1F");
|
size_t cc = strcspn(str, "\x02\x03\x1D\x1F");
|
||||||
wattr_set(win, attrs, pair, NULL);
|
wattr_set(win, attr | colorAttr, 1 + colorPair, NULL);
|
||||||
waddnstr(win, str, cc);
|
waddnstr(win, str, cc);
|
||||||
|
|
||||||
if (!str[cc]) break;
|
if (!str[cc]) break;
|
||||||
switch (str[cc]) {
|
|
||||||
break; case 0x02: attrs ^= A_BOLD;
|
str = &str[cc];
|
||||||
break; case 0x03: // TODO
|
switch (*str++) {
|
||||||
break; case 0x1D: attrs ^= A_ITALIC;
|
break; case 0x02: attr ^= A_BOLD;
|
||||||
break; case 0x1F: attrs ^= A_UNDERLINE;
|
break; case 0x1D: attr ^= A_ITALIC;
|
||||||
|
break; case 0x1F: attr ^= A_UNDERLINE;
|
||||||
|
break; case 0x03: {
|
||||||
|
short fg = 0;
|
||||||
|
short bg = 0;
|
||||||
|
|
||||||
|
size_t fgLen = strspn(str, "0123456789");
|
||||||
|
if (!fgLen) {
|
||||||
|
colorPair = -1;
|
||||||
|
colorAttr = A_NORMAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgLen > 2) fgLen = 2;
|
||||||
|
for (size_t i = 0; i < fgLen; ++i) {
|
||||||
|
fg *= 10;
|
||||||
|
fg += str[i] - '0';
|
||||||
|
}
|
||||||
|
str = &str[fgLen];
|
||||||
|
|
||||||
|
size_t bgLen = (str[0] == ',') ? strspn(&str[1], "0123456789") : 0;
|
||||||
|
if (bgLen > 2) bgLen = 2;
|
||||||
|
for (size_t i = 0; i < bgLen; ++i) {
|
||||||
|
bg *= 10;
|
||||||
|
bg += str[1 + i] - '0';
|
||||||
|
}
|
||||||
|
if (bgLen) str = &str[1 + bgLen];
|
||||||
|
|
||||||
|
if (colorPair == -1) colorPair = 0;
|
||||||
|
colorPair = (colorPair & 070) | MIRC_COLORS[fg].color;
|
||||||
|
colorAttr = MIRC_COLORS[fg].attr;
|
||||||
|
if (bgLen) {
|
||||||
|
colorPair = (colorPair & 007) | (MIRC_COLORS[bg].color << 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
str = &str[cc + 1];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue