From e6b337e32312772a3450e4b5bd6c9720c2a99dcb Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Wed, 4 Jun 2014 19:00:53 +0700 Subject: [PATCH] Trying to fix #10164 (crash on zoom in/out) This happens due to infinite recursion when syncing extent between map canvas and map renderer. Not entirely sure why, seems to happen only on 32bit systems. --- src/gui/qgsmapcanvas.cpp | 13 +++++++++++++ src/gui/qgsmapcanvas.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/gui/qgsmapcanvas.cpp b/src/gui/qgsmapcanvas.cpp index 713a9de771f..849776f15d1 100755 --- a/src/gui/qgsmapcanvas.cpp +++ b/src/gui/qgsmapcanvas.cpp @@ -89,6 +89,7 @@ QgsMapCanvasRendererSync::QgsMapCanvasRendererSync( QgsMapCanvas* canvas, QgsMap : QObject( canvas ) , mCanvas( canvas ) , mRenderer( renderer ) + , mSyncingExtent( false ) { connect( mCanvas, SIGNAL( extentsChanged() ), this, SLOT( onExtentC2R() ) ); connect( mRenderer, SIGNAL( extentsChanged() ), this, SLOT( onExtentR2C() ) ); @@ -109,12 +110,24 @@ QgsMapCanvasRendererSync::QgsMapCanvasRendererSync( QgsMapCanvas* canvas, QgsMap void QgsMapCanvasRendererSync::onExtentC2R() { + // protection against possible bounce back + if ( mSyncingExtent ) + return; + + mSyncingExtent = true; mRenderer->setExtent( mCanvas->mapSettings().extent() ); + mSyncingExtent = false; } void QgsMapCanvasRendererSync::onExtentR2C() { + // protection against possible bounce back + if ( mSyncingExtent ) + return; + + mSyncingExtent = true; mCanvas->setExtent( mRenderer->extent() ); + mSyncingExtent = false; } void QgsMapCanvasRendererSync::onMapUnitsC2R() diff --git a/src/gui/qgsmapcanvas.h b/src/gui/qgsmapcanvas.h index fdb943affe4..243135109db 100755 --- a/src/gui/qgsmapcanvas.h +++ b/src/gui/qgsmapcanvas.h @@ -662,6 +662,8 @@ class QgsMapCanvasRendererSync : public QObject protected: QgsMapCanvas* mCanvas; QgsMapRenderer* mRenderer; + + bool mSyncingExtent; };