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 gboolean gtk_style_cascade_get_style_property (GtkStyleProvider *provider, GtkWidgetPath *path, GtkStateFlags state, GParamSpec *pspec, GValue *value) { 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_style_provider_get_style_property (item, path, state, pspec, value)) return TRUE; } return FALSE; }
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; }
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 void gtk_style_cascade_lookup (GtkStyleProviderPrivate *provider, const GtkCssMatcher *matcher, GtkCssLookup *lookup, GtkCssChange *change) { GtkStyleCascade *cascade = GTK_STYLE_CASCADE (provider); GtkStyleCascadeIter iter; GtkStyleProvider *item; GtkCssChange iter_change; for (item = gtk_style_cascade_iter_init (cascade, &iter); item; item = gtk_style_cascade_iter_next (cascade, &iter)) { GtkStyleProviderPrivate *sp = (GtkStyleProviderPrivate*)item; if (GTK_IS_STYLE_PROVIDER_PRIVATE (sp)) { _gtk_style_provider_private_lookup (sp, matcher, lookup, change ? &iter_change : NULL); if (change) *change |= iter_change; } else { /* you lose */ g_warn_if_reached (); } } gtk_style_cascade_iter_clear (&iter); }
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; }
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 GtkStyleProvider * gtk_style_cascade_iter_init (GtkStyleCascade *cascade, GtkStyleCascadeIter *iter) { iter->parent_index = cascade->parent ? cascade->parent->providers->len : 0; iter->index = cascade->providers->len; return gtk_style_cascade_iter_next (cascade, iter); }
static GtkStyleProvider * gtk_style_cascade_iter_init (GtkStyleCascade *cascade, GtkStyleCascadeIter *iter) { GtkStyleCascade *cas = cascade; int ix; iter->n_cascades = 1; while ((cas = cas->parent) != NULL) iter->n_cascades++; iter->cascade_index = g_new (int, iter->n_cascades); for (cas = cascade, ix = 0; ix < iter->n_cascades; cas = cas->parent, ix++) iter->cascade_index[ix] = cas->providers->len; return gtk_style_cascade_iter_next (cascade, iter); }