From ccd39b8804cba58206d254944c8e7c3bb8e02cdf Mon Sep 17 00:00:00 2001 From: Jorge Arellano Cid Date: Fri, 29 Jul 2011 15:45:45 -0400 Subject: avoid double draw after scrollIdle() After going back or forward to any page, there were two redraws: one from the origin and another from the scroll position. This patch avoids flicker, and makes rendering 100% faster in this case. --- dw/layout.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'dw/layout.cc') diff --git a/dw/layout.cc b/dw/layout.cc index cf19df37..170ec20e 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -194,6 +194,7 @@ Layout::Layout (Platform *platform) canvasWidth = canvasAscent = canvasDescent = 0; usesViewport = false; + drawAfterScrollReq = false; scrollX = scrollY = 0; viewportWidth = viewportHeight = 0; hScrollbarThickness = vScrollbarThickness = 0; @@ -456,6 +457,11 @@ void Layout::scrollIdle () if (xChanged || yChanged) { adjustScrollPos (); view->scrollTo (scrollX, scrollY); + if (drawAfterScrollReq) { + drawAfterScrollReq = false; + view->queueDrawTotal (); + MSG("Layout::scrollIdle: view->queueDrawTotal()\n"); + } } scrollIdleId = -1; @@ -503,7 +509,11 @@ void Layout::draw (View *view, Rectangle *area) { Rectangle widgetArea, intersection, widgetDrawArea; - if (topLevel) { + if (scrollIdleId != -1) { + /* scroll is pending, defer draw until after scrollIdle() */ + drawAfterScrollReq = true; + + } else if (topLevel) { /* Draw the top level widget. */ widgetArea.x = topLevel->allocation.x; widgetArea.y = topLevel->allocation.y; -- cgit v1.2.3