diff options
author | Tim E. Real <termtech@rogers.com> | 2011-10-16 21:35:39 +0000 |
---|---|---|
committer | Tim E. Real <termtech@rogers.com> | 2011-10-16 21:35:39 +0000 |
commit | a65f03f8cefc3e1d2e6b71ace15789fc63795275 (patch) | |
tree | 7d7138e88f4dbd6c1dba3a67618dccf37973888c /muse2/muse/master | |
parent | b071fa342f72770346e36b3564c9c225d9af791f (diff) |
Fixed crashes reloading songs having open editors. Previous memleak fixes
revealed some problems. Installed bool TopWin::deleting(). It is set true when
closeEvent() is called in any self-deleting TopWins. Used it to make all such
TopWins and their corresponding child canvasses ignore songChanged signals.
Diffstat (limited to 'muse2/muse/master')
-rw-r--r-- | muse2/muse/master/lmaster.cpp | 7 | ||||
-rw-r--r-- | muse2/muse/master/lmaster.h | 2 | ||||
-rw-r--r-- | muse2/muse/master/masteredit.cpp | 7 | ||||
-rw-r--r-- | muse2/muse/master/masteredit.h | 2 |
4 files changed, 14 insertions, 4 deletions
diff --git a/muse2/muse/master/lmaster.cpp b/muse2/muse/master/lmaster.cpp index bf31cc91..52b488d0 100644 --- a/muse2/muse/master/lmaster.cpp +++ b/muse2/muse/master/lmaster.cpp @@ -122,7 +122,9 @@ namespace MusEGui { void LMaster::closeEvent(QCloseEvent* e) { - emit deleted(static_cast<TopWin*>(this)); + _isDeleting = true; // Set flag so certain signals like songChanged, which may cause crash during delete, can be ignored. + + emit isDeleting(static_cast<TopWin*>(this)); e->accept(); } @@ -132,6 +134,9 @@ void LMaster::closeEvent(QCloseEvent* e) void LMaster::songChanged(int type) { + if(_isDeleting) // Ignore while while deleting to prevent crash. + return; + if (type & (SC_SIG | SC_TEMPO | SC_KEY )) updateList(); } diff --git a/muse2/muse/master/lmaster.h b/muse2/muse/master/lmaster.h index 6bc90019..33b40f30 100644 --- a/muse2/muse/master/lmaster.h +++ b/muse2/muse/master/lmaster.h @@ -173,7 +173,7 @@ class LMaster : public MidiEditor { void configChanged(); signals: - void deleted(MusEGui::TopWin*); + void isDeleting(MusEGui::TopWin*); void seekTo(int tick); public: diff --git a/muse2/muse/master/masteredit.cpp b/muse2/muse/master/masteredit.cpp index e9d669e1..c3c66008 100644 --- a/muse2/muse/master/masteredit.cpp +++ b/muse2/muse/master/masteredit.cpp @@ -59,7 +59,9 @@ int MasterEdit::_rasterInit = 0; void MasterEdit::closeEvent(QCloseEvent* e) { - emit deleted(static_cast<TopWin*>(this)); + _isDeleting = true; // Set flag so certain signals like songChanged, which may cause crash during delete, can be ignored. + + emit isDeleting(static_cast<TopWin*>(this)); e->accept(); } @@ -69,6 +71,9 @@ void MasterEdit::closeEvent(QCloseEvent* e) void MasterEdit::songChanged(int type) { + if(_isDeleting) // Ignore while while deleting to prevent crash. + return; + if (type & SC_TEMPO) { int tempo = MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos()); curTempo->blockSignals(true); diff --git a/muse2/muse/master/masteredit.h b/muse2/muse/master/masteredit.h index fdf8dd71..835ca879 100644 --- a/muse2/muse/master/masteredit.h +++ b/muse2/muse/master/masteredit.h @@ -91,7 +91,7 @@ class MasterEdit : public MidiEditor { // void tempoChanged(double); signals: - void deleted(MusEGui::TopWin*); + void isDeleting(MusEGui::TopWin*); public: MasterEdit(); |