SizeRequest: Round px values up for min CSS sizes

Otherwise, requesting a min size in em where the equivalent in px had a
fractional part would lead to the widget getting allocated 1 too few px.
You could see this in the CSS property vs. allocation in the Inspector.

Note that margin/border/padding are left alone: the rationale is that we
do as browsers do, and Benjamin said we already do that for those,
whereas his tests on min-(width|height) showed otherwise. My subsequent
analysis indicated it to be far less clear-cut than that, but he remains
unconvinced that we should ceil() all the things! So just do these ones.

https://gitlab.gnome.org/GNOME/gtk/issues/1088
This commit is contained in:
Daniel Boles 2018-05-21 21:45:27 +01:00
parent 5c24bbf00c
commit 3396c5e983

View File

@ -82,6 +82,14 @@ get_number (GtkCssStyle *style,
return floor (d); return floor (d);
} }
/* Special-case min-width|height to round upwards, to avoid underalloc by 1px */
static int
get_number_ceil (GtkCssStyle *style,
guint property)
{
return ceil (_gtk_css_number_value_get (gtk_css_style_get_value (style, property), 100));
}
static void static void
get_box_margin (GtkCssStyle *style, get_box_margin (GtkCssStyle *style,
GtkBorder *margin) GtkBorder *margin)
@ -166,15 +174,15 @@ gtk_widget_query_size_for_orientation (GtkWidget *widget,
{ {
css_extra_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right; css_extra_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right;
css_extra_for_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom; css_extra_for_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom;
css_min_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH); css_min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH);
css_min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT); css_min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
} }
else else
{ {
css_extra_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom; css_extra_size = margin.top + margin.bottom + border.top + border.bottom + padding.top + padding.bottom;
css_extra_for_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right; css_extra_for_size = margin.left + margin.right + border.left + border.right + padding.left + padding.right;
css_min_size = get_number (style, GTK_CSS_PROPERTY_MIN_HEIGHT); css_min_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_HEIGHT);
css_min_for_size = get_number (style, GTK_CSS_PROPERTY_MIN_WIDTH); css_min_for_size = get_number_ceil (style, GTK_CSS_PROPERTY_MIN_WIDTH);
} }
if (for_size < 0) if (for_size < 0)