diff --git a/gtk/gtkcssprovider.c b/gtk/gtkcssprovider.c index 6f8cbe4710..37091b2685 100644 --- a/gtk/gtkcssprovider.c +++ b/gtk/gtkcssprovider.c @@ -690,10 +690,37 @@ * * * - * border-width + * border-top-width * integer * #gint - * border-width: 5; + * border-top-width: 5; + * + * + * border-left-width + * integer + * #gint + * border-left-width: 5; + * + * + * border-bottom-width + * integer + * #gint + * border-bottom-width: 5; + * + * + * border-right-width + * integer + * #gint + * border-right-width: 5; + * + * + * border-width + * #GtkBorder + * border-width: 1; + * border-width: 1 2; + * border-width: 1 2 3; + * border-width: 1 2 3 5; + * * * * border-radius diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index e96faea2d7..134a0f27c0 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -3474,28 +3474,27 @@ gtk_style_context_get_border (GtkStyleContext *context, { GtkStyleContextPrivate *priv; StyleData *data; - const GValue *value; - GtkBorder *b; + int top, left, bottom, right; g_return_if_fail (border != NULL); - *border = fallback_border; - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); priv = context->priv; g_return_if_fail (priv->widget_path != NULL); data = style_data_lookup (context); - value = _gtk_style_properties_peek_property (data->store, - "border-width", - state, - NULL); + gtk_style_properties_get (data->store, + state, + "border-top-width", &top, + "border-left-width", &left, + "border-bottom-width", &bottom, + "border-right-width", &right, + NULL); - if (value) - { - b = g_value_get_boxed (value); - *border = *b; - } + border->top = top; + border->left = left; + border->bottom = bottom; + border->right = right; } /** diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c index 2d6bda681a..8925ba46ce 100644 --- a/gtk/gtkstyleproperty.c +++ b/gtk/gtkstyleproperty.c @@ -1160,6 +1160,83 @@ bindings_value_to_string (const GValue *value) return g_string_free (str, FALSE); } +/*** PACKING ***/ + +static GParameter * +unpack_border (const GValue *value, + guint *n_params, + const char *top, + const char *left, + const char *bottom, + const char *right) +{ + GParameter *parameter = g_new0 (GParameter, 4); + GtkBorder *border = g_value_get_boxed (value); + + parameter[0].name = top; + g_value_init (¶meter[0].value, G_TYPE_INT); + g_value_set_int (¶meter[0].value, border->top); + parameter[1].name = left; + g_value_init (¶meter[1].value, G_TYPE_INT); + g_value_set_int (¶meter[1].value, border->left); + parameter[2].name = bottom; + g_value_init (¶meter[2].value, G_TYPE_INT); + g_value_set_int (¶meter[2].value, border->bottom); + parameter[3].name = right; + g_value_init (¶meter[3].value, G_TYPE_INT); + g_value_set_int (¶meter[3].value, border->right); + + *n_params = 4; + return parameter; +} + +static void +pack_border (GValue *value, + GtkStyleProperties *props, + GtkStateFlags state, + const char *top, + const char *left, + const char *bottom, + const char *right) +{ + GtkBorder border; + int t, l, b, r; + + gtk_style_properties_get (props, + state, + top, &t, + left, &l, + bottom, &b, + right, &r, + NULL); + + border.top = t; + border.left = l; + border.bottom = b; + border.right = r; + + g_value_set_boxed (value, &border); +} + +static GParameter * +unpack_border_width (const GValue *value, + guint *n_params) +{ + return unpack_border (value, n_params, + "border-top-width", "border-left-width", + "border-bottom-width", "border-right-width"); +} + +static void +pack_border_width (GValue *value, + GtkStyleProperties *props, + GtkStateFlags state) +{ + pack_border (value, props, state, + "border-top-width", "border-left-width", + "border-bottom-width", "border-right-width"); +} + /*** API ***/ static void @@ -1368,10 +1445,32 @@ gtk_style_property_init (void) "Padding", GTK_TYPE_BORDER, 0)); gtk_style_properties_register_property (NULL, - g_param_spec_boxed ("border-width", + g_param_spec_int ("border-top-width", + "border top width", + "Border width at top", + 0, G_MAXINT, 0, 0)); + gtk_style_properties_register_property (NULL, + g_param_spec_int ("border-left-width", + "border left width", + "Border width at left", + 0, G_MAXINT, 0, 0)); + gtk_style_properties_register_property (NULL, + g_param_spec_int ("border-bottom-width", + "border bottom width", + "Border width at bottom", + 0, G_MAXINT, 0, 0)); + gtk_style_properties_register_property (NULL, + g_param_spec_int ("border-right-width", + "border right width", + "Border width at right", + 0, G_MAXINT, 0, 0)); + _gtk_style_property_register (g_param_spec_boxed ("border-width", "Border width", "Border width, in pixels", - GTK_TYPE_BORDER, 0)); + GTK_TYPE_BORDER, 0), + NULL, + unpack_border_width, + pack_border_width); gtk_style_properties_register_property (NULL, g_param_spec_int ("border-radius", "Border radius", diff --git a/gtk/gtkstylepropertyprivate.h b/gtk/gtkstylepropertyprivate.h index 38850a19e7..a1d222ecf5 100644 --- a/gtk/gtkstylepropertyprivate.h +++ b/gtk/gtkstylepropertyprivate.h @@ -30,7 +30,7 @@ typedef GParameter * (* GtkStyleUnpackFunc) (const GValue guint *n_params); typedef void (* GtkStylePackFunc) (GValue *value, GtkStyleProperties *props, - GtkStateFlags flags); + GtkStateFlags state); struct _GtkStyleProperty {