X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcsstypes.c;h=e67dceac56e5f9ca6edc4a640fd2b638a597e9f6;hb=67f5e595a796a8321d6dc7737c58476564998c07;hp=c454fea9fed27354c1f80c6388cc4ccad85b8b75;hpb=7603e6e47395b8e1d66522a22255637fa10d3a47;p=~andy%2Fgtk diff --git a/gtk/gtkcsstypes.c b/gtk/gtkcsstypes.c index c454fea9f..e67dceac5 100644 --- a/gtk/gtkcsstypes.c +++ b/gtk/gtkcsstypes.c @@ -18,141 +18,75 @@ #include "config.h" #include "gtkcsstypesprivate.h" -#include "gtkstylecontextprivate.h" -#define DEFINE_BOXED_TYPE_WITH_COPY_FUNC(TypeName, type_name) \ -\ -static TypeName * \ -type_name ## _copy (const TypeName *foo) \ -{ \ - return g_memdup (foo, sizeof (TypeName)); \ -} \ -\ -G_DEFINE_BOXED_TYPE (TypeName, type_name, type_name ## _copy, g_free) +#include "gtkcssnumbervalueprivate.h" +#include "gtkstylecontextprivate.h" -DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBackgroundSize, _gtk_css_background_size) -DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBorderCornerRadius, _gtk_css_border_corner_radius) -DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssBorderImageRepeat, _gtk_css_border_image_repeat) -DEFINE_BOXED_TYPE_WITH_COPY_FUNC (GtkCssNumber, _gtk_css_number) +typedef struct _GtkCssChangeTranslation GtkCssChangeTranslation; +struct _GtkCssChangeTranslation { + GtkCssChange from; + GtkCssChange to; +}; -void -_gtk_css_number_init (GtkCssNumber *number, - double value, - GtkCssUnit unit) +static GtkCssChange +gtk_css_change_translate (GtkCssChange match, + const GtkCssChangeTranslation *translations, + guint n_translations) { - number->value = value; - number->unit = unit; -} + GtkCssChange result = match; + guint i; -gboolean -_gtk_css_number_equal (const GtkCssNumber *one, - const GtkCssNumber *two) -{ - return one->unit == two->unit && - one->value == two->value; -} + for (i = 0; i < n_translations; i++) + { + if (match & translations[i].from) + { + result &= ~translations[i].from; + result |= translations[i].to; + } + } -double -_gtk_css_number_get (const GtkCssNumber *number, - double one_hundred_percent) -{ - if (number->unit == GTK_CSS_PERCENT) - return number->value * one_hundred_percent * 0.01; - else - return number->value; + return result; } -gboolean -_gtk_css_number_compute (GtkCssNumber *dest, - const GtkCssNumber *src, - GtkStyleContext *context) +GtkCssChange +_gtk_css_change_for_sibling (GtkCssChange match) { - switch (src->unit) - { - default: - g_assert_not_reached(); - /* fall through */ - case GTK_CSS_PERCENT: - case GTK_CSS_NUMBER: - case GTK_CSS_PX: - case GTK_CSS_DEG: - dest->value = src->value; - dest->unit = src->unit; - break; - case GTK_CSS_PT: - dest->value = src->value * 96.0 / 72.0; - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_PC: - dest->value = src->value * 96.0 / 72.0 * 12.0; - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_IN: - dest->value = src->value * 96.0; - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_CM: - dest->value = src->value * 96.0 * 0.39370078740157477; - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_MM: - dest->value = src->value * 96.0 * 0.039370078740157477; - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_EM: - dest->value = src->value * _gtk_css_value_get_double (_gtk_style_context_peek_property (context, "font-size")); - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_EX: - /* for now we pretend ex is half of em */ - dest->value = src->value * _gtk_css_value_get_double (_gtk_style_context_peek_property (context, "font-size")); - dest->unit = GTK_CSS_PX; - break; - case GTK_CSS_RAD: - dest->value = 360 * src->value / (2 * G_PI); - dest->unit = GTK_CSS_DEG; - break; - case GTK_CSS_GRAD: - dest->value = 360 * src->value / 400.0; - dest->unit = GTK_CSS_DEG; - break; - case GTK_CSS_TURN: - dest->value = 360 * src->value; - dest->unit = GTK_CSS_DEG; - break; - } + static const GtkCssChangeTranslation table[] = { + { GTK_CSS_CHANGE_CLASS, GTK_CSS_CHANGE_SIBLING_CLASS }, + { GTK_CSS_CHANGE_NAME, GTK_CSS_CHANGE_SIBLING_NAME }, + { GTK_CSS_CHANGE_POSITION, GTK_CSS_CHANGE_SIBLING_POSITION }, + { GTK_CSS_CHANGE_STATE, GTK_CSS_CHANGE_SIBLING_STATE }, + { GTK_CSS_CHANGE_SOURCE, 0 }, + { GTK_CSS_CHANGE_ANIMATE, 0 } + }; - return !_gtk_css_number_equal (src, dest); + return gtk_css_change_translate (match, table, G_N_ELEMENTS (table)); } -void -_gtk_css_number_print (const GtkCssNumber *number, - GString *string) +GtkCssChange +_gtk_css_change_for_child (GtkCssChange match) { - char buf[G_ASCII_DTOSTR_BUF_SIZE]; - - const char *names[] = { - /* [GTK_CSS_NUMBER] = */ "", - /* [GTK_CSS_PERCENT] = */ "%", - /* [GTK_CSS_PX] = */ "px", - /* [GTK_CSS_PT] = */ "pt", - /* [GTK_CSS_EM] = */ "em", - /* [GTK_CSS_EX] = */ "ex", - /* [GTK_CSS_PC] = */ "pc", - /* [GTK_CSS_IN] = */ "in", - /* [GTK_CSS_CM] = */ "cm", - /* [GTK_CSS_MM] = */ "mm", - /* [GTK_CSS_RAD] = */ "rad", - /* [GTK_CSS_DEG] = */ "deg", - /* [GTK_CSS_GRAD] = */ "grad", - /* [GTK_CSS_TURN] = */ "turn", + static const GtkCssChangeTranslation table[] = { + { GTK_CSS_CHANGE_CLASS, GTK_CSS_CHANGE_PARENT_CLASS }, + { GTK_CSS_CHANGE_NAME, GTK_CSS_CHANGE_PARENT_NAME }, + { GTK_CSS_CHANGE_POSITION, GTK_CSS_CHANGE_PARENT_POSITION }, + { GTK_CSS_CHANGE_STATE, GTK_CSS_CHANGE_PARENT_STATE }, + { GTK_CSS_CHANGE_SIBLING_CLASS, GTK_CSS_CHANGE_PARENT_SIBLING_CLASS }, + { GTK_CSS_CHANGE_SIBLING_NAME, GTK_CSS_CHANGE_PARENT_SIBLING_NAME }, + { GTK_CSS_CHANGE_SIBLING_POSITION, GTK_CSS_CHANGE_PARENT_SIBLING_POSITION }, + { GTK_CSS_CHANGE_SIBLING_STATE, GTK_CSS_CHANGE_PARENT_SIBLING_STATE }, + { GTK_CSS_CHANGE_SOURCE, 0 }, + { GTK_CSS_CHANGE_ANIMATE, 0 } }; - g_return_if_fail (number != NULL); - g_return_if_fail (string != NULL); + return gtk_css_change_translate (match, table, G_N_ELEMENTS (table)); +} - g_ascii_dtostr (buf, sizeof (buf), number->value); - g_string_append (string, buf); - if (number->value != 0.0) - g_string_append (string, names[number->unit]); +GtkCssDependencies +_gtk_css_dependencies_union (GtkCssDependencies first, + GtkCssDependencies second) +{ + return (first & ~GTK_CSS_EQUALS_PARENT) | ((first & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0) + | (second & ~GTK_CSS_EQUALS_PARENT) | ((second & GTK_CSS_EQUALS_PARENT) ? GTK_CSS_DEPENDS_ON_PARENT : 0); } +