diff options
-rw-r--r-- | dw/fltkviewbase.cc | 2 | ||||
-rw-r--r-- | dw/fltkviewport.cc | 35 | ||||
-rw-r--r-- | dw/layout.cc | 1 |
3 files changed, 20 insertions, 18 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc index 4778cd87..145d4136 100644 --- a/dw/fltkviewbase.cc +++ b/dw/fltkviewbase.cc @@ -434,7 +434,7 @@ void FltkViewBase::finishDrawing (core::Rectangle *area) void FltkViewBase::queueDraw (core::Rectangle *area) { drawRegion.addRectangle (area); - damage (FL_DAMAGE_USER1); + damage (FL_DAMAGE_USER1); // USER1 for buffered draw } void FltkViewBase::queueDrawTotal () diff --git a/dw/fltkviewport.cc b/dw/fltkviewport.cc index 707c0bd7..e903e05f 100644 --- a/dw/fltkviewport.cc +++ b/dw/fltkviewport.cc @@ -193,34 +193,37 @@ void FltkViewport::draw_area (void *data, int x, int y, int w, int h) } fl_pop_clip(); - } +/* + * Draw the viewport. + * + * + Damage flags come in different ways, draw() should cope with them all. + * + FL_DAMAGE_CHILD can flag scroll bars or embedded FLTK widgets. + */ void FltkViewport::draw () { int hdiff = vscrollbar->visible () ? SCROLLBAR_THICKNESS : 0; int vdiff = hscrollbar->visible () ? SCROLLBAR_THICKNESS : 0; int d = damage(); - if (d & FL_DAMAGE_SCROLL) { - clear_damage (FL_DAMAGE_SCROLL); + MSG("FltkViewport::draw d=%d => ", d); + if (d == (FL_DAMAGE_SCROLL | FL_DAMAGE_CHILD)) { fl_scroll(x(), y(), w() - hdiff, h() - vdiff, -scrollDX, -scrollDY, draw_area, this); - clear_damage (d & ~FL_DAMAGE_SCROLL); - } - - if (d) { + MSG("fl_scroll()\n"); + } else { draw_area(this, x(), y(), w () - hdiff, h () - vdiff); + MSG("draw_area()\n"); + } - if (d == FL_DAMAGE_ALL || hscrollbar->damage ()) - draw_child (*hscrollbar); - if (d == FL_DAMAGE_ALL || vscrollbar->damage ()) - draw_child (*vscrollbar); - - if (d == FL_DAMAGE_ALL && hdiff && vdiff) { - fl_color(FL_BACKGROUND_COLOR); - fl_rectf(x()+w()-hdiff, y()+h()-vdiff, hdiff, vdiff); - } + if ((d & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) || vscrollbar->damage ()) + draw_child (*vscrollbar); + if ((d & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) || hscrollbar->damage ()) + draw_child (*hscrollbar); + if ((d & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) && (hdiff && vdiff)) { + fl_color(FL_BACKGROUND_COLOR); + fl_rectf(x()+w()-hdiff, y()+h()-vdiff, hdiff, vdiff); } scrollDX = 0; diff --git a/dw/layout.cc b/dw/layout.cc index 3535d794..28633c85 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -931,7 +931,6 @@ void Layout::resizeIdle () // Tell the view about the new world size. view->setCanvasSize (canvasWidth, canvasAscent, canvasDescent); - // view->queueDrawTotal (false); if (usesViewport) { int currHThickness = currHScrollbarThickness(); |