From d733603ea25388c6ebb288a5e8a3354b7ed1954f Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 18 Feb 2010 09:01:47 +0000 Subject: Refuse to delete /control_in or /control_out (fix crashes e.g. select-all + delete). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2464 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/events/Delete.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'src/engine/events/Delete.cpp') diff --git a/src/engine/events/Delete.cpp b/src/engine/events/Delete.cpp index 82681c08..27f1b995 100644 --- a/src/engine/events/Delete.cpp +++ b/src/engine/events/Delete.cpp @@ -63,6 +63,11 @@ Delete::~Delete() void Delete::pre_process() { + if (_path.is_root() || _path == "path:/control_in" || _path == "path:/control_out") { + QueuedEvent::pre_process(); + return; + } + _removed_bindings = _engine.control_bindings()->remove(_path); _store_iterator = _engine.engine_store()->find(_path); @@ -168,16 +173,12 @@ Delete::post_process() { _removed_bindings.reset(); - if (!_node && !_port) { - if (_path.is_root()) { - _request->respond_error("You can not destroy the root patch (/)"); - } else { - string msg = string("Could not find object ") + _path.str() + " to destroy"; - _request->respond_error(msg); - } - } - - if (_patch_node_listnode) { + if (_path.is_root() || _path == "path:/control_in" || _path == "path:/control_out") { + _request->respond_error(_path.chop_scheme() + " can not be deleted"); + } else if (!_node && !_port) { + string msg = string("Could not find object ") + _path.chop_scheme() + " to delete"; + _request->respond_error(msg); + } else if (_patch_node_listnode) { assert(_node); _node->deactivate(); _request->respond_ok(); @@ -197,7 +198,7 @@ Delete::post_process() _engine.broadcaster()->bundle_end(); _engine.maid()->push(_patch_port_listnode); } else { - _request->respond_error("Unable to destroy object"); + _request->respond_error("Unable to delete object " + _path.chop_scheme()); } if (_driver_port) { -- cgit v1.2.1