aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-19 17:10:12 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-19 17:10:12 -0400
commitab063f3928a27601bd4c7ca514d78a544ba7ffcf (patch)
treef7a2a582072c4605bf5257eb448a9ad04db70833
parent6424c4929f8de18799d4d01a71cf2f5e21701126 (diff)
downloadrunes-ab063f3928a27601bd4c7ca514d78a544ba7ffcf.tar.gz
runes-ab063f3928a27601bd4c7ca514d78a544ba7ffcf.zip
handle inverted text
-rw-r--r--display.c38
-rw-r--r--display.h2
-rw-r--r--parser.c6
-rw-r--r--parser.l6
-rw-r--r--term.h1
5 files changed, 46 insertions, 7 deletions
diff --git a/display.c b/display.c
index d9823b4..0fdf7d8 100644
--- a/display.c
+++ b/display.c
@@ -273,6 +273,7 @@ void runes_display_reset_text_attributes(RunesTerm *t)
runes_display_reset_bold(t);
runes_display_reset_italic(t);
runes_display_reset_underline(t);
+ runes_display_reset_inverse(t);
}
void runes_display_set_bold(RunesTerm *t)
@@ -329,6 +330,18 @@ void runes_display_reset_underline(RunesTerm *t)
attrs, pango_attr_underline_new(PANGO_UNDERLINE_NONE));
}
+void runes_display_set_inverse(RunesTerm *t)
+{
+ t->inverse = 1;
+ cairo_set_source(t->cr, runes_display_get_fgcolor(t));
+}
+
+void runes_display_reset_inverse(RunesTerm *t)
+{
+ t->inverse = 0;
+ cairo_set_source(t->cr, runes_display_get_fgcolor(t));
+}
+
void runes_display_set_fg_color(RunesTerm *t, int color)
{
t->fgcolor = color;
@@ -343,6 +356,7 @@ void runes_display_reset_fg_color(RunesTerm *t)
void runes_display_set_bg_color(RunesTerm *t, int color)
{
t->bgcolor = color;
+ cairo_set_source(t->cr, runes_display_get_fgcolor(t));
}
void runes_display_reset_bg_color(RunesTerm *t)
@@ -462,24 +476,34 @@ void runes_display_cleanup(RunesTerm *t)
static cairo_pattern_t *runes_display_get_fgcolor(RunesTerm *t)
{
- if (t->fgcolor == -1) {
- return t->fgdefault;
+ int color = t->inverse ? t->bgcolor : t->fgcolor;
+
+ if (t->inverse && t->bgcolor == t->fgcolor) {
+ return t->bgdefault;
+ }
+ else if (color == -1) {
+ return t->inverse ? t->bgdefault : t->fgdefault;
}
else if (t->bold) {
- return t->brightcolors[t->fgcolor];
+ return t->brightcolors[color];
}
else {
- return t->colors[t->fgcolor];
+ return t->colors[color];
}
}
static cairo_pattern_t *runes_display_get_bgcolor(RunesTerm *t)
{
- if (t->bgcolor == -1) {
- return t->bgdefault;
+ int color = t->inverse ? t->fgcolor : t->bgcolor;
+
+ if (t->inverse && t->bgcolor == t->fgcolor) {
+ return t->fgdefault;
+ }
+ else if (color == -1) {
+ return t->inverse ? t->fgdefault : t->bgdefault;
}
else {
- return t->colors[t->bgcolor];
+ return t->colors[color];
}
}
diff --git a/display.h b/display.h
index 85974cb..cb0b16c 100644
--- a/display.h
+++ b/display.h
@@ -19,6 +19,8 @@ void runes_display_set_italic(RunesTerm *t);
void runes_display_reset_italic(RunesTerm *t);
void runes_display_set_underline(RunesTerm *t);
void runes_display_reset_underline(RunesTerm *t);
+void runes_display_set_inverse(RunesTerm *t);
+void runes_display_reset_inverse(RunesTerm *t);
void runes_display_set_fg_color(RunesTerm *t, int color);
void runes_display_reset_fg_color(RunesTerm *t);
void runes_display_set_bg_color(RunesTerm *t, int color);
diff --git a/parser.c b/parser.c
index 382be79..ade9fc3 100644
--- a/parser.c
+++ b/parser.c
@@ -2595,6 +2595,9 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
case 4:
runes_display_set_underline(t);
break;
+ case 7:
+ runes_display_set_inverse(t);
+ break;
case 22:
runes_display_reset_bold(t);
break;
@@ -2604,6 +2607,9 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
case 24:
runes_display_reset_underline(t);
break;
+ case 27:
+ runes_display_reset_inverse(t);
+ break;
case 30: case 31: case 32: case 33:
case 34: case 35: case 36: case 37:
runes_display_set_fg_color(t, params[i] - 30);
diff --git a/parser.l b/parser.l
index dbb5899..14e65a0 100644
--- a/parser.l
+++ b/parser.l
@@ -506,6 +506,9 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
case 4:
runes_display_set_underline(t);
break;
+ case 7:
+ runes_display_set_inverse(t);
+ break;
case 22:
runes_display_reset_bold(t);
break;
@@ -515,6 +518,9 @@ static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
case 24:
runes_display_reset_underline(t);
break;
+ case 27:
+ runes_display_reset_inverse(t);
+ break;
case 30: case 31: case 32: case 33:
case 34: case 35: case 36: case 37:
runes_display_set_fg_color(t, params[i] - 30);
diff --git a/term.h b/term.h
index 7329af5..2969a94 100644
--- a/term.h
+++ b/term.h
@@ -38,6 +38,7 @@ struct runes_term {
PangoLayout *layout;
char bold;
+ char inverse;
char hide_cursor;
char unfocused;