summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/textblock.cc22
-rw-r--r--dw/widget.cc33
-rw-r--r--test/html/Makefile.am1
3 files changed, 49 insertions, 7 deletions
diff --git a/dw/textblock.cc b/dw/textblock.cc
index 27438b6d..0cef739b 100644
--- a/dw/textblock.cc
+++ b/dw/textblock.cc
@@ -2,7 +2,7 @@
* Dillo Widget
*
* Copyright 2005-2007, 2012-2014 Sebastian Geerken <sgeerken@dillo.org>
- * Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
+ * Copyright 2023-2024 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -768,12 +768,28 @@ int Textblock::getAvailWidthOfChild (Widget *child, bool forceValue)
// No width specified: similar to standard implementation (see
// there), but "leftInnerPadding" has to be considered, too.
DBG_OBJ_MSG ("resize", 1, "no specification");
- if (forceValue)
+ if (forceValue) {
width = misc::max (getAvailWidth (true) - boxDiffWidth ()
- leftInnerPadding,
0);
- else
+
+ if (width != -1) {
+ /* Clamp to min-width and max-width if given, taking into
+ * account leftInnerPadding. */
+ int maxWidth = child->calcWidth (child->getStyle()->maxWidth,
+ -1, this, -1, false);
+ if (maxWidth != -1 && width > maxWidth - leftInnerPadding)
+ width = maxWidth - leftInnerPadding;
+
+ int minWidth = child->calcWidth (child->getStyle()->minWidth,
+ -1, this, -1, false);
+ if (minWidth != -1 && width < minWidth - leftInnerPadding)
+ width = minWidth - leftInnerPadding;
+ }
+
+ } else {
width = -1;
+ }
} else
width = Widget::getAvailWidthOfChild (child, forceValue);
diff --git a/dw/widget.cc b/dw/widget.cc
index b778700b..59cbdd9b 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -2,7 +2,7 @@
* Dillo Widget
*
* Copyright 2005-2007 Sebastian Geerken <sgeerken@dillo.org>
- * Copyright 2023 Rodrigo Arias Mallo <rodarima@gmail.com>
+ * Copyright 2023-2024 Rodrigo Arias Mallo <rodarima@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1668,6 +1668,16 @@ int Widget::applyPerHeight (int containerHeight, style::Length perHeight)
+ boxDiffHeight ();
}
+/**
+ * Computes the content width available of a child widget.
+ *
+ * @param child The child widget of which the available width will be
+ * computed.
+ * @param forceValue If true, computes the width of the child with value
+ * "auto". Otherwise, it wont.
+ *
+ * @return The available width in pixels or -1.
+ */
int Widget::getAvailWidthOfChild (Widget *child, bool forceValue)
{
// This is a halfway suitable implementation for all
@@ -1681,10 +1691,27 @@ int Widget::getAvailWidthOfChild (Widget *child, bool forceValue)
if (child->getStyle()->width == style::LENGTH_AUTO) {
DBG_OBJ_MSG ("resize", 1, "no specification");
- if (forceValue)
+
+ /* We only compute when forceValue is true */
+ if (forceValue) {
width = misc::max (getAvailWidth (true) - boxDiffWidth (), 0);
- else
+
+ if (width != -1) {
+ /* Clamp to min-width and max-width if given */
+ int maxWidth = child->calcWidth (child->getStyle()->maxWidth,
+ -1, this, -1, false);
+ if (maxWidth != -1 && width > maxWidth)
+ width = maxWidth;
+
+ int minWidth = child->calcWidth (child->getStyle()->minWidth,
+ -1, this, -1, false);
+ if (minWidth != -1 && width < minWidth)
+ width = minWidth;
+ }
+
+ } else {
width = -1;
+ }
} else {
// In most cases, the toplevel widget should be a container, so
// the container is non-NULL when the parent is non-NULL. Just
diff --git a/test/html/Makefile.am b/test/html/Makefile.am
index 39931d2f..9098e3dc 100644
--- a/test/html/Makefile.am
+++ b/test/html/Makefile.am
@@ -39,5 +39,4 @@ XFAIL_TESTS = \
render/max-width-html.html \
render/min-width-html.html \
render/span-padding.html \
- render/table-max-width.html \
render/table-td-width-percent.html