cairo-util: Don't leak Pango objects
Rework PangoCairo context initialisation, so we don't leak either the Pango layout, or any of the derived objects it creates. Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
parent
d43931080e
commit
29c3422e05
@ -490,16 +490,26 @@ theme_destroy(struct theme *t)
|
|||||||
static PangoLayout *
|
static PangoLayout *
|
||||||
create_layout(cairo_t *cr, const char *title)
|
create_layout(cairo_t *cr, const char *title)
|
||||||
{
|
{
|
||||||
|
PangoFontMap *fontmap;
|
||||||
|
PangoContext *context;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
PangoFontDescription *desc;
|
PangoFontDescription *desc;
|
||||||
|
|
||||||
layout = pango_cairo_create_layout(cr);
|
fontmap = pango_cairo_font_map_new();
|
||||||
|
context = pango_font_map_create_context(fontmap);
|
||||||
|
g_object_unref(fontmap);
|
||||||
|
pango_cairo_font_map_set_default(NULL);
|
||||||
|
pango_cairo_update_context(cr, context);
|
||||||
|
layout = pango_layout_new(context);
|
||||||
|
g_object_unref(context);
|
||||||
|
|
||||||
if (title) {
|
if (title) {
|
||||||
pango_layout_set_text(layout, title, -1);
|
pango_layout_set_text(layout, title, -1);
|
||||||
desc = pango_font_description_from_string("sans-serif Bold 10");
|
desc = pango_font_description_from_string("sans-serif Bold 10");
|
||||||
pango_layout_set_font_description(layout, desc);
|
pango_layout_set_font_description(layout, desc);
|
||||||
pango_font_description_free(desc);
|
pango_font_description_free(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
|
||||||
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
|
||||||
pango_layout_set_auto_dir (layout, FALSE);
|
pango_layout_set_auto_dir (layout, FALSE);
|
||||||
@ -567,6 +577,8 @@ theme_render_frame(struct theme *t,
|
|||||||
PangoLayout *title_layout;
|
PangoLayout *title_layout;
|
||||||
PangoRectangle logical;
|
PangoRectangle logical;
|
||||||
|
|
||||||
|
cairo_save(cr);
|
||||||
|
|
||||||
title_layout = create_layout(cr, title);
|
title_layout = create_layout(cr, title);
|
||||||
|
|
||||||
pango_layout_get_pixel_extents (title_layout, NULL, &logical);
|
pango_layout_get_pixel_extents (title_layout, NULL, &logical);
|
||||||
@ -608,6 +620,11 @@ theme_render_frame(struct theme *t,
|
|||||||
cairo_set_source_rgb(cr, 0.4, 0.4, 0.4);
|
cairo_set_source_rgb(cr, 0.4, 0.4, 0.4);
|
||||||
SHOW_TEXT(cr);
|
SHOW_TEXT(cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_PANGO
|
||||||
|
cairo_restore(cr);
|
||||||
|
g_object_unref(title_layout);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user