summaryrefslogtreecommitdiff
path: root/muse2/muse/master
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2011-10-16 21:35:39 +0000
committerTim E. Real <termtech@rogers.com>2011-10-16 21:35:39 +0000
commita65f03f8cefc3e1d2e6b71ace15789fc63795275 (patch)
tree7d7138e88f4dbd6c1dba3a67618dccf37973888c /muse2/muse/master
parentb071fa342f72770346e36b3564c9c225d9af791f (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.cpp7
-rw-r--r--muse2/muse/master/lmaster.h2
-rw-r--r--muse2/muse/master/masteredit.cpp7
-rw-r--r--muse2/muse/master/masteredit.h2
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();