diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-19 17:10:12 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-19 17:10:12 -0400 |
commit | ab063f3928a27601bd4c7ca514d78a544ba7ffcf (patch) | |
tree | f7a2a582072c4605bf5257eb448a9ad04db70833 | |
parent | 6424c4929f8de18799d4d01a71cf2f5e21701126 (diff) | |
download | runes-ab063f3928a27601bd4c7ca514d78a544ba7ffcf.tar.gz runes-ab063f3928a27601bd4c7ca514d78a544ba7ffcf.zip |
handle inverted text
-rw-r--r-- | display.c | 38 | ||||
-rw-r--r-- | display.h | 2 | ||||
-rw-r--r-- | parser.c | 6 | ||||
-rw-r--r-- | parser.l | 6 | ||||
-rw-r--r-- | term.h | 1 |
5 files changed, 46 insertions, 7 deletions
@@ -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]; } } @@ -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); @@ -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); @@ -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); @@ -38,6 +38,7 @@ struct runes_term { PangoLayout *layout; char bold; + char inverse; char hide_cursor; char unfocused; |