st/entry: Compare shadow spec before invalidating shadow on style change
Instead of doing a lot of useless work every time we receive the style-changed signal, only invalidate our text shadow pipeline in case the shadow actually changed. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1744>
This commit is contained in:
parent
3b4a1fcd51
commit
ba774e1fa2
@ -105,6 +105,8 @@ struct _StEntryPrivate
|
|||||||
|
|
||||||
gboolean has_ibeam;
|
gboolean has_ibeam;
|
||||||
|
|
||||||
|
StShadow *shadow_spec;
|
||||||
|
|
||||||
CoglPipeline *text_shadow_material;
|
CoglPipeline *text_shadow_material;
|
||||||
gfloat shadow_width;
|
gfloat shadow_width;
|
||||||
gfloat shadow_height;
|
gfloat shadow_height;
|
||||||
@ -242,13 +244,23 @@ st_entry_style_changed (StWidget *self)
|
|||||||
{
|
{
|
||||||
StEntryPrivate *priv = ST_ENTRY_PRIV (self);
|
StEntryPrivate *priv = ST_ENTRY_PRIV (self);
|
||||||
StThemeNode *theme_node;
|
StThemeNode *theme_node;
|
||||||
|
StShadow *shadow_spec;
|
||||||
ClutterColor color;
|
ClutterColor color;
|
||||||
gdouble size;
|
gdouble size;
|
||||||
|
|
||||||
cogl_clear_object (&priv->text_shadow_material);
|
|
||||||
|
|
||||||
theme_node = st_widget_get_theme_node (self);
|
theme_node = st_widget_get_theme_node (self);
|
||||||
|
|
||||||
|
shadow_spec = st_theme_node_get_text_shadow (theme_node);
|
||||||
|
if (!priv->shadow_spec || !shadow_spec ||
|
||||||
|
!st_shadow_equal (shadow_spec, priv->shadow_spec))
|
||||||
|
{
|
||||||
|
g_clear_pointer (&priv->text_shadow_material, cogl_object_unref);
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->shadow_spec, st_shadow_unref);
|
||||||
|
if (shadow_spec)
|
||||||
|
priv->shadow_spec = st_shadow_ref (shadow_spec);
|
||||||
|
}
|
||||||
|
|
||||||
_st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
|
_st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
|
||||||
|
|
||||||
if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
|
if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
|
||||||
@ -799,13 +811,11 @@ st_entry_paint (ClutterActor *actor,
|
|||||||
ClutterPaintContext *paint_context)
|
ClutterPaintContext *paint_context)
|
||||||
{
|
{
|
||||||
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
|
StEntryPrivate *priv = ST_ENTRY_PRIV (actor);
|
||||||
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
|
||||||
StShadow *shadow_spec = st_theme_node_get_text_shadow (theme_node);
|
|
||||||
ClutterActorClass *parent_class;
|
ClutterActorClass *parent_class;
|
||||||
|
|
||||||
st_widget_paint_background (ST_WIDGET (actor), paint_context);
|
st_widget_paint_background (ST_WIDGET (actor), paint_context);
|
||||||
|
|
||||||
if (shadow_spec)
|
if (priv->shadow_spec)
|
||||||
{
|
{
|
||||||
ClutterActorBox allocation;
|
ClutterActorBox allocation;
|
||||||
float width, height;
|
float width, height;
|
||||||
@ -821,7 +831,7 @@ st_entry_paint (ClutterActor *actor,
|
|||||||
|
|
||||||
cogl_clear_object (&priv->text_shadow_material);
|
cogl_clear_object (&priv->text_shadow_material);
|
||||||
|
|
||||||
material = _st_create_shadow_pipeline_from_actor (shadow_spec,
|
material = _st_create_shadow_pipeline_from_actor (priv->shadow_spec,
|
||||||
priv->entry);
|
priv->entry);
|
||||||
|
|
||||||
priv->shadow_width = width;
|
priv->shadow_width = width;
|
||||||
@ -834,7 +844,7 @@ st_entry_paint (ClutterActor *actor,
|
|||||||
CoglFramebuffer *framebuffer =
|
CoglFramebuffer *framebuffer =
|
||||||
clutter_paint_context_get_framebuffer (paint_context);
|
clutter_paint_context_get_framebuffer (paint_context);
|
||||||
|
|
||||||
_st_paint_shadow_with_opacity (shadow_spec,
|
_st_paint_shadow_with_opacity (priv->shadow_spec,
|
||||||
framebuffer,
|
framebuffer,
|
||||||
priv->text_shadow_material,
|
priv->text_shadow_material,
|
||||||
&allocation,
|
&allocation,
|
||||||
|
Loading…
Reference in New Issue
Block a user