diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc index 7c8f7f3f86..ecc6fefacc 100644 --- a/libs/ardour/rc_configuration.cc +++ b/libs/ardour/rc_configuration.cc @@ -239,8 +239,10 @@ RCConfiguration::get_variables (std::string const & node_name) const #undef CONFIG_VARIABLE #undef CONFIG_VARIABLE_SPECIAL +/* due to special case of PBD::ConfigVariable we cannot use PBD::to_string (value), + * but have to construct a ConfigVariable */ #define CONFIG_VARIABLE(type,var,Name,value) \ - var.add_to_node (*node); + var.add_to_node_if_modified (*node, ConfigVariable (Name, value).get_as_string ()); #define CONFIG_VARIABLE_SPECIAL(type,var,Name,value,mutator) \ var.add_to_node (*node); #include "ardour/rc_configuration_vars.inc.h" diff --git a/libs/pbd/configuration_variable.cc b/libs/pbd/configuration_variable.cc index 60d7de2a6f..549dd757fe 100644 --- a/libs/pbd/configuration_variable.cc +++ b/libs/pbd/configuration_variable.cc @@ -43,6 +43,21 @@ ConfigVariableBase::add_to_node (XMLNode& node) const node.add_child_nocopy (*child); } +void +ConfigVariableBase::add_to_node_if_modified (XMLNode& node, std::string const& dflt) const +{ + const std::string v = get_as_string (); + if (v == dflt) { + DEBUG_TRACE (DEBUG::Configuration, string_compose ("Config variable '%1' used default, not saved\n", _name)); + return; + } + DEBUG_TRACE (DEBUG::Configuration, string_compose ("Config variable '%1' stored as [%2]\n", _name, v)); + XMLNode* child = new XMLNode ("Option"); + child->set_property ("name", _name); + child->set_property ("value", v); + node.add_child_nocopy (*child); +} + bool ConfigVariableBase::set_from_node (XMLNode const & node) { diff --git a/libs/pbd/pbd/configuration_variable.h b/libs/pbd/pbd/configuration_variable.h index 28c1099aa2..79b7b893c8 100644 --- a/libs/pbd/pbd/configuration_variable.h +++ b/libs/pbd/pbd/configuration_variable.h @@ -34,6 +34,7 @@ class LIBPBD_API ConfigVariableBase { std::string name () const { return _name; } void add_to_node (XMLNode&) const; + void add_to_node_if_modified (XMLNode&, std::string const&) const; bool set_from_node (XMLNode const &); virtual std::string get_as_string () const = 0;