add a plugin-death connection
authorRobin Gareus <robin@gareus.org>
Mon, 18 Jul 2016 21:51:10 +0000 (23:51 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 18 Jul 2016 21:52:40 +0000 (23:52 +0200)
at application exit, there may otherwise be a race condition,
queue draw could be scheduled for a widget that's no longer present.

gtk2_ardour/processor_box.cc
gtk2_ardour/processor_box.h

index c01d9e497cc976551a2ae5652f86d7e9e4b29224..4ba27f10a61e98e5b13b5d410559ea76db1c3ed5 100644 (file)
@@ -1518,6 +1518,7 @@ ProcessorEntry::PluginDisplay::PluginDisplay (ProcessorEntry& e, boost::shared_p
 {
        set_name ("processor prefader");
        add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
+       _plug->DropReferences.connect (_death_connection, invalidator (*this), boost::bind (&PluginDisplay::plugin_going_away, this), gui_context());
        _plug->QueueDraw.connect (_qdraw_connection, invalidator (*this),
                        boost::bind (&Gtk::Widget::queue_draw, this), gui_context ());
 
index 27c529980fb4564d16430fd65fd0e331432908ce..5dd7483be4b3dae84867f1eb440875496828ef71 100644 (file)
@@ -250,12 +250,17 @@ private:
                bool on_button_press_event (GdkEventButton *ev);
                bool on_button_release_event (GdkEventButton *ev);
 
+               void plugin_going_away () {
+                       _qdraw_connection.disconnect ();
+               }
+
                void update_height_alloc (uint32_t inline_height);
                virtual uint32_t render_inline (cairo_t *, uint32_t width);
 
                ProcessorEntry& _entry;
                boost::shared_ptr<ARDOUR::Plugin> _plug;
                PBD::ScopedConnection _qdraw_connection;
+               PBD::ScopedConnection _death_connection;
                cairo_surface_t* _surf;
                uint32_t _max_height;
                uint32_t _cur_height;