summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-07-03 14:03:10 +0200
committerRobin Gareus <robin@gareus.org>2017-07-03 14:03:10 +0200
commitd9767b10ac4493cf1b76c6b8afd920e2584ef39e (patch)
treea24d43fdd187ff747bfd0b0e7d1dd324cbd5ae80 /gtk2_ardour
parente9ee454cedda06403a57d1e17239fa2fbfb36638 (diff)
Fix another crash at exit.
During ARDOUR_UI::finish(), after destroying various instances: close_all_dialogs() -> ArdourDialog::on_response() -> GUIIdle() The event loop recurses and may execute a previously scheduled Editor::idle_visual_changer()
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_dialog.cc13
-rw-r--r--gtk2_ardour/ardour_dialog.h1
-rw-r--r--gtk2_ardour/editor_videotimeline.cc3
3 files changed, 16 insertions, 1 deletions
diff --git a/gtk2_ardour/ardour_dialog.cc b/gtk2_ardour/ardour_dialog.cc
index c7d78099ce..1c9da0112f 100644
--- a/gtk2_ardour/ardour_dialog.cc
+++ b/gtk2_ardour/ardour_dialog.cc
@@ -68,6 +68,17 @@ ArdourDialog::on_response (int response_id)
}
void
+ArdourDialog::close_self ()
+{
+ /* Don't call Idle, don't pop splash.
+ * This is used at exit and session-close and invoked
+ * via close_all_dialogs.
+ */
+ hide ();
+ Gtk::Dialog::on_response (RESPONSE_CANCEL);
+}
+
+void
ArdourDialog::pop_splash ()
{
if (_splash_pushed) {
@@ -138,7 +149,7 @@ ArdourDialog::init ()
set_transient_for (*parent);
}
- ARDOUR_UI::CloseAllDialogs.connect (sigc::bind (sigc::mem_fun (*this, &ArdourDialog::response), RESPONSE_CANCEL));
+ ARDOUR_UI::CloseAllDialogs.connect (sigc::mem_fun (*this, &ArdourDialog::close_self)); /* send a RESPONSE_CANCEL to self */
proxy = new WM::ProxyTemporary (get_title(), this);
WM::Manager::instance().register_window (proxy);
diff --git a/gtk2_ardour/ardour_dialog.h b/gtk2_ardour/ardour_dialog.h
index 9e91d3e97e..76d7ac1d08 100644
--- a/gtk2_ardour/ardour_dialog.h
+++ b/gtk2_ardour/ardour_dialog.h
@@ -51,6 +51,7 @@ public:
protected:
void pop_splash ();
+ void close_self ();
private:
WM::ProxyTemporary* proxy;
diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc
index e5f5db3465..e087034af0 100644
--- a/gtk2_ardour/editor_videotimeline.cc
+++ b/gtk2_ardour/editor_videotimeline.cc
@@ -53,6 +53,9 @@ Editor::set_video_timeline_height (const int h)
void
Editor::update_video_timeline (bool flush)
{
+ // catch GUIIdle -> Editor::idle_visual_changer during quit/close
+ assert (ARDOUR_UI::instance()->video_timeline);
+
if (flush) {
ARDOUR_UI::instance()->video_timeline->flush_local_cache();
}