aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/fltkviewbase.cc2
-rw-r--r--dw/fltkviewport.cc35
-rw-r--r--dw/layout.cc1
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();