diff options
-rw-r--r-- | dw/textblock.cc | 10 | ||||
-rw-r--r-- | dw/widget.cc | 15 |
2 files changed, 23 insertions, 2 deletions
diff --git a/dw/textblock.cc b/dw/textblock.cc index 0df4270b..94a5b469 100644 --- a/dw/textblock.cc +++ b/dw/textblock.cc @@ -2804,7 +2804,7 @@ void Textblock::borderChanged (int y, Widget *vloat) DBG_OBJ_MSGF ("resize", 1, "Rewrapping from line %d (of %d).", wrapLineIndex, lines->size ()); - if (vloat->getGenerator() == this) { + if (vloat->getGenerator() == this && lines->size () > 0) { bool found = false; // Sometimes, the respective word is not yet part of a // line. Nothing to do, but because of the assertion below @@ -2864,6 +2864,14 @@ void Textblock::borderChanged (int y, Widget *vloat) exceeds = exceedsBeginning = lineIndex2 < 0; } + DBG_OBJ_MSGF ("resize", 2, + "lineIndex2 = %d (of %d), exceeds = %s, " + "exceedsBeginning = %s, exceedsEnd = %s", + lineIndex2, lines->size (), + exceeds ? "true" : "false", + exceedsBeginning ? "true" : "false", + exceedsEnd ? "true" : "false"); + if (exceedsBeginning && exceedsEnd) break; diff --git a/dw/widget.cc b/dw/widget.cc index 35316c4c..484dfff1 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -262,7 +262,20 @@ void Widget::actualQueueResize (int ref, bool extremesChanged, bool fast) markExtremesChange (ref); } - if (!fast) { + if (fast) { + if (parent) { + // In this case, queueResize is called from top (may be a + // random entry point) to bottom, so markSizeChange and + // markExtremesChange have to be called explicitly for the + // parent. The tests (needsResize etc.) are uses to check + // whether queueResize has been called for the parent, or + // whether this widget is the enty point. + if (parent->needsResize () || parent->resizeQueued ()) + parent->markSizeChange (parentRef); + if (parent->extremesChanged () || parent->extremesQueued ()) + parent->markExtremesChange (parentRef); + } + } else { for (widget2 = parent, child = this; widget2; child = widget2, widget2 = widget2->parent) { if (layout && !widget2->resizeQueued ()) |