← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Defer canvas type setting save until destruction of EDA_DRAW_FRAME

 

Updated patch attached (missed initializers in the original)

On Wed, Jan 10, 2018 at 11:40 PM, Jon Evans <jon@xxxxxxxxxxxxx> wrote:

> Hopefully this fixes:
> https://bugs.launchpad.net/kicad/+bug/1741787
> although I don't currently have a good way of reproducing the crash.
>
> Chris, if you can give it a try on your crashing machine that would be
> greatly appreciated.
>
> Thanks
> -Jon
>
From 1eb7a5ca257a9e8d0a5dfad08ed74f3a238df2b0 Mon Sep 17 00:00:00 2001
From: Jon Evans <jon@xxxxxxxxxxxxx>
Date: Thu, 11 Jan 2018 23:02:18 -0500
Subject: [PATCH] Defer canvas type setting save until destruction of 
 EDA_DRAW_FRAME

Fixes: lp:1741787
* https://bugs.launchpad.net/kicad/+bug/1741787
---
 common/draw_frame.cpp                | 5 +++++
 gerbview/events_called_functions.cpp | 4 +++-
 include/draw_frame.h                 | 6 ++++++
 pcbnew/basepcbframe.cpp              | 4 +++-
 4 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/common/draw_frame.cpp b/common/draw_frame.cpp
index bd9342155..49b2df5c6 100644
--- a/common/draw_frame.cpp
+++ b/common/draw_frame.cpp
@@ -142,6 +142,8 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
     m_hotkeysDescrList    = NULL;
 
     m_canvas              = NULL;
+    m_canvasType          = EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE;
+    m_canvasTypeDirty     = false;
     m_galCanvas           = NULL;
     m_galCanvasActive     = false;
     m_actions             = NULL;
@@ -216,6 +218,9 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent,
 
 EDA_DRAW_FRAME::~EDA_DRAW_FRAME()
 {
+    if( m_canvasTypeDirty )
+        saveCanvasTypeSetting( m_canvasType );
+
     delete m_actions;
     delete m_toolManager;
     delete m_toolDispatcher;
diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp
index 05d611aac..222ff9953 100644
--- a/gerbview/events_called_functions.cpp
+++ b/gerbview/events_called_functions.cpp
@@ -563,10 +563,12 @@ void GERBVIEW_FRAME::SwitchCanvas( wxCommandEvent& aEvent )
         break;
     }
 
-    saveCanvasTypeSetting( canvasType );
     UseGalCanvas( use_gal );
     wxUpdateUIEvent e;
     OnUpdateSwitchCanvas( e );
+
+    m_canvasType = canvasType;
+    m_canvasTypeDirty = true;
 }
 
 
diff --git a/include/draw_frame.h b/include/draw_frame.h
index 899c9784b..6d925eb52 100644
--- a/include/draw_frame.h
+++ b/include/draw_frame.h
@@ -141,6 +141,12 @@ protected:
     /// One-shot to avoid a recursive mouse event during hotkey movement
     bool            m_movingCursorWithKeyboard;
 
+    /// Flag indicating that drawing canvas type needs to be saved to config
+    bool            m_canvasTypeDirty;
+
+    /// The current canvas type
+    EDA_DRAW_PANEL_GAL::GAL_TYPE    m_canvasType;
+
     void SetScreen( BASE_SCREEN* aScreen )  { m_currentScreen = aScreen; }
 
     /**
diff --git a/pcbnew/basepcbframe.cpp b/pcbnew/basepcbframe.cpp
index 54ba21cb7..62245fc45 100644
--- a/pcbnew/basepcbframe.cpp
+++ b/pcbnew/basepcbframe.cpp
@@ -958,7 +958,9 @@ void PCB_BASE_FRAME::SwitchCanvas( wxCommandEvent& aEvent )
     }
 
     UseGalCanvas( use_gal );
-    saveCanvasTypeSetting( canvasType );
+
+    m_canvasType = canvasType;
+    m_canvasTypeDirty = true;
 }
 
 
-- 
2.14.1


Follow ups

References