diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 6e8ca92d6c..c9a5ac8e1a 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -287,6 +287,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , _was_dirty (false) , _mixer_on_top (false) , _initial_verbose_plugin_scan (false) + , _shared_popup_menu (0) , secondary_clock_spacer (0) , auto_input_button (ArdourButton::led_default_elements) , time_info_box (0) @@ -868,6 +869,7 @@ ARDOUR_UI::~ARDOUR_UI () delete rc_option_editor; rc_option_editor = 0; // failed to wrap object warning delete nsm; nsm = 0; delete gui_object_state; gui_object_state = 0; + delete _shared_popup_menu ; _shared_popup_menu = 0; delete main_window_visibility; FastMeter::flush_pattern_cache (); ArdourFader::flush_pattern_cache (); @@ -5433,7 +5435,7 @@ ARDOUR_UI::popup_editor_meter_menu (GdkEventButton* ev) { using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = shared_popup_menu (); MenuList& items = m->items (); RadioMenuItem::Group group; @@ -6024,3 +6026,14 @@ ARDOUR_UI::monitor_mono () Glib::RefPtr tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-mono"); _monitor->set_mono (tact->get_active()); } + +Gtk::Menu* +ARDOUR_UI::shared_popup_menu () +{ + ENSURE_GUI_THREAD (*this, &ARDOUR_UI::shared_popup_menu, ignored); + + assert (!_shared_popup_menu || !_shared_popup_menu->is_visible()); + delete _shared_popup_menu; + _shared_popup_menu = new Gtk::Menu; + return _shared_popup_menu; +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index db6b30fd60..8ff4c3685f 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -228,6 +228,8 @@ public: PublicEditor& the_editor() { return *editor;} Mixer_UI* the_mixer() { return mixer; } + Gtk::Menu* shared_popup_menu (); + void new_midi_tracer_window (); void toggle_editing_space(); void toggle_mixer_space(); @@ -401,6 +403,8 @@ private: bool _mixer_on_top; bool _initial_verbose_plugin_scan; + Gtk::Menu* _shared_popup_menu; + void hide_tabbable (ArdourWidgets::Tabbable*); void detach_tabbable (ArdourWidgets::Tabbable*); void attach_tabbable (ArdourWidgets::Tabbable*); @@ -555,8 +559,6 @@ private: void transport_rec_enable_blink (bool onoff); - Gtk::Menu* session_popup_menu; - /* menu bar and associated stuff */ Gtk::MenuBar* menu_bar; diff --git a/gtk2_ardour/automation_controller.cc b/gtk2_ardour/automation_controller.cc index c7860c53cb..aa37feabb3 100644 --- a/gtk2_ardour/automation_controller.cc +++ b/gtk2_ardour/automation_controller.cc @@ -31,6 +31,8 @@ #include "widgets/ardour_button.h" #include "widgets/ardour_knob.h" + +#include "ardour_ui.h" #include "automation_controller.h" #include "gui_thread.h" #include "note_select_dialog.h" @@ -301,14 +303,14 @@ AutomationController::on_button_release(GdkEventButton* ev) const ARDOUR::ParameterDescriptor& desc = _controllable->desc(); if (desc.unit == ARDOUR::ParameterDescriptor::MIDI_NOTE) { - Gtk::Menu* menu = manage(new Menu()); + Gtk::Menu* menu = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = menu->items(); items.push_back(MenuElem(_("Select Note..."), sigc::mem_fun(*this, &AutomationController::run_note_select_dialog))); menu->popup(1, ev->time); return true; } else if (desc.unit == ARDOUR::ParameterDescriptor::HZ) { - Gtk::Menu* menu = manage(new Menu()); + Gtk::Menu* menu = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = menu->items(); items.push_back(MenuElem(_("Halve"), sigc::bind(sigc::mem_fun(*this, &AutomationController::set_ratio), diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index 4ca37d191d..ab80917229 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -24,6 +24,7 @@ #include #include +#include "ardour_ui.h" #include "time_axis_view.h" #include "streamview.h" #include "editor_summary.h" @@ -461,7 +462,7 @@ EditorSummary::on_button_press_event (GdkEventButton* ev) if (ev->button == 3) { // right-click: show the reset menu action using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Gtk::Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); items.push_back(MenuElem(_("Reset Summary to Extents"), sigc::mem_fun(*this, &EditorSummary::reset_to_extents))); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index e219a70d1c..ea6ace2af1 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -40,6 +40,7 @@ #include "widgets/tooltips.h" #include "gui_thread.h" +#include "ardour_ui.h" #include "ardour_window.h" #include "ui_config.h" #include "utils.h" @@ -837,7 +838,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) { using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); RadioMenuItem::Group group; @@ -888,7 +889,7 @@ MeterStrip::popup_name_label_menu (GdkEventButton* ev) { using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); RadioMenuItem::Group group; diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 736e757675..052f08204e 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -59,6 +59,7 @@ #include "widgets/tooltips.h" +#include "ardour_ui.h" #include "ardour_window.h" #include "enums_convert.h" #include "mixer_strip.h" @@ -2520,7 +2521,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) { using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); RadioMenuItem::Group group; diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 2f5c1b160b..679b98e41b 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -2874,7 +2874,7 @@ Mixer_UI::popup_note_context_menu (GdkEventButton *ev) { using namespace Gtk::Menu_Helpers; - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); if (_selection.axes.empty()) { diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc index 6959d23d66..148c9ed651 100644 --- a/gtk2_ardour/session_dialog.cc +++ b/gtk2_ardour/session_dialog.cc @@ -1062,7 +1062,7 @@ SessionDialog::recent_context_mennu (GdkEventButton *ev) Gtk::TreeModel::Path tpath = recent_session_model->get_path(iter); const bool is_child = tpath.up () && tpath.up (); - Gtk::Menu* m = manage (new Menu); + Gtk::Menu* m = ARDOUR_UI::instance()->shared_popup_menu (); MenuList& items = m->items (); items.push_back (MenuElem (s, sigc::bind (sigc::hide_return (sigc::ptr_fun (&PBD::open_folder)), s))); if (!is_child) { diff --git a/gtk2_ardour/visibility_group.cc b/gtk2_ardour/visibility_group.cc index d0ef1dd635..10d5f98b73 100644 --- a/gtk2_ardour/visibility_group.cc +++ b/gtk2_ardour/visibility_group.cc @@ -69,6 +69,7 @@ VisibilityGroup::button_press_event (GdkEventButton* ev) return false; } + /* memory leak: Gtk::Menu* */ menu()->popup (1, ev->time); return true; } diff --git a/gtk2_ardour/visibility_group.h b/gtk2_ardour/visibility_group.h index ce1adecdd4..d95497d9ed 100644 --- a/gtk2_ardour/visibility_group.h +++ b/gtk2_ardour/visibility_group.h @@ -45,7 +45,6 @@ public: boost::function ()> = 0 ); - Gtk::Menu* menu (); Gtk::Widget* list_view (); bool button_press_event (GdkEventButton *); void update (); @@ -87,6 +86,8 @@ private: void update_list_view (); bool should_actually_be_visible (Member const &) const; + Gtk::Menu* menu (); + std::vector _members; std::string _xml_property_name; ModelColumns _model_columns;