From cd024e21f0db76db95a6b61436d0819ccdf9112b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 21 Sep 2012 16:21:40 +0200 Subject: [PATCH] st-widget: Add method to clear background-image For performance reasons, resources required to paint a widget are aggressively cached; we know of at least one case where our caching prevents updating the used background-image correctly, so add explicit API to clear all associated cache data. https://bugzilla.gnome.org/show_bug.cgi?id=679268 --- src/st/st-widget.c | 35 +++++++++++++++++++++++++++++++++++ src/st/st-widget.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/src/st/st-widget.c b/src/st/st-widget.c index c867f7d44..27cc2fbc6 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -2760,3 +2760,38 @@ st_widget_get_focus_chain (StWidget *widget) { return ST_WIDGET_GET_CLASS (widget)->get_focus_chain (widget); } + +/** + * st_widget_clear_background_image: + * @widget: An #StWidget + * + * Force a reload of the background-image property. Usually properties + * are cached heavily to avoid unnecessary work on paint, this method + * will force the cache to be recreated. + */ +void +st_widget_clear_background_image (StWidget *actor) +{ + GFile *file; + const char *path; + char *uri; + + if (actor->priv->theme_node == NULL) + return; + + path = st_theme_node_get_background_image (actor->priv->theme_node); + if (path == NULL) + return; + + file = g_file_new_for_path (path); + uri = g_file_get_uri (file); + + st_texture_cache_clear_uri (st_texture_cache_get_default (), uri); + st_theme_node_invalidate_paint_state (actor->priv->theme_node); + + if (CLUTTER_ACTOR_IS_MAPPED (CLUTTER_ACTOR (actor))) + clutter_actor_queue_redraw (CLUTTER_ACTOR (actor)); + + g_object_unref (file); + g_free (uri); +} diff --git a/src/st/st-widget.h b/src/st/st-widget.h index eb9e4cec1..b04defa7d 100644 --- a/src/st/st-widget.h +++ b/src/st/st-widget.h @@ -142,6 +142,8 @@ ClutterActor * st_widget_get_label_actor (StWidget *widg void st_widget_set_label_actor (StWidget *widget, ClutterActor *label); +void st_widget_clear_background_image (StWidget *widget); + /* Only to be used by sub-classes of StWidget */ void st_widget_style_changed (StWidget *widget); StThemeNode * st_widget_get_theme_node (StWidget *widget);