Fix some Gtk::Menu related memory leaks
authorRobin Gareus <robin@gareus.org>
Thu, 7 Mar 2019 15:40:16 +0000 (16:40 +0100)
committerRobin Gareus <robin@gareus.org>
Thu, 7 Mar 2019 22:50:32 +0000 (23:50 +0100)
A Gtk::manage()d widget will be deleted when its parent container
is destroyed. Top-level context menus are not inside a container and
hence need to be manually deallocated.

This adds explicit delete calls for menus where there is a
member variable reference to the Menu.

15 files changed:
gtk2_ardour/audio_clock.cc
gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_routes.cc
gtk2_ardour/editor_routes.h
gtk2_ardour/generic_pluginui.cc
gtk2_ardour/midi_time_axis.cc
gtk2_ardour/panner_ui.cc
gtk2_ardour/processor_box.cc
gtk2_ardour/route_time_axis.cc
gtk2_ardour/route_time_axis.h
gtk2_ardour/shuttle_control.cc
gtk2_ardour/transport_masters_dialog.cc
gtk2_ardour/transport_masters_dialog.h
gtk2_ardour/vca_time_axis.cc

index 2656c2b445f128cf31d0217d09fe392f17ae7a0a..329b2fb321f2e0252e376667a525d721afed6ed0 100644 (file)
@@ -127,6 +127,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string&
 
 AudioClock::~AudioClock ()
 {
+       delete ops_menu;
        delete foreground_attr;
        delete editing_attr;
 }
index 82ea4f027de1e403be413ac12a3abe6a9083e079..132a07a5882265667033c1c5484f035ae33858a5 100644 (file)
@@ -830,7 +830,6 @@ Editor::Editor ()
 
        _ignore_region_action = false;
        _last_region_menu_was_main = false;
-       _popup_region_menu_item = 0;
 
        _show_marker_lines = false;
 
@@ -858,6 +857,11 @@ Editor::Editor ()
 
 Editor::~Editor()
 {
+       delete tempo_marker_menu;
+       delete meter_marker_menu;
+       delete editor_ruler_menu;
+       delete _popup_region_menu_item;
+
        delete button_bindings;
        delete _routes;
        delete _route_groups;
index 2931344195f8385fa0a99dbd7d85a63f041a13fa..ad0427fd629512da752a0d9ac9897b6079e76f4b 100644 (file)
@@ -953,7 +953,7 @@ private:
 
        static double timebar_height;
        guint32 visible_timebars;
-       Gtk::Menu          *editor_ruler_menu;
+       Gtk::Menueditor_ruler_menu;
 
        ArdourCanvas::Rectangle* tempo_bar;
        ArdourCanvas::Rectangle* meter_bar;
index f6a5cffb0b25a3802e263ec77006719c42b1f226..f049bea2b9f221591dd7a7057cb7fbb0a7f7a964 100644 (file)
@@ -323,6 +323,11 @@ EditorRoutes::EditorRoutes (Editor* e)
        Route::PluginSetup.connect_same_thread (*this, boost::bind (&EditorRoutes::plugin_setup, this, _1, _2, _3));
 }
 
+EditorRoutes::~EditorRoutes ()
+{
+       delete _menu;
+}
+
 bool
 EditorRoutes::focus_in (GdkEventFocus*)
 {
index e9497edbbec566cf497cff1d234d50ced8d68d92..d588d544127c8ca17b3c67f77403a1e2118e887f 100644 (file)
@@ -36,6 +36,7 @@ class EditorRoutes : public EditorComponent, public PBD::ScopedConnectionList, p
 {
 public:
        EditorRoutes (Editor *);
+       ~EditorRoutes ();
 
        void set_session (ARDOUR::Session *);
 
index 34d38d3088da960bdf584703fef7e4ca39afbbf5..923c8891e08b737c9fcd795ea7105c674eea066c 100644 (file)
@@ -224,6 +224,7 @@ GenericPluginUI::~GenericPluginUI ()
        if (output_controls.size() > 0) {
                screen_update_connection.disconnect();
        }
+       delete automation_menu;
        delete _pianomm;
 }
 
index f64caaf2717b16e793f05d096fbccba978d83d6d..4cad0fb8befb5647ff1e040bd43eee53101e647e 100644 (file)
@@ -550,10 +550,7 @@ MidiTimeAxisView::append_extra_display_menu_items ()
        items.push_back (MenuElem (_("Patch Selector..."),
                                sigc::mem_fun(*this, &RouteUI::select_midi_patch)));
 
-       color_mode_menu = build_color_mode_menu();
-       if (color_mode_menu) {
-               items.push_back (MenuElem (_("Color Mode"), *color_mode_menu));
-       }
+       items.push_back (MenuElem (_("Color Mode"), *build_color_mode_menu ()));
 
        items.push_back (SeparatorElem ());
 }
index d41a6a9719ac6f9f0006579b31338795e98bd5b1..485635f2b4e0ef05febbf0cd4388f57bffe102c9 100644 (file)
@@ -374,7 +374,7 @@ PannerUI::pan_button_event (GdkEventButton* ev)
 
        case 3:
                if (pan_menu == 0) {
-                       pan_menu = manage (new Menu);
+                       pan_menu = new Menu;
                        pan_menu->set_name ("ArdourContextMenu");
                }
                build_pan_menu ();
index f7c54a8bce8726bda2f5c918f6391ed8292620c8..a31bfc9f7390bd4486456f582074099b9cbfda8f 100644 (file)
@@ -715,7 +715,7 @@ ProcessorEntry::hide_things ()
 }
 
 
-Menu *
+Menu*
 ProcessorEntry::build_controls_menu ()
 {
        using namespace Menu_Helpers;
@@ -778,7 +778,7 @@ ProcessorEntry::toggle_control_visibility (Control* c)
        _parent->update_gui_object_state (this);
 }
 
-Menu *
+Menu*
 ProcessorEntry::build_send_options_menu ()
 {
        using namespace Menu_Helpers;
@@ -2160,6 +2160,7 @@ ProcessorBox::show_processor_menu (int arg)
                        aux_menu_item->set_submenu (*m);
                        aux_menu_item->set_sensitive (true);
                } else {
+                       delete m;
                        /* stupid gtkmm: we need to pass a null reference here */
                        gtk_menu_item_set_submenu (aux_menu_item->gobj(), 0);
                        aux_menu_item->set_sensitive (false);
@@ -2174,6 +2175,7 @@ ProcessorBox::show_processor_menu (int arg)
                        listen_menu_item->set_submenu (*m);
                        listen_menu_item->set_sensitive (true);
                } else {
+                       delete m;
                        /* stupid gtkmm: we need to pass a null reference here */
                        gtk_menu_item_set_submenu (listen_menu_item->gobj(), 0);
                        listen_menu_item->set_sensitive (false);
@@ -2188,6 +2190,7 @@ ProcessorBox::show_processor_menu (int arg)
                        remove_listen_menu_item->set_submenu (*m);
                        remove_listen_menu_item->set_sensitive (true);
                } else {
+                       delete m;
                        /* stupid gtkmm: we need to pass a null reference here */
                        gtk_menu_item_set_submenu (remove_listen_menu_item->gobj(), 0);
                        remove_listen_menu_item->set_sensitive (false);
@@ -2213,6 +2216,7 @@ ProcessorBox::show_processor_menu (int arg)
                                controls_menu_item->set_submenu (*m);
                                controls_menu_item->set_sensitive (true);
                        } else {
+                               delete m;
                                gtk_menu_item_set_submenu (controls_menu_item->gobj(), 0);
                                controls_menu_item->set_sensitive (false);
                        }
@@ -2230,6 +2234,7 @@ ProcessorBox::show_processor_menu (int arg)
                                send_menu_item->set_submenu (*m);
                                send_menu_item->set_sensitive (true);
                        } else {
+                               delete m;
                                gtk_menu_item_set_submenu (send_menu_item->gobj(), 0);
                                send_menu_item->set_sensitive (false);
                        }
index 7614093e02af6c6056b9193c700b5f447141a77c..4092263dda21f17091b3b0e1d8e5e0e95e3a6288 100644 (file)
@@ -109,8 +109,6 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCan
        , plugins_submenu_item (0)
        , route_group_menu (0)
        , playlist_action_menu (0)
-       , mode_menu (0)
-       , color_mode_menu (0)
        , gm (sess, true, 75, 14)
        , _ignore_set_layer_display (false)
        , pan_automation_item(NULL)
@@ -339,7 +337,7 @@ RouteTimeAxisView::~RouteTimeAxisView ()
        }
 
        delete playlist_action_menu;
-       playlist_action_menu = 0;
+       delete automation_action_menu;
 
        delete _view;
        _view = 0;
@@ -788,6 +786,7 @@ RouteTimeAxisView::build_display_menu ()
 
                } else {
                        /* show nothing */
+                       delete alignment_menu;
                }
 
                items.push_back (SeparatorElem());
index 48af0f82b25c42ef376ec9b5309329bcaf5674fb..1b061d0fc7b3724b13be8827f4b862906d9b6bd6 100644 (file)
@@ -161,9 +161,9 @@ protected:
 
        struct ProcessorAutomationInfo {
                boost::shared_ptr<ARDOUR::Processor> processor;
-               bool                                 valid;
-               Gtk::Menu*                           menu;
-               std::vector<ProcessorAutomationNode*>     lines;
+               bool                                  valid;
+               Gtk::Menu*                            menu;
+               std::vector<ProcessorAutomationNode*> lines;
 
                ProcessorAutomationInfo (boost::shared_ptr<ARDOUR::Processor> i)
                    : processor (i), valid (true), menu (0) {}
@@ -255,10 +255,6 @@ protected:
        RouteGroupMenu*     route_group_menu;
        Gtk::Menu*          playlist_action_menu;
        Gtk::MenuItem*      playlist_item;
-       Gtk::Menu*          mode_menu;
-       Gtk::Menu*          color_mode_menu;
-
-       virtual Gtk::Menu* build_color_mode_menu() { return 0; }
 
        void use_playlist (Gtk::RadioMenuItem *item, boost::weak_ptr<ARDOUR::Playlist> wpl);
 
index d56214f9c0d21cb295fe88f4ec4252a6a0c99516..190f2efb6e52a9993c46c3371dea353d94f54ab8 100644 (file)
@@ -106,6 +106,7 @@ ShuttleControl::~ShuttleControl ()
 {
        cairo_pattern_destroy (pattern);
        cairo_pattern_destroy (shine_pattern);
+       delete shuttle_context_menu;
 }
 
 void
index 7421671a01db14fef1eacc8936993f329c30ba28..8a5f9cf4ee7e36f1d3c6368c6b4e6c5aced6e95e 100644 (file)
@@ -256,6 +256,11 @@ TransportMastersWidget::Row::Row (TransportMastersWidget& p)
 {
 }
 
+TransportMastersWidget::Row::~Row ()
+{
+       delete request_option_menu;
+}
+
 bool
 TransportMastersWidget::Row::name_press (GdkEventButton* ev)
 {
@@ -367,7 +372,7 @@ TransportMastersWidget::Row::build_request_options ()
 {
        using namespace Gtk::Menu_Helpers;
 
-       request_option_menu = manage (new Menu);
+       request_option_menu = new Menu;
 
        MenuList& items (request_option_menu->items());
 
index d2c2ab11bc464701f30f3de209de1739a4c5a883..612f531bdecd96f2b2e704678d21f234961e573f 100644 (file)
@@ -101,6 +101,7 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
                void update (ARDOUR::Session*, ARDOUR::samplepos_t);
 
                Row (TransportMastersWidget& parent);
+               ~Row ();
 
                struct PortColumns : public Gtk::TreeModel::ColumnRecord {
                        PortColumns() {
index d4394a65a28b5317360e506ac44e4028cfcc0d03..32eacdfc767b330d9a98dbed014ab73519a53da3 100644 (file)
@@ -122,6 +122,7 @@ VCATimeAxisView::VCATimeAxisView (PublicEditor& ed, Session* s, ArdourCanvas::Ca
 
 VCATimeAxisView::~VCATimeAxisView ()
 {
+       delete automation_action_menu;
 }
 
 void