From 3bc9281c312ec237b6365c023c5ef060f5788a6b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 7 Mar 2019 16:40:16 +0100 Subject: Fix some Gtk::Menu related memory leaks 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. --- gtk2_ardour/audio_clock.cc | 1 + gtk2_ardour/editor.cc | 6 +++++- gtk2_ardour/editor.h | 2 +- gtk2_ardour/editor_routes.cc | 5 +++++ gtk2_ardour/editor_routes.h | 1 + gtk2_ardour/generic_pluginui.cc | 1 + gtk2_ardour/midi_time_axis.cc | 5 +---- gtk2_ardour/panner_ui.cc | 2 +- gtk2_ardour/processor_box.cc | 9 +++++++-- gtk2_ardour/route_time_axis.cc | 5 ++--- gtk2_ardour/route_time_axis.h | 10 +++------- gtk2_ardour/shuttle_control.cc | 1 + gtk2_ardour/transport_masters_dialog.cc | 7 ++++++- gtk2_ardour/transport_masters_dialog.h | 1 + gtk2_ardour/vca_time_axis.cc | 1 + 15 files changed, 37 insertions(+), 20 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 2656c2b445..329b2fb321 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -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; } diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 82ea4f027d..132a07a588 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -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; diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 2931344195..ad0427fd62 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -953,7 +953,7 @@ private: static double timebar_height; guint32 visible_timebars; - Gtk::Menu *editor_ruler_menu; + Gtk::Menu* editor_ruler_menu; ArdourCanvas::Rectangle* tempo_bar; ArdourCanvas::Rectangle* meter_bar; diff --git a/gtk2_ardour/editor_routes.cc b/gtk2_ardour/editor_routes.cc index f6a5cffb0b..f049bea2b9 100644 --- a/gtk2_ardour/editor_routes.cc +++ b/gtk2_ardour/editor_routes.cc @@ -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*) { diff --git a/gtk2_ardour/editor_routes.h b/gtk2_ardour/editor_routes.h index e9497edbbe..d588d54412 100644 --- a/gtk2_ardour/editor_routes.h +++ b/gtk2_ardour/editor_routes.h @@ -36,6 +36,7 @@ class EditorRoutes : public EditorComponent, public PBD::ScopedConnectionList, p { public: EditorRoutes (Editor *); + ~EditorRoutes (); void set_session (ARDOUR::Session *); diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc index 34d38d3088..923c8891e0 100644 --- a/gtk2_ardour/generic_pluginui.cc +++ b/gtk2_ardour/generic_pluginui.cc @@ -224,6 +224,7 @@ GenericPluginUI::~GenericPluginUI () if (output_controls.size() > 0) { screen_update_connection.disconnect(); } + delete automation_menu; delete _pianomm; } diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc index f64caaf271..4cad0fb8be 100644 --- a/gtk2_ardour/midi_time_axis.cc +++ b/gtk2_ardour/midi_time_axis.cc @@ -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 ()); } diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index d41a6a9719..485635f2b4 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -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 (); diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index f7c54a8bce..a31bfc9f73 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -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); } diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc index 7614093e02..4092263dda 100644 --- a/gtk2_ardour/route_time_axis.cc +++ b/gtk2_ardour/route_time_axis.cc @@ -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()); diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index 48af0f82b2..1b061d0fc7 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -161,9 +161,9 @@ protected: struct ProcessorAutomationInfo { boost::shared_ptr processor; - bool valid; - Gtk::Menu* menu; - std::vector lines; + bool valid; + Gtk::Menu* menu; + std::vector lines; ProcessorAutomationInfo (boost::shared_ptr 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 wpl); diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc index d56214f9c0..190f2efb6e 100644 --- a/gtk2_ardour/shuttle_control.cc +++ b/gtk2_ardour/shuttle_control.cc @@ -106,6 +106,7 @@ ShuttleControl::~ShuttleControl () { cairo_pattern_destroy (pattern); cairo_pattern_destroy (shine_pattern); + delete shuttle_context_menu; } void diff --git a/gtk2_ardour/transport_masters_dialog.cc b/gtk2_ardour/transport_masters_dialog.cc index 7421671a01..8a5f9cf4ee 100644 --- a/gtk2_ardour/transport_masters_dialog.cc +++ b/gtk2_ardour/transport_masters_dialog.cc @@ -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()); diff --git a/gtk2_ardour/transport_masters_dialog.h b/gtk2_ardour/transport_masters_dialog.h index d2c2ab11bc..612f531bde 100644 --- a/gtk2_ardour/transport_masters_dialog.h +++ b/gtk2_ardour/transport_masters_dialog.h @@ -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() { diff --git a/gtk2_ardour/vca_time_axis.cc b/gtk2_ardour/vca_time_axis.cc index d4394a65a2..32eacdfc76 100644 --- a/gtk2_ardour/vca_time_axis.cc +++ b/gtk2_ardour/vca_time_axis.cc @@ -122,6 +122,7 @@ VCATimeAxisView::VCATimeAxisView (PublicEditor& ed, Session* s, ArdourCanvas::Ca VCATimeAxisView::~VCATimeAxisView () { + delete automation_action_menu; } void -- cgit v1.2.3