diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-04-11 16:59:37 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-04-11 16:59:37 -0400 |
commit | 840a53511093dd25160e19eb18a13967ab642f72 (patch) | |
tree | 0d5846fd8a54958c915f876b4a262d94a940f8f9 | |
parent | ee0a4da6b224f7395139a231cc88c4464d2bbf65 (diff) | |
download | runes-840a53511093dd25160e19eb18a13967ab642f72.tar.gz runes-840a53511093dd25160e19eb18a13967ab642f72.zip |
and underline support
-rw-r--r-- | display.c | 40 | ||||
-rw-r--r-- | display.h | 2 | ||||
-rw-r--r-- | term.h | 1 | ||||
-rw-r--r-- | vt100.c | 6 |
4 files changed, 45 insertions, 4 deletions
@@ -17,10 +17,11 @@ void runes_display_init(RunesTerm *t) 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); - t->font_name = "monospace"; - t->font_size = 14.0; - t->font_bold = 0; - t->font_italic = 0; + t->font_name = "monospace"; + t->font_size = 14.0; + t->font_bold = 0; + t->font_italic = 0; + t->font_underline = 0; cairo_set_scaled_font(t->cr, runes_display_make_font(t)); @@ -87,6 +88,24 @@ void runes_display_show_string(RunesTerm *t, char *buf, size_t len) if (len) { buf[len] = '\0'; cairo_show_text(t->cr, buf); + + if (t->font_underline) { + double x, y; + double fontx, fonty, ascent; + + cairo_save(t->cr); + cairo_get_current_point(t->cr, &x, &y); + runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent); + cairo_set_line_width(t->cr, 1); + cairo_move_to( + t->cr, x - (fontx * strlen(buf)), y - ascent + fonty - 0.5); + cairo_line_to(t->cr, x, y - ascent + fonty - 0.5); + cairo_stroke(t->cr); + cairo_restore(t->cr); + + runes_display_move_to(t, t->row, t->col); + } + t->col += strlen(buf); /* we have to flush manually because XNextEvent (which normally handles * flushing) will most likely be called again before the keystroke is @@ -172,6 +191,7 @@ void runes_display_reset_text_attributes(RunesTerm *t) runes_display_reset_bg_color(t); runes_display_reset_bold(t); runes_display_reset_italic(t); + runes_display_reset_underline(t); } void runes_display_set_bold(RunesTerm *t) @@ -198,6 +218,18 @@ void runes_display_reset_italic(RunesTerm *t) cairo_set_scaled_font(t->cr, runes_display_make_font(t)); } +void runes_display_set_underline(RunesTerm *t) +{ + t->font_underline = 1; + cairo_set_scaled_font(t->cr, runes_display_make_font(t)); +} + +void runes_display_reset_underline(RunesTerm *t) +{ + t->font_underline = 0; + cairo_set_scaled_font(t->cr, runes_display_make_font(t)); +} + void runes_display_set_fg_color(RunesTerm *t, cairo_pattern_t *color) { t->fgcolor = color; @@ -17,6 +17,8 @@ void runes_display_set_bold(RunesTerm *t); void runes_display_reset_bold(RunesTerm *t); 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_fg_color(RunesTerm *t, cairo_pattern_t *color); void runes_display_reset_fg_color(RunesTerm *t); void runes_display_set_bg_color(RunesTerm *t, cairo_pattern_t *color); @@ -17,6 +17,7 @@ struct runes_term { double font_size; char font_italic; char font_bold; + char font_underline; cairo_pattern_t *colors[8]; @@ -216,12 +216,18 @@ static char *runes_vt100_handle_escape_sequence( case 3: runes_display_set_italic(t); break; + case 4: + runes_display_set_underline(t); + break; case 22: runes_display_reset_bold(t); break; case 23: runes_display_reset_italic(t); break; + case 24: + runes_display_reset_underline(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]); |