delete transport masters from an idle callback
authorPaul Davis <paul@linuxaudiosystems.com>
Sun, 7 Oct 2018 16:29:52 +0000 (12:29 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 7 Oct 2018 16:29:52 +0000 (12:29 -0400)
gtk2_ardour/transport_masters_dialog.cc
gtk2_ardour/transport_masters_dialog.h

index 3b16007aca60c79c4fb2a83c8f83da25cf565816..ec2a028ba477d1adc6791c0a161f6176fdb51ef4 100644 (file)
@@ -256,10 +256,22 @@ TransportMastersWidget::Row::name_press (GdkEventButton* ev)
        return false;
 }
 
+gboolean
+TransportMastersWidget::Row::_idle_remove (gpointer arg)
+{
+       TransportMastersWidget::Row* row = (TransportMastersWidget::Row*) arg;
+       TransportMasterManager::instance().remove (row->tm->name());
+
+       return FALSE; /* do not call again */
+}
+
 void
 TransportMastersWidget::Row::remove_clicked ()
 {
-       TransportMasterManager::instance().remove (tm->name());
+       /* have to do this via an idle callback, because it will destroy the
+          widget from which this callback was initiated.
+       */
+       g_idle_add_full (G_PRIORITY_HIGH_IDLE + 10, _idle_remove, this, NULL);
 }
 
 void
@@ -519,7 +531,7 @@ TransportMastersWidget::Row::update (Session* s, samplepos_t now)
 }
 
 void
-       TransportMastersWidget::update (samplepos_t /* audible */)
+TransportMastersWidget::update (samplepos_t /* audible */)
 {
        samplepos_t now = AudioEngine::instance()->sample_time ();
 
index ee6f1cfdb13e21399040ad5fb5cf13014110e7cd..1d20dfee157486af15bae5249c20b1047d2e8b97 100644 (file)
@@ -126,6 +126,8 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
                void prop_change (PBD::PropertyChange);
                void remove_clicked ();
 
+               static gboolean _idle_remove (gpointer arg);
+
                bool name_press (GdkEventButton*);
                void name_edited (std::string, int);