static GtkSettings * gtk_style_cascade_get_settings (GtkStyleProviderPrivate *provider) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkSettings *settings; GtkStyleProvider *item; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { if (!GTK_IS_STYLE_PROVIDER_PRIVATE (item)) continue; settings = _gtk_style_provider_private_get_settings (GTK_STYLE_PROVIDER_PRIVATE (item)); if (settings) { gtk_style_cascade_iter_clear (&iter); return settings; } } gtk_style_cascade_iter_clear (&iter); return NULL; }
static void gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider, const GtkCssMatcher *matcher, GtkCssLookup *lookup) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkStyleProvider *item; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { if (GTK_IS_STYLE_PROVIDER_PRIVATE (item)) { _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (item), matcher, lookup); } else { /* you lose */ g_warn_if_reached (); } } }
static GtkCssKeyframes * gtk_style_cascade_get_keyframes (GtkStyleProviderPrivate *provider, const char *name) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkCssKeyframes *keyframes; GtkStyleProvider *item; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { if (!GTK_IS_STYLE_PROVIDER_PRIVATE (item)) continue; keyframes = _gtk_style_provider_private_get_keyframes (GTK_STYLE_PROVIDER_PRIVATE (item), name); if (keyframes) { gtk_style_cascade_iter_clear (&iter); return keyframes; } } gtk_style_cascade_iter_clear (&iter); return NULL; }
void _gtk_modifier_style_map_color (GtkModifierStyle *style, const gchar *name, const GdkRGBA *color) { GtkModifierStylePrivate *priv; GtkSymbolicColor *symbolic_color = NULL; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); g_return_if_fail (name != NULL); priv = style->priv; G_GNUC_BEGIN_IGNORE_DEPRECATIONS; if (color) symbolic_color = gtk_symbolic_color_new_literal (color); gtk_style_properties_map_color (priv->style, name, symbolic_color); G_GNUC_END_IGNORE_DEPRECATIONS; g_signal_emit (style, signals[CHANGED], 0); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); }
static GtkCssChange gtk_style_cascade_get_change (GtkStyleProviderPrivate *provider, const GtkCssMatcher *matcher) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkStyleProvider *item; GtkCssChange change = 0; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { if (GTK_IS_STYLE_PROVIDER_PRIVATE (item)) { change |= _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (item), matcher); } else { g_return_val_if_reached (GTK_CSS_CHANGE_ANY); } } return change; }
void _gtk_style_cascade_add_provider (GtkStyleCascade *cascade, GtkStyleProvider *provider, guint priority) { GtkStyleProviderData data; guint i; g_return_if_fail (GTK_IS_STYLE_CASCADE (cascade)); g_return_if_fail (GTK_IS_STYLE_PROVIDER (provider)); g_return_if_fail (GTK_STYLE_PROVIDER (cascade) != provider); data.provider = g_object_ref (provider); data.priority = priority; data.changed_signal_id = g_signal_connect_swapped (provider, "-gtk-private-changed", G_CALLBACK (_gtk_style_provider_private_changed), cascade); /* ensure it gets removed first */ _gtk_style_cascade_remove_provider (cascade, provider); for (i = 0; i < cascade->providers->len; i++) { if (g_array_index (cascade->providers, GtkStyleProviderData, i).priority > priority) break; } g_array_insert_val (cascade->providers, i, data); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (cascade)); }
/** * gtk_symbolic_color_resolve: * @color: a #GtkSymbolicColor * @props: (allow-none): #GtkStyleProperties to use when resolving * named colors, or %NULL * @resolved_color: (out): return location for the resolved color * * If @color is resolvable, @resolved_color will be filled in * with the resolved color, and %TRUE will be returned. Generally, * if @color can't be resolved, it is due to it being defined on * top of a named color that doesn't exist in @props. * * When @props is %NULL, resolving of named colors will fail, so if * your @color is or references such a color, this function will * return %FALSE. * * Returns: %TRUE if the color has been resolved * * Since: 3.0 * * Deprecated: 3.8: #GtkSymbolicColor is deprecated. **/ gboolean gtk_symbolic_color_resolve (GtkSymbolicColor *color, GtkStyleProperties *props, GdkRGBA *resolved_color) { GdkRGBA pink = { 1.0, 0.5, 0.5, 1.0 }; GtkCssValue *v, *current; g_return_val_if_fail (color != NULL, FALSE); g_return_val_if_fail (resolved_color != NULL, FALSE); g_return_val_if_fail (props == NULL || GTK_IS_STYLE_PROPERTIES (props), FALSE); current = _gtk_css_rgba_value_new_from_rgba (&pink); v = _gtk_css_color_value_resolve (color->value, GTK_STYLE_PROVIDER_PRIVATE (props), current, 0, NULL); _gtk_css_value_unref (current); if (v == NULL) return FALSE; *resolved_color = *_gtk_css_rgba_value_get_rgba (v); _gtk_css_value_unref (v); return TRUE; }
static GtkCssValue * gtk_style_cascade_get_color (GtkStyleProviderPrivate *provider, const char *name) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkCssValue *color; GtkStyleProvider *item; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { if (GTK_IS_STYLE_PROVIDER_PRIVATE (item)) { color = _gtk_style_provider_private_get_color (GTK_STYLE_PROVIDER_PRIVATE (item), name); if (color) return color; } else { /* If somebody hits this code path, shout at them */ } } return NULL; }
static GtkCssValue * gtk_modifier_style_provider_get_color (GtkStyleProviderPrivate *provider, const char *name) { GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); return _gtk_style_provider_private_get_color (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), name); }
static GtkCssChange gtk_modifier_style_provider_get_change (GtkStyleProviderPrivate *provider, const GtkCssMatcher *matcher) { GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); return _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), matcher); }
static void gtk_modifier_style_provider_lookup (GtkStyleProviderPrivate *provider, const GtkCssMatcher *matcher, GtkCssLookup *lookup) { GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), matcher, lookup); }
void _gtk_style_cascade_set_scale (GtkStyleCascade *cascade, int scale) { gtk_internal_return_if_fail (GTK_IS_STYLE_CASCADE (cascade)); if (cascade->scale == scale) return; cascade->scale = scale; _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (cascade)); }
GtkStyleProviderPrivate * gtk_css_node_get_style_provider (GtkCssNode *cssnode) { GtkStyleProviderPrivate *result; result = gtk_css_node_get_style_provider_or_null (cssnode); if (result) return result; if (cssnode->parent) return gtk_css_node_get_style_provider (cssnode->parent); return GTK_STYLE_PROVIDER_PRIVATE (_gtk_settings_get_style_cascade (gtk_settings_get_default (), 1)); }
static GtkStyleProviderPrivate * gtk_css_widget_node_get_style_provider (GtkCssNode *node) { GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node); GtkStyleContext *context; GtkStyleCascade *cascade; if (widget_node->widget == NULL) return NULL; context = _gtk_widget_peek_style_context (widget_node->widget); if (context) return gtk_style_context_get_style_provider (context); cascade = _gtk_settings_get_style_cascade (gtk_widget_get_settings (widget_node->widget), gtk_widget_get_scale_factor (widget_node->widget)); return GTK_STYLE_PROVIDER_PRIVATE (cascade); }
void _gtk_modifier_style_set_font (GtkModifierStyle *style, const PangoFontDescription *font_desc) { GtkModifierStylePrivate *priv; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); priv = style->priv; if (font_desc) gtk_style_properties_set (priv->style, 0, "font", font_desc, NULL); else gtk_style_properties_unset_property (priv->style, "font", 0); g_signal_emit (style, signals[CHANGED], 0); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); }
void _gtk_modifier_style_set_color_property (GtkModifierStyle *style, GType widget_type, const gchar *prop_name, const GdkRGBA *color) { GtkModifierStylePrivate *priv; const GdkRGBA *old_color; gchar *str; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); g_return_if_fail (g_type_is_a (widget_type, GTK_TYPE_WIDGET)); g_return_if_fail (prop_name != NULL); priv = style->priv; str = g_strdup_printf ("-%s-%s", g_type_name (widget_type), prop_name); old_color = g_hash_table_lookup (priv->color_properties, str); if ((!color && !old_color) || (color && old_color && gdk_rgba_equal (color, old_color))) { g_free (str); return; } if (color) { g_hash_table_insert (priv->color_properties, str, gdk_rgba_copy (color)); } else { g_hash_table_remove (priv->color_properties, str); g_free (str); } g_signal_emit (style, signals[CHANGED], 0); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); }
static void modifier_style_set_color (GtkModifierStyle *style, const gchar *prop, GtkStateFlags state, const GdkRGBA *color) { GtkModifierStylePrivate *priv; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); priv = style->priv; if (color) gtk_style_properties_set (priv->style, state, prop, color, NULL); else gtk_style_properties_unset_property (priv->style, prop, state); g_signal_emit (style, signals[CHANGED], 0); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); }
void _gtk_style_cascade_remove_provider (GtkStyleCascade *cascade, GtkStyleProvider *provider) { guint i; g_return_if_fail (GTK_IS_STYLE_CASCADE (cascade)); g_return_if_fail (GTK_IS_STYLE_PROVIDER (provider)); for (i = 0; i < cascade->providers->len; i++) { GtkStyleProviderData *data = &g_array_index (cascade->providers, GtkStyleProviderData, i); if (data->provider == provider) { g_array_remove_index (cascade->providers, i); _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (cascade)); break; } } }