From 96613df7830699dbbfb5c2d9fe3ebdb0598e6aca Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 29 Jan 2010 04:35:48 +0000 Subject: Remove references to deleted ports with control bindings (fix crash when applying binding to deleted port). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2393 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/events/Delete.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/engine/events/Delete.cpp') diff --git a/src/engine/events/Delete.cpp b/src/engine/events/Delete.cpp index 956253d6..11d355a4 100644 --- a/src/engine/events/Delete.cpp +++ b/src/engine/events/Delete.cpp @@ -17,18 +17,19 @@ #include "raul/Maid.hpp" #include "raul/Path.hpp" +#include "ClientBroadcaster.hpp" +#include "ControlBindings.hpp" #include "Delete.hpp" -#include "Responder.hpp" -#include "Engine.hpp" -#include "PatchImpl.hpp" -#include "NodeBase.hpp" -#include "PluginImpl.hpp" -#include "Driver.hpp" #include "DisconnectAll.hpp" -#include "ClientBroadcaster.hpp" +#include "Driver.hpp" +#include "Engine.hpp" #include "EngineStore.hpp" #include "EventSource.hpp" +#include "NodeBase.hpp" +#include "PatchImpl.hpp" +#include "PluginImpl.hpp" #include "PortImpl.hpp" +#include "Responder.hpp" using namespace std; @@ -62,6 +63,8 @@ Delete::~Delete() void Delete::pre_process() { + _removed_bindings = _engine.control_bindings()->remove(_path); + _store_iterator = _engine.engine_store()->find(_path); if (_store_iterator != _engine.engine_store()->end()) { @@ -75,7 +78,7 @@ Delete::pre_process() _removed_table = _engine.engine_store()->remove(_store_iterator); } - if (_node != NULL && !_path.is_root()) { + if (_node && !_path.is_root()) { assert(_node->parent_patch()); _patch_node_listnode = _node->parent_patch()->remove_node(_path.name()); if (_patch_node_listnode) { @@ -153,10 +156,6 @@ Delete::execute(ProcessContext& context) if ( ! _port->parent_patch()->parent()) { _driver_port = _engine.driver()->remove_port(_port->path()); - - // Apparently this needs to be called in post_process?? - //if (_driver_port) - // _driver_port->elem()->unregister(); } } @@ -168,6 +167,8 @@ Delete::execute(ProcessContext& context) void Delete::post_process() { + _removed_bindings.reset(); + if (!_node && !_port) { if (_path.is_root()) { _responder->respond_error("You can not destroy the root patch (/)"); -- cgit v1.2.1