aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/bullet.cc7
-rw-r--r--dw/bullet.hh5
-rw-r--r--dw/image.cc7
-rw-r--r--dw/image.hh5
-rw-r--r--dw/oofawarewidget.cc91
-rw-r--r--dw/oofawarewidget.hh16
-rw-r--r--dw/ooffloatsmgr.cc40
-rw-r--r--dw/ooffloatsmgr.hh14
-rw-r--r--dw/oofpositionedmgr.cc18
-rw-r--r--dw/oofpositionedmgr.hh5
-rw-r--r--dw/outofflowmgr.hh6
-rw-r--r--dw/ruler.cc6
-rw-r--r--dw/ruler.hh5
-rw-r--r--dw/stackingcontextmgr.cc48
-rw-r--r--dw/stackingcontextmgr.hh18
-rw-r--r--dw/table.cc23
-rw-r--r--dw/table.hh6
-rw-r--r--dw/textblock.cc61
-rw-r--r--dw/textblock.hh16
-rw-r--r--dw/ui.cc6
-rw-r--r--dw/ui.hh4
-rw-r--r--dw/widget.cc29
-rw-r--r--dw/widget.hh10
-rw-r--r--test/dw_simple_container.cc11
-rw-r--r--test/dw_simple_container.hh5
25 files changed, 223 insertions, 239 deletions
diff --git a/dw/bullet.cc b/dw/bullet.cc
index 579de2c7..0b4b5983 100644
--- a/dw/bullet.cc
+++ b/dw/bullet.cc
@@ -57,8 +57,9 @@ void Bullet::containerSizeChangedForChildren ()
DBG_OBJ_LEAVE ();
}
-core::Widget *Bullet::draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack)
+void Bullet::draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
int x, y, l;
bool filled = true;
@@ -81,8 +82,6 @@ core::Widget *Bullet::draw (core::View *view, core::Rectangle *area,
view->drawArc (getStyle()->color, core::style::Color::SHADING_NORMAL,
filled, x + l/2, y + l/2, l, l, 0, 360);
}
-
- return NULL;
}
core::Iterator *Bullet::iterator (core::Content::Type mask, bool atEnd)
diff --git a/dw/bullet.hh b/dw/bullet.hh
index aa83ba3a..7703a64b 100644
--- a/dw/bullet.hh
+++ b/dw/bullet.hh
@@ -17,8 +17,9 @@ protected:
void sizeRequestImpl (core::Requisition *requisition);
void getExtremesImpl (core::Extremes *extremes);
void containerSizeChangedForChildren ();
- Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
core::Iterator *iterator (core::Content::Type mask, bool atEnd);
public:
diff --git a/dw/image.cc b/dw/image.cc
index 881eb687..11d2e97f 100644
--- a/dw/image.cc
+++ b/dw/image.cc
@@ -404,8 +404,9 @@ bool Image::buttonReleaseImpl (core::EventButton *event)
return false;
}
-core::Widget *Image::draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack)
+void Image::draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
int dx, dy;
core::Rectangle content, intersection;
@@ -469,8 +470,6 @@ core::Widget *Image::draw (core::View *view, core::Rectangle *area,
}
/** TODO: draw selection */
-
- return NULL;
}
core::Iterator *Image::iterator (core::Content::Type mask, bool atEnd)
diff --git a/dw/image.hh b/dw/image.hh
index 6032a83b..85776db5 100644
--- a/dw/image.hh
+++ b/dw/image.hh
@@ -135,8 +135,9 @@ protected:
void sizeAllocateImpl (core::Allocation *allocation);
void containerSizeChangedForChildren ();
- Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
bool buttonPressImpl (core::EventButton *event);
bool buttonReleaseImpl (core::EventButton *event);
diff --git a/dw/oofawarewidget.cc b/dw/oofawarewidget.cc
index ed8fe693..3f9c37c8 100644
--- a/dw/oofawarewidget.cc
+++ b/dw/oofawarewidget.cc
@@ -349,45 +349,47 @@ bool OOFAwareWidget::doesWidgetOOFInterruptDrawing (Widget *widget)
return cl < gl;
}
-Widget *OOFAwareWidget::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack)
+void OOFAwareWidget::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
DBG_OBJ_ENTER ("draw", 0, "draw", "%d, %d, %d * %d",
area->x, area->y, area->width, area->height);
- Widget *retWidget = NULL;
-
- while (retWidget == NULL &&
+ while (*interruptedWidget == NULL &&
((OOFStackingIterator*)iteratorStack->getTop())->majorLevel
< OOFStackingIterator::END) {
- retWidget = drawLevel (view, area, iteratorStack,
- ((OOFStackingIterator*)iteratorStack->getTop())
- ->majorLevel);
+ drawLevel (view, area, iteratorStack, interruptedWidget,
+ ((OOFStackingIterator*)iteratorStack->getTop())->majorLevel);
- if (retWidget) {
- if (retWidget->getParent () == this) {
+ if (*interruptedWidget) {
+ if ((*interruptedWidget)->getParent () == this) {
DBG_OBJ_MSGF ("draw", 1, "interrupted at %p, drawing seperately",
- retWidget);
+ *interruptedWidget);
DBG_IF_RTFL {
StringBuffer sb;
iteratorStack->intoStringBuffer (&sb);
DBG_OBJ_MSGF ("draw", 2, "iteratorStack: %s", sb.getChars ());
}
- core::Rectangle retWidgetArea;
- if (retWidget->intersects (area, &retWidgetArea)) {
- // Similar to Widget::drawToplevel. Nested
- // interruptions are not allowed.
+ core::Rectangle interruptedWidgetArea;
+ if ((*interruptedWidget)->intersects (area,
+ &interruptedWidgetArea)) {
+ // Similar to Widget::drawToplevel. Nested interruptions are not
+ // allowed.
StackingIteratorStack iteratorStack2;
- Widget *retWidget2 =
- retWidget->drawTotal (view, &retWidgetArea, &iteratorStack2);
- assert (retWidget2 == NULL);
+ Widget *interruptedWidget2 = NULL;
+ (*interruptedWidget)->drawTotal (view, &interruptedWidgetArea,
+ &iteratorStack2,
+ &interruptedWidget2);
+ assert (interruptedWidget2 == NULL);
}
((OOFStackingIterator*)iteratorStack->getTop())
- ->registerWidgetDrawnAfterInterruption (retWidget);
+ ->registerWidgetDrawnAfterInterruption (*interruptedWidget);
- retWidget = NULL; // Continue with the current state of "iterator".
+ // Continue with the current state of "iterator".
+ *interruptedWidget = NULL;
DBG_OBJ_MSG ("draw", 1, "done with interruption");
}
} else {
@@ -399,22 +401,19 @@ Widget *OOFAwareWidget::draw (View *view, Rectangle *area,
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-Widget *OOFAwareWidget::drawLevel (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int majorLevel)
+void OOFAwareWidget::drawLevel (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel)
{
DBG_OBJ_ENTER ("draw", 0, "OOFAwareWidget/drawLevel",
"(%d, %d, %d * %d), %s",
area->x, area->y, area->width, area->height,
OOFStackingIterator::majorLevelText (majorLevel));
- Widget *retWidget = NULL;
-
switch (majorLevel) {
case OOFStackingIterator::START:
break;
@@ -427,9 +426,9 @@ Widget *OOFAwareWidget::drawLevel (View *view, Rectangle *area,
if (stackingContextMgr) {
OOFStackingIterator *osi =
(OOFStackingIterator*)iteratorStack->getTop ();
- retWidget =
- stackingContextMgr->drawBottom (view, area, iteratorStack,
- &osi->minorLevel, &osi->index);
+ stackingContextMgr->drawBottom (view, area, iteratorStack,
+ interruptedWidget, &osi->minorLevel,
+ &osi->index);
}
break;
@@ -442,16 +441,16 @@ Widget *OOFAwareWidget::drawLevel (View *view, Rectangle *area,
break;
case OOFStackingIterator::OOF_CONT:
- retWidget = drawOOF (view, area, iteratorStack);
+ drawOOF (view, area, iteratorStack, interruptedWidget);
break;
case OOFStackingIterator::SC_TOP:
if (stackingContextMgr) {
OOFStackingIterator *osi =
(OOFStackingIterator*)iteratorStack->getTop ();
- retWidget =
- stackingContextMgr->drawTop (view, area, iteratorStack,
- &osi->minorLevel, &osi->index);
+ stackingContextMgr->drawTop (view, area, iteratorStack,
+ interruptedWidget, &osi->minorLevel,
+ &osi->index);
}
break;
@@ -459,32 +458,27 @@ Widget *OOFAwareWidget::drawLevel (View *view, Rectangle *area,
break;
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-Widget *OOFAwareWidget::drawOOF (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack)
+void OOFAwareWidget::drawOOF (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
OOFStackingIterator *osi = (OOFStackingIterator*)iteratorStack->getTop ();
assert (osi->majorLevel == OOFStackingIterator::OOF_CONT);
- Widget *retWidget = NULL;
-
- while (retWidget == NULL && osi->minorLevel < NUM_OOFM) {
+ while (*interruptedWidget == NULL && osi->minorLevel < NUM_OOFM) {
if(outOfFlowMgr[osi->minorLevel])
- retWidget =
- outOfFlowMgr[osi->minorLevel]->draw (view, area, iteratorStack,
- &(osi->index));
- if (retWidget == NULL) {
+ outOfFlowMgr[osi->minorLevel]->draw (view, area, iteratorStack,
+ interruptedWidget, &(osi->index));
+ if (*interruptedWidget == NULL) {
osi->minorLevel++;
osi->index = 0;
}
}
-
- return retWidget;
-}
+}
Widget *OOFAwareWidget::getWidgetOOFAtPoint (int x, int y)
{
@@ -499,7 +493,6 @@ Widget *OOFAwareWidget::getWidgetOOFAtPoint (int x, int y)
return NULL;
}
-
int OOFAwareWidget::getAvailWidthOfChild (Widget *child, bool forceValue)
{
if (isWidgetOOF(child)) {
diff --git a/dw/oofawarewidget.hh b/dw/oofawarewidget.hh
index 20a482f3..f9d88c2b 100644
--- a/dw/oofawarewidget.hh
+++ b/dw/oofawarewidget.hh
@@ -171,11 +171,12 @@ protected:
void sizeAllocateEnd ();
void containerSizeChangedForChildrenOOF ();
- virtual Widget *drawLevel (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int majorLevel);
- Widget *drawOOF (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ virtual void drawLevel (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel);
+ void drawOOF (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
Widget *getWidgetOOFAtPoint (int x, int y);
static bool isOOFContainer (Widget *widget, int oofmIndex);
@@ -220,8 +221,9 @@ public:
bool doesWidgetOOFInterruptDrawing (Widget *widget);
- Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
lout::object::Object *stackingIterator (bool atEnd);
virtual void borderChanged (int y, core::Widget *vloat);
diff --git a/dw/ooffloatsmgr.cc b/dw/ooffloatsmgr.cc
index 3bddbb34..bc426846 100644
--- a/dw/ooffloatsmgr.cc
+++ b/dw/ooffloatsmgr.cc
@@ -1277,31 +1277,30 @@ int OOFFloatsMgr::calcFloatX (Float *vloat, Side side, int gbX, int gbWidth,
return x;
}
-Widget *OOFFloatsMgr::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack, int *index)
+void OOFFloatsMgr::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *index)
{
DBG_OBJ_ENTER ("draw", 0, "draw", "(%d, %d, %d * %d), [%d]",
area->x, area->y, area->width, area->height, *index);
- Widget *retWidget = NULL;
-
if (*index < leftFloatsCB->size ())
- retWidget =
- drawFloats (leftFloatsCB, view, area, iteratorStack, index, 0);
+ drawFloats (leftFloatsCB, view, area, iteratorStack, interruptedWidget,
+ index, 0);
- if (retWidget == NULL)
- retWidget = drawFloats (rightFloatsCB, view, area, iteratorStack, index,
- leftFloatsCB->size ());
+ if (*interruptedWidget == NULL)
+ drawFloats (rightFloatsCB, view, area, iteratorStack, interruptedWidget,
+ index, leftFloatsCB->size ());
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-Widget *OOFFloatsMgr::drawFloats (SortedFloatsVector *list, View *view,
- Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int *index, int startIndex)
+void OOFFloatsMgr::drawFloats (SortedFloatsVector *list, View *view,
+ Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *index,
+ int startIndex)
{
// This could be improved, since the list is sorted: search the
// first float fitting into the area, and iterate until one is
@@ -1309,9 +1308,8 @@ Widget *OOFFloatsMgr::drawFloats (SortedFloatsVector *list, View *view,
OOFAwareWidget::OOFStackingIterator *osi =
(OOFAwareWidget::OOFStackingIterator*)iteratorStack->getTop ();
- Widget *retWidget = NULL;
- while (retWidget == NULL && *index - startIndex < list->size()) {
+ while (*interruptedWidget == NULL && *index - startIndex < list->size()) {
Float *vloat = list->get(*index - startIndex);
Widget *childWidget = vloat->getWidget ();
@@ -1319,14 +1317,12 @@ Widget *OOFFloatsMgr::drawFloats (SortedFloatsVector *list, View *view,
if (!osi->hasWidgetBeenDrawnAfterInterruption (childWidget) &&
!StackingContextMgr::handledByStackingContextMgr (childWidget) &&
childWidget->intersects (area, &childArea))
- retWidget =
- childWidget->drawTotal (view, &childArea, iteratorStack);
+ childWidget->drawTotal (view, &childArea, iteratorStack,
+ interruptedWidget);
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
(*index)++;
}
-
- return retWidget;
}
void OOFFloatsMgr::addWidgetInFlow (OOFAwareWidget *textblock,
diff --git a/dw/ooffloatsmgr.hh b/dw/ooffloatsmgr.hh
index f7f994d7..70c576b4 100644
--- a/dw/ooffloatsmgr.hh
+++ b/dw/ooffloatsmgr.hh
@@ -284,10 +284,11 @@ private:
bool doFloatsExceedCB (Side side);
bool haveExtremesChanged (Side side);
- core::Widget *drawFloats (SortedFloatsVector *list, core::View *view,
- core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int *index, int startIndex);
+ void drawFloats (SortedFloatsVector *list, core::View *view,
+ core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ core::Widget **interruptedWidget, int *index,
+ int startIndex);
core::Widget *getFloatWidgetAtPoint (SortedFloatsVector *list, int x, int y);
bool collidesV (Float *vloat, Float *other, SFVType type, int *yReal);
@@ -342,8 +343,9 @@ public:
core::Allocation *allocation);
void sizeAllocateEnd (OOFAwareWidget *caller);
void containerSizeChangedForChildren ();
- core::Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack, int *index);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ core::Widget **interruptedWidget, int *index);
void markSizeChange (int ref);
void markExtremesChange (int ref);
diff --git a/dw/oofpositionedmgr.cc b/dw/oofpositionedmgr.cc
index 8c322333..24a6622a 100644
--- a/dw/oofpositionedmgr.cc
+++ b/dw/oofpositionedmgr.cc
@@ -168,34 +168,32 @@ bool OOFPositionedMgr::haveExtremesChanged ()
}
-Widget *OOFPositionedMgr::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int *index)
+void OOFPositionedMgr::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *index)
{
DBG_OBJ_ENTER ("draw", 0, "draw", "(%d, %d, %d * %d), [%d]",
area->x, area->y, area->width, area->height, *index);
OOFAwareWidget::OOFStackingIterator *osi =
(OOFAwareWidget::OOFStackingIterator*)iteratorStack->getTop ();
- Widget *retWidget = NULL;
- while (retWidget == NULL && *index < children->size()) {
+ while (*interruptedWidget == NULL && *index < children->size()) {
Child *child = children->get(*index);
Rectangle childArea;
if (!osi->hasWidgetBeenDrawnAfterInterruption (child->widget) &&
!StackingContextMgr::handledByStackingContextMgr (child->widget) &&
child->widget->intersects (area, &childArea))
- retWidget =
- child->widget->drawTotal (view, &childArea, iteratorStack);
+ child->widget->drawTotal (view, &childArea, iteratorStack,
+ interruptedWidget);
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
(*index)++;
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
void OOFPositionedMgr::addWidgetInFlow (OOFAwareWidget *widget,
diff --git a/dw/oofpositionedmgr.hh b/dw/oofpositionedmgr.hh
index 819c4558..bf701941 100644
--- a/dw/oofpositionedmgr.hh
+++ b/dw/oofpositionedmgr.hh
@@ -65,8 +65,9 @@ public:
core::Allocation *allocation);
void sizeAllocateEnd (OOFAwareWidget *caller);
void containerSizeChangedForChildren ();
- core::Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack, int *index);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ core::Widget **interruptedWidget, int *index);
void markSizeChange (int ref);
void markExtremesChange (int ref);
diff --git a/dw/outofflowmgr.hh b/dw/outofflowmgr.hh
index 15a94081..b7db0fe3 100644
--- a/dw/outofflowmgr.hh
+++ b/dw/outofflowmgr.hh
@@ -25,9 +25,9 @@ public:
core::Allocation *allocation) = 0;
virtual void sizeAllocateEnd (OOFAwareWidget *caller) = 0;
virtual void containerSizeChangedForChildren () = 0;
- virtual core::Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int *index) = 0;
+ virtual void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ core::Widget **interruptedWidget, int *index) = 0;
virtual void markSizeChange (int ref) = 0;
virtual void markExtremesChange (int ref) = 0;
diff --git a/dw/ruler.cc b/dw/ruler.cc
index b8a7deb5..979cb03c 100644
--- a/dw/ruler.cc
+++ b/dw/ruler.cc
@@ -62,11 +62,11 @@ bool Ruler::usesAvailWidth ()
return true;
}
-core::Widget *Ruler::draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack)
+void Ruler::draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
drawWidgetBox (view, area, false);
- return NULL;
}
core::Iterator *Ruler::iterator (core::Content::Type mask, bool atEnd)
diff --git a/dw/ruler.hh b/dw/ruler.hh
index f0f98465..c94c2e55 100644
--- a/dw/ruler.hh
+++ b/dw/ruler.hh
@@ -20,8 +20,9 @@ protected:
void getExtremesImpl (core::Extremes *extremes);
void containerSizeChangedForChildren ();
bool usesAvailWidth ();
- Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
public:
Ruler ();
diff --git a/dw/stackingcontextmgr.cc b/dw/stackingcontextmgr.cc
index 70b4dd75..08fb0e82 100644
--- a/dw/stackingcontextmgr.cc
+++ b/dw/stackingcontextmgr.cc
@@ -60,36 +60,36 @@ void StackingContextMgr::addChildSCWidget (Widget *widget)
DBG_OBJ_ARRSET_PTR ("childSCWidgets", childSCWidgets->size() - 1, widget);
}
-Widget *StackingContextMgr::drawBottom (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int *zIndexOffset, int *index)
+void StackingContextMgr::drawBottom (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget,
+ int *zIndexOffset, int *index)
{
DBG_OBJ_ENTER ("draw", 0, "drawBottom", "(%d, %d, %d * %d), [%d], [%d]",
area->x, area->y, area->width, area->height, *zIndexOffset,
*index);
- Widget *retWidget =
- draw (view, area, iteratorStack, index, INT_MIN, -1, zIndexOffset);
+ draw (view, area, iteratorStack, interruptedWidget, index, INT_MIN, -1,
+ zIndexOffset);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-Widget *StackingContextMgr::drawTop (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int *zIndexOffset, int *index)
+void StackingContextMgr::drawTop (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget,
+ int *zIndexOffset, int *index)
{
DBG_OBJ_ENTER ("draw", 0, "drawTop", "(%d, %d, %d * %d), [%d], [%d]",
area->x, area->y, area->width, area->height, *zIndexOffset,
*index);
- Widget *retWidget =
- draw (view, area, iteratorStack, index, 0, INT_MAX, zIndexOffset);
+ draw (view, area, iteratorStack, interruptedWidget, index, 0, INT_MAX,
+ zIndexOffset);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-Widget *StackingContextMgr::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack,
- int *zIndexOffset, int startZIndex,
- int endZIndex, int *index)
+void StackingContextMgr::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *zIndexOffset,
+ int startZIndex, int endZIndex, int *index)
{
DBG_OBJ_ENTER ("draw", 0, "draw", "(%d, %d, %d * %d), [%d], %d, %d, [%d]",
area->x, area->y, area->width, area->height,
@@ -98,28 +98,29 @@ Widget *StackingContextMgr::draw (View *view, Rectangle *area,
DBG_OBJ_MSGF ("draw", 1, "initially: index = %d (of %d)",
*index, childSCWidgets->size ());
- Widget *retWidget = NULL;
int startZIndexEff = max (minZIndex, startZIndex),
endZIndexEff = min (maxZIndex, endZIndex);
- while (retWidget == NULL && *zIndexOffset + startZIndexEff <= endZIndexEff) {
+ while (*interruptedWidget == NULL &&
+ *zIndexOffset + startZIndexEff <= endZIndexEff) {
DBG_OBJ_MSGF ("draw", 1, "drawing zIndex = %d + %d",
*zIndexOffset, startZIndexEff);
DBG_OBJ_MSG_START ();
- while (retWidget == NULL && *index < childSCWidgets->size ()) {
+ while (*interruptedWidget == NULL && *index < childSCWidgets->size ()) {
Widget *child = childSCWidgets->get (*index);
DBG_OBJ_MSGF ("draw", 2, "widget %p has zIndex = %d",
child, child->getStyle()->zIndex);
Rectangle childArea;
if (child->getStyle()->zIndex == *zIndexOffset + startZIndexEff &&
child->intersects (area, &childArea))
- retWidget = child->drawTotal (view, &childArea, iteratorStack);
+ child->drawTotal (view, &childArea, iteratorStack,
+ interruptedWidget);
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
(*index)++;
}
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
(*zIndexOffset)++;
DBG_OBJ_MSG_END ();
@@ -127,9 +128,8 @@ Widget *StackingContextMgr::draw (View *view, Rectangle *area,
DBG_OBJ_MSGF ("draw", 1, "finally: index = %d (of %d)",
*index, childSCWidgets->size ());
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
Widget *StackingContextMgr::getTopWidgetAtPoint (int x, int y)
diff --git a/dw/stackingcontextmgr.hh b/dw/stackingcontextmgr.hh
index 10a929cf..28cdd2f9 100644
--- a/dw/stackingcontextmgr.hh
+++ b/dw/stackingcontextmgr.hh
@@ -23,9 +23,9 @@ private:
lout::container::typed::Vector<Widget> *childSCWidgets;
int minZIndex, maxZIndex;
- Widget *draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack, int *zIndexOffset,
- int startZIndex, int endZIndex, int *index);
+ void draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack, Widget **interruptedWidget,
+ int *zIndexOffset, int startZIndex, int endZIndex, int *index);
Widget *getWidgetAtPoint (int x, int y, int startZIndex, int endZIndex);
public:
@@ -47,12 +47,12 @@ public:
void addChildSCWidget (Widget *widget);
- Widget *drawBottom (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack, int *zIndexOffset,
- int *index);
- Widget *drawTop (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack, int *zIndexOffset,
- int *index);
+ void drawBottom (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *zIndexOffset, int *index);
+ void drawTop (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int *zIndexOffset, int *index);
Widget *getTopWidgetAtPoint (int x, int y);
Widget *getBottomWidgetAtPoint (int x, int y);
diff --git a/dw/table.cc b/dw/table.cc
index 656084a4..c65f2d75 100644
--- a/dw/table.cc
+++ b/dw/table.cc
@@ -356,16 +356,14 @@ bool Table::isBlockLevel ()
return true;
}
-core::Widget *Table::drawLevel (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int majorLevel)
+void Table::drawLevel (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel)
{
DBG_OBJ_ENTER ("draw", 0, "Table/drawLevel", "(%d, %d, %d * %d), %s",
area->x, area->y, area->width, area->height,
OOFStackingIterator::majorLevelText (majorLevel));
- Widget *retWidget = NULL;
-
#if 0
// This old code belongs perhaps to the background. Check when reactivated.
int offx = getStyle()->boxOffsetX () + getStyle()->hBorderSpacing;
@@ -390,32 +388,31 @@ core::Widget *Table::drawLevel (core::View *view, core::Rectangle *area,
OOFStackingIterator *osi =
(OOFStackingIterator*)iteratorStack->getTop ();
- while (retWidget == NULL && osi->index < children->size ()) {
+ while (*interruptedWidget == NULL && osi->index < children->size ()) {
if (childDefined (osi->index)) {
Widget *child = children->get(osi->index)->cell.widget;
core::Rectangle childArea;
if (!core::StackingContextMgr::handledByStackingContextMgr
(child)
&& child->intersects (area, &childArea))
- retWidget =
- child->drawTotal (view, &childArea, iteratorStack);
+ child->drawTotal (view, &childArea, iteratorStack,
+ interruptedWidget);
}
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
osi->index++;
}
}
break;
default:
- retWidget =
- OOFAwareWidget::drawLevel (view, area, iteratorStack, majorLevel);
+ OOFAwareWidget::drawLevel (view, area, iteratorStack, interruptedWidget,
+ majorLevel);
break;
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
void Table::removeChild (Widget *child)
diff --git a/dw/table.hh b/dw/table.hh
index c6f23259..db546f2a 100644
--- a/dw/table.hh
+++ b/dw/table.hh
@@ -471,9 +471,9 @@ protected:
bool isBlockLevel ();
- Widget *drawLevel (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int majorLevel);
+ void drawLevel (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel);
//bool buttonPressImpl (core::EventButton *event);
//bool buttonReleaseImpl (core::EventButton *event);
diff --git a/dw/textblock.cc b/dw/textblock.cc
index 615406ea..9812572f 100644
--- a/dw/textblock.cc
+++ b/dw/textblock.cc
@@ -1447,17 +1447,15 @@ void Textblock::drawSpace(int wordIndex, core::View *view,
* - area is used always (ev. set it to event->area)
* - event is only used when is_expose
*/
-core::Widget *Textblock::drawLine (Line *line, core::View *view,
- core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack)
+void Textblock::drawLine (Line *line, core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
DBG_OBJ_ENTER ("draw", 0, "drawLine", "..., %d, %d, %d * %d",
area->x, area->y, area->width, area->height);
OOFStackingIterator *osi = (OOFStackingIterator*)iteratorStack->getTop ();
- Widget *retWidget = NULL;
-
int xWidget = line->textOffset;
int yWidgetBase = lineYOffsetWidget (line) + line->borderAscent;
@@ -1470,7 +1468,7 @@ core::Widget *Textblock::drawLine (Line *line, core::View *view,
if (osi->index < line->firstWord)
osi->index = line->firstWord;
- while (retWidget == NULL && osi->index <= line->lastWord
+ while (*interruptedWidget == NULL && osi->index <= line->lastWord
&& xWidget < area->x + area->width) {
Word *word = words->getRef (osi->index);
int wordSize = word->size.width;
@@ -1486,8 +1484,8 @@ core::Widget *Textblock::drawLine (Line *line, core::View *view,
if (!core::StackingContextMgr::handledByStackingContextMgr
(child) &&
child->intersects (area, &childArea))
- retWidget =
- child->drawTotal (view, &childArea, iteratorStack);
+ child->drawTotal (view, &childArea, iteratorStack,
+ interruptedWidget);
} else {
int wordIndex2 = osi->index;
while (wordIndex2 < line->lastWord &&
@@ -1523,13 +1521,12 @@ core::Widget *Textblock::drawLine (Line *line, core::View *view,
}
xWidget += wordSize + word->effSpace;
- if (retWidget == NULL)
+ if (*interruptedWidget == NULL)
osi->index++;
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
/**
@@ -1697,49 +1694,46 @@ Textblock::Word *Textblock::findWord (int x, int y, bool *inSpace)
return NULL;
}
-core::Widget *Textblock::drawLevel (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int majorLevel)
+void Textblock::drawLevel (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel)
{
DBG_OBJ_ENTER ("draw", 0, "Textblock/drawLevel", "(%d, %d, %d * %d), %s",
area->x, area->y, area->width, area->height,
OOFStackingIterator::majorLevelText (majorLevel));
- Widget *retWidget = NULL;
-
switch (majorLevel) {
case OOFStackingIterator::IN_FLOW:
// Osi->index (word index) is regarded in drawLine.
for (int lineIndex = findLineIndexWhenAllocated (area->y);
- retWidget == NULL && lineIndex < lines->size (); lineIndex++) {
+ *interruptedWidget == NULL && lineIndex < lines->size ();
+ lineIndex++) {
Line *line = lines->getRef (lineIndex);
if (lineYOffsetWidget (line) >= area->y + area->height)
break;
DBG_OBJ_MSGF ("draw", 0, "line %d (of %d)", lineIndex, lines->size ());
- retWidget = drawLine (line, view, area, iteratorStack);
+ drawLine (line, view, area, iteratorStack, interruptedWidget);
}
break;
case OOFStackingIterator::OOF_REF:
- retWidget = drawOOFReferences (view, area, iteratorStack);
+ drawOOFReferences (view, area, iteratorStack, interruptedWidget);
break;
default:
- retWidget =
- OOFAwareWidget::drawLevel (view, area, iteratorStack, majorLevel);
+ OOFAwareWidget::drawLevel (view, area, iteratorStack, interruptedWidget,
+ majorLevel);
break;
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
-core::Widget *Textblock::drawOOFReferences (core::View *view,
- core::Rectangle *area,
- core::StackingIteratorStack
- *iteratorStack)
+void Textblock::drawOOFReferences (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
DBG_OBJ_ENTER ("draw", 0, "Textblock/drawOOFReferences", "%d, %d, %d * %d",
area->x, area->y, area->width, area->height);
@@ -1749,30 +1743,27 @@ core::Widget *Textblock::drawOOFReferences (core::View *view,
OOFStackingIterator *osi = (OOFStackingIterator*)iteratorStack->getTop ();
assert (osi->majorLevel == OOFStackingIterator::OOF_REF);
- Widget *retWidget = NULL;
-
- while (retWidget == NULL && osi->minorLevel < NUM_OOFM) {
- while (retWidget == NULL && osi->index < words->size ()) {
+ while (*interruptedWidget == NULL && osi->minorLevel < NUM_OOFM) {
+ while (*interruptedWidget == NULL && osi->index < words->size ()) {
Word *word = words->getRef (osi->index);
if (word->content.type == core::Content::WIDGET_OOF_REF &&
getOOFMIndex (word->content.widget) == osi->minorLevel &&
doesWidgetOOFInterruptDrawing (word->content.widget))
- retWidget = word->content.widget;
+ *interruptedWidget = word->content.widget;
// The index is increased in any case: the iterator must
// point to the next element.
osi->index++;
}
- if (retWidget == NULL) {
+ if (*interruptedWidget == NULL) {
osi->minorLevel++;
osi->index = 0;
}
}
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_OBJ_LEAVE ();
- return retWidget;
}
/**
diff --git a/dw/textblock.hh b/dw/textblock.hh
index 4a5681e6..c96b2bc6 100644
--- a/dw/textblock.hh
+++ b/dw/textblock.hh
@@ -642,10 +642,12 @@ protected:
core::Rectangle *area, int xWidget, int yWidgetBase);
void drawSpace (int wordIndex, core::View *view, core::Rectangle *area,
int xWidget, int yWidgetBase);
- Widget *drawLine (Line *line, core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
- Widget *drawOOFReferences (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void drawLine (Line *line, core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
+ void drawOOFReferences (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
int findLineIndex (int y);
int findLineIndexWhenNotAllocated (int y);
@@ -801,9 +803,9 @@ protected:
void alignLine (int lineIndex);
void calcTextOffset (int lineIndex, int totalWidth);
- Widget *drawLevel (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack,
- int majorLevel);
+ void drawLevel (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget, int majorLevel);
void sizeRequestImpl (core::Requisition *requisition);
void getExtremesImpl (core::Extremes *extremes);
diff --git a/dw/ui.cc b/dw/ui.cc
index 70b451c9..2aed65de 100644
--- a/dw/ui.cc
+++ b/dw/ui.cc
@@ -128,12 +128,12 @@ void Embed::setEnabled (bool enabled)
resource->setEnabled (enabled);
}
-Widget *Embed::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack)
+void Embed::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
drawWidgetBox (view, area, false);
resource->draw (view, area);
- return NULL;
}
Iterator *Embed::iterator (Content::Type mask, bool atEnd)
diff --git a/dw/ui.hh b/dw/ui.hh
index 898b51d4..1ff896f5 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -253,8 +253,8 @@ public:
void setDisplayed (bool displayed);
void setEnabled (bool enabled);
- Widget *draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack);
+ void draw (View *view, Rectangle *area, StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
Iterator *iterator (Content::Type mask, bool atEnd);
void setStyle (style::Style *style);
diff --git a/dw/widget.cc b/dw/widget.cc
index 607b157d..3c58d0a1 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -179,8 +179,9 @@ bool Widget::intersects (Rectangle *area, Rectangle *intersection)
return r;
}
-Widget *Widget::drawTotal (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack)
+void Widget::drawTotal (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
DBG_OBJ_ENTER ("draw", 0, "drawTotal", "%d, %d, %d * %d",
area->x, area->y, area->width, area->height);
@@ -208,8 +209,8 @@ Widget *Widget::drawTotal (View *view, Rectangle *area,
sb.getChars ());
}
- Widget *retWidget = draw (view, area, iteratorStack);
- DBG_OBJ_MSGF ("draw", 1, "=> %p", retWidget);
+ draw (view, area, iteratorStack, interruptedWidget);
+ DBG_OBJ_MSGF ("draw", 1, "=> %p", *interruptedWidget);
DBG_IF_RTFL {
misc::StringBuffer sb;
@@ -218,15 +219,15 @@ Widget *Widget::drawTotal (View *view, Rectangle *area,
sb.getChars ());
}
- // A return value other than NULL indicates a widget with a complex
- // drawing process, for which stackIterator() must return something
- // non-NULL, so that the interrupted drawing process can be
- // continued. (TODO: Not quite correct when forward() was called
- // instead of push().)
+ // A value for *interruptedWidget other than NULL indicates a
+ // widget with a complex drawing process, for which stackIterator()
+ // must return something non-NULL, so that the interrupted drawing
+ // process can be continued. (TODO: Not quite correct when
+ // forward() was called instead of push().)
- // assert (retWidget == NULL || si != NULL);
+ // assert (*interruptedWidget == NULL || si != NULL);
- if (retWidget == NULL) {
+ if (*interruptedWidget == NULL) {
if (si)
iteratorStack->pop ();
} else
@@ -239,7 +240,6 @@ Widget *Widget::drawTotal (View *view, Rectangle *area,
}
DBG_OBJ_LEAVE ();
- return retWidget;
}
void Widget::drawToplevel (View *view, Rectangle *area)
@@ -247,10 +247,11 @@ void Widget::drawToplevel (View *view, Rectangle *area)
assert (parent == NULL);
StackingIteratorStack iteratorStack;
- Widget *retWidget = drawTotal (view, area, &iteratorStack);
+ Widget *interruptedWidget = NULL;
+ drawTotal (view, area, &iteratorStack, &interruptedWidget);
// Everything should be finished at this point.
- assert (retWidget == NULL);
+ assert (interruptedWidget == NULL);
}
void Widget::setParent (Widget *parent)
diff --git a/dw/widget.hh b/dw/widget.hh
index 8cd05e13..c284e172 100644
--- a/dw/widget.hh
+++ b/dw/widget.hh
@@ -469,10 +469,12 @@ public:
bool intersects (Rectangle *area, Rectangle *intersection);
/** Area is given in widget coordinates. */
- virtual Widget *draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack) = 0;
- Widget *drawTotal (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack);
+ virtual void draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget) = 0;
+ void drawTotal (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
void drawToplevel (View *view, Rectangle *area);
bool buttonPress (EventButton *event);
diff --git a/test/dw_simple_container.cc b/test/dw_simple_container.cc
index 9507e233..94dec2d5 100644
--- a/test/dw_simple_container.cc
+++ b/test/dw_simple_container.cc
@@ -205,17 +205,14 @@ namespace dw {
}
}
-core::Widget *SimpleContainer::draw (View *view, Rectangle *area,
- StackingIteratorStack *iteratorStack)
+void SimpleContainer::draw (View *view, Rectangle *area,
+ StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget)
{
- Widget *retWidget = NULL;
-
drawWidgetBox (view, area, false);
Rectangle childArea;
if (child && child->intersects (area, &childArea))
- retWidget = child->drawTotal (view, &childArea, iteratorStack);
-
- return retWidget;
+ child->drawTotal (view, &childArea, iteratorStack, interruptedWidget);
}
Iterator *SimpleContainer::iterator (Content::Type mask, bool atEnd)
diff --git a/test/dw_simple_container.hh b/test/dw_simple_container.hh
index 251df8fb..9f3b2ca6 100644
--- a/test/dw_simple_container.hh
+++ b/test/dw_simple_container.hh
@@ -44,8 +44,9 @@ public:
SimpleContainer ();
~SimpleContainer ();
- Widget *draw (core::View *view, core::Rectangle *area,
- core::StackingIteratorStack *iteratorStack);
+ void draw (core::View *view, core::Rectangle *area,
+ core::StackingIteratorStack *iteratorStack,
+ Widget **interruptedWidget);
core::Iterator *iterator (core::Content::Type mask, bool atEnd);
void removeChild (Widget *child);