aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-02-16 20:16:49 +0100
committerSebastian Geerken <devnull@localhost>2014-02-16 20:16:49 +0100
commitb308da7e0d226008d2daf94ca2b41f8c2b8c6fc1 (patch)
treed46bb07a8b63f0fadc5f04179871d1aac7328581
parentf5ab169f48fc872503b11335ff9d298a63f3b69a (diff)
(i) Widget::ueueResize can now be called recursively (so to speak). (ii) Using (i), float size changes are handled correctly.
-rw-r--r--doc/dw-widget-sizes.doc5
-rw-r--r--dw/layout.cc3
-rw-r--r--dw/layout.hh16
-rw-r--r--dw/outofflowmgr.cc10
-rw-r--r--dw/widget.cc19
-rw-r--r--dw/widget.hh2
6 files changed, 49 insertions, 6 deletions
diff --git a/doc/dw-widget-sizes.doc b/doc/dw-widget-sizes.doc
index 86f46561..dcc74bfc 100644
--- a/doc/dw-widget-sizes.doc
+++ b/doc/dw-widget-sizes.doc
@@ -208,6 +208,11 @@ first row (*queueResize*) defines also the rules for
*markExtremesChanges* and *markExtremesChanges*, and in the second row
(*sizeAllocate*), even *sizeRequest* has to be considered.
+<div style="border: 2px solid #ff4040; margin-bottom: 0.5em;
+padding: 0.5em 1em; background-color: #fff0f0"><b>Info:</b>
+Not up to date: *queueResize* can now be called recursively (so to
+speak). See code there.</div>
+
<table>
<tr>
<th>Within call of ... ↓
diff --git a/dw/layout.cc b/dw/layout.cc
index c984b764..d35d30d7 100644
--- a/dw/layout.cc
+++ b/dw/layout.cc
@@ -245,6 +245,7 @@ Layout::Layout (Platform *platform)
topLevel = NULL;
widgetAtPoint = NULL;
+ queueQueueResizeList = new typed::Vector<QueueResizeItem> (4, true);
queueResizeList = new typed::Vector<Widget> (4, false);
DBG_OBJ_CREATE ("dw::core::Layout");
@@ -308,6 +309,8 @@ Layout::~Layout ()
topLevel = NULL;
delete w;
}
+
+ delete queueQueueResizeList;
delete queueResizeList;
delete platform;
delete view;
diff --git a/dw/layout.hh b/dw/layout.hh
index 64274714..93af896a 100644
--- a/dw/layout.hh
+++ b/dw/layout.hh
@@ -150,9 +150,25 @@ private:
~Anchor ();
};
+ class QueueResizeItem: public lout::object::Object
+ {
+ public:
+ Widget *widget;
+ int ref;
+ bool extremesChanged;
+
+ inline QueueResizeItem (Widget *widget, int ref, bool extremesChanged)
+ {
+ this->widget = widget;
+ this->ref = ref;
+ this->extremesChanged = extremesChanged;
+ }
+ };
+
Platform *platform;
View *view;
Widget *topLevel, *widgetAtPoint;
+ lout::container::typed::Vector<QueueResizeItem> *queueQueueResizeList;
lout::container::typed::Vector<Widget> *queueResizeList;
/* The state, which must be projected into the view. */
diff --git a/dw/outofflowmgr.cc b/dw/outofflowmgr.cc
index 4cb5b62c..8c1faa82 100644
--- a/dw/outofflowmgr.cc
+++ b/dw/outofflowmgr.cc
@@ -1100,12 +1100,10 @@ void OutOfFlowMgr::markSizeChange (int ref)
vloat->dirty = vloat->sizeChangedSinceLastAllocation = true;
- // There should be something like this:
- //
- // vloat->generatingBlock->borderChanged (vloat->yReal,
- // vloat->getWidget ());
- //
- // But that does not work.
+ // The generating block is told directly about this. (Others later, in
+ // sizeAllocateEnd.) Could be faster (cf. hasRelationChanged, which
+ // differentiates many special cases), but the size is not known yet,
+ vloat->generatingBlock->borderChanged (vloat->yReal, vloat->getWidget ());
} else if (isRefAbsolutelyPositioned (ref)) {
int i = getAbsolutelyPositionedIndexFromRef (ref);
absolutelyPositioned->get(i)->dirty = true;
diff --git a/dw/widget.cc b/dw/widget.cc
index bf921d31..21b55f47 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -167,6 +167,25 @@ void Widget::queueDrawArea (int x, int y, int width, int height)
*/
void Widget::queueResize (int ref, bool extremesChanged)
{
+ // queueResize() can be called recursively; calls are queued, so
+ // that actualQueueResize() is clean.
+
+ if (queueResizeEntered ())
+ layout->queueQueueResizeList->put (new Layout::QueueResizeItem
+ (this, ref, extremesChanged));
+ else {
+ actualQueueResize (ref, extremesChanged);
+
+ while (layout != NULL && layout->queueQueueResizeList->size () > 0) {
+ Layout::QueueResizeItem *item = layout->queueQueueResizeList->get (0);
+ item->widget->actualQueueResize (item->ref, item->extremesChanged);
+ layout->queueQueueResizeList->remove (0); // hopefully not too large
+ }
+ }
+}
+
+void Widget::actualQueueResize (int ref, bool extremesChanged)
+{
assert (!queueResizeEntered ());
DBG_OBJ_MSGF ("resize", 0, "<b>queueResize</b> (%d, %s)",
diff --git a/dw/widget.hh b/dw/widget.hh
index c9aeb427..8ebc2767 100644
--- a/dw/widget.hh
+++ b/dw/widget.hh
@@ -164,6 +164,8 @@ private:
*/
bool buttonSensitiveSet;
+ void actualQueueResize (int ref, bool extremesChanged);
+
public:
/**
* \brief This value is defined by the parent widget, and used for