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
This commit is contained in:
Florian Müllner 2012-09-21 16:21:40 +02:00
parent c4c470c1f3
commit cd024e21f0
2 changed files with 37 additions and 0 deletions

View File

@ -2760,3 +2760,38 @@ st_widget_get_focus_chain (StWidget *widget)
{ {
return ST_WIDGET_GET_CLASS (widget)->get_focus_chain (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);
}

View File

@ -142,6 +142,8 @@ ClutterActor * st_widget_get_label_actor (StWidget *widg
void st_widget_set_label_actor (StWidget *widget, void st_widget_set_label_actor (StWidget *widget,
ClutterActor *label); ClutterActor *label);
void st_widget_clear_background_image (StWidget *widget);
/* Only to be used by sub-classes of StWidget */ /* Only to be used by sub-classes of StWidget */
void st_widget_style_changed (StWidget *widget); void st_widget_style_changed (StWidget *widget);
StThemeNode * st_widget_get_theme_node (StWidget *widget); StThemeNode * st_widget_get_theme_node (StWidget *widget);