aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-08 19:10:54 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-08 19:13:51 -0400
commitf0dcd27213628ec04f37623ee72ded56fbbeeee8 (patch)
tree4ffde0b1d4e0b10bb1bd193c4c26fb3e1bcfa904 /src
parentc64efa947ca2cf63c294dba4245fe14048f66adf (diff)
downloadrunes-f0dcd27213628ec04f37623ee72ded56fbbeeee8.tar.gz
runes-f0dcd27213628ec04f37623ee72ded56fbbeeee8.zip
use cairo groups instead of writing the double-buffering code myself
pretty much equivalent, but a lot simpler
Diffstat (limited to 'src')
-rw-r--r--src/display.c68
-rw-r--r--src/display.h4
-rw-r--r--src/term.c4
-rw-r--r--src/window-xlib.c7
4 files changed, 24 insertions, 59 deletions
diff --git a/src/display.c b/src/display.c
index c26c692..83ee9d9 100644
--- a/src/display.c
+++ b/src/display.c
@@ -22,30 +22,11 @@ void runes_display_init(RunesDisplay *display, char *font_name)
runes_display_recalculate_font_metrics(display, font_name);
}
-void runes_display_set_window_size(RunesTerm *t, int width, int height)
+void runes_display_set_context(RunesTerm *t, cairo_t *cr)
{
RunesDisplay *display = t->display;
- cairo_t *old_cr = NULL;
- cairo_surface_t *surface;
- if (width == display->xpixel && height == display->ypixel) {
- return;
- }
-
- display->xpixel = width;
- display->ypixel = height;
-
- old_cr = display->cr;
-
- /* XXX this should really use cairo_surface_create_similar_image, but when
- * i did that, drawing calls would occasionally block until an X event
- * occurred for some reason. should look into this, because i think
- * create_similar_image does things that are more efficient (using some
- * xlib shm stuff) */
- surface = cairo_image_surface_create(
- CAIRO_FORMAT_RGB24, display->xpixel, display->ypixel);
- display->cr = cairo_create(surface);
- cairo_surface_destroy(surface);
+ display->cr = cr;
if (display->layout) {
pango_cairo_update_layout(display->cr, display->layout);
}
@@ -63,24 +44,6 @@ void runes_display_set_window_size(RunesTerm *t, int width, int height)
pango_attr_list_unref(attrs);
pango_font_description_free(font_desc);
}
-
- cairo_save(display->cr);
-
- if (old_cr) {
- cairo_set_source_surface(
- display->cr, cairo_get_target(old_cr), 0.0, 0.0);
- }
- else {
- cairo_set_source(display->cr, t->config->bgdefault);
- }
-
- cairo_paint(display->cr);
-
- cairo_restore(display->cr);
-
- if (old_cr) {
- cairo_destroy(old_cr);
- }
}
void runes_display_draw_screen(RunesTerm *t)
@@ -96,6 +59,8 @@ void runes_display_draw_screen(RunesTerm *t)
display->has_selection = 0;
}
+ cairo_push_group(display->cr);
+
/* XXX quite inefficient */
rows = t->scr->grid->max.row;
for (r = 0; r < rows; ++r) {
@@ -106,11 +71,14 @@ void runes_display_draw_screen(RunesTerm *t)
}
}
+ cairo_pop_group_to_source(display->cr);
+ cairo_paint(display->cr);
+
t->scr->dirty = 0;
display->dirty = 0;
}
-void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr)
+void runes_display_draw_cursor(RunesTerm *t)
{
RunesDisplay *display = t->display;
@@ -128,30 +96,31 @@ void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr)
width *= 2;
}
- cairo_save(cr);
- cairo_set_source(cr, t->config->cursorcolor);
+ cairo_push_group(display->cr);
+ cairo_set_source(display->cr, t->config->cursorcolor);
if (display->unfocused) {
- cairo_set_line_width(cr, 1);
+ cairo_set_line_width(display->cr, 1);
cairo_rectangle(
- cr,
+ display->cr,
col * display->fontx + 0.5,
(row + display->row_visible_offset) * display->fonty + 0.5,
width - 1, display->fonty - 1);
- cairo_stroke(cr);
+ cairo_stroke(display->cr);
}
else {
cairo_rectangle(
- cr,
+ display->cr,
col * display->fontx,
(row + display->row_visible_offset) * display->fonty,
width, display->fonty);
- cairo_fill(cr);
+ cairo_fill(display->cr);
runes_display_draw_glyph(
- t, cr, t->config->bgdefault, cell->attrs,
+ t, display->cr, t->config->bgdefault, cell->attrs,
cell->contents, cell->len,
row + display->row_visible_offset, col);
}
- cairo_restore(cr);
+ cairo_pop_group_to_source(display->cr);
+ cairo_paint(display->cr);
}
}
@@ -218,7 +187,6 @@ int runes_display_loc_is_between(
void runes_display_cleanup(RunesDisplay *display)
{
g_object_unref(display->layout);
- cairo_destroy(display->cr);
}
static void runes_display_recalculate_font_metrics(
diff --git a/src/display.h b/src/display.h
index ba2bb13..4230fc4 100644
--- a/src/display.h
+++ b/src/display.h
@@ -25,9 +25,9 @@ struct runes_display {
};
void runes_display_init(RunesDisplay *display, char *font_name);
-void runes_display_set_window_size(RunesTerm *t, int width, int height);
+void runes_display_set_context(RunesTerm *t, cairo_t *cr);
void runes_display_draw_screen(RunesTerm *t);
-void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr);
+void runes_display_draw_cursor(RunesTerm *t);
int runes_display_loc_is_selected(RunesTerm *t, struct vt100_loc loc);
int runes_display_loc_is_between(
RunesTerm *t, struct vt100_loc loc,
diff --git a/src/term.c b/src/term.c
index 84d7f4f..0584653 100644
--- a/src/term.c
+++ b/src/term.c
@@ -30,9 +30,10 @@ void runes_term_init(RunesTerm *t, RunesLoop *loop, int argc, char *argv[])
t->scr = calloc(1, sizeof(VT100Screen));
vt100_screen_init(t->scr);
+ vt100_screen_set_scrollback_length(t->scr, t->config->scrollback_length);
runes_window_backend_create_window(t, argc, argv);
runes_pty_backend_spawn_subprocess(t);
- vt100_screen_set_scrollback_length(t->scr, t->config->scrollback_length);
+ runes_display_set_context(t, t->w->backend_cr);
runes_window_backend_get_size(t, &width, &height);
runes_term_set_window_size(t, width, height);
@@ -45,7 +46,6 @@ void runes_term_set_window_size(RunesTerm *t, int xpixel, int ypixel)
{
int row = ypixel / t->display->fonty, col = xpixel / t->display->fontx;
- runes_display_set_window_size(t, xpixel, ypixel);
runes_pty_backend_set_window_size(t, row, col, xpixel, ypixel);
vt100_screen_set_window_size(t->scr, row, col);
}
diff --git a/src/window-xlib.c b/src/window-xlib.c
index 68930d2..20f4eee 100644
--- a/src/window-xlib.c
+++ b/src/window-xlib.c
@@ -519,11 +519,7 @@ static void runes_window_backend_flush(RunesTerm *t)
}
runes_display_draw_screen(t);
-
- cairo_set_source_surface(
- w->backend_cr, cairo_get_target(t->display->cr), 0.0, 0.0);
- cairo_paint(w->backend_cr);
- runes_display_draw_cursor(t, w->backend_cr);
+ runes_display_draw_cursor(t);
cairo_surface_flush(cairo_get_target(w->backend_cr));
clock_gettime(CLOCK_REALTIME, &w->last_redraw);
@@ -879,6 +875,7 @@ static void runes_window_backend_handle_expose_event(
{
UNUSED(e);
+ t->display->dirty = 1;
runes_window_backend_flush(t);
}