diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-03 14:03:10 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-03 14:03:10 +0200 |
commit | d9767b10ac4493cf1b76c6b8afd920e2584ef39e (patch) | |
tree | a24d43fdd187ff747bfd0b0e7d1dd324cbd5ae80 | |
parent | e9ee454cedda06403a57d1e17239fa2fbfb36638 (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()
-rw-r--r-- | gtk2_ardour/ardour_dialog.cc | 13 | ||||
-rw-r--r-- | gtk2_ardour/ardour_dialog.h | 1 | ||||
-rw-r--r-- | gtk2_ardour/editor_videotimeline.cc | 3 |
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(); } |