diff options
author | Jesse Luehrs <doy@tozt.net> | 2016-05-08 19:10:54 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2016-05-08 19:13:51 -0400 |
commit | f0dcd27213628ec04f37623ee72ded56fbbeeee8 (patch) | |
tree | 4ffde0b1d4e0b10bb1bd193c4c26fb3e1bcfa904 /src | |
parent | c64efa947ca2cf63c294dba4245fe14048f66adf (diff) | |
download | runes-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.c | 68 | ||||
-rw-r--r-- | src/display.h | 4 | ||||
-rw-r--r-- | src/term.c | 4 | ||||
-rw-r--r-- | src/window-xlib.c | 7 |
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, @@ -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); } |