diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-11 00:09:16 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-11 00:09:16 -0400 |
commit | db264d8ac4b3a41228ae2eed4092092501ed2678 (patch) | |
tree | cb4ccac65c6e4d71c48ec2674decad483f22bc7a | |
parent | 528584f2f0e5b96c1819d1e48a8127ce7e869ae6 (diff) | |
download | runes-db264d8ac4b3a41228ae2eed4092092501ed2678.tar.gz runes-db264d8ac4b3a41228ae2eed4092092501ed2678.zip |
handle colors, somewhat
-rw-r--r-- | display.c | 35 | ||||
-rw-r--r-- | display.h | 3 | ||||
-rw-r--r-- | term.h | 2 | ||||
-rw-r--r-- | vt100.c | 55 |
4 files changed, 87 insertions, 8 deletions
@@ -7,9 +7,14 @@ void runes_display_init(RunesTerm *t) cairo_font_face_t *font_face; cairo_matrix_t font_matrix, ctm; - t->bgcolor = cairo_pattern_create_rgb(1.0, 1.0, 1.0); - t->fgcolor = cairo_pattern_create_rgb(0.0, 0.0, 1.0); - t->cursorcolor = cairo_pattern_create_rgb(0.0, 1.0, 0.0); + t->colors[0] = cairo_pattern_create_rgb(0.0, 0.0, 0.0); + t->colors[1] = cairo_pattern_create_rgb(1.0, 0.0, 0.0); + t->colors[2] = cairo_pattern_create_rgb(0.0, 1.0, 0.0); + t->colors[3] = cairo_pattern_create_rgb(1.0, 1.0, 0.0); + t->colors[4] = cairo_pattern_create_rgb(0.0, 0.0, 1.0); + t->colors[5] = cairo_pattern_create_rgb(1.0, 0.0, 1.0); + t->colors[6] = cairo_pattern_create_rgb(1.0, 1.0, 1.0); + t->colors[7] = cairo_pattern_create_rgb(1.0, 1.0, 1.0); font_face = cairo_toy_font_face_create("monospace", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_matrix_init_scale(&font_matrix, 14.0, 14.0); @@ -18,10 +23,13 @@ void runes_display_init(RunesTerm *t) cairo_set_scaled_font(t->cr, t->font); + runes_display_reset_text_attributes(t); + t->cursorcolor = cairo_pattern_create_rgb(0.0, 1.0, 0.0); + + cairo_save(t->cr); cairo_set_source(t->cr, t->bgcolor); cairo_paint(t->cr); - - cairo_set_source(t->cr, t->fgcolor); + cairo_restore(t->cr); runes_display_move_to(t, 0, 0); @@ -133,3 +141,20 @@ void runes_display_kill_line_forward(RunesTerm *t) runes_display_move_to(t, t->row, t->col); } + +void runes_display_reset_text_attributes(RunesTerm *t) +{ + runes_display_set_fg_color(t, t->colors[7]); + runes_display_set_bg_color(t, t->colors[0]); +} + +void runes_display_set_fg_color(RunesTerm *t, cairo_pattern_t *color) +{ + t->fgcolor = color; + cairo_set_source(t->cr, t->fgcolor); +} + +void runes_display_set_bg_color(RunesTerm *t, cairo_pattern_t *color) +{ + t->bgcolor = color; +} @@ -9,5 +9,8 @@ void runes_display_move_to(RunesTerm *t, int row, int col); void runes_display_show_string(RunesTerm *t, char *buf, size_t len); void runes_display_backspace(RunesTerm *t); void runes_display_kill_line_forward(RunesTerm *t); +void runes_display_reset_text_attributes(RunesTerm *t); +void runes_display_set_fg_color(RunesTerm *t, cairo_pattern_t *color); +void runes_display_set_bg_color(RunesTerm *t, cairo_pattern_t *color); #endif @@ -14,6 +14,8 @@ struct runes_term { cairo_pattern_t *cursorcolor; cairo_scaled_font_t *font; + cairo_pattern_t *colors[8]; + int row; int col; }; @@ -1,3 +1,4 @@ +#include <stdio.h> #include <string.h> #include "runes.h" @@ -16,8 +17,27 @@ static char *runes_vt100_handle_escape_sequence(RunesTerm *t, char *buf, size_t UNUSED(len); if (buf[1] == '[') { /* CSI */ - /* ignoring parameters, for now */ - switch (buf[2]) { + int p[3] = { -1, -1, -1 }; + int paramlen; + char type; + + buf += 2; + + /* XXX stop hardcoding the max number of parameters */ + if (sscanf(buf, "%d;%d;%d%c%n", &p[0], &p[1], &p[2], &type, ¶mlen) == 4) { + /* nothing */ + } + else if (sscanf(buf, "%d;%d%c%n", &p[0], &p[1], &type, ¶mlen) == 3) { + /* nothing */ + } + else if (sscanf(buf, "%d%c%n", &p[0], &type, ¶mlen) == 2) { + /* nothing */ + } + else if (sscanf(buf, "%c%n", &type, ¶mlen) == 1) { + /* nothing */ + } + + switch (type) { case 'D': { /* CUB */ int row, col; @@ -49,11 +69,40 @@ static char *runes_vt100_handle_escape_sequence(RunesTerm *t, char *buf, size_t case 'K': /* EL */ runes_display_kill_line_forward(t); break; + case 'm': { + int i; + + if (p[0] == -1) { + p[0] = 0; + } + + for (i = 0; i < 3; ++i) { + switch (p[i]) { + case -1: + break; + case 0: + runes_display_reset_text_attributes(t); + break; + case 30: case 31: case 32: case 33: + case 34: case 35: case 36: case 37: + runes_display_set_fg_color(t, t->colors[p[i] - 30]); + break; + case 40: case 41: case 42: case 43: + case 44: case 45: case 46: case 47: + runes_display_set_bg_color(t, t->colors[p[i] - 40]); + break; + /* XXX ... */ + default: + break; + } + } + break; + } default: break; } - buf += 3; + buf += paramlen; } else { /* do nothing, for now */ |