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 | |
parent | a6be59d31f590d2d0c36e64537630ae12d996b27 (diff) |
Removed Layout::queueQueueResizeList and optimized multiple (both nested and sequential) queueResize.
-rw-r--r-- | dw/layout.cc | 2 | ||||
-rw-r--r-- | dw/layout.hh | 18 | ||||
-rw-r--r-- | dw/widget.cc | 61 | ||||
-rw-r--r-- | dw/widget.hh | 1 |
4 files changed, 16 insertions, 66 deletions
diff --git a/dw/layout.cc b/dw/layout.cc index ee58f7ee..3535d794 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -260,7 +260,6 @@ Layout::Layout (Platform *platform) topLevel = NULL; widgetAtPoint = NULL; - queueQueueResizeList = new typed::Stack<QueueResizeItem> (true); queueResizeList = new typed::Vector<Widget> (4, false); DBG_OBJ_CREATE ("dw::core::Layout"); @@ -334,7 +333,6 @@ Layout::~Layout () delete w; } - delete queueQueueResizeList; delete queueResizeList; delete platform; delete view; diff --git a/dw/layout.hh b/dw/layout.hh index 16d19979..aada2069 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -152,27 +152,9 @@ private: ~Anchor (); }; - class QueueResizeItem: public lout::object::Object - { - public: - Widget *widget; - int ref; - bool extremesChanged, fast; - - inline QueueResizeItem (Widget *widget, int ref, bool extremesChanged, - bool fast) - { - this->widget = widget; - this->ref = ref; - this->extremesChanged = extremesChanged; - this->fast = fast; - } - }; - Platform *platform; View *view; Widget *topLevel, *widgetAtPoint; - lout::container::typed::Stack<QueueResizeItem> *queueQueueResizeList; lout::container::typed::Vector<Widget> *queueResizeList; /* The state, which must be projected into the view. */ 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) diff --git a/dw/widget.hh b/dw/widget.hh index 2e9bcfd1..d5cb8972 100644 --- a/dw/widget.hh +++ b/dw/widget.hh @@ -164,7 +164,6 @@ private: void queueResize (int ref, bool extremesChanged, bool fast); inline void queueResizeFast (int ref, bool extremesChanged) { queueResize (ref, extremesChanged, true); } - void actualQueueResize (int ref, bool extremesChanged, bool fast); public: /** |