diff --git a/repos/os/src/server/input_filter/main.cc b/repos/os/src/server/input_filter/main.cc index e291ecf101..46b35b6f50 100644 --- a/repos/os/src/server/input_filter/main.cc +++ b/repos/os/src/server/input_filter/main.cc @@ -378,15 +378,35 @@ struct Input_filter::Main : Input_connection::Avail_handler, void _apply_config() { - _input_connections.for_each([&] (Registered &conn) { - destroy(_heap, &conn); }); + Xml_node const config = _config.xml(); - _config.xml().for_each_sub_node("input", [&] (Xml_node input_node) { + /* close input sessions that are no longer needed */ + _input_connections.for_each([&] (Registered &conn) { + + bool obsolete = true; + config.for_each_sub_node("input", [&] (Xml_node input_node) { + if (conn.label() == input_node.attribute_value("label", Label())) + obsolete = false; }); + + if (obsolete) + destroy(_heap, &conn); + }); + + /* open new input sessions */ + config.for_each_sub_node("input", [&] (Xml_node input_node) { try { Label const label = input_node.attribute_value("label", Label()); + bool already_exists = false; + _input_connections.for_each([&] (Input_connection const &conn) { + if (conn.label() == label) + already_exists = true; }); + + if (already_exists) + return; + try { new (_heap) Registered(_input_connections, _env,