aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2016-04-13 22:07:21 +0200
committerSebastian Geerken <devnull@localhost>2016-04-13 22:07:21 +0200
commitf9e84c934486ae795a5b310bf88cd8919730ec7c (patch)
tree80a3bf1d05fced88efa54b1826365f977db255dd
parenta6be59d31f590d2d0c36e64537630ae12d996b27 (diff)
Removed Layout::queueQueueResizeList and optimized multiple (both nested and sequential) queueResize.
-rw-r--r--dw/layout.cc2
-rw-r--r--dw/layout.hh18
-rw-r--r--dw/widget.cc61
-rw-r--r--dw/widget.hh1
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:
/**