Compare commits

...

9 Commits

Author SHA1 Message Date
Timm Bäder
d9dd36094b image: _get_style_context never returns NULL 2016-02-07 08:54:41 +01:00
Timm Bäder
aae83422bd Make gtk_icon_helper_invalidate private 2016-02-07 08:54:41 +01:00
Timm Bäder
6e679f82f8 Add and use gtk_icon_helper_invalidate_for_change 2016-02-07 08:54:41 +01:00
Timm Bäder
8b2528d753 iconhelper: Save whether the surface is symbolic 2016-02-07 08:54:41 +01:00
Timm Bäder
2046e32a98 stylepropertyimpl: Use GTK_CSS_AFFECTS_SYMBOLIC_ICON
Things like color affect symbolic icons, but not colored icons, while
other css properties like -gtk-icon-effect affect colored icons, but not
symbolic ones.
2016-02-07 08:54:40 +01:00
Timm Bäder
da62103d23 csstypes: Add GTK_CSS_AFFECTS_SYMBOLIC_ICON 2016-02-07 08:54:40 +01:00
Timm Bäder
f323a3fb65 cssstylechange: Add helper function to print change
So I don't have to print both styles to the console, paste them both
into a file and then run diff on the 2 files anymore.
2016-02-07 08:54:40 +01:00
Timm Bäder
c53a060747 iconhelper: Un-duplicate some code 2016-02-07 08:54:40 +01:00
Timm Bäder
ff786f7e6b Remove more unnecessary redraws
The call to gtk_widget_set_state_flags immediately before these already
queues a redraw/allocate/resize in case they have to be queued.
2016-02-07 08:54:40 +01:00
12 changed files with 92 additions and 39 deletions

View File

@@ -105,14 +105,10 @@ select_swatch (GtkColorChooserWidget *cc,
return; return;
if (cc->priv->current != NULL) if (cc->priv->current != NULL)
{ gtk_widget_unset_state_flags (GTK_WIDGET (cc->priv->current), GTK_STATE_FLAG_SELECTED);
gtk_widget_unset_state_flags (GTK_WIDGET (cc->priv->current), GTK_STATE_FLAG_SELECTED);
gtk_widget_queue_draw (GTK_WIDGET (cc->priv->current));
}
gtk_widget_set_state_flags (GTK_WIDGET (swatch), GTK_STATE_FLAG_SELECTED, FALSE); gtk_widget_set_state_flags (GTK_WIDGET (swatch), GTK_STATE_FLAG_SELECTED, FALSE);
cc->priv->current = swatch; cc->priv->current = swatch;
gtk_widget_queue_draw (GTK_WIDGET (cc->priv->current));
gtk_color_swatch_get_rgba (swatch, &color); gtk_color_swatch_get_rgba (swatch, &color);

View File

@@ -1648,8 +1648,6 @@ gtk_combo_box_button_state_flags_changed (GtkWidget *widget,
gtk_widget_get_state_flags (widget), gtk_widget_get_state_flags (widget),
TRUE); TRUE);
} }
gtk_widget_queue_draw (widget);
} }
static void static void

View File

@@ -110,3 +110,47 @@ gtk_css_style_change_changes_property (GtkCssStyleChange *change,
return _gtk_bitmask_get (change->changes, id); return _gtk_bitmask_get (change->changes, id);
} }
void
gtk_css_style_change_print (GtkCssStyleChange *change,
GString *string)
{
int i;
GtkCssStyle *old = gtk_css_style_change_get_old_style (change);
GtkCssStyle *new = gtk_css_style_change_get_new_style (change);
for (i = 0; i < GTK_CSS_PROPERTY_N_PROPERTIES; i ++)
{
if (gtk_css_style_change_changes_property (change, i))
{
GtkCssStyleProperty *prop;
GtkCssValue *value;
const char *name;
prop = _gtk_css_style_property_lookup_by_id (i);
name = _gtk_style_property_get_name (GTK_STYLE_PROPERTY (prop));
value = gtk_css_style_get_value (old, i);
_gtk_css_value_print (value, string);
g_string_append_printf (string, "%s: ", name);
_gtk_css_value_print (value, string);
g_string_append (string, "\n");
g_string_append_printf (string, "%s: ", name);
value = gtk_css_style_get_value (new, i);
_gtk_css_value_print (value, string);
g_string_append (string, "\n");
}
}
}
char *
gtk_css_style_change_to_string (GtkCssStyleChange *change)
{
GString *string = g_string_new ("");
gtk_css_style_change_print (change, string);
return g_string_free (string, FALSE);
}

View File

@@ -47,7 +47,9 @@ gboolean gtk_css_style_change_affects (GtkCssStyleChange
GtkCssAffects affects); GtkCssAffects affects);
gboolean gtk_css_style_change_changes_property (GtkCssStyleChange *change, gboolean gtk_css_style_change_changes_property (GtkCssStyleChange *change,
guint id); guint id);
void gtk_css_style_change_print (GtkCssStyleChange *change, GString *string);
char * gtk_css_style_change_to_string (GtkCssStyleChange *change);
G_END_DECLS G_END_DECLS
#endif /* __GTK_CSS_STYLE_CHANGE_PRIVATE_H__ */ #endif /* __GTK_CSS_STYLE_CHANGE_PRIVATE_H__ */

View File

@@ -1029,7 +1029,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_COLOR, GTK_CSS_PROPERTY_COLOR,
GDK_TYPE_RGBA, GDK_TYPE_RGBA,
GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED, GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_FOREGROUND | GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_ICON, GTK_CSS_AFFECTS_FOREGROUND | GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
color_parse, color_parse,
color_query, color_query,
color_assign, color_assign,
@@ -1056,7 +1056,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_THEME, GTK_CSS_PROPERTY_ICON_THEME,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_INHERIT, GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON, GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_theme_value_parse, icon_theme_value_parse,
NULL, NULL,
NULL, NULL,
@@ -1065,7 +1065,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_PALETTE, GTK_CSS_PROPERTY_ICON_PALETTE,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_INHERIT, GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON, GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_palette_parse, icon_palette_parse,
NULL, NULL,
NULL, NULL,
@@ -1603,7 +1603,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_SOURCE, GTK_CSS_PROPERTY_ICON_SOURCE,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_ANIMATED, GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_ICON, GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
css_image_value_parse_with_builtin, css_image_value_parse_with_builtin,
NULL, NULL,
NULL, NULL,
@@ -1612,7 +1612,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_SHADOW, GTK_CSS_PROPERTY_ICON_SHADOW,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED, GTK_STYLE_PROPERTY_INHERIT | GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_CLIP, GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_CLIP,
shadow_value_parse, shadow_value_parse,
NULL, NULL,
NULL, NULL,
@@ -1622,7 +1622,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_STYLE, GTK_CSS_PROPERTY_ICON_STYLE,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_INHERIT, GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON, GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_style_parse, icon_style_parse,
NULL, NULL,
NULL, NULL,
@@ -1631,7 +1631,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_TRANSFORM, GTK_CSS_PROPERTY_ICON_TRANSFORM,
G_TYPE_NONE, G_TYPE_NONE,
GTK_STYLE_PROPERTY_ANIMATED, GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_CLIP, GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON | GTK_CSS_AFFECTS_CLIP,
transform_value_parse, transform_value_parse,
NULL, NULL,
NULL, NULL,

View File

@@ -105,7 +105,8 @@ typedef guint64 GtkCssChange;
* if it was cached. * if it was cached.
* @GTK_CSS_AFFECTS_TEXT: Text rendering is affected. * @GTK_CSS_AFFECTS_TEXT: Text rendering is affected.
* @GTK_CSS_AFFECTS_TEXT_ATTRS: Text attributes are affected. * @GTK_CSS_AFFECTS_TEXT_ATTRS: Text attributes are affected.
* @GTK_CSS_AFFECTS_ICON: Icons and icon rendering is affected. * @GTK_CSS_AFFECTS_ICON: Fullcolor icons and their rendering is affected.
* @GTK_CSS_AFFECTS_SYMBOLIC_ICON: Symbolic icons and their rendering is affected.
* @GTK_CSS_AFFECTS_OUTLINE: The outline styling is affected. Outlines * @GTK_CSS_AFFECTS_OUTLINE: The outline styling is affected. Outlines
* only affect elements that can be focused. * only affect elements that can be focused.
* @GTK_CSS_AFFECTS_CLIP: Changes in this property may have an effect * @GTK_CSS_AFFECTS_CLIP: Changes in this property may have an effect
@@ -128,15 +129,17 @@ typedef enum {
GTK_CSS_AFFECTS_TEXT = (1 << 4), GTK_CSS_AFFECTS_TEXT = (1 << 4),
GTK_CSS_AFFECTS_TEXT_ATTRS = (1 << 5), GTK_CSS_AFFECTS_TEXT_ATTRS = (1 << 5),
GTK_CSS_AFFECTS_ICON = (1 << 6), GTK_CSS_AFFECTS_ICON = (1 << 6),
GTK_CSS_AFFECTS_OUTLINE = (1 << 7), GTK_CSS_AFFECTS_SYMBOLIC_ICON = (1 << 7),
GTK_CSS_AFFECTS_CLIP = (1 << 8), GTK_CSS_AFFECTS_OUTLINE = (1 << 8),
GTK_CSS_AFFECTS_SIZE = (1 << 9) GTK_CSS_AFFECTS_CLIP = (1 << 9),
GTK_CSS_AFFECTS_SIZE = (1 << 10)
} GtkCssAffects; } GtkCssAffects;
#define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_FOREGROUND | \ #define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_FOREGROUND | \
GTK_CSS_AFFECTS_BACKGROUND | \ GTK_CSS_AFFECTS_BACKGROUND | \
GTK_CSS_AFFECTS_BORDER | \ GTK_CSS_AFFECTS_BORDER | \
GTK_CSS_AFFECTS_ICON | \ GTK_CSS_AFFECTS_ICON | \
GTK_CSS_AFFECTS_SYMBOLIC_ICON | \
GTK_CSS_AFFECTS_OUTLINE) GTK_CSS_AFFECTS_OUTLINE)
enum { /*< skip >*/ enum { /*< skip >*/

View File

@@ -993,8 +993,6 @@ gtk_flow_box_child_set_selected (GtkFlowBoxChild *child,
gtk_widget_unset_state_flags (GTK_WIDGET (child), gtk_widget_unset_state_flags (GTK_WIDGET (child),
GTK_STATE_FLAG_SELECTED); GTK_STATE_FLAG_SELECTED);
gtk_widget_queue_draw (GTK_WIDGET (child));
return TRUE; return TRUE;
} }

View File

@@ -42,25 +42,43 @@ struct _GtkIconHelperPrivate {
guint use_fallback : 1; guint use_fallback : 1;
guint force_scale_pixbuf : 1; guint force_scale_pixbuf : 1;
guint rendered_surface_is_symbolic : 1;
cairo_surface_t *rendered_surface; cairo_surface_t *rendered_surface;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (GtkIconHelper, gtk_icon_helper, GTK_TYPE_CSS_GADGET) G_DEFINE_TYPE_WITH_PRIVATE (GtkIconHelper, gtk_icon_helper, GTK_TYPE_CSS_GADGET)
void static void
gtk_icon_helper_invalidate (GtkIconHelper *self) gtk_icon_helper_invalidate (GtkIconHelper *self)
{ {
if (self->priv->rendered_surface != NULL) if (self->priv->rendered_surface != NULL)
{ {
cairo_surface_destroy (self->priv->rendered_surface); cairo_surface_destroy (self->priv->rendered_surface);
self->priv->rendered_surface = NULL; self->priv->rendered_surface = NULL;
self->priv->rendered_surface_is_symbolic = FALSE;
} }
if (!GTK_IS_CSS_TRANSIENT_NODE (gtk_css_gadget_get_node (GTK_CSS_GADGET (self)))) if (!GTK_IS_CSS_TRANSIENT_NODE (gtk_css_gadget_get_node (GTK_CSS_GADGET (self))))
gtk_widget_queue_resize (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))); gtk_widget_queue_resize (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self)));
} }
void
gtk_icon_helper_invalidate_for_change (GtkIconHelper *self,
GtkCssStyleChange *change)
{
GtkIconHelperPrivate *priv = self->priv;
if (change &&
((gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_SYMBOLIC_ICON) &&
priv->rendered_surface_is_symbolic) ||
(gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON) &&
!priv->rendered_surface_is_symbolic)))
{
gtk_icon_helper_invalidate (self);
}
}
static void static void
gtk_icon_helper_take_definition (GtkIconHelper *self, gtk_icon_helper_take_definition (GtkIconHelper *self,
GtkImageDefinition *def) GtkImageDefinition *def)
@@ -145,8 +163,7 @@ static void
gtk_icon_helper_style_changed (GtkCssGadget *gadget, gtk_icon_helper_style_changed (GtkCssGadget *gadget,
GtkCssStyleChange *change) GtkCssStyleChange *change)
{ {
if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON)) gtk_icon_helper_invalidate_for_change (GTK_ICON_HELPER (gadget), change);
gtk_icon_helper_invalidate (GTK_ICON_HELPER (gadget));
if (!GTK_IS_CSS_TRANSIENT_NODE (gtk_css_gadget_get_node (gadget))) if (!GTK_IS_CSS_TRANSIENT_NODE (gtk_css_gadget_get_node (gadget)))
GTK_CSS_GADGET_CLASS (gtk_icon_helper_parent_class)->style_changed (gadget, change); GTK_CSS_GADGET_CLASS (gtk_icon_helper_parent_class)->style_changed (gadget, change);
@@ -205,6 +222,7 @@ gtk_icon_helper_init (GtkIconHelper *self)
self->priv->icon_size = GTK_ICON_SIZE_INVALID; self->priv->icon_size = GTK_ICON_SIZE_INVALID;
self->priv->pixel_size = -1; self->priv->pixel_size = -1;
self->priv->rendered_surface_is_symbolic = FALSE;
} }
static void static void
@@ -419,6 +437,7 @@ ensure_surface_for_gicon (GtkIconHelper *self,
gint scale, gint scale,
GIcon *gicon) GIcon *gicon)
{ {
GtkIconHelperPrivate *priv = self->priv;
GtkIconTheme *icon_theme; GtkIconTheme *icon_theme;
gint width, height; gint width, height;
GtkIconInfo *info; GtkIconInfo *info;
@@ -478,18 +497,20 @@ ensure_surface_for_gicon (GtkIconHelper *self,
symbolic = FALSE; symbolic = FALSE;
} }
surface = gdk_cairo_surface_create_from_pixbuf (destination, scale, gtk_widget_get_window (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))));
if (!symbolic) if (!symbolic)
{ {
GtkCssIconEffect icon_effect; GtkCssIconEffect icon_effect;
surface = gdk_cairo_surface_create_from_pixbuf (destination, scale, gtk_widget_get_window (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self))));
icon_effect = _gtk_css_icon_effect_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_EFFECT)); icon_effect = _gtk_css_icon_effect_value_get (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_EFFECT));
gtk_css_icon_effect_apply (icon_effect, surface); gtk_css_icon_effect_apply (icon_effect, surface);
} }
else else
{ {
surface = gdk_cairo_surface_create_from_pixbuf (destination, scale, gtk_widget_get_window (gtk_css_gadget_get_owner (GTK_CSS_GADGET (self)))); priv->rendered_surface_is_symbolic = TRUE;
} }
g_object_unref (destination); g_object_unref (destination);
return surface; return surface;

View File

@@ -138,7 +138,8 @@ gboolean _gtk_icon_helper_get_force_scale_pixbuf (GtkIconHelper *self);
void _gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self, void _gtk_icon_helper_set_force_scale_pixbuf (GtkIconHelper *self,
gboolean force_scale); gboolean force_scale);
void gtk_icon_helper_invalidate (GtkIconHelper *self); void gtk_icon_helper_invalidate_for_change (GtkIconHelper *self,
GtkCssStyleChange *change);
G_END_DECLS G_END_DECLS

View File

@@ -1923,16 +1923,10 @@ gtk_image_style_updated (GtkWidget *widget)
{ {
GtkImage *image = GTK_IMAGE (widget); GtkImage *image = GTK_IMAGE (widget);
GtkImagePrivate *priv = image->priv; GtkImagePrivate *priv = image->priv;
GtkStyleContext *context; GtkStyleContext *context = gtk_widget_get_style_context (widget);
GtkCssStyleChange *change = gtk_style_context_get_change (context);
context = gtk_widget_get_style_context (widget); gtk_icon_helper_invalidate_for_change (priv->icon_helper, change);
if (context)
{
GtkCssStyleChange *change = gtk_style_context_get_change (context);
if (change && gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON))
gtk_icon_helper_invalidate (priv->icon_helper);
}
GTK_WIDGET_CLASS (gtk_image_parent_class)->style_updated (widget); GTK_WIDGET_CLASS (gtk_image_parent_class)->style_updated (widget);

View File

@@ -1911,7 +1911,6 @@ gtk_list_box_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
gtk_widget_set_state_flags (GTK_WIDGET (priv->active_row), gtk_widget_set_state_flags (GTK_WIDGET (priv->active_row),
GTK_STATE_FLAG_ACTIVE, GTK_STATE_FLAG_ACTIVE,
FALSE); FALSE);
gtk_widget_queue_draw (GTK_WIDGET (box));
if (n_press == 2 && !priv->activate_single_click) if (n_press == 2 && !priv->activate_single_click)
gtk_list_box_activate (box, row); gtk_list_box_activate (box, row);
@@ -1989,7 +1988,6 @@ gtk_list_box_multipress_gesture_released (GtkGestureMultiPress *gesture,
priv->active_row = NULL; priv->active_row = NULL;
priv->active_row_active = FALSE; priv->active_row_active = FALSE;
gtk_widget_queue_draw (GTK_WIDGET (box));
g_object_unref (box); g_object_unref (box);
} }

View File

@@ -11921,8 +11921,6 @@ ensure_state_flag_backdrop (GtkWidget *widget)
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_BACKDROP, FALSE); gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_BACKDROP, FALSE);
else else
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP); gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
gtk_widget_queue_draw (widget);
} }
void void