diff options
author | Sebastian Geerken <devnull@localhost> | 2014-07-17 14:32:22 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-07-17 14:32:22 +0200 |
commit | 0754874120c89fbc7e8c21b43c25337c83d74313 (patch) | |
tree | f8e6da2c3fac1399accbee4e6492fd9b4b1c2805 | |
parent | 45110795cad4e47d5a0b9f1f0f2d08b16bd29538 (diff) |
Fixed bug in Layout::resizeIdle: regard widgets which needs allocation but not resizing (because sizeRequest has been called within another context). Also some new RTFL messages.
-rw-r--r-- | dw/layout.cc | 2 | ||||
-rw-r--r-- | dw/outofflowmgr.cc | 63 | ||||
-rw-r--r-- | dw/widget.cc | 36 |
3 files changed, 78 insertions, 23 deletions
diff --git a/dw/layout.cc b/dw/layout.cc index 64f2f8d5..82a21f57 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -889,7 +889,7 @@ void Layout::resizeIdle () // If this method is triggered by a viewport change, we can save // time when the toplevel widget is not affected (as for a toplevel // image resource). - if (topLevel && topLevel->needsResize ()) { + if (topLevel && (topLevel->needsResize () || topLevel->needsAllocate ())) { Requisition requisition; Allocation allocation; diff --git a/dw/outofflowmgr.cc b/dw/outofflowmgr.cc index d9436cb9..62386b15 100644 --- a/dw/outofflowmgr.cc +++ b/dw/outofflowmgr.cc @@ -485,6 +485,9 @@ OutOfFlowMgr::OutOfFlowMgr (Textblock *containingBlock) leftFloatsCB = new SortedFloatsVector (this, LEFT, CB); rightFloatsCB = new SortedFloatsVector (this, RIGHT, CB); + DBG_OBJ_SET_NUM ("leftFloatsCB.size", leftFloatsCB->size()); + DBG_OBJ_SET_NUM ("rightFloatsCB.size", rightFloatsCB->size()); + leftFloatsAll = new Vector<Float> (1, true); rightFloatsAll = new Vector<Float> (1, true); @@ -1003,6 +1006,9 @@ bool OutOfFlowMgr::haveExtremesChanged (Side side) void OutOfFlowMgr::moveFromGBToCB (Side side) { + DBG_OBJ_ENTER ("oofm.resize", 0, "moveFromGBToCB", "%s", + side == LEFT ? "LEFT" : "RIGHT"); + SortedFloatsVector *dest = side == LEFT ? leftFloatsCB : rightFloatsCB; int *floatsMark = side == LEFT ? &leftFloatsMark : &rightFloatsMark; @@ -1017,20 +1023,24 @@ void OutOfFlowMgr::moveFromGBToCB (Side side) // "vloat->indexCBList == -1": prevent copying the vloat twice. if (vloat->indexCBList == -1 && vloat->mark == mark) { dest->put (vloat); - //printf("[%p] moving %s float %p (%s %p, mark %d) to CB list\n", - // containingBlock, side == LEFT ? "left" : "right", - // vloat, vloat->widget->getClassName(), vloat->widget, - // vloat->mark); + DBG_OBJ_MSGF ("oofm.resize", 1, + "moving float %p (mark %d) to CB list\n", + vloat->getWidget (), vloat->mark); + DBG_OBJ_SET_NUM (side == LEFT ? + "leftFloatsCB.size" : "rightFloatsCB.size", + dest->size()); + DBG_OBJ_ARRATTRSET_PTR (side == LEFT ? + "leftFloatsCB" : "rightFloatsCB", + dest->size() - 1, "widget", + vloat->getWidget ()); + } } } *floatsMark = 0; - //printf ("[%p] new %s list:\n", - // containingBlock, side == LEFT ? "left" : "right"); - //for (int i = 0; i < dest->size(); i++) - // printf (" %d: %s\n", i, dest->get(i)->toString()); + DBG_OBJ_LEAVE (); } void OutOfFlowMgr::sizeAllocateFloats (Side side, int newLastAllocatedFloat) @@ -1078,7 +1088,7 @@ void OutOfFlowMgr::sizeAllocateFloats (Side side, int newLastAllocatedFloat) int OutOfFlowMgr::calcFloatX (Float *vloat, Side side, int gbX, int gbWidth, int gbLineBreakWidth) { - DBG_OBJ_ENTER ("resize.oofm", 0, "calcFloatX", "%p, %s, %d, %d, %d", + DBG_OBJ_ENTER ("resize.common", 0, "calcFloatX", "%p, %s, %d, %d, %d", vloat->getWidget (), side == LEFT ? "LEFT" : "RIGHT", gbX, gbWidth, gbLineBreakWidth); int x; @@ -1097,7 +1107,8 @@ int OutOfFlowMgr::calcFloatX (Float *vloat, Side side, int gbX, int gbWidth, if (wasAllocated (containingBlock) && x + vloat->size.width > containingBlock->getLineBreakWidth ()) { x = max (0, containingBlock->getLineBreakWidth () - vloat->size.width); - DBG_OBJ_MSGF ("resize.oofm", 1, "corrected to: max (0, %d - %d) = %d", + DBG_OBJ_MSGF ("resize.common", 1, + "corrected to: max (0, %d - %d) = %d", containingBlock->getLineBreakWidth (), vloat->size.width, x); } @@ -1116,7 +1127,7 @@ int OutOfFlowMgr::calcFloatX (Float *vloat, Side side, int gbX, int gbWidth, - vloat->generatingBlock->getStyle()->boxRestWidth(), // Do not exceed CB allocation: 0); - DBG_OBJ_MSGF ("resize.oofm", 1, "x = max (%d + %d - %d - %d, 0) = %d", + DBG_OBJ_MSGF ("resize.common", 1, "x = max (%d + %d - %d - %d, 0) = %d", gbX, gbLineBreakWidth, vloat->size.width, vloat->generatingBlock->getStyle()->boxRestWidth(), x); break; @@ -1230,8 +1241,9 @@ void OutOfFlowMgr::addWidgetOOF (Widget *widget, Textblock *generatingBlock, if (wasAllocated (generatingBlock)) { leftFloatsCB->put (vloat); - //printf ("[%p] adding left float %p (%s %p) to CB list\n", - // containingBlock, vloat, widget->getClassName(), widget); + DBG_OBJ_SET_NUM ("leftFloatsCB.size", leftFloatsCB->size()); + DBG_OBJ_ARRATTRSET_PTR ("leftFloatsCB", leftFloatsCB->size() - 1, + "widget", vloat->getWidget ()); } else { if (tbInfo->index < lastLeftTBIndex) leftFloatsMark++; @@ -1257,8 +1269,9 @@ void OutOfFlowMgr::addWidgetOOF (Widget *widget, Textblock *generatingBlock, if (wasAllocated (generatingBlock)) { rightFloatsCB->put (vloat); - //printf ("[%p] adding right float %p (%s %p) to CB list\n", - // containingBlock, vloat, widget->getClassName(), widget); + DBG_OBJ_SET_NUM ("rightFloatsCB.size", rightFloatsCB->size()); + DBG_OBJ_ARRATTRSET_PTR ("rightFloatsCB", rightFloatsCB->size() - 1, + "widget", vloat->getWidget ()); } else { if (tbInfo->index < lastRightTBIndex) rightFloatsMark++; @@ -1693,6 +1706,8 @@ void OutOfFlowMgr::getFloatsSize (Requisition *cbReq, Side side, int *width, *width = *height = 0; + DBG_OBJ_MSGF ("resize.oofm", 1, "%d floats on this side", list->size()); + for (int i = 0; i < list->size(); i++) { Float *vloat = list->get(i); @@ -1959,12 +1974,22 @@ int OutOfFlowMgr::getBorder (Textblock *textblock, Side side, int y, int h, OutOfFlowMgr::SortedFloatsVector *OutOfFlowMgr::getFloatsListForTextblock (Textblock *textblock, Side side) { - if (wasAllocated (textblock)) - return side == LEFT ? leftFloatsCB : rightFloatsCB; - else { + DBG_OBJ_ENTER ("oofm.common", 1, "getFloatsListForTextblock", "%p, %s", + textblock, side == LEFT ? "LEFT" : "RIGHT"); + + OutOfFlowMgr::SortedFloatsVector *list; + + if (wasAllocated (textblock)) { + DBG_OBJ_MSG ("oofm.common", 2, "returning <b>CB</b> list"); + list = side == LEFT ? leftFloatsCB : rightFloatsCB; + } else { + DBG_OBJ_MSG ("oofm.common", 2, "returning <b>GB</b> list"); TBInfo *tbInfo = getTextblock (textblock); - return side == LEFT ? tbInfo->leftFloatsGB : tbInfo->rightFloatsGB; + list = side == LEFT ? tbInfo->leftFloatsGB : tbInfo->rightFloatsGB; } + + DBG_OBJ_LEAVE (); + return list; } diff --git a/dw/widget.cc b/dw/widget.cc index fb02dda2..a04a767c 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -213,11 +213,36 @@ void Widget::queueResize (int ref, bool extremesChanged, bool fast) (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) { + DBG_IF_RTFL { + DBG_OBJ_MSGF ("resize", 1, "queue item list has %d elements:", + layout->queueQueueResizeList->size ()); + DBG_OBJ_MSG_START (); + for (int i = 0; i < layout->queueQueueResizeList->size (); i++) { + DBG_OBJ_MSGF + ("resize", 1, + "#%d: widget = %p, ref = %d, extremesChanged = %s, " + "fast = %s", + i, layout->queueQueueResizeList->get(i)->widget, + layout->queueQueueResizeList->get(i)->ref, + layout->queueQueueResizeList->get(i)->extremesChanged ? + "true" : "false", + layout->queueQueueResizeList->get(i)->fast ? + "true" : "false"); + } + DBG_OBJ_MSG_END (); + DBG_OBJ_MSG ("resize", 1, "taking #0 out of list"); + } + 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->fast); layout->queueQueueResizeList->remove (0); // hopefully not too large @@ -280,6 +305,11 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) child = widget2, widget2 = widget2->parent) { if (layout && !widget2->resizeQueued ()) layout->queueResizeList->put (widget2); + + DBG_OBJ_MSGF ("resize", 2, "setting %s and ALLOCATE_QUEUED for %p", + resizeFlag == RESIZE_QUEUED ? + "RESIZE_QUEUED" : "NEEDS_RESIZE", + widget2); widget2->setFlags (resizeFlag); widget2->markSizeChange (child->parentRef); |