diff options
-rw-r--r-- | doc/dw-widget-sizes.doc | 5 | ||||
-rw-r--r-- | dw/layout.cc | 3 | ||||
-rw-r--r-- | dw/layout.hh | 16 | ||||
-rw-r--r-- | dw/outofflowmgr.cc | 10 | ||||
-rw-r--r-- | dw/widget.cc | 19 | ||||
-rw-r--r-- | dw/widget.hh | 2 |
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 |