]> git.sur5r.net Git - i3/i3/commitdiff
Flush cairo surface after drawing text.
authorIngo Bürk <ingo.buerk@tngtech.com>
Tue, 13 Oct 2015 09:08:10 +0000 (11:08 +0200)
committerIngo Bürk <ingo.buerk@tngtech.com>
Tue, 13 Oct 2015 09:08:10 +0000 (11:08 +0200)
This is necessary to avoid a bug where a cairo assertion fails because no snapshot is available.

fixes #1989

i3bar/src/cairo_util.c
libi3/font.c

index 52181aee667b98f9826ee5dc33ccf1360067a72a..6a2ed0ac955e4740e4452e2e80af7266f96ecfe1 100644 (file)
@@ -78,9 +78,13 @@ void cairo_set_source_color(surface_t *surface, color_t color) {
  *
  */
 void cairo_draw_text(i3String *text, surface_t *surface, color_t fg_color, color_t bg_color, int x, int y, int max_width) {
+    /* Flush any changes before we draw the text as this might use XCB directly. */
+    cairo_surface_flush(surface->surface);
+
     set_font_colors(surface->gc, fg_color.colorpixel, bg_color.colorpixel);
     draw_text(text, surface->id, surface->gc, visual_type, x, y, max_width);
 
+    /* Notify cairo that we (possibly) used another way to draw on the surface. */
     cairo_surface_mark_dirty(surface->surface);
 }
 
@@ -130,6 +134,7 @@ void cairo_copy_surface(surface_t *src, surface_t *dest, double src_x, double sr
 
     /* Make sure we flush the surface for any text drawing operations that could follow.
      * Since we support drawing text via XCB, we need this. */
+    cairo_surface_flush(src->surface);
     cairo_surface_flush(dest->surface);
     cairo_restore(dest->cr);
 }
index 9e808a8923bf0ec6c09f0bbe1031c72d3ae6c0f9..b578bf8b0eb49ca7ae795e920f573f1cb0d95096 100644 (file)
@@ -133,6 +133,8 @@ static void draw_text_pango(const char *text, size_t text_len,
     cairo_move_to(cr, x, y - yoffset);
     pango_cairo_show_layout(cr, layout);
 
+    cairo_surface_flush(surface);
+
     /* Free resources */
     g_object_unref(layout);
     cairo_destroy(cr);