aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-11 16:59:37 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-11 16:59:37 -0400
commit840a53511093dd25160e19eb18a13967ab642f72 (patch)
tree0d5846fd8a54958c915f876b4a262d94a940f8f9
parentee0a4da6b224f7395139a231cc88c4464d2bbf65 (diff)
downloadrunes-840a53511093dd25160e19eb18a13967ab642f72.tar.gz
runes-840a53511093dd25160e19eb18a13967ab642f72.zip
and underline support
-rw-r--r--display.c40
-rw-r--r--display.h2
-rw-r--r--term.h1
-rw-r--r--vt100.c6
4 files changed, 45 insertions, 4 deletions
diff --git a/display.c b/display.c
index 6213db0..ab756b5 100644
--- a/display.c
+++ b/display.c
@@ -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;
diff --git a/display.h b/display.h
index cdbb76a..412fad8 100644
--- a/display.h
+++ b/display.h
@@ -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);
diff --git a/term.h b/term.h
index 9f7bb86..e637e69 100644
--- a/term.h
+++ b/term.h
@@ -17,6 +17,7 @@ struct runes_term {
double font_size;
char font_italic;
char font_bold;
+ char font_underline;
cairo_pattern_t *colors[8];
diff --git a/vt100.c b/vt100.c
index fd8b1dd..99406bd 100644
--- a/vt100.c
+++ b/vt100.c
@@ -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]);