aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-11 19:09:08 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-11 19:09:08 -0400
commit753f0ff60fb305f0087cb3e24bc24d4bbbfb4632 (patch)
tree98a65066eaf7a5edb066d63488b4afc7d952d565
parent67ed90e8683aab22876d13e864cf68bbb6196989 (diff)
downloadrunes-753f0ff60fb305f0087cb3e24bc24d4bbbfb4632.tar.gz
runes-753f0ff60fb305f0087cb3e24bc24d4bbbfb4632.zip
handle show/hide cursor
-rw-r--r--display.c38
-rw-r--r--display.h2
-rw-r--r--term.h2
-rw-r--r--vt100.c30
4 files changed, 60 insertions, 12 deletions
diff --git a/display.c b/display.c
index ab756b5..066399a 100644
--- a/display.c
+++ b/display.c
@@ -17,6 +17,9 @@ 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->cursorcolor = cairo_pattern_create_rgb(0.0, 1.0, 0.0);
+ t->show_cursor = 1;
+
t->font_name = "monospace";
t->font_size = 14.0;
t->font_bold = 0;
@@ -26,7 +29,6 @@ void runes_display_init(RunesTerm *t)
cairo_set_scaled_font(t->cr, runes_display_make_font(t));
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);
@@ -58,17 +60,19 @@ void runes_display_get_position(RunesTerm *t, int *row, int *col)
* time, and shouldn't be left behind when it moves */
void runes_display_draw_cursor(RunesTerm *t)
{
- double x, y;
- double fontx, fonty, ascent;
-
- cairo_save(t->backend_cr);
- cairo_set_source(t->backend_cr, t->cursorcolor);
- runes_display_move_to(t, t->row, t->col);
- cairo_get_current_point(t->cr, &x, &y);
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
- cairo_rectangle(t->backend_cr, x, y - ascent, fontx, fonty);
- cairo_fill(t->backend_cr);
- cairo_restore(t->backend_cr);
+ if (t->show_cursor) {
+ double x, y;
+ double fontx, fonty, ascent;
+
+ cairo_save(t->backend_cr);
+ cairo_set_source(t->backend_cr, t->cursorcolor);
+ runes_display_move_to(t, t->row, t->col);
+ cairo_get_current_point(t->cr, &x, &y);
+ runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
+ cairo_rectangle(t->backend_cr, x, y - ascent, fontx, fonty);
+ cairo_fill(t->backend_cr);
+ cairo_restore(t->backend_cr);
+ }
}
void runes_display_move_to(RunesTerm *t, int row, int col)
@@ -251,6 +255,16 @@ void runes_display_reset_bg_color(RunesTerm *t)
runes_display_set_bg_color(t, t->colors[0]);
}
+void runes_display_show_cursor(RunesTerm *t)
+{
+ t->show_cursor = 1;
+}
+
+void runes_display_hide_cursor(RunesTerm *t)
+{
+ t->show_cursor = 0;
+}
+
static void runes_display_get_font_dimensions(
RunesTerm *t, double *fontx, double *fonty, double *ascent)
{
diff --git a/display.h b/display.h
index 412fad8..d5c8559 100644
--- a/display.h
+++ b/display.h
@@ -23,5 +23,7 @@ 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);
void runes_display_reset_bg_color(RunesTerm *t);
+void runes_display_show_cursor(RunesTerm *t);
+void runes_display_hide_cursor(RunesTerm *t);
#endif
diff --git a/term.h b/term.h
index e637e69..18a2e65 100644
--- a/term.h
+++ b/term.h
@@ -19,6 +19,8 @@ struct runes_term {
char font_bold;
char font_underline;
+ char show_cursor;
+
cairo_pattern_t *colors[8];
int row;
diff --git a/vt100.c b/vt100.c
index 8769ff9..38430d5 100644
--- a/vt100.c
+++ b/vt100.c
@@ -227,6 +227,36 @@ static char *runes_vt100_handle_csi(RunesTerm *t, char *buf, size_t len)
break;
}
break;
+ case 'h':
+ if (dec) {
+ switch (p[0]) {
+ case 25:
+ runes_display_show_cursor(t);
+ break;
+ default:
+ runes_vt100_unhandled_csi(t, dec, p, type);
+ break;
+ }
+ }
+ else {
+ runes_vt100_unhandled_csi(t, dec, p, type);
+ }
+ break;
+ case 'l':
+ if (dec) {
+ switch (p[0]) {
+ case 25:
+ runes_display_hide_cursor(t);
+ break;
+ default:
+ runes_vt100_unhandled_csi(t, dec, p, type);
+ break;
+ }
+ }
+ else {
+ runes_vt100_unhandled_csi(t, dec, p, type);
+ }
+ break;
case 'm': { /* SGR */
int i;