Index: gtkhid-cairo.c =================================================================== --- gtkhid-cairo.c (revision 10386) +++ gtkhid-cairo.c (revision 10387) @@ -141,6 +141,27 @@ cairo_stroke(cr); } +/** First, frees previous surface and context, then creates new ones, similar to drawing_area. */ +static void cr_create_similar_surface_and_context(cairo_surface_t ** psurf, cairo_t ** pcr, void *vport) +{ + GHidPort *port = vport; + cairo_surface_t *surface; + cairo_t *cr; + + if (*psurf) + cairo_surface_destroy(*psurf); + + surface = gdk_window_create_similar_surface(gtk_widget_get_window(port->drawing_area), + CAIRO_CONTENT_COLOR_ALPHA, + gtk_widget_get_allocated_width(port->drawing_area), + gtk_widget_get_allocated_height(port->drawing_area)); + *psurf = surface; + if (*pcr) + cairo_destroy(*pcr); + cr = cairo_create(surface); + *pcr = cr; +} + static void start_subcomposite(void) { } @@ -1373,17 +1394,9 @@ done_once = 1; } - if (priv->surf_da) - cairo_surface_destroy(priv->surf_da); + /* Creates a single cairo surface/context for off-line painting */ + cr_create_similar_surface_and_context(&priv->surf_da, &priv->cr_drawing_area, port); - /* Creates a single cairo surface/context for off-line painting */ - priv->surf_da = gdk_window_create_similar_surface(gtk_widget_get_window(port->drawing_area), - CAIRO_CONTENT_COLOR_ALPHA, - gtk_widget_get_allocated_width(port->drawing_area), - gtk_widget_get_allocated_height(port->drawing_area)); - if (priv->cr_drawing_area) - cairo_destroy(priv->cr_drawing_area); - priv->cr_drawing_area = cairo_create(priv->surf_da); priv->cr = priv->cr_drawing_area; }