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;
if (cc->priv->current != NULL)
{
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_unset_state_flags (GTK_WIDGET (cc->priv->current), GTK_STATE_FLAG_SELECTED);
gtk_widget_set_state_flags (GTK_WIDGET (swatch), GTK_STATE_FLAG_SELECTED, FALSE);
cc->priv->current = swatch;
gtk_widget_queue_draw (GTK_WIDGET (cc->priv->current));
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),
TRUE);
}
gtk_widget_queue_draw (widget);
}
static void

View File

@@ -110,3 +110,47 @@ gtk_css_style_change_changes_property (GtkCssStyleChange *change,
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);
gboolean gtk_css_style_change_changes_property (GtkCssStyleChange *change,
guint id);
void gtk_css_style_change_print (GtkCssStyleChange *change, GString *string);
char * gtk_css_style_change_to_string (GtkCssStyleChange *change);
G_END_DECLS
#endif /* __GTK_CSS_STYLE_CHANGE_PRIVATE_H__ */

View File

@@ -1029,7 +1029,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_COLOR,
GDK_TYPE_RGBA,
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_query,
color_assign,
@@ -1056,7 +1056,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_THEME,
G_TYPE_NONE,
GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON,
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_theme_value_parse,
NULL,
NULL,
@@ -1065,7 +1065,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_PALETTE,
G_TYPE_NONE,
GTK_STYLE_PROPERTY_ANIMATED | GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON,
GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_palette_parse,
NULL,
NULL,
@@ -1603,7 +1603,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_SOURCE,
G_TYPE_NONE,
GTK_STYLE_PROPERTY_ANIMATED,
GTK_CSS_AFFECTS_ICON,
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
css_image_value_parse_with_builtin,
NULL,
NULL,
@@ -1612,7 +1612,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_SHADOW,
G_TYPE_NONE,
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,
NULL,
NULL,
@@ -1622,7 +1622,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_STYLE,
G_TYPE_NONE,
GTK_STYLE_PROPERTY_INHERIT,
GTK_CSS_AFFECTS_ICON,
GTK_CSS_AFFECTS_ICON | GTK_CSS_AFFECTS_SYMBOLIC_ICON,
icon_style_parse,
NULL,
NULL,
@@ -1631,7 +1631,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_PROPERTY_ICON_TRANSFORM,
G_TYPE_NONE,
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,
NULL,
NULL,

View File

@@ -105,7 +105,8 @@ typedef guint64 GtkCssChange;
* if it was cached.
* @GTK_CSS_AFFECTS_TEXT: Text rendering is 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
* only affect elements that can be focused.
* @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_ATTRS = (1 << 5),
GTK_CSS_AFFECTS_ICON = (1 << 6),
GTK_CSS_AFFECTS_OUTLINE = (1 << 7),
GTK_CSS_AFFECTS_CLIP = (1 << 8),
GTK_CSS_AFFECTS_SIZE = (1 << 9)
GTK_CSS_AFFECTS_SYMBOLIC_ICON = (1 << 7),
GTK_CSS_AFFECTS_OUTLINE = (1 << 8),
GTK_CSS_AFFECTS_CLIP = (1 << 9),
GTK_CSS_AFFECTS_SIZE = (1 << 10)
} GtkCssAffects;
#define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_FOREGROUND | \
GTK_CSS_AFFECTS_BACKGROUND | \
GTK_CSS_AFFECTS_BORDER | \
GTK_CSS_AFFECTS_ICON | \
GTK_CSS_AFFECTS_SYMBOLIC_ICON | \
GTK_CSS_AFFECTS_OUTLINE)
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_STATE_FLAG_SELECTED);
gtk_widget_queue_draw (GTK_WIDGET (child));
return TRUE;
}

View File

@@ -42,25 +42,43 @@ struct _GtkIconHelperPrivate {
guint use_fallback : 1;
guint force_scale_pixbuf : 1;
guint rendered_surface_is_symbolic : 1;
cairo_surface_t *rendered_surface;
};
G_DEFINE_TYPE_WITH_PRIVATE (GtkIconHelper, gtk_icon_helper, GTK_TYPE_CSS_GADGET)
void
static void
gtk_icon_helper_invalidate (GtkIconHelper *self)
{
if (self->priv->rendered_surface != NULL)
{
cairo_surface_destroy (self->priv->rendered_surface);
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))))
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
gtk_icon_helper_take_definition (GtkIconHelper *self,
GtkImageDefinition *def)
@@ -145,8 +163,7 @@ static void
gtk_icon_helper_style_changed (GtkCssGadget *gadget,
GtkCssStyleChange *change)
{
if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_ICON))
gtk_icon_helper_invalidate (GTK_ICON_HELPER (gadget));
gtk_icon_helper_invalidate_for_change (GTK_ICON_HELPER (gadget), change);
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);
@@ -205,6 +222,7 @@ gtk_icon_helper_init (GtkIconHelper *self)
self->priv->icon_size = GTK_ICON_SIZE_INVALID;
self->priv->pixel_size = -1;
self->priv->rendered_surface_is_symbolic = FALSE;
}
static void
@@ -419,6 +437,7 @@ ensure_surface_for_gicon (GtkIconHelper *self,
gint scale,
GIcon *gicon)
{
GtkIconHelperPrivate *priv = self->priv;
GtkIconTheme *icon_theme;
gint width, height;
GtkIconInfo *info;
@@ -478,18 +497,20 @@ ensure_surface_for_gicon (GtkIconHelper *self,
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)
{
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));
gtk_css_icon_effect_apply (icon_effect, surface);
}
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);
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,
gboolean force_scale);
void gtk_icon_helper_invalidate (GtkIconHelper *self);
void gtk_icon_helper_invalidate_for_change (GtkIconHelper *self,
GtkCssStyleChange *change);
G_END_DECLS

View File

@@ -1923,16 +1923,10 @@ gtk_image_style_updated (GtkWidget *widget)
{
GtkImage *image = GTK_IMAGE (widget);
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);
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_icon_helper_invalidate_for_change (priv->icon_helper, change);
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_STATE_FLAG_ACTIVE,
FALSE);
gtk_widget_queue_draw (GTK_WIDGET (box));
if (n_press == 2 && !priv->activate_single_click)
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_active = FALSE;
gtk_widget_queue_draw (GTK_WIDGET (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);
else
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
gtk_widget_queue_draw (widget);
}
void