From b6f4cdaea27fbf49f924b2684d4c638089314067 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 25 Dec 2009 21:06:52 +0000 Subject: rationalize destruction pathway (some more); tidy-ify some ImageFrame code git-svn-id: svn://localhost/ardour2/branches/3.0@6398 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_region_view.cc | 2 - gtk2_ardour/axis_view.cc | 1 - gtk2_ardour/axis_view.h | 2 - gtk2_ardour/editor.cc | 77 ++++++++-------- gtk2_ardour/editor.h | 5 +- gtk2_ardour/editor_drag.cc | 2 +- gtk2_ardour/editor_imageframe.cc | 5 +- gtk2_ardour/editor_mixer.cc | 17 +--- gtk2_ardour/imageframe_time_axis.cc | 19 ++-- gtk2_ardour/imageframe_time_axis.h | 4 +- gtk2_ardour/imageframe_time_axis_group.cc | 143 +++++++++++++++--------------- gtk2_ardour/imageframe_time_axis_view.cc | 6 +- gtk2_ardour/imageframe_view.cc | 117 ++++++++++++------------ gtk2_ardour/marker_time_axis_view.cc | 6 +- gtk2_ardour/midi_region_view.cc | 2 +- gtk2_ardour/mixer_strip.cc | 1 + gtk2_ardour/mixer_strip.h | 1 + gtk2_ardour/mixer_ui.cc | 12 ++- gtk2_ardour/region_view.cc | 5 ++ gtk2_ardour/route_ui.cc | 6 +- gtk2_ardour/selection.cc | 30 ++++--- gtk2_ardour/selection.h | 4 +- gtk2_ardour/time_axis_view.cc | 18 ++-- gtk2_ardour/time_axis_view.h | 2 + 24 files changed, 241 insertions(+), 246 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index c52d71c780..54be60bc9d 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -1186,8 +1186,6 @@ AudioRegionView::add_ghost (TimeAxisView& tv) ghost->set_colors(); ghosts.push_back (ghost); - ghost->CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); - return ghost; } diff --git a/gtk2_ardour/axis_view.cc b/gtk2_ardour/axis_view.cc index 9bd9182201..eb3ef23bc6 100644 --- a/gtk2_ardour/axis_view.cc +++ b/gtk2_ardour/axis_view.cc @@ -44,7 +44,6 @@ using namespace Gtkmm2ext; using namespace ARDOUR; list AxisView::used_colors; -PBD::Signal1 AxisView::CatchDeletion; AxisView::AxisView (ARDOUR::Session* sess) : SessionHandlePtr (sess) diff --git a/gtk2_ardour/axis_view.h b/gtk2_ardour/axis_view.h index 29f167d85e..108d14c1f1 100644 --- a/gtk2_ardour/axis_view.h +++ b/gtk2_ardour/axis_view.h @@ -60,8 +60,6 @@ class AxisView : public virtual Selectable, public PBD::ScopedConnectionList, pu _marked_for_display = yn; } - static PBD::Signal1 CatchDeletion; - sigc::signal Hiding; void set_old_order_key (uint32_t ok) { _old_order_key = ok; } diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 320642cbd9..45fd4d6010 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -310,7 +310,6 @@ Editor::Editor () _show_waveforms_recording = true; show_gain_after_trim = false; verbose_cursor_on = true; - route_removal = false; last_item_entered = 0; last_item_entered_n = 0; @@ -688,6 +687,8 @@ Editor::Editor () Config->ParameterChanged.connect (*this, ui_bind (&Editor::parameter_changed, this, _1), gui_context()); + TimeAxisView::CatchDeletion.connect (*this, ui_bind (&Editor::timeaxisview_deleted, this, _1), gui_context()); + _last_normalization_value = 0; constructed = true; @@ -4803,8 +4804,6 @@ Editor::handle_new_route (RouteList& routes) rtv->view()->RegionViewAdded.connect (sigc::mem_fun (*this, &Editor::region_view_added)); rtv->view()->HeightChanged.connect (sigc::mem_fun (*this, &Editor::streamview_height_changed)); - - route->DropReferences.connect (*this, boost::bind (&Editor::remove_route, this, rtv), gui_context()); } _routes->routes_added (new_views); @@ -4819,56 +4818,62 @@ Editor::handle_new_route (RouteList& routes) } void -Editor::remove_route (TimeAxisView *tv) +Editor::timeaxisview_deleted (TimeAxisView *tv) { - ENSURE_GUI_THREAD (*this, &Editor::remove_route, tv) - - TrackViewList::iterator i; - if ((i = find (track_views.begin(), track_views.end(), tv)) == track_views.end()) { - /* this track view has already been removed by someone else; e.g. when - * the session goes away, all TimeAxisViews are removed by the Editor's - * session_going_away handler. - */ + if (_session && _session->deletion_in_progress()) { + /* the situation is under control */ return; } - boost::shared_ptr route; - RouteTimeAxisView* rtav = dynamic_cast (tv); - if (rtav) { - route = rtav->route (); - } + ENSURE_GUI_THREAD (*this, &Editor::timeaxisview_deleted, tv); - TimeAxisView* next_tv = 0; _routes->route_removed (tv); if (tv == entered_track) { entered_track = 0; } - - i = track_views.erase (i); - if (track_views.empty()) { - next_tv = 0; - } else if (i == track_views.end()) { - next_tv = track_views.front(); - } else { - next_tv = (*i); + /* remove it from the list of track views */ + + TrackViewList::iterator i; + + if ((i = find (track_views.begin(), track_views.end(), tv)) != track_views.end()) { + i = track_views.erase (i); } - if (current_mixer_strip && current_mixer_strip->route() == route) { + /* update whatever the current mixer strip is displaying, if revelant */ - if (next_tv) { - set_selected_mixer_strip (*next_tv); - } else { - /* make the editor mixer strip go away setting the - * button to inactive (which also unticks the menu option) - */ + boost::shared_ptr route; + RouteTimeAxisView* rtav = dynamic_cast (tv); - ActionManager::uncheck_toggleaction ("/Editor/show-editor-mixer"); - } - } + if (rtav) { + route = rtav->route (); + } + + if (current_mixer_strip && current_mixer_strip->route() == route) { + + TimeAxisView* next_tv; + if (track_views.empty()) { + next_tv = 0; + } else if (i == track_views.end()) { + next_tv = track_views.front(); + } else { + next_tv = (*i); + } + + + if (next_tv) { + set_selected_mixer_strip (*next_tv); + } else { + /* make the editor mixer strip go away setting the + * button to inactive (which also unticks the menu option) + */ + + ActionManager::uncheck_toggleaction ("/Editor/show-editor-mixer"); + } + } } void diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c045136f61..ca1082af78 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -618,8 +618,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void add_selection_context_items (Gtk::Menu_Helpers::MenuList&); void handle_new_route (ARDOUR::RouteList&); - void remove_route (TimeAxisView *); - bool route_removal; + void timeaxisview_deleted (TimeAxisView *); Gtk::HBox global_hpacker; Gtk::VBox global_vpacker; @@ -1803,9 +1802,7 @@ public: bool show_editor_mixer_when_tracks_arrive; Gtk::VBox current_mixer_strip_vbox; void cms_new (boost::shared_ptr); - void cms_deleted (); void current_mixer_strip_hidden (); - void current_mixer_strip_removed (); void detach_tearoff (Gtk::Box* b, Gtk::Window* w); void reattach_tearoff (Gtk::Box* b, Gtk::Window* w, int32_t n); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index a86f7ee64b..cd9419cffd 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -2662,7 +2662,7 @@ RubberbandSelectDrag::start_grab (GdkEvent* event, Gdk::Cursor *) } void -RubberbandSelectDrag::motion (GdkEvent* event, bool first_move) +RubberbandSelectDrag::motion (GdkEvent* event, bool) { nframes64_t start; nframes64_t end; diff --git a/gtk2_ardour/editor_imageframe.cc b/gtk2_ardour/editor_imageframe.cc index 2d6e23fbd5..bac689b48f 100644 --- a/gtk2_ardour/editor_imageframe.cc +++ b/gtk2_ardour/editor_imageframe.cc @@ -1088,7 +1088,6 @@ Editor::handle_new_imageframe_time_axis_view(const string & track_name, void* sr row[route_display_columns.tv] = iftav; route_list_display.get_selection()->select (row); - iftav->CatchDeletion.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)iftav), gui_context()); iftav->gui_changed.connect(sigc::mem_fun(*this, &Editor::handle_gui_changes)) ; } @@ -1104,9 +1103,7 @@ Editor::handle_new_imageframe_marker_time_axis_view(const string & track_name, T row[route_display_columns.text] = mta->name(); row[route_display_columns.tv] = mta; route_list_display.get_selection()->select (row); - - mta->CatchDeletion.connect (*this, boost::bind (&Editor::remove_route, this, (TimeAxisView*)mta), gui_context()); - } +} /* */ diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index 311506ecdf..b2cca47e98 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -63,12 +63,6 @@ Editor::editor_list_button_toggled () } } -void -Editor::cms_deleted () -{ - current_mixer_strip = 0; -} - void Editor::show_editor_mixer (bool yn) { @@ -169,7 +163,7 @@ Editor::create_editor_mixer () _session, false); current_mixer_strip->Hiding.connect (sigc::mem_fun(*this, &Editor::current_mixer_strip_hidden)); - current_mixer_strip->CatchDeletion.connect (*this, boost::bind (&Editor::current_mixer_strip_removed, this), gui_context()); + #ifdef GTKOSX current_mixer_strip->WidthChanged.connect (sigc::mem_fun(*this, &Editor::ensure_all_elements_drawn)); #endif @@ -296,15 +290,6 @@ Editor::update_current_screen () } } -void -Editor::current_mixer_strip_removed () -{ - if (current_mixer_strip) { - /* it is being deleted elsewhere */ - current_mixer_strip = 0; - } -} - void Editor::current_mixer_strip_hidden () { diff --git a/gtk2_ardour/imageframe_time_axis.cc b/gtk2_ardour/imageframe_time_axis.cc index 96939218b1..b680dbda3a 100644 --- a/gtk2_ardour/imageframe_time_axis.cc +++ b/gtk2_ardour/imageframe_time_axis.cc @@ -81,6 +81,8 @@ ImageFrameTimeAxis::ImageFrameTimeAxis(const string & track_id, PublicEditor& ed // set the initial height of this time axis set_height(hNormal) ; + + TimeAxisView::CatchDeletion.connect (*this, ui_bind (&ImageFrameTimeAxis::remove_time_axis_view, this, _1), gui_context()); } /** @@ -322,8 +324,6 @@ ImageFrameTimeAxis::add_marker_time_axis(MarkerTimeAxis* marker_track, void* src else { marker_time_axis_list.push_back(marker_track) ; - marker_track->CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxis::remove_time_axis_view, this, marker_track, (void*)this), gui_context()); - MarkerTimeAxisAdded(marker_track, src) ; /* EMIT_SIGNAL */ ret = true ; } @@ -390,17 +390,20 @@ ImageFrameTimeAxis::remove_named_marker_time_axis(const string & track_id, void* * @param src the identity of the object that initiated the change */ void -ImageFrameTimeAxis::remove_time_axis_view(MarkerTimeAxis* mta, void* src) +ImageFrameTimeAxis::remove_time_axis_view (TimeAxisView* tav) { - ENSURE_GUI_THREAD (*this, &ImageFrameTimeAxis::remove_time_axis_view, mta, src) + MarkerTimeAxisView* mtav = dynamic_cast (tav); + + if (!mtav) { + return; + } MarkerTimeAxisList::iterator i; - if((i = find (marker_time_axis_list.begin(), marker_time_axis_list.end(), mta)) != marker_time_axis_list.end()) - { + + if ((i = find (marker_time_axis_list.begin(), marker_time_axis_list.end(), mta)) != marker_time_axis_list.end()) { // note that we dont delete the object itself, we just remove it from our list marker_time_axis_list.erase(i) ; - - MarkerTimeAxisRemoved(mta->name(), src) ; /* EMIT_SIGNAL */ + MarkerTimeAxisRemoved (mta->name(), src) ; /* EMIT_SIGNAL */ } } diff --git a/gtk2_ardour/imageframe_time_axis.h b/gtk2_ardour/imageframe_time_axis.h index 6b2576fe96..52c2f73e67 100644 --- a/gtk2_ardour/imageframe_time_axis.h +++ b/gtk2_ardour/imageframe_time_axis.h @@ -138,12 +138,12 @@ class ImageFrameTimeAxis : public VisualTimeAxis MarkerTimeAxis* remove_named_marker_time_axis(const std::string & track_id, void* src) ; /** - * Removes tav from the list of MarkerTimaAxis associated with this ImageFrameTimeAxis + * Potentially removes a MarkerTimeAxisView from the list of MarkerTimaAxis associated with this ImageFrameTimeAxis * * @param tav the TimeAxis to remove * @param src the identity of the object that initiated the change */ - void remove_time_axis_view(MarkerTimeAxis* tav, void* src) ; + void remove_time_axis_view (TimeAxisView* av); //---------------------------------------------------------------------------------------// diff --git a/gtk2_ardour/imageframe_time_axis_group.cc b/gtk2_ardour/imageframe_time_axis_group.cc index 5cdbf2d3af..1bff9a1572 100644 --- a/gtk2_ardour/imageframe_time_axis_group.cc +++ b/gtk2_ardour/imageframe_time_axis_group.cc @@ -33,7 +33,7 @@ #include "i18n.h" -using namespace ARDOUR ; +using namespace ARDOUR; PBD::Signal1 ImageFrameTimeAxisGroup::CatchDeletion; @@ -49,8 +49,10 @@ PBD::Signal1 ImageFrameTimeAxisGroup::CatchDeleti ImageFrameTimeAxisGroup::ImageFrameTimeAxisGroup(ImageFrameTimeAxisView& iftav, const string & group_id) : _view_helper(iftav), _group_id(group_id) { - selected_imageframe_item = 0 ; - is_selected = false ; + selected_imageframe_item = 0; + is_selected = false; + + ImageFrameView::CatchDeletion.connect (*this, ui_bind (&ImageFrameTimeAxisGroup::remove_imageframe_item, this, _1), gui_context()); } /** @@ -63,20 +65,20 @@ ImageFrameTimeAxisGroup::~ImageFrameTimeAxisGroup() // Destroy all the ImageFramViews that we have for(ImageFrameViewList::iterator iter = imageframe_views.begin(); iter != imageframe_views.end(); ++iter) { - ImageFrameView* ifv = *iter ; + ImageFrameView* ifv = *iter; - ImageFrameViewList::iterator next = iter ; - next++ ; + ImageFrameViewList::iterator next = iter; + next++; - imageframe_views.erase(iter) ; + imageframe_views.erase(iter); - delete ifv ; - ifv = 0 ; + delete ifv; + ifv = 0; - iter = next ; + iter = next; } - CatchDeletion ; /* EMIT_SIGNAL */ + CatchDeletion; /* EMIT_SIGNAL */ } @@ -94,9 +96,9 @@ ImageFrameTimeAxisGroup::set_group_name(const string & new_name, void* src) { if(_group_id != new_name) { - std::string temp_name = _group_id ; - _group_id = new_name ; - NameChanged(_group_id, temp_name, src) ; /* EMIT_SIGNAL */ + std::string temp_name = _group_id; + _group_id = new_name; + NameChanged(_group_id, temp_name, src); /* EMIT_SIGNAL */ } } @@ -109,7 +111,7 @@ ImageFrameTimeAxisGroup::set_group_name(const string & new_name, void* src) std::string ImageFrameTimeAxisGroup::get_group_name() const { - return(_group_id) ; + return(_group_id); } @@ -127,16 +129,16 @@ ImageFrameTimeAxisGroup::set_item_heights(gdouble h) /* limit the values to something sane-ish */ if (h < 10.0 || h > 1000.0) { - return(-1) ; + return(-1); } // set the heights of all the imaeg frame views within the group for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); ++citer) { - (*citer)->set_height(h) ; + (*citer)->set_height(h); } - return(0) ; + return(0); } /** @@ -150,15 +152,15 @@ ImageFrameTimeAxisGroup::set_item_samples_per_units(gdouble spp) { if(spp < 1.0) { - return(-1) ; + return(-1); } for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); ++citer) { - (*citer)->set_samples_per_unit(spp) ; + (*citer)->set_samples_per_unit(spp); } - return(0) ; + return(0); } /** @@ -169,10 +171,10 @@ ImageFrameTimeAxisGroup::set_item_samples_per_units(gdouble spp) void ImageFrameTimeAxisGroup::apply_item_color(Gdk::Color& color) { - region_color = color ; + region_color = color; for(ImageFrameViewList::const_iterator citer = imageframe_views.begin(); citer != imageframe_views.end(); citer++) { - (*citer)->set_color (region_color) ; + (*citer)->set_color (region_color); } } @@ -198,7 +200,7 @@ ImageFrameTimeAxisGroup::apply_item_color(Gdk::Color& color) ImageFrameView* ImageFrameTimeAxisGroup::add_imageframe_item(const string & frame_id, nframes_t start, nframes_t duration, unsigned char* rgb_data, uint32_t width, uint32_t height, uint32_t num_channels, void* src) { - ImageFrameView* ifv = 0 ; + ImageFrameView* ifv = 0; //check that there is not already an imageframe with that id if(get_named_imageframe_item(frame_id) == 0) @@ -214,16 +216,13 @@ ImageFrameTimeAxisGroup::add_imageframe_item(const string & frame_id, nframes_t rgb_data, width, height, - num_channels) ; - - imageframe_views.push_front(ifv) ; - - ifv->CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxisGroup::remove_imageframe_item, this, (void*)this), gui_context()); + num_channels); - ImageFrameAdded(ifv, src) ; /* EMIT_SIGNAL */ + imageframe_views.push_front(ifv); + ImageFrameAdded(ifv, src); /* EMIT_SIGNAL */ } - return(ifv) ; + return(ifv); } @@ -236,17 +235,17 @@ ImageFrameTimeAxisGroup::add_imageframe_item(const string & frame_id, nframes_t ImageFrameView* ImageFrameTimeAxisGroup::get_named_imageframe_item(const string & frame_id) { - ImageFrameView* ifv = 0 ; + ImageFrameView* ifv = 0; for (ImageFrameViewList::const_iterator i = imageframe_views.begin(); i != imageframe_views.end(); ++i) { if (((ImageFrameView*)*i)->get_item_name() == frame_id) { - ifv = ((ImageFrameView*)*i) ; - break ; + ifv = ((ImageFrameView*)*i); + break; } } - return(ifv) ; + return(ifv); } /** @@ -260,28 +259,28 @@ ImageFrameTimeAxisGroup::get_named_imageframe_item(const string & frame_id) void ImageFrameTimeAxisGroup::remove_selected_imageframe_item(void* src) { - std::string frame_id ; + std::string frame_id; if(selected_imageframe_item) { - ImageFrameViewList::iterator i ; + ImageFrameViewList::iterator i; if((i = find(imageframe_views.begin(), imageframe_views.end(), selected_imageframe_item)) != imageframe_views.end()) { - imageframe_views.erase(i) ; - frame_id = selected_imageframe_item->get_item_name() ; + imageframe_views.erase(i); + frame_id = selected_imageframe_item->get_item_name(); // note that we delete the item here - delete(selected_imageframe_item) ; - selected_imageframe_item = 0 ; + delete(selected_imageframe_item); + selected_imageframe_item = 0; - std::string track_id = _view_helper.trackview().name() ; - ImageFrameRemoved(track_id, _group_id, frame_id, src) ; /* EMIT_SIGNAL */ + std::string track_id = _view_helper.trackview().name(); + ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */ } } else { - //cerr << "No Selected ImageFrame" << endl ; + //cerr << "No Selected ImageFrame" << endl; } } @@ -296,31 +295,31 @@ ImageFrameTimeAxisGroup::remove_selected_imageframe_item(void* src) ImageFrameView* ImageFrameTimeAxisGroup::remove_named_imageframe_item(const string & frame_id, void* src) { - ImageFrameView* removed = 0 ; + ImageFrameView* removed = 0; for(ImageFrameViewList::iterator iter = imageframe_views.begin(); iter != imageframe_views.end(); ++iter) { - ImageFrameView* tempItem = *iter ; + ImageFrameView* tempItem = *iter; if(tempItem->get_item_name() == frame_id) { - removed = tempItem ; - imageframe_views.erase(iter) ; + removed = tempItem; + imageframe_views.erase(iter); if (removed == selected_imageframe_item) { - selected_imageframe_item = 0 ; + selected_imageframe_item = 0; } - std::string track_id = _view_helper.trackview().name() ; - ImageFrameRemoved(track_id, _group_id, frame_id, src) ; /* EMIT_SIGNAL */ + std::string track_id = _view_helper.trackview().name(); + ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */ // break from the for loop - break ; + break; } - iter++ ; + iter++; } - return(removed) ; + return(removed); } /** @@ -330,18 +329,18 @@ ImageFrameTimeAxisGroup::remove_named_imageframe_item(const string & frame_id, v * @param ifv the ImageFrameView to remove */ void -ImageFrameTimeAxisGroup::remove_imageframe_item(ImageFrameView* ifv, void* src) +ImageFrameTimeAxisGroup::remove_imageframe_item (ImageFrameView* ifv) { ENSURE_GUI_THREAD (*this, &ImageFrameTimeAxisGroup::remove_imageframe_item, ifv, src) ImageFrameViewList::iterator i; - if((i = find (imageframe_views.begin(), imageframe_views.end(), ifv)) != imageframe_views.end()) - { - imageframe_views.erase(i) ; - std::string frame_id = ifv->get_item_name() ; - std::string track_id = _view_helper.trackview().name() ; - ImageFrameRemoved(track_id, _group_id, frame_id, src) ; /* EMIT_SIGNAL */ + if((i = find (imageframe_views.begin(), imageframe_views.end(), ifv)) != imageframe_views.end()) { + imageframe_views.erase(i); + + std::string frame_id = ifv->get_item_name(); + std::string track_id = _view_helper.trackview().name(); + ImageFrameRemoved(track_id, _group_id, frame_id, src); /* EMIT_SIGNAL */ } } @@ -358,14 +357,14 @@ ImageFrameTimeAxisGroup::remove_imageframe_item(ImageFrameView* ifv, void* src) //{ // if(selected_imageframe_item) // { -// selected_imageframe_item->set_selected(false, this) ; +// selected_imageframe_item->set_selected(false, this); // } // -// selected_imageframe_item = ifv ; +// selected_imageframe_item = ifv; // // if(!ifv->get_selected()) // { -// selected_imageframe_item->set_selected(true, this) ; +// selected_imageframe_item->set_selected(true, this); // } //} @@ -378,7 +377,7 @@ ImageFrameTimeAxisGroup::remove_imageframe_item(ImageFrameView* ifv, void* src) //void //ImageFrameTimeAxisGroup::set_selected_imageframe_item(std::string frame_id) //{ -// selected_imageframe_item = get_named_imageframe_item(frame_id) ; +// selected_imageframe_item = get_named_imageframe_item(frame_id); //} @@ -390,7 +389,7 @@ ImageFrameTimeAxisGroup::remove_imageframe_item(ImageFrameView* ifv, void* src) // ImageFrameView* // ImageFrameTimeAxisGroup::get_selected_imageframe_item() // { - // return(selected_imageframe_item) ; + // return(selected_imageframe_item); // } @@ -403,7 +402,7 @@ ImageFrameTimeAxisGroup::remove_imageframe_item(ImageFrameView* ifv, void* src) bool ImageFrameTimeAxisGroup::get_selected() const { - return(is_selected) ; + return(is_selected); } @@ -415,7 +414,7 @@ ImageFrameTimeAxisGroup::get_selected() const void ImageFrameTimeAxisGroup::set_selected(bool yn) { - is_selected = yn ; + is_selected = yn; } @@ -454,9 +453,9 @@ ImageFrameTimeAxisGroup::remove_this_group(void* src) gint ImageFrameTimeAxisGroup::idle_remove_this_group(ImageFrameTimeAxisGroup* group, void* src) { - delete group ; - group = 0 ; - group->GroupRemoved(group->get_group_name(), src) ; /* EMIT_SIGNAL */ - return(false) ; + delete group; + group = 0; + group->GroupRemoved(group->get_group_name(), src); /* EMIT_SIGNAL */ + return(false); } diff --git a/gtk2_ardour/imageframe_time_axis_view.cc b/gtk2_ardour/imageframe_time_axis_view.cc index a1c211995b..b78ce58b08 100644 --- a/gtk2_ardour/imageframe_time_axis_view.cc +++ b/gtk2_ardour/imageframe_time_axis_view.cc @@ -66,6 +66,8 @@ ImageFrameTimeAxisView::ImageFrameTimeAxisView (ImageFrameTimeAxis& tv) selected_imageframe_group = 0 ; selected_imageframe_view = 0 ; + + ImageFrameTimeAxisGroup::CatchDeletion.connect (*this, ui_bind (&ImageFrameTimeAxisView::remove_imageframe_group, this, _1), gui_context()); } /** @@ -211,11 +213,7 @@ ImageFrameTimeAxisView::add_imageframe_group(std::string group_id, void* src) else { iftag = new ImageFrameTimeAxisGroup(*this, group_id) ; - imageframe_groups.push_front(iftag) ; - - iftag->CatchDeletion.connect (*this, boost::bind (&ImageFrameTimeAxisView::remove_imageframe_group, this, iftag, (void*)this), gui_context()); - ImageFrameGroupAdded(iftag, src) ; /* EMIT_SIGNAL */ } diff --git a/gtk2_ardour/imageframe_view.cc b/gtk2_ardour/imageframe_view.cc index 6feca44a85..366c56e5e5 100644 --- a/gtk2_ardour/imageframe_view.cc +++ b/gtk2_ardour/imageframe_view.cc @@ -34,7 +34,7 @@ #include "canvas_impl.h" #include "gui_thread.h" -using namespace ARDOUR ; +using namespace ARDOUR; using namespace Gtk; sigc::signal ImageFrameView::GoingAway; @@ -73,24 +73,24 @@ ImageFrameView::ImageFrameView(const string & item_id, TimeAxisViewItem::ShowHandles)) { - the_parent_group = item_group ; - set_name_text(item_id) ; + the_parent_group = item_group; + set_name_text(item_id); - image_data_width = width ; - image_data_height = height ; - image_data_num_channels = num_channels ; + image_data_width = width; + image_data_height = height; + image_data_num_channels = num_channels; //This should be art_free'd once the ArtPixBuf is destroyed - this should happen when we destroy the imageframe canvas item - unsigned char* the_rgb_data = (unsigned char*) art_alloc(width*height*num_channels) ; - memcpy(the_rgb_data, rgb_data, (width*height*num_channels)) ; + unsigned char* the_rgb_data = (unsigned char*) art_alloc(width*height*num_channels); + memcpy(the_rgb_data, rgb_data, (width*height*num_channels)); - ArtPixBuf* pbuf ; + ArtPixBuf* pbuf; pbuf = art_pixbuf_new_rgba(the_rgb_data, width, height, (num_channels * width)); - imageframe = 0 ; + imageframe = 0; //calculate our image width based on the track height - double im_ratio = (double)width/(double)height ; - double im_width = ((double)(trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) * im_ratio) ; + double im_ratio = (double)width/(double)height; + double im_width = ((double)(trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE) * im_ratio); imageframe = new ImageFrame (*group, pbuf, 1.0, 1.0, ANCHOR_NW, im_width, (trackview.current_height() - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE)); @@ -101,8 +101,10 @@ ImageFrameView::ImageFrameView(const string & item_id, frame_handle_start->raise_to_top(); frame_handle_end->raise_to_top(); - set_position(start, this) ; - set_duration(duration, this) ; + set_position(start, this); + set_duration(duration, this); + + MarkerView::CatchDeletion.connect (*this, ui_bind (&ImageFrameView::remove_marker_view_item, this, _1), gui_context()); } /** @@ -117,29 +119,29 @@ ImageFrameView::~ImageFrameView() for(MarkerViewList::iterator iter = marker_view_list.begin(); iter != marker_view_list.end(); ++iter) { - MarkerView* mv = (*iter) ; + MarkerView* mv = (*iter); - MarkerViewList::iterator next = iter ; - next++ ; + MarkerViewList::iterator next = iter; + next++; // remove the item from our marker list // the current iterator becomes invalid after this point, so we cannot call next upon it // luckily enough, we already have next - marker_view_list.erase(iter) ; + marker_view_list.erase(iter); // remove the item from the marker time axis - MarkerTimeAxisView* mtav = dynamic_cast(&mv->get_time_axis_view())->get_view() ; + MarkerTimeAxisView* mtav = dynamic_cast(&mv->get_time_axis_view())->get_view(); if(mtav) { - mtav->remove_marker_view(mv, this) ; + mtav->remove_marker_view(mv, this); } - mv->set_marked_item(0) ; - delete mv ; - mv = 0 ; + mv->set_marked_item(0); + delete mv; + mv = 0; // set our iterator to next, as we have invalided the current iterator with the call to erase - iter = next ; + iter = next; } // if we are the currently selected item withi the parent track, we need to se-select @@ -147,12 +149,12 @@ ImageFrameView::~ImageFrameView() { if(the_parent_group->get_view().get_selected_imageframe_view() == this) { - the_parent_group->get_view().clear_selected_imageframe_item(false) ; + the_parent_group->get_view().clear_selected_imageframe_item(false); } } delete imageframe; - imageframe = 0 ; + imageframe = 0; } @@ -169,10 +171,10 @@ ImageFrameView::~ImageFrameView() bool ImageFrameView::set_position(nframes64_t pos, void* src, double* delta) { - nframes64_t old_pos = frame_position ; + nframes64_t old_pos = frame_position; // do the standard stuff - bool ret = TimeAxisViewItem::set_position(pos, src, delta) ; + bool ret = TimeAxisViewItem::set_position(pos, src, delta); // everything went ok with the standard stuff? if (ret) { @@ -180,14 +182,14 @@ ImageFrameView::set_position(nframes64_t pos, void* src, double* delta) for (MarkerViewList::iterator i = marker_view_list.begin(); i != marker_view_list.end(); ++i) { // calculate the offset of the marker - MarkerView* mv = (MarkerView*)*i ; - nframes64_t marker_old_pos = mv->get_position() ; + MarkerView* mv = (MarkerView*)*i; + nframes64_t marker_old_pos = mv->get_position(); - mv->set_position(pos + (marker_old_pos - old_pos), src) ; + mv->set_position(pos + (marker_old_pos - old_pos), src); } } - return(ret) ; + return(ret); } /** @@ -201,7 +203,7 @@ bool ImageFrameView::set_duration(nframes64_t dur, void* src) { /* do the standard stuff */ - bool ret = TimeAxisViewItem::set_duration(dur, src) ; + bool ret = TimeAxisViewItem::set_duration(dur, src); // eveything went ok with the standard stuff? if(ret) @@ -210,7 +212,7 @@ ImageFrameView::set_duration(nframes64_t dur, void* src) imageframe->property_drawwidth() = trackview.editor.frame_to_pixel(get_duration()); } - return(ret) ; + return(ret); } //---------------------------------------------------------------------------------------// @@ -225,7 +227,7 @@ ImageFrameView::set_duration(nframes64_t dur, void* src) void ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group) { - the_parent_group = group ; + the_parent_group = group; } /** @@ -236,7 +238,7 @@ ImageFrameView::set_time_axis_group(ImageFrameTimeAxisGroup* group) ImageFrameTimeAxisGroup* ImageFrameView::get_time_axis_group() { - return(the_parent_group) ; + return(the_parent_group); } @@ -253,7 +255,7 @@ ImageFrameView::set_height (gdouble h) { // set the image size // @todo might have to re-get the image data, for a large height...hmmm. - double im_ratio = (double)image_data_width/(double)image_data_height ; + double im_ratio = (double)image_data_width/(double)image_data_height; imageframe->property_width() = (h - TimeAxisViewItem::NAME_Y_OFFSET) * im_ratio; imageframe->property_height() = h - TimeAxisViewItem::NAME_Y_OFFSET; @@ -285,11 +287,8 @@ ImageFrameView::set_height (gdouble h) void ImageFrameView::add_marker_view_item(MarkerView* item, void* src) { - marker_view_list.push_back(item) ; - - item->CatchDeletion.connect (*this, boost::bind (&ImageFrameView::remove_marker_view_item, this, (void*)this), gui_context()); - - MarkerViewAdded(item, src) ; /* EMIT_SIGNAL */ + marker_view_list.push_back(item); + MarkerViewAdded(item, src); /* EMIT_SIGNAL */ } /** @@ -303,28 +302,28 @@ ImageFrameView::add_marker_view_item(MarkerView* item, void* src) MarkerView* ImageFrameView::remove_named_marker_view_item(const string & markerId, void* src) { - MarkerView* mv = 0 ; - MarkerViewList::iterator i = marker_view_list.begin() ; + MarkerView* mv = 0; + MarkerViewList::iterator i = marker_view_list.begin(); while(i != marker_view_list.end()) { if (((MarkerView*)*i)->get_item_name() == markerId) { - mv = (*i) ; + mv = (*i); - marker_view_list.erase(i) ; + marker_view_list.erase(i); - MarkerViewRemoved(mv,src) ; /* EMIT_SIGNAL */ + MarkerViewRemoved(mv,src); /* EMIT_SIGNAL */ // iterator is now invalid, but since we should only ever have // one item with the specified name, things are ok, and we can // break from the while loop - break ; + break; } - i++ ; + i++; } - return(mv) ; + return(mv); } /** @@ -335,15 +334,15 @@ ImageFrameView::remove_named_marker_view_item(const string & markerId, void* src * @param src the identity of the object that initiated the change */ void -ImageFrameView::remove_marker_view_item(MarkerView* mv, void* src) +ImageFrameView::remove_marker_view_item (MarkerView* mv) { ENSURE_GUI_THREAD (*this, &ImageFrameView::remove_marker_view_item, mv, src) - MarkerViewList::iterator i ; + MarkerViewList::iterator i; - if((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) { - marker_view_list.erase(i) ; - MarkerViewRemoved (mv, src) ; /* EMIT_SIGNAL */ + if ((i = find (marker_view_list.begin(), marker_view_list.end(), mv)) != marker_view_list.end()) { + marker_view_list.erase(i); + MarkerViewRemoved (mv, src); /* EMIT_SIGNAL */ } } @@ -355,18 +354,18 @@ ImageFrameView::remove_marker_view_item(MarkerView* mv, void* src) bool ImageFrameView::has_marker_view_item(const string & mname) { - bool result = false ; + bool result = false; for (MarkerViewList::const_iterator ci = marker_view_list.begin(); ci != marker_view_list.end(); ++ci) { if (((MarkerView*)*ci)->get_item_name() == mname) { - result = true ; + result = true; // found the item, so we can break the for loop - break ; + break; } } - return(result) ; + return(result); } diff --git a/gtk2_ardour/marker_time_axis_view.cc b/gtk2_ardour/marker_time_axis_view.cc index 3da442e89d..c4fa4bc4c8 100644 --- a/gtk2_ardour/marker_time_axis_view.cc +++ b/gtk2_ardour/marker_time_axis_view.cc @@ -67,6 +67,7 @@ MarkerTimeAxisView::MarkerTimeAxisView(MarkerTimeAxis& tv) _samples_per_unit = _trackview.editor.get_current_zoom() ; _trackview.editor.ZoomChanged.connect (sigc::mem_fun(*this, &MarkerTimeAxisView::reset_samples_per_unit)); + MarkerView::CatchDeletion.connect (*this, ui_bind (&MarkerTimeAxisView::remove_marker_view, this, _1), gui_context()); } /** @@ -211,8 +212,6 @@ MarkerTimeAxisView::add_marker_view(ImageFrameView* ifv, std::string mark_type, ifv->add_marker_view_item(mv, src) ; marker_view_list.push_front(mv) ; - mv->CatchDeletion.connect (*this, boost::bind (&MarkerTimeAxisView::remove_marker_view, this, _1), gui_context()); - MarkerViewAdded(mv,src) ; /* EMIT_SIGNAL */ return(mv) ; @@ -311,7 +310,7 @@ MarkerTimeAxisView::remove_named_marker_view(std::string item_id, void* src) * @param src the identity of the object that initiated the change */ void -MarkerTimeAxisView::remove_marker_view(MarkerView* mv) +MarkerTimeAxisView::remove_marker_view (MarkerView* mv) { ENSURE_GUI_THREAD (*this, &MarkerTimeAxisView::remove_marker_view, mv, src) @@ -326,7 +325,6 @@ MarkerTimeAxisView::remove_marker_view(MarkerView* mv) } } - /** * Sets the duration of the selected MarkerView to the specified number of seconds * diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index d85ca3cad6..24f167a6c7 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1071,7 +1071,7 @@ MidiRegionView::add_ghost (TimeAxisView& tv) } } - ghost->CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); + GhostRegion::CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); return ghost; } diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 38d60233de..3531108f4a 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -72,6 +72,7 @@ using namespace std; sigc::signal > MixerStrip::SwitchIO; int MixerStrip::scrollbar_height = 0; +PBD::Signal1 MixerStrip::CatchDeletion; MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer) : AxisView(sess) diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 0e432eed3e..acb69534b3 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -102,6 +102,7 @@ class MixerStrip : public RouteUI, public Gtk::EventBox sigc::signal WidthChanged; static sigc::signal > SwitchIO; + static PBD::Signal1 CatchDeletion; protected: friend class Mixer_UI; diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index dc3b95a68f..b750f8a470 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -250,6 +250,8 @@ Mixer_UI::Mixer_UI () group_display.show(); auto_rebinding = FALSE; + + MixerStrip::CatchDeletion.connect (*this, ui_bind (&Mixer_UI::remove_strip, this, _1), gui_context()); _plugin_selector = new PluginSelector (PluginManager::the_manager ()); } @@ -334,7 +336,6 @@ Mixer_UI::add_strip (RouteList& routes) } route->NameChanged.connect (*this, boost::bind (&Mixer_UI::strip_name_changed, this, strip), gui_context()); - route->DropReferences.connect (*this, boost::bind (&Mixer_UI::remove_strip, this, strip), gui_context()); strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed)); strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip)); @@ -350,7 +351,14 @@ Mixer_UI::add_strip (RouteList& routes) void Mixer_UI::remove_strip (MixerStrip* strip) { - ENSURE_GUI_THREAD (*this, &Mixer_UI::remove_strip, strip) + if (_session && _session->deletion_in_progress()) { + /* its all being taken care of */ + return; + } + + ENSURE_GUI_THREAD (*this, &Mixer_UI::remove_strip, strip); + + cerr << "Mixer UI removing strip for " << strip << endl; TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator ri; diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index b6f0cda8f1..2d7f5c8797 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -80,6 +80,7 @@ RegionView::RegionView (ArdourCanvas::Group* parent, , wait_for_data(false) , _time_converter(r->session().tempo_map(), r->position()) { + GhostRegion::CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); } RegionView::RegionView (const RegionView& other) @@ -94,6 +95,8 @@ RegionView::RegionView (const RegionView& other) valid = false; _pixel_width = other._pixel_width; _height = other._height; + + GhostRegion::CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); } RegionView::RegionView (const RegionView& other, boost::shared_ptr other_region) @@ -112,6 +115,8 @@ RegionView::RegionView (const RegionView& other, boost::shared_ptr other valid = false; _pixel_width = other._pixel_width; _height = other._height; + + GhostRegion::CatchDeletion.connect (*this, ui_bind (&RegionView::remove_ghost, this, _1), gui_context()); } RegionView::RegionView (ArdourCanvas::Group* parent, diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index f78885deb4..e3ee563ac7 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -79,6 +79,9 @@ RouteUI::RouteUI (boost::shared_ptr rt, ARDOUR::Session* sess) RouteUI::~RouteUI() { + _route.reset (); /* drop reference to route, so that it can be cleaned up */ + route_connections.drop_connections (); + delete solo_menu; delete mute_menu; delete sends_menu; @@ -165,9 +168,6 @@ RouteUI::self_delete () { /* This may be called from a non-GUI thread. Keep it safe */ - cerr << "\n\nExpect to see route " << _route->name() << " be deleted\n"; - _route.reset (); /* drop reference to route, so that it can be cleaned up */ - route_connections.drop_connections (); delete_when_idle (this); } diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index b2cb88a008..065100a2d8 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -46,6 +46,22 @@ struct AudioRangeComparator { } }; +Selection::Selection (const PublicEditor* e) + : tracks (e) + , editor (e) + , next_time_id (0) +{ + clear (); + + /* we have disambiguate which remove() for the compiler */ + + void (Selection::*track_remove)(TimeAxisView*) = &Selection::remove; + TimeAxisView::CatchDeletion.connect (*this, ui_bind (track_remove, this, _1), gui_context()); + + void (Selection::*marker_remove)(Marker*) = &Selection::remove; + Marker::CatchDeletion.connect (*this, ui_bind (marker_remove, this, _1), gui_context()); +} + #if 0 Selection& Selection::operator= (const Selection& other) @@ -209,8 +225,6 @@ Selection::toggle (TimeAxisView* track) TrackSelection::iterator i; if ((i = find (tracks.begin(), tracks.end(), track)) == tracks.end()) { - void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; - track->CatchDeletion.connect (*this, boost::bind (pmf, this, track), gui_context()); tracks.push_back (track); } else { tracks.erase (i); @@ -337,11 +351,6 @@ Selection::add (const TrackViewList& track_list) { TrackViewList added = tracks.add (track_list); - for (list::const_iterator i = added.begin(); i != added.end(); ++i) { - void (Selection::*pmf)(TimeAxisView*) = &Selection::remove; - (*i)->CatchDeletion.connect (*this, boost::bind (pmf, this, (*i)), gui_context()); - } - if (!added.empty()) { TracksChanged (); } @@ -945,13 +954,6 @@ void Selection::add (Marker* m) { if (find (markers.begin(), markers.end(), m) == markers.end()) { - - /* disambiguate which remove() for the compiler */ - - void (Selection::*pmf)(Marker*) = &Selection::remove; - - m->CatchDeletion.connect (*this, boost::bind (pmf, this, _1), gui_context()); - markers.push_back (m); MarkersChanged(); } diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h index d838720d36..3a6e7ff3ae 100644 --- a/gtk2_ardour/selection.h +++ b/gtk2_ardour/selection.h @@ -85,9 +85,7 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList MidiRegionSelection midi_regions; MidiNoteSelection midi_notes; - Selection (PublicEditor const * e) : tracks (e), editor (e), next_time_id (0) { - clear(); - } + Selection (PublicEditor const * e); // Selection& operator= (const Selection& other); diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 2c241ee283..4809d9fedd 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -74,6 +74,7 @@ uint32_t TimeAxisView::hSmaller = 0; uint32_t TimeAxisView::hSmall = 0; bool TimeAxisView::need_size_info = true; int const TimeAxisView::_max_order = 512; +PBD::Signal1 TimeAxisView::CatchDeletion; TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/) : AxisView (sess), @@ -178,6 +179,8 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie controls_hbox.show (); ColorsChanged.connect (sigc::mem_fun (*this, &TimeAxisView::color_handler)); + + GhostRegion::CatchDeletion.connect (*this, ui_bind (&TimeAxisView::erase_ghost, this, _1), gui_context()); } TimeAxisView::~TimeAxisView() @@ -925,24 +928,23 @@ TimeAxisView::add_ghost (RegionView* rv) if(gr) { ghosts.push_back(gr); - gr->CatchDeletion.connect (*this, ui_bind (&TimeAxisView::erase_ghost, this, _1), gui_context()); } } void -TimeAxisView::remove_ghost (RegionView* rv) { +TimeAxisView::remove_ghost (RegionView* rv) +{ rv->remove_ghost_in (*this); } void -TimeAxisView::erase_ghost (GhostRegion* gr) { - if(in_destructor) { +TimeAxisView::erase_ghost (GhostRegion* gr) +{ + if (in_destructor) { return; } - - list::iterator i; - - for (i = ghosts.begin(); i != ghosts.end(); ++i) { + + for (list::iterator i = ghosts.begin(); i != ghosts.end(); ++i) { if ((*i) == gr) { ghosts.erase (i); break; diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h index 3ad033417b..d2c87426a9 100644 --- a/gtk2_ardour/time_axis_view.h +++ b/gtk2_ardour/time_axis_view.h @@ -96,6 +96,8 @@ class TimeAxisView : public virtual AxisView, public PBD::Stateful XMLNode& get_state (); int set_state (const XMLNode&, int version); + static PBD::Signal1 CatchDeletion; + /** @return index of this TimeAxisView within its parent */ int order () const { return _order; } -- cgit v1.2.3