Layering - the return of "later is higher".
[ardour.git] / gtk2_ardour / rc_option_editor.cc
index a4d2b5dee2325c9052eb3ec604eb816c0c5569fd..bcefc1260bca9eda7279e97cdd2bc9b48e590a10 100644 (file)
@@ -54,6 +54,8 @@
 #include "midi_port_dialog.h"
 #include "sfdb_ui.h"
 #include "keyboard.h"
+#include "theme_manager.h"
+#include "ui_config.h"
 #include "i18n.h"
 
 using namespace std;
@@ -67,8 +69,7 @@ class ClickOptions : public OptionEditorBox
 {
 public:
        ClickOptions (RCConfiguration* c, Gtk::Window* p)
-               : _rc_config (c),
-                 _parent (p)
+               : _rc_config (c)
        {
                Table* t = manage (new Table (2, 3));
                t->set_spacings (4);
@@ -114,6 +115,9 @@ private:
        {
                SoundFileChooser sfdb (_("Choose Click"));
 
+               sfdb.show_all ();
+               sfdb.present ();
+
                if (sfdb.run () == RESPONSE_OK) {
                        click_chosen (sfdb.get_filename());
                }
@@ -154,7 +158,6 @@ private:
        }
 
        RCConfiguration* _rc_config;
-       Gtk::Window* _parent;
        Entry _click_path_entry;
        Entry _click_emphasis_path_entry;
 };
@@ -531,17 +534,35 @@ private:
 class FontScalingOptions : public OptionEditorBox
 {
 public:
-       FontScalingOptions (RCConfiguration* c) :
-               _rc_config (c),
-               _dpi_adjustment (50, 50, 250, 1, 10),
+       FontScalingOptions (UIConfiguration* uic) :
+               _ui_config (uic),
+               _dpi_adjustment (100, 50, 250, 1, 5),
                _dpi_slider (_dpi_adjustment)
        {
-               _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale () / 1024)));
+               _dpi_adjustment.set_value (_ui_config->get_font_scale() / 1024.);
 
-               Label* l = manage (new Label (_("Font scaling:")));
+               Label* l = manage (new Label (_("GUI and Font scaling:")));
                l->set_name ("OptionsLabel");
 
+                const Glib::ustring dflt = _("Default");
+                const Glib::ustring empty = X_(""); // despite gtk-doc saying so, NULL does not work as reference
+
+               _dpi_slider.set_name("FontScaleSlider");
                _dpi_slider.set_update_policy (UPDATE_DISCONTINUOUS);
+               _dpi_slider.set_draw_value(false);
+               _dpi_slider.add_mark(50,  Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(60,  Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(70,  Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(80,  Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(90,  Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(100, Gtk::POS_TOP, dflt);
+               _dpi_slider.add_mark(125, Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(150, Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(175, Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(200, Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(225, Gtk::POS_TOP, empty);
+               _dpi_slider.add_mark(250, Gtk::POS_TOP, empty);
+
                HBox* h = manage (new HBox);
                h->set_spacing (4);
                h->pack_start (*l, false, false);
@@ -549,13 +570,15 @@ public:
 
                _box->pack_start (*h, false, false);
 
+               set_note (_("Adjusting the scale require an application restart to re-layout."));
+
                _dpi_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &FontScalingOptions::dpi_changed));
        }
 
        void parameter_changed (string const & p)
        {
                if (p == "font-scale") {
-                       _dpi_adjustment.set_value (floor ((double)(_rc_config->get_font_scale() / 1024)));
+                       _dpi_adjustment.set_value (_ui_config->get_font_scale() / 1024.);
                }
        }
 
@@ -568,12 +591,12 @@ private:
 
        void dpi_changed ()
        {
-               _rc_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024));
+               _ui_config->set_font_scale ((long) floor (_dpi_adjustment.get_value() * 1024.));
                /* XXX: should be triggered from the parameter changed signal */
                reset_dpi ();
        }
 
-       RCConfiguration* _rc_config;
+       UIConfiguration* _ui_config;
        Adjustment _dpi_adjustment;
        HScale _dpi_slider;
 };
@@ -581,12 +604,12 @@ private:
 class ClipLevelOptions : public OptionEditorBox
 {
 public:
-       ClipLevelOptions (RCConfiguration* c) 
-               : _rc_config (c)
+       ClipLevelOptions (UIConfiguration* c) 
+               : _ui_config (c)
                , _clip_level_adjustment (-.5, -50.0, 0.0, 0.1, 1.0) /* units of dB */
                , _clip_level_slider (_clip_level_adjustment)
        {
-               _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level ());
+               _clip_level_adjustment.set_value (_ui_config->get_waveform_clip_level ());
 
                Label* l = manage (new Label (_("Waveform Clip Level (dBFS):")));
                l->set_name ("OptionsLabel");
@@ -605,7 +628,7 @@ public:
        void parameter_changed (string const & p)
        {
                if (p == "waveform-clip-level") {
-                       _clip_level_adjustment.set_value (_rc_config->get_waveform_clip_level());
+                       _clip_level_adjustment.set_value (_ui_config->get_waveform_clip_level());
                }
        }
 
@@ -618,12 +641,12 @@ private:
 
        void clip_level_changed ()
        {
-               _rc_config->set_waveform_clip_level (_clip_level_adjustment.get_value());
+               _ui_config->set_waveform_clip_level (_clip_level_adjustment.get_value());
                /* XXX: should be triggered from the parameter changed signal */
                ArdourCanvas::WaveView::set_clip_level (_clip_level_adjustment.get_value());
        }
 
-       RCConfiguration* _rc_config;
+       UIConfiguration* _ui_config;
        Adjustment _clip_level_adjustment;
        HScale _clip_level_slider;
 };
@@ -993,10 +1016,12 @@ private:
 class PluginOptions : public OptionEditorBox
 {
 public:
-       PluginOptions (RCConfiguration* c)
+       PluginOptions (RCConfiguration* c, UIConfiguration* uic)
                : _rc_config (c)
+               , _ui_config (uic)
                , _display_plugin_scan_progress (_("Always Display Plugin Scan Progress"))
-               , _discover_vst_on_start (_("Scan for new VST Plugins on Application Start"))
+               , _discover_vst_on_start (_("Scan for [new] VST Plugins on Application Start"))
+               , _discover_au_on_start (_("Scan for AudioUnit Plugins on Application Start"))
                , _timeout_adjustment (0, 0, 3000, 50, 50)
                , _timeout_slider (_timeout_adjustment)
        {
@@ -1022,6 +1047,7 @@ public:
                Gtkmm2ext::UI::instance()->set_tip (_display_plugin_scan_progress,
                                            _("<b>When enabled</b> a popup window showing plugin scan progress is displayed for indexing (cache load) and discovery (detect new plugins)"));
 
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
                _timeout_slider.set_digits (0);
                _timeout_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &PluginOptions::timeout_changed));
 
@@ -1069,13 +1095,38 @@ public:
                b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::edit_vst_path_clicked));
                t->attach (*b, 1, 2, n, n+1, FILL); ++n;
 #endif
+#endif // any VST
+
+#ifdef AUDIOUNIT_SUPPORT
+               ss.str("");
+               ss << "<b>" << _("Audio Unit") << "</b>";
+               l = manage (left_aligned_label (ss.str()));
+               l->set_use_markup (true);
+               t->attach (*manage (new Label ("")), 0, 3, n, n+1, FILL | EXPAND); ++n;
+               t->attach (*l, 0, 2, n, n+1, FILL | EXPAND); ++n;
+
+               t->attach (_discover_au_on_start, 0, 2, n, n+1); ++n;
+               _discover_au_on_start.signal_toggled().connect (sigc::mem_fun (*this, &PluginOptions::discover_au_on_start_toggled));
+               Gtkmm2ext::UI::instance()->set_tip (_discover_au_on_start,
+                                           _("<b>When enabled</b> Audio Unit Plugins are discovered on application start. When disabled AU plugins will only be available after triggering a 'Scan' manually. The first successful scan will enable AU auto-scan, Any crash during plugin discovery will disable it."));
+
+               ++n;
+               b = manage (new Button (_("Clear AU Cache")));
+               b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_cache_clicked));
+               t->attach (*b, 0, 1, n, n+1, FILL);
+
+               b = manage (new Button (_("Clear AU Blacklist")));
+               b->signal_clicked().connect (sigc::mem_fun (*this, &PluginOptions::clear_au_blacklist_clicked));
+               t->attach (*b, 1, 2, n, n+1, FILL);
+               ++n;
+#endif
 
                _box->pack_start (*t,true,true);
        }
 
        void parameter_changed (string const & p) {
                if (p == "show-plugin-scan-window") {
-                       bool const x = _rc_config->get_show_plugin_scan_window();
+                       bool const x = _ui_config->get_show_plugin_scan_window();
                        _display_plugin_scan_progress.set_active (x);
                }
                else if (p == "discover-vst-on-start") {
@@ -1086,24 +1137,31 @@ public:
                        int const x = _rc_config->get_vst_scan_timeout();
                        _timeout_adjustment.set_value (x);
                }
+               else if (p == "discover-audio-units") {
+                       bool const x = _rc_config->get_discover_audio_units();
+                       _discover_au_on_start.set_active (x);
+               }
        }
 
        void set_state_from_config () {
                parameter_changed ("show-plugin-scan-window");
                parameter_changed ("discover-vst-on-start");
                parameter_changed ("vst-scan-timeout");
+               parameter_changed ("discover-audio-units");
        }
 
 private:
        RCConfiguration* _rc_config;
+       UIConfiguration* _ui_config;
        CheckButton _display_plugin_scan_progress;
        CheckButton _discover_vst_on_start;
+       CheckButton _discover_au_on_start;
        Adjustment _timeout_adjustment;
        HScale _timeout_slider;
 
        void display_plugin_scan_progress_toggled () {
                bool const x = _display_plugin_scan_progress.get_active();
-               _rc_config->set_show_plugin_scan_window(x);
+               _ui_config->set_show_plugin_scan_window(x);
        }
 
        void discover_vst_on_start_toggled () {
@@ -1111,6 +1169,11 @@ private:
                _rc_config->set_discover_vst_on_start(x);
        }
 
+       void discover_au_on_start_toggled () {
+               bool const x = _discover_au_on_start.get_active();
+               _rc_config->set_discover_audio_units(x);
+       }
+
        void timeout_changed () {
                int x = floor(_timeout_adjustment.get_value());
                _rc_config->set_vst_scan_timeout(x);
@@ -1124,12 +1187,21 @@ private:
                PluginManager::instance().clear_vst_blacklist();
        }
 
+       void clear_au_cache_clicked () {
+               PluginManager::instance().clear_au_cache();
+       }
+
+       void clear_au_blacklist_clicked () {
+               PluginManager::instance().clear_au_blacklist();
+       }
+
+
        void edit_vst_path_clicked () {
                Gtkmm2ext::PathsDialog *pd = new Gtkmm2ext::PathsDialog (
                                _("Set Windows VST Search Path"),
                                _rc_config->get_plugin_path_vst(),
                                PluginManager::instance().get_default_windows_vst_path()
-                               );
+                       );
                ResponseType r = (ResponseType) pd->run ();
                pd->hide();
                if (r == RESPONSE_ACCEPT) {
@@ -1224,6 +1296,7 @@ private:
 RCOptionEditor::RCOptionEditor ()
        : OptionEditor (Config, string_compose (_("%1 Preferences"), PROGRAM_NAME))
         , _rc_config (Config)
+       , _ui_config (ARDOUR_UI::config())
        , _mixer_strip_visibility ("mixer-element-visibility")
 {
        /* MISC */
@@ -1280,8 +1353,8 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "only-copy-imported-files",
                     _("Always copy imported files"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_only_copy_imported_files),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_only_copy_imported_files)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_only_copy_imported_files),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_only_copy_imported_files)
                     ));
 
        add_option (_("Misc"), new DirectoryOption (
@@ -1345,17 +1418,6 @@ RCOptionEditor::RCOptionEditor ()
        // Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), _(""));
        add_option (_("Transport"), tsf);
 
-       tsf = new BoolOption (
-                    "stop-recording-on-xrun",
-                    _("Stop recording when an xrun occurs"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun)
-                    );
-       Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), 
-                                           string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"),
-                                                           PROGRAM_NAME));
-       add_option (_("Transport"), tsf);
-
        tsf = new BoolOption (
                     "loop-is-mode",
                     _("Play loop is a transport mode"),
@@ -1367,6 +1429,17 @@ RCOptionEditor::RCOptionEditor ()
                                               "<b>When disabled</b> the loop button starts playing the loop, but stop then cancels loop playback")));
        add_option (_("Transport"), tsf);
        
+       tsf = new BoolOption (
+                    "stop-recording-on-xrun",
+                    _("Stop recording when an xrun occurs"),
+                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_stop_recording_on_xrun),
+                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_stop_recording_on_xrun)
+                    );
+       Gtkmm2ext::UI::instance()->set_tip (tsf->tip_widget(), 
+                                           string_compose (_("<b>When enabled</b> %1 will stop recording if an over- or underrun is detected by the audio engine"),
+                                                           PROGRAM_NAME));
+       add_option (_("Transport"), tsf);
+
        tsf = new BoolOption (
                     "create-xrun-marker",
                     _("Create markers where xruns occur"),
@@ -1430,7 +1503,6 @@ RCOptionEditor::RCOptionEditor ()
                sigc::mem_fun (*_rc_config, &RCConfiguration::set_sync_source)
                );
 
-       populate_sync_options ();
        add_option (_("Transport"), _sync_source);
 
        _sync_framerate = new BoolOption (
@@ -1451,13 +1523,21 @@ RCOptionEditor::RCOptionEditor ()
 
        _sync_genlock = new BoolOption (
                "timecode-source-is-synced",
-               _("External timecode is sync locked"),
+               _("Sync-lock timecode to clock (disable drift compensation)"),
                sigc::mem_fun (*_rc_config, &RCConfiguration::get_timecode_source_is_synced),
                sigc::mem_fun (*_rc_config, &RCConfiguration::set_timecode_source_is_synced)
                );
        Gtkmm2ext::UI::instance()->set_tip 
-               (_sync_genlock->tip_widget(), 
-                _("<b>When enabled</b> indicates that the selected external timecode source shares sync (Black &amp; Burst, Wordclock, etc) with the audio interface."));
+               (_sync_genlock->tip_widget(),
+                string_compose (_("<b>When enabled</b> %1 will never varispeed when slaved to external timecode. "
+                                  "Sync Lock indicates that the selected external timecode source shares clock-sync "
+                                  "(Black &amp; Burst, Wordclock, etc) with the audio interface. "
+                                  "This option disables drift compensation. The transport speed is fixed at 1.0. "
+                                  "Vari-speed LTC will be ignored and cause drift."
+                                  "\n\n"
+                                  "<b>When disabled</b> %1 will compensate for potential drift, regardless if the "
+                                  "timecode sources shares clock sync."
+                                 ), PROGRAM_NAME));
 
 
        add_option (_("Transport"), _sync_genlock);
@@ -1494,6 +1574,8 @@ RCOptionEditor::RCOptionEditor ()
        AudioEngine::instance()->get_physical_inputs (DataType::AUDIO, physical_inputs);
        _ltc_port->set_popdown_strings (physical_inputs);
 
+       populate_sync_options ();
+
        add_option (_("Transport"), _ltc_port);
 
        // TODO; rather disable this button than not compile it..
@@ -1554,16 +1636,16 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "show-track-meters",
                     _("Show meters on tracks in the editor"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_track_meters),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_track_meters)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_track_meters),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_track_meters)
                     ));
 
        add_option (_("Editor"),
             new BoolOption (
                     "show-editor-meter",
                     _("Display master-meter in the toolbar"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_editor_meter),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_editor_meter)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_editor_meter),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_editor_meter)
                     ));
 
        ComboOption<FadeShape>* fadeshape = new ComboOption<FadeShape> (
@@ -1596,20 +1678,31 @@ RCOptionEditor::RCOptionEditor ()
 
        add_option (_("Editor"), bco);
 
+       ComboOption<LayerModel>* lm = new ComboOption<LayerModel> (
+               "layer-model",
+               _("Layering model"),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::get_layer_model),
+               sigc::mem_fun (*_rc_config, &RCConfiguration::set_layer_model)
+               );
+
+       lm->add (LaterHigher, _("later is higher"));
+       lm->add (Manual, _("manual layering"));
+       add_option (_("Editor"), lm);
+
        add_option (_("Editor"),
             new BoolOption (
                     "rubberbanding-snaps-to-grid",
                     _("Make rubberband selection rectangle snap to the grid"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_rubberbanding_snaps_to_grid),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_rubberbanding_snaps_to_grid)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_rubberbanding_snaps_to_grid),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_rubberbanding_snaps_to_grid)
                     ));
 
        add_option (_("Editor"),
             new BoolOption (
                     "show-waveforms",
                     _("Show waveforms in regions"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_waveforms),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_waveforms)
                     ));
 
        add_option (_("Editor"),
@@ -1618,15 +1711,15 @@ RCOptionEditor::RCOptionEditor ()
                     _("Show gain envelopes in audio regions"),
                     _("in all modes"),
                     _("only in region gain mode"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_region_gain),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_region_gain)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_region_gain),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_region_gain)
                     ));
 
        ComboOption<WaveformScale>* wfs = new ComboOption<WaveformScale> (
                "waveform-scale",
                _("Waveform scale"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_scale),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_scale)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_waveform_scale),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_waveform_scale)
                );
 
        wfs->add (Linear, _("linear"));
@@ -1637,8 +1730,8 @@ RCOptionEditor::RCOptionEditor ()
        ComboOption<WaveformShape>* wfsh = new ComboOption<WaveformShape> (
                "waveform-shape",
                _("Waveform shape"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_waveform_shape),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_waveform_shape)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_waveform_shape),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_waveform_shape)
                );
 
        wfsh->add (Traditional, _("traditional"));
@@ -1646,45 +1739,37 @@ RCOptionEditor::RCOptionEditor ()
 
        add_option (_("Editor"), wfsh);
 
-       add_option (_("Editor"), new ClipLevelOptions (_rc_config));
+       add_option (_("Editor"), new ClipLevelOptions (_ui_config));
 
        add_option (_("Editor"),
             new BoolOption (
                     "show-waveforms-while-recording",
                     _("Show waveforms for audio while it is being recorded"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_waveforms_while_recording),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_waveforms_while_recording)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_waveforms_while_recording),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_waveforms_while_recording)
                     ));
 
        add_option (_("Editor"),
                    new BoolOption (
                            "show-zoom-tools",
                            _("Show zoom toolbar"),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_zoom_tools),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_zoom_tools)
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_zoom_tools),
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_zoom_tools)
                            ));
 
        add_option (_("Editor"),
                    new BoolOption (
                            "update-editor-during-summary-drag",
                            _("Update editor window during drags of the summary"),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::get_update_editor_during_summary_drag),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::set_update_editor_during_summary_drag)
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::get_update_editor_during_summary_drag),
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::set_update_editor_during_summary_drag)
                            ));
 
-       add_option (_("Editor"),
-            new BoolOption (
-                    "link-editor-and-mixer-selection",
-                    _("Synchronise editor and mixer selection"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_editor_and_mixer_selection),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_editor_and_mixer_selection)
-                    ));
-
        bo = new BoolOption (
                     "name-new-markers",
                     _("Name new markers"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_name_new_markers),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_name_new_markers)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_name_new_markers),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_name_new_markers)
                );
        
        add_option (_("Editor"), bo);
@@ -1695,10 +1780,29 @@ RCOptionEditor::RCOptionEditor ()
            new BoolOption (
                    "autoscroll-editor",
                    _("Auto-scroll editor window when dragging near its edges"),
-                   sigc::mem_fun (*_rc_config, &RCConfiguration::get_autoscroll_editor),
-                   sigc::mem_fun (*_rc_config, &RCConfiguration::set_autoscroll_editor)
+                   sigc::mem_fun (*_ui_config, &UIConfiguration::get_autoscroll_editor),
+                   sigc::mem_fun (*_ui_config, &UIConfiguration::set_autoscroll_editor)
                    ));
 
+       ComboOption<RegionSelectionAfterSplit> *rsas = new ComboOption<RegionSelectionAfterSplit> (
+                   "region-selection-after-split",
+                   _("After splitting selected regions, select"),
+                   sigc::mem_fun (*_rc_config, &RCConfiguration::get_region_selection_after_split),
+                   sigc::mem_fun (*_rc_config, &RCConfiguration::set_region_selection_after_split));
+
+       // TODO: decide which of these modes are really useful
+       rsas->add(None, _("no regions"));
+       // rsas->add(NewlyCreatedLeft, _("newly-created regions before the split"));
+       // rsas->add(NewlyCreatedRight, _("newly-created regions after the split"));
+       rsas->add(NewlyCreatedBoth, _("newly-created regions"));
+       // rsas->add(Existing, _("unmodified regions in the existing selection"));
+       // rsas->add(ExistingNewlyCreatedLeft, _("existing selection and newly-created regions before the split"));
+       // rsas->add(ExistingNewlyCreatedRight, _("existing selection and newly-created regions after the split"));
+       rsas->add(ExistingNewlyCreatedBoth, _("existing selection and newly-created regions"));
+
+       add_option (_("Editor"), rsas);
+
+
        /* AUDIO */
 
        add_option (_("Audio"), new OptionEditorHeading (_("Buffering")));
@@ -1785,20 +1889,34 @@ RCOptionEditor::RCOptionEditor ()
                sigc::mem_fun (*_rc_config, &RCConfiguration::set_denormal_model)
                );
 
+       int dmsize = 1;
        dm->add (DenormalNone, _("no processor handling"));
 
        FPU fpu;
 
        if (fpu.has_flush_to_zero()) {
+               ++dmsize;
                dm->add (DenormalFTZ, _("use FlushToZero"));
+       } else if (_rc_config->get_denormal_model() == DenormalFTZ) {
+               _rc_config->set_denormal_model(DenormalNone);
        }
 
        if (fpu.has_denormals_are_zero()) {
+               ++dmsize;
                dm->add (DenormalDAZ, _("use DenormalsAreZero"));
+       } else if (_rc_config->get_denormal_model() == DenormalDAZ) {
+               _rc_config->set_denormal_model(DenormalNone);
        }
 
        if (fpu.has_flush_to_zero() && fpu.has_denormals_are_zero()) {
+               ++dmsize;
                dm->add (DenormalFTZDAZ, _("use FlushToZero and DenormalsAreZero"));
+       } else if (_rc_config->get_denormal_model() == DenormalFTZDAZ) {
+               _rc_config->set_denormal_model(DenormalNone);
+       }
+
+       if (dmsize == 1) {
+               dm->set_sensitive(false);
        }
 
        add_option (_("Audio"), dm);
@@ -1966,6 +2084,16 @@ RCOptionEditor::RCOptionEditor ()
                     sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner)
                     ));
 
+       add_option (_("MIDI"),
+                   new SpinOption<float> (
+                           "midi-readahead",
+                           _("MIDI read-ahead time (seconds)"),
+                           sigc::mem_fun (*_rc_config, &RCConfiguration::get_midi_readahead),
+                           sigc::mem_fun (*_rc_config, &RCConfiguration::set_midi_readahead),
+                           0.1, 10, 0.1, 1,
+                           "", 1.0, 1
+                           ));
+
        add_option (_("MIDI"),
                    new BoolOption (
                            "send-midi-clock",
@@ -2054,16 +2182,16 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "never-display-periodic-midi",
                     _("Never display periodic MIDI messages (MTC, MIDI Clock)"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_never_display_periodic_midi),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_never_display_periodic_midi)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_never_display_periodic_midi),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_never_display_periodic_midi)
                     ));
 
        add_option (_("MIDI"),
             new BoolOption (
                     "sound-midi-notes",
                     _("Sound MIDI notes as they are selected"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_sound_midi_notes),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_sound_midi_notes)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_sound_midi_notes),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_sound_midi_notes)
                     ));
 
        add_option (_("MIDI"), new OptionEditorHeading (_("Midi Audition")));
@@ -2093,7 +2221,14 @@ RCOptionEditor::RCOptionEditor ()
 
        /* USER INTERACTION */
 
-       if (getenv ("ARDOUR_BUNDLED")) {
+       if (
+#ifdef PLATFORM_WINDOWS
+                       true
+#else
+                       getenv ("ARDOUR_BUNDLED")
+#endif
+          )
+       {
                add_option (_("User interaction"), 
                            new BoolOption (
                                    "enable-translation",
@@ -2127,9 +2262,9 @@ RCOptionEditor::RCOptionEditor ()
        /* VIDEO Timeline */
        add_option (_("Video"), new VideoTimelineOptions (_rc_config));
 
-#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
+#if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined AUDIOUNIT_SUPPORT)
        /* Plugin options (currrently VST only) */
-       add_option (_("Plugins"), new PluginOptions (_rc_config));
+       add_option (_("Plugins"), new PluginOptions (_rc_config, _ui_config));
 #endif
 
        /* INTERFACE */
@@ -2138,37 +2273,39 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "widget-prelight",
                     _("Graphically indicate mouse pointer hovering over various widgets"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_widget_prelight),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_widget_prelight)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_widget_prelight),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_widget_prelight)
                     ));
 
+#ifdef TOOLTIPS_GOT_FIXED
        add_option (S_("Preferences|GUI"),
             new BoolOption (
                     "use-tooltips",
                     _("Show tooltips if mouse hovers over a control"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_use_tooltips),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_use_tooltips)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_use_tooltips),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_use_tooltips)
                     ));
+#endif
 
        add_option (S_("Preferences|GUI"),
             new BoolOption (
                     "show-name-highlight",
-                    _("Use name highlight bars in region displays"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_show_name_highlight),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_show_name_highlight)
+                    _("Use name highlight bars in region displays (requires a restart)"),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_show_name_highlight),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_show_name_highlight)
                     ));
 
 #ifndef GTKOSX
        /* font scaling does nothing with GDK/Quartz */
-       add_option (S_("Preferences|GUI"), new FontScalingOptions (_rc_config));
+       add_option (S_("Preferences|GUI"), new FontScalingOptions (_ui_config));
 #endif
 
        add_option (S_("GUI"),
                    new BoolOption (
                            "super-rapid-clock-update",
                            _("update transport clock display at FPS instead of every 100ms"),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::get_super_rapid_clock_update),
-                           sigc::mem_fun (*_rc_config, &RCConfiguration::set_super_rapid_clock_update)
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::get_super_rapid_clock_update),
+                           sigc::mem_fun (*_ui_config, &UIConfiguration::set_super_rapid_clock_update)
                            ));
 
        /* Lock GUI timeout */
@@ -2201,8 +2338,8 @@ RCOptionEditor::RCOptionEditor ()
                new VisibilityOption (
                        _("Mixer Strip"),
                        &_mixer_strip_visibility,
-                       sigc::mem_fun (*_rc_config, &RCConfiguration::get_mixer_strip_visibility),
-                       sigc::mem_fun (*_rc_config, &RCConfiguration::set_mixer_strip_visibility)
+                       sigc::mem_fun (*_ui_config, &UIConfiguration::get_mixer_strip_visibility),
+                       sigc::mem_fun (*_ui_config, &UIConfiguration::set_mixer_strip_visibility)
                        )
                );
 
@@ -2210,8 +2347,8 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "default-narrow_ms",
                     _("Use narrow strips in the mixer by default"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_default_narrow_ms),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_default_narrow_ms)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_default_narrow_ms),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_default_narrow_ms)
                     ));
 
        add_option (S_("Preferences|Metering"), new OptionEditorHeading (_("Metering")));
@@ -2219,8 +2356,8 @@ RCOptionEditor::RCOptionEditor ()
        ComboOption<float>* mht = new ComboOption<float> (
                "meter-hold",
                _("Peak hold time"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_hold),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_hold)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_hold),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_hold)
                );
 
        mht->add (MeterHoldOff, _("off"));
@@ -2252,8 +2389,8 @@ RCOptionEditor::RCOptionEditor ()
        ComboOption<MeterLineUp>* mlu = new ComboOption<MeterLineUp> (
                "meter-line-up-level",
                _("Meter line-up level; 0dBu"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_line_up_level),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_line_up_level)
                );
 
        mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
@@ -2268,8 +2405,8 @@ RCOptionEditor::RCOptionEditor ()
        ComboOption<MeterLineUp>* mld = new ComboOption<MeterLineUp> (
                "meter-line-up-din",
                _("IEC1/DIN Meter line-up level; 0dBu"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_din),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_din)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_line_up_din),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_line_up_din)
                );
 
        mld->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)"));
@@ -2284,8 +2421,8 @@ RCOptionEditor::RCOptionEditor ()
        ComboOption<VUMeterStandard>* mvu = new ComboOption<VUMeterStandard> (
                "meter-vu-standard",
                _("VU Meter standard"),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard),
-               sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard)
+               sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_vu_standard),
+               sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_vu_standard)
                );
 
        mvu->add (MeteringVUfrench,   _("0VU = -2dBu (France)"));
@@ -2299,8 +2436,8 @@ RCOptionEditor::RCOptionEditor ()
        HSliderOption *mpks = new HSliderOption("meter-peak",
                        _("Peak threshold [dBFS]"),
                        mpk,
-                       sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_peak),
-                       sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_peak)
+                       sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_peak),
+                       sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_peak)
                        );
 
        Gtkmm2ext::UI::instance()->set_tip
@@ -2313,10 +2450,14 @@ RCOptionEditor::RCOptionEditor ()
             new BoolOption (
                     "meter-style-led",
                     _("LED meter style"),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_style_led),
-                    sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_style_led)
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::get_meter_style_led),
+                    sigc::mem_fun (*_ui_config, &UIConfiguration::set_meter_style_led)
                     ));
 
+       /* and now the theme manager */
+
+       ThemeManager* tm = manage (new ThemeManager);
+       add_page (_("Theme"), *tm);
 }
 
 void
@@ -2371,4 +2512,12 @@ RCOptionEditor::populate_sync_options ()
        for (vector<SyncSource>::iterator i = sync_opts.begin(); i != sync_opts.end(); ++i) {
                _sync_source->add (*i, sync_source_to_string (*i));
        }
+
+       if (sync_opts.empty()) {
+               _sync_source->set_sensitive(false);
+       } else {
+               if (std::find(sync_opts.begin(), sync_opts.end(), _rc_config->get_sync_source()) == sync_opts.end()) {
+                       _rc_config->set_sync_source(sync_opts.front());
+               }
+       }
 }