diff --git a/gtk/gtkcssnodeutils.c b/gtk/gtkcssnodeutils.c index 3e1fc333eb..3677d3d42d 100644 --- a/gtk/gtkcssnodeutils.c +++ b/gtk/gtkcssnodeutils.c @@ -114,7 +114,7 @@ gtk_css_node_get_preferred_size (GtkCssNode *cssnode, { GtkCssStyle *style; GtkBorder border, padding; - int extra_size, extra_opposite, extra_baseline; + int min_size, extra_size, extra_opposite, extra_baseline; if (!get_content_size_func) get_content_size_func = get_content_size_func_default; @@ -126,12 +126,14 @@ gtk_css_node_get_preferred_size (GtkCssNode *cssnode, extra_size = border.left + border.right + padding.left + padding.right; extra_opposite = border.top + border.bottom + padding.top + padding.bottom; extra_baseline = border.left + padding.left; + min_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH); } else { extra_size = border.top + border.bottom + padding.top + padding.bottom; extra_opposite = border.left + border.right + padding.left + padding.right; extra_baseline = border.top + padding.top; + min_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT); } if (for_size > -1) @@ -149,6 +151,11 @@ gtk_css_node_get_preferred_size (GtkCssNode *cssnode, minimum_baseline, natural_baseline, get_content_size_data); + g_warn_if_fail (*minimum <= *natural); + + *minimum = MAX (min_size, *minimum); + *natural = MAX (min_size, *natural); + *minimum += extra_size; *natural += extra_size; diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 45fa695e9e..e6f77ef6f9 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -804,6 +804,15 @@ border_image_width_parse (GtkCssStyleProperty *property, FALSE); } +static GtkCssValue * +minmax_parse (GtkCssStyleProperty *property, + GtkCssParser *parser) +{ + return _gtk_css_number_value_parse (parser, + GTK_CSS_PARSE_LENGTH + | GTK_CSS_POSITIVE_ONLY); +} + static GtkCssValue * transition_property_parse_one (GtkCssParser *parser) { @@ -1529,6 +1538,25 @@ _gtk_css_style_property_init_properties (void) NULL, _gtk_css_transform_value_new_none ()); + gtk_css_style_property_register ("min-width", + GTK_CSS_PROPERTY_MIN_WIDTH, + G_TYPE_NONE, + GTK_STYLE_PROPERTY_ANIMATED, + GTK_CSS_AFFECTS_SIZE, + minmax_parse, + NULL, + NULL, + _gtk_css_number_value_new (0, GTK_CSS_PX)); + gtk_css_style_property_register ("min-height", + GTK_CSS_PROPERTY_MIN_HEIGHT, + G_TYPE_NONE, + GTK_STYLE_PROPERTY_ANIMATED, + GTK_CSS_AFFECTS_SIZE, + minmax_parse, + NULL, + NULL, + _gtk_css_number_value_new (0, GTK_CSS_PX)); + gtk_css_style_property_register ("transition-property", GTK_CSS_PROPERTY_TRANSITION_PROPERTY, G_TYPE_NONE, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 1f68e9c39a..2b6b80cead 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -164,6 +164,8 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_ICON_SHADOW, GTK_CSS_PROPERTY_ICON_STYLE, GTK_CSS_PROPERTY_ICON_TRANSFORM, + GTK_CSS_PROPERTY_MIN_WIDTH, + GTK_CSS_PROPERTY_MIN_HEIGHT, GTK_CSS_PROPERTY_TRANSITION_PROPERTY, GTK_CSS_PROPERTY_TRANSITION_DURATION, GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,