aboutsummaryrefslogtreecommitdiff
path: root/dw/widget.cc
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-06-16 21:29:05 +0200
committerSebastian Geerken <devnull@localhost>2014-06-16 21:29:05 +0200
commitd23346d250cd18718f0540cfca49e2204fb40767 (patch)
tree58ee8e7a8590c104bdc0067dc89552d165ab991f /dw/widget.cc
parent3d05377424b220d8bddc45c062c54dd6aab66f26 (diff)
Started work on more efficient handling of viewport size changes.
Diffstat (limited to 'dw/widget.cc')
-rw-r--r--dw/widget.cc72
1 files changed, 41 insertions, 31 deletions
diff --git a/dw/widget.cc b/dw/widget.cc
index cf3f2d79..c24f58db 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -195,7 +195,7 @@ void Widget::queueDrawArea (int x, int y, int width, int height)
/**
* \brief This method should be called, when a widget changes its size.
*/
-void Widget::queueResize (int ref, bool extremesChanged)
+void Widget::queueResize (int ref, bool extremesChanged, bool fast)
{
DBG_OBJ_MSGF ("resize", 0, "<b>queueResize</b> (%d, %s)",
ref, extremesChanged ? "true" : "false");
@@ -207,15 +207,16 @@ void Widget::queueResize (int ref, bool extremesChanged)
if (queueResizeEntered ()) {
DBG_OBJ_MSG ("resize", 1, "put into queue");
layout->queueQueueResizeList->put (new Layout::QueueResizeItem
- (this, ref, extremesChanged));
+ (this, ref, extremesChanged, fast));
} else {
- actualQueueResize (ref, extremesChanged);
+ actualQueueResize (ref, extremesChanged, fast);
while (layout != NULL && layout->queueQueueResizeList->size () > 0) {
Layout::QueueResizeItem *item = layout->queueQueueResizeList->get (0);
DBG_OBJ_MSGF ("resize", 1, "taken out of queue queue (size = %d)",
layout->queueQueueResizeList->size ());
- item->widget->actualQueueResize (item->ref, item->extremesChanged);
+ item->widget->actualQueueResize (item->ref, item->extremesChanged,
+ item->fast);
layout->queueQueueResizeList->remove (0); // hopefully not too large
}
}
@@ -223,7 +224,7 @@ void Widget::queueResize (int ref, bool extremesChanged)
DBG_OBJ_MSG_END ();
}
-void Widget::actualQueueResize (int ref, bool extremesChanged)
+void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast)
{
assert (!queueResizeEntered ());
@@ -235,10 +236,6 @@ void Widget::actualQueueResize (int ref, bool extremesChanged)
Widget *widget2, *child;
- //printf("The %stop-level %s %p with parentRef = %d has changed its size. "
- // "Layout = %p.\n",
- // parent ? "non-" : "", getClassName(), this, parentRef, layout);
-
Flags resizeFlag, extremesFlag;
if (layout) {
@@ -261,36 +258,49 @@ void Widget::actualQueueResize (int ref, bool extremesChanged)
setFlags (extremesFlag);
markExtremesChange (ref);
}
-
- for (widget2 = parent, child = this; widget2;
- child = widget2, widget2 = widget2->parent) {
- //printf (" Setting %s and ALLOCATE_QUEUED for the "
- // "%stop-level %s %p with parentRef = %d\n",
- // resizeFlag == RESIZE_QUEUED ? "RESIZE_QUEUED" : "NEEDS_RESIZE",
- // widget2->parent ? "non-" : "", widget2->getClassName(), widget2,
- // widget2->parentRef);
-
- if (layout && !widget2->resizeQueued ())
- layout->queueResizeList->put (widget2);
-
- widget2->setFlags (resizeFlag);
- widget2->markSizeChange (child->parentRef);
- widget2->setFlags (ALLOCATE_QUEUED);
-
- if (extremesChanged) {
- widget2->setFlags (extremesFlag);
- widget2->markExtremesChange (child->parentRef);
+
+ if (!fast) {
+ for (widget2 = parent, child = this; widget2;
+ child = widget2, widget2 = widget2->parent) {
+ if (layout && !widget2->resizeQueued ())
+ layout->queueResizeList->put (widget2);
+
+ widget2->setFlags (resizeFlag);
+ widget2->markSizeChange (child->parentRef);
+ widget2->setFlags (ALLOCATE_QUEUED);
+
+ if (extremesChanged) {
+ widget2->setFlags (extremesFlag);
+ widget2->markExtremesChange (child->parentRef);
+ }
}
- }
- if (layout)
- layout->queueResize (extremesChanged);
+ if (layout)
+ layout->queueResize (extremesChanged);
+ }
leaveQueueResize ();
DBG_OBJ_MSG_END ();
}
+void Widget::containerSizeChanged ()
+{
+ // TODO Can be largely optimized.
+ queueResizeFast (0, true);
+ containerSizeChangedForChildren ();
+}
+
+void Widget::containerSizeChangedForChildren ()
+{
+ // Working, but inefficient standard implementation.
+ Iterator *it = iterator ((Content::Type)(Content::WIDGET_IN_FLOW |
+ Content::WIDGET_OOF_CONT),
+ false);
+ while (it->next ())
+ it->getContent()->widget->containerSizeChanged ();
+ it->unref ();
+}
/**
* \brief This method is a wrapper for Widget::sizeRequestImpl(); it calls