diff options
author | Sebastian Geerken <devnull@localhost> | 2016-04-13 22:07:21 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2016-04-13 22:07:21 +0200 |
commit | f9e84c934486ae795a5b310bf88cd8919730ec7c (patch) | |
tree | 80a3bf1d05fced88efa54b1826365f977db255dd /dw/widget.cc | |
parent | a6be59d31f590d2d0c36e64537630ae12d996b27 (diff) |
Removed Layout::queueQueueResizeList and optimized multiple (both nested and sequential) queueResize.
Diffstat (limited to 'dw/widget.cc')
-rw-r--r-- | dw/widget.cc | 61 |
1 files changed, 16 insertions, 45 deletions
diff --git a/dw/widget.cc b/dw/widget.cc index 33b9ed96..d500ae67 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -311,49 +311,11 @@ void Widget::queueResize (int ref, bool extremesChanged, bool fast) ref, extremesChanged ? "true" : "false", fast ? "true" : "false"); - // queueResize() can be called recursively; calls are queued, so - // that actualQueueResize() is clean. - - if (queueResizeEntered ()) { - DBG_OBJ_MSG ("resize", 1, "put into queue"); - layout->queueQueueResizeList->pushUnder (new Layout::QueueResizeItem - (this, ref, extremesChanged, - fast)); - } else { - actualQueueResize (ref, extremesChanged, fast); - - DBG_IF_RTFL { - if (layout == NULL) - DBG_OBJ_MSG ("resize", 1, "layout is not set"); - else if (layout->queueQueueResizeList->size () == 0) - DBG_OBJ_MSG ("resize", 1, "queue item list is empty"); - } - - while (layout != NULL && layout->queueQueueResizeList->size () > 0) { - Layout::QueueResizeItem *item = - layout->queueQueueResizeList->getTop (); - item->widget->actualQueueResize (item->ref, item->extremesChanged, - item->fast); - layout->queueQueueResizeList->pop (); - } - } - - DBG_OBJ_LEAVE (); -} - -void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) -{ - assert (!queueResizeEntered ()); - - DBG_OBJ_ENTER ("resize", 0, "actualQueueResize", "%d, %s, %s", - ref, extremesChanged ? "true" : "false", - fast ? "true" : "false"); - enterQueueResize (); Widget *widget2, *child; - Flags resizeFlag, extremesFlag; + Flags resizeFlag, extremesFlag, totalFlags; if (layout) { // If RESIZE_QUEUED is set, this widget is already in the list. @@ -371,7 +333,11 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) setFlags (ALLOCATE_QUEUED); markSizeChange (ref); + totalFlags = resizeFlag; + if (extremesChanged) { + totalFlags = (Flags)(totalFlags | extremesFlag); + setFlags (extremesFlag); markExtremesChange (ref); } @@ -391,12 +357,7 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) } } else { for (widget2 = parent, child = this; widget2; - child = widget2, widget2 = widget2->parent) { - // TODO Could the following code be used for optimization? - //if (widget2->resizeQueued () && - // (widget2->extremesQueued () || !extremesChanged)) - // break; - + child = widget2, widget2 = widget2->parent) { if (layout && !widget2->resizeQueued ()) layout->queueResizeList->put (widget2); @@ -413,6 +374,16 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) widget2->setFlags (extremesFlag); widget2->markExtremesChange (child->parentRef); } + + if (widget2->parent && + (widget2->parent->flags & totalFlags) == totalFlags) { + widget2->parent->markSizeChange (widget2->parentRef); + if (extremesChanged) { + widget2->parent->markExtremesChange (widget2->parentRef); + } + + break; + } } if (layout) |