+
+/*
+ This is called when we need to update the adjustment with the value
+ from the spinner's text entry.
+
+ We need to use Gtk::Entry::get_text to avoid recursive nastiness :)
+
+ If we're not in logarithmic mode we can return false to use the
+ default conversion.
+
+ In theory we should check for conversion errors but set numeric
+ mode to true on the spinner prevents invalid input.
+*/
+int
+BarController::entry_input (double* new_value)
+{
+ if (!logarithmic) {
+ return false;
+ }
+
+ // extract a double from the string and take its log
+ Entry *entry = dynamic_cast<Entry *>(&spinner);
+ double value;
+
+ {
+ // Switch to user's preferred locale so that
+ // if they use different LC_NUMERIC conventions,
+ // we will honor them.
+
+ PBD::LocaleGuard lg ("");
+ sscanf (entry->get_text().c_str(), "%lf", &value);
+ }
+
+ *new_value = log(value);
+
+ return true;
+}
+
+/*
+ This is called when we need to update the spinner's text entry
+ with the value of the adjustment.
+
+ We need to use Gtk::Entry::set_text to avoid recursive nastiness :)
+
+ If we're not in logarithmic mode we can return false to use the
+ default conversion.
+*/
+bool
+BarController::entry_output ()
+{
+ if (!logarithmic) {
+ return false;
+ }
+
+ // generate the exponential and turn it into a string
+ // convert to correct locale.
+
+ stringstream stream;
+ string str;
+
+ char buf[128];
+
+ {
+ // Switch to user's preferred locale so that
+ // if they use different LC_NUMERIC conventions,
+ // we will honor them.
+
+ PBD::LocaleGuard lg ("");
+ snprintf (buf, sizeof (buf), "%g", exp (spinner.get_adjustment()->get_value()));
+ }
+
+ Entry *entry = dynamic_cast<Entry *>(&spinner);
+ entry->set_text(buf);
+
+ return true;
+}
+
+
+