]> git.sur5r.net Git - i3/i3/commitdiff
Make freeing surfaces idempotent 2065/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Wed, 18 Nov 2015 14:32:45 +0000 (15:32 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Mon, 23 Nov 2015 21:18:02 +0000 (22:18 +0100)
If a window with border is set to "border none" and then closed, we would
call cairo_destroy / cairo_surface_destroy twice, causing an assertion
failure in cairo as the objects already had zero references the second
time. We fix this by explicitly setting these objects to NULL.

relates to #1278

libi3/draw_util.c

index f6c53865b4937cd0feb60cfa0f2249d37d2b7a84..e33a9ecbd4a05a8750abea3536b7bdc68013e2ca 100644 (file)
@@ -66,6 +66,12 @@ void draw_util_surface_free(xcb_connection_t *conn, surface_t *surface) {
 #ifdef CAIRO_SUPPORT
     cairo_surface_destroy(surface->surface);
     cairo_destroy(surface->cr);
+
+    /* We need to explicitly set these to NULL to avoid assertion errors in
+     * cairo when calling this multiple times. This can happen, for example,
+     * when setting the border of a window to none and then closing it. */
+    surface->surface = NULL;
+    surface->cr = NULL;
 #endif
 }