Parse IRC styling in UI
Wow the colorPair thing actually works. Have I finally cracked curses colors?weechat-hashes
parent
d59666cb25
commit
cd3dc4ef4c
2
chat.c
2
chat.c
|
@ -76,7 +76,7 @@ int main(int argc, char *argv[]) {
|
||||||
ircConfig(insecure, cert, priv);
|
ircConfig(insecure, cert, priv);
|
||||||
|
|
||||||
uiInit();
|
uiInit();
|
||||||
uiFormat(Network, Cold, NULL, "Traveling...");
|
uiFormat(Network, Cold, NULL, C "3Trave" U "ling" U C "0,3.." C "0,4.");
|
||||||
uiDraw();
|
uiDraw();
|
||||||
|
|
||||||
int irc = ircConnect(host, port);
|
int irc = ircConnect(host, port);
|
||||||
|
|
75
ui.c
75
ui.c
|
@ -15,12 +15,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <curses.h>
|
#include <curses.h>
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <sysexits.h>
|
#include <sysexits.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
|
@ -56,7 +58,7 @@ static short colorPair(short fg, short bg) {
|
||||||
pair_content(pair, &f, &b);
|
pair_content(pair, &f, &b);
|
||||||
if (f == fg && b == bg) return pair;
|
if (f == fg && b == bg) return pair;
|
||||||
}
|
}
|
||||||
init_pair(colorPairs, fg, bg);
|
init_pair(colorPairs, fg % COLORS, bg % COLORS);
|
||||||
return colorPairs++;
|
return colorPairs++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,11 +156,80 @@ void uiDraw(void) {
|
||||||
doupdate();
|
doupdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Style {
|
||||||
|
attr_t attr;
|
||||||
|
enum Color fg, bg;
|
||||||
|
};
|
||||||
|
static const struct Style Reset = { A_NORMAL, Default, Default };
|
||||||
|
|
||||||
|
static short mapColor(enum Color color) {
|
||||||
|
switch (color) {
|
||||||
|
break; case White: return 8 + COLOR_WHITE;
|
||||||
|
break; case Black: return 0 + COLOR_BLACK;
|
||||||
|
break; case Blue: return 0 + COLOR_BLUE;
|
||||||
|
break; case Green: return 0 + COLOR_GREEN;
|
||||||
|
break; case Red: return 8 + COLOR_RED;
|
||||||
|
break; case Brown: return 0 + COLOR_RED;
|
||||||
|
break; case Magenta: return 0 + COLOR_MAGENTA;
|
||||||
|
break; case Orange: return 0 + COLOR_YELLOW;
|
||||||
|
break; case Yellow: return 8 + COLOR_YELLOW;
|
||||||
|
break; case LightGreen: return 8 + COLOR_GREEN;
|
||||||
|
break; case Cyan: return 0 + COLOR_CYAN;
|
||||||
|
break; case LightCyan: return 8 + COLOR_CYAN;
|
||||||
|
break; case LightBlue: return 8 + COLOR_BLUE;
|
||||||
|
break; case Pink: return 8 + COLOR_MAGENTA;
|
||||||
|
break; case Gray: return 8 + COLOR_BLACK;
|
||||||
|
break; case LightGray: return 0 + COLOR_WHITE;
|
||||||
|
break; default: return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void styleParse(struct Style *style, const char **str, size_t *len) {
|
||||||
|
switch (**str) {
|
||||||
|
break; case '\2': (*str)++; style->attr ^= A_BOLD;
|
||||||
|
break; case '\17': (*str)++; *style = Reset;
|
||||||
|
break; case '\26': (*str)++; style->attr ^= A_REVERSE;
|
||||||
|
break; case '\35': (*str)++; style->attr ^= A_ITALIC;
|
||||||
|
break; case '\37': (*str)++; style->attr ^= A_UNDERLINE;
|
||||||
|
break; case '\3': {
|
||||||
|
(*str)++;
|
||||||
|
if (!isdigit(**str)) {
|
||||||
|
style->fg = Default;
|
||||||
|
style->bg = Default;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
style->fg = *(*str)++ - '0';
|
||||||
|
if (isdigit(**str)) style->fg = style->fg * 10 + *(*str)++ - '0';
|
||||||
|
if ((*str)[0] != ',' || !isdigit((*str)[1])) break;
|
||||||
|
(*str)++;
|
||||||
|
style->bg = *(*str)++ - '0';
|
||||||
|
if (isdigit(**str)) style->bg = style->bg * 10 + *(*str)++ - '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*len = strcspn(*str, "\2\3\17\26\35\37");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void styleAdd(WINDOW *win, const char *str) {
|
||||||
|
size_t len;
|
||||||
|
struct Style style = Reset;
|
||||||
|
while (*str) {
|
||||||
|
styleParse(&style, &str, &len);
|
||||||
|
wattr_set(
|
||||||
|
win,
|
||||||
|
style.attr | colorAttr(mapColor(style.fg)),
|
||||||
|
colorPair(mapColor(style.fg), mapColor(style.bg)),
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
waddnstr(win, str, len);
|
||||||
|
str += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
waddch(window->pad, '\n');
|
waddch(window->pad, '\n');
|
||||||
waddstr(window->pad, str);
|
styleAdd(window->pad, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiFormat(
|
void uiFormat(
|
||||||
|
|
Loading…
Reference in New Issue