fix previous commit
[ardour.git] / gtk2_ardour / time_axis_view.cc
index 059776bd92606326561f855021d0f67c6661fee8..3032d834bfda4bacbef7fc21b9e17831d623195d 100644 (file)
 #include "canvas/canvas.h"
 #include "canvas/rectangle.h"
 #include "canvas/debug.h"
+#include "canvas/utils.h"
+#include "canvas/colors.h"
+
+#include "ardour/profile.h"
 
 #include "ardour_ui.h"
 #include "ardour_dialog.h"
@@ -58,20 +62,33 @@ using namespace std;
 using namespace Gtk;
 using namespace Gdk;
 using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
 using namespace PBD;
 using namespace Editing;
 using namespace ArdourCanvas;
 using Gtkmm2ext::Keyboard;
 
+#define TOP_LEVEL_WIDGET controls_ebox
+
 const double trim_handle_size = 6.0; /* pixels */
 uint32_t TimeAxisView::button_height = 0;
 uint32_t TimeAxisView::extra_height = 0;
 int const TimeAxisView::_max_order = 512;
+unsigned int TimeAxisView::name_width_px = 100;
 PBD::Signal1<void,TimeAxisView*> TimeAxisView::CatchDeletion;
+Glib::RefPtr<Gtk::SizeGroup> TimeAxisView::controls_meters_size_group = Glib::RefPtr<Gtk::SizeGroup>();
+Glib::RefPtr<Gtk::SizeGroup> TimeAxisView::midi_scroomer_size_group = Glib::RefPtr<Gtk::SizeGroup>();
+
+void
+TimeAxisView::setup_sizes()
+{
+       name_width_px = ceil (100. * ARDOUR_UI::config()->get_font_scale() / 102400.);
+}
 
 TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
        : AxisView (sess)
-       , controls_table (2, 8)
+       , controls_table (3, 3)
+       , controls_button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_BOTH))
        , _name_editing (false)
        , height (0)
        , display_menu (0)
@@ -89,65 +106,82 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
        , _order (0)
        , _effective_height (0)
        , _resize_drag_start (-1)
+       , _did_resize (false)
        , _preresize_cursor (0)
        , _have_preresize_cursor (false)
        , _ebox_release_can_act (true)
 {
+       if (!controls_meters_size_group) {
+               controls_meters_size_group = SizeGroup::create (SIZE_GROUP_HORIZONTAL);
+       }
+       if (!midi_scroomer_size_group) {
+               midi_scroomer_size_group = SizeGroup::create (SIZE_GROUP_HORIZONTAL);
+       }
        if (extra_height == 0) {
                compute_heights ();
        }
 
-       _canvas_display = new Group (ed.get_trackview_group (), ArdourCanvas::Duple (0.0, 0.0));
+       _canvas_display = new ArdourCanvas::Container (ed.get_trackview_group ());
        CANVAS_DEBUG_NAME (_canvas_display, "main for TAV");
        _canvas_display->hide(); // reveal as needed
 
-       selection_group = new Group (_canvas_display);
+       _canvas_separator = new ArdourCanvas::Line(_canvas_display);
+       CANVAS_DEBUG_NAME (_canvas_separator, "separator for TAV");
+       _canvas_separator->set (ArdourCanvas::Duple(0.0, 0.0), ArdourCanvas::Duple(ArdourCanvas::COORD_MAX, 0.0));
+       _canvas_separator->set_outline_color(ArdourCanvas::rgba_to_color (0, 0, 0, 1.0));
+       _canvas_separator->set_outline_width(1.0);
+       _canvas_separator->hide();
+
+       selection_group = new ArdourCanvas::Container (_canvas_display);
        CANVAS_DEBUG_NAME (selection_group, "selection for TAV");
        selection_group->set_data (X_("timeselection"), (void *) 1);
        selection_group->hide();
-
-       _ghost_group = new Group (_canvas_display);
+       
+       _ghost_group = new ArdourCanvas::Container (_canvas_display);
        CANVAS_DEBUG_NAME (_ghost_group, "ghost for TAV");
        _ghost_group->lower_to_bottom();
        _ghost_group->show();
 
        name_label.set_name ("TrackLabel");
        name_label.set_alignment (0.0, 0.5);
+       name_label.set_width_chars (12);
        ARDOUR_UI::instance()->set_tip (name_label, _("Track/Bus name (double click to edit)"));
 
-       Gtk::Entry* an_entry = new Gtk::Entry;
+       Gtk::Entry* an_entry = new Gtkmm2ext::FocusEntry;
+       an_entry->set_name ("EditorTrackNameDisplay");
        Gtk::Requisition req;
        an_entry->size_request (req);
        name_label.set_size_request (-1, req.height);
+       name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
        delete an_entry;
 
-       name_hbox.pack_start (name_label, true, true);
+       name_hbox.pack_end (name_label, true, true);
+
+       // set min. track-header width if fader is not visible
+       name_hbox.set_size_request(name_width_px, -1);
+
        name_hbox.show ();
        name_label.show ();
-       
-       controls_table.set_size_request (200);
+
        controls_table.set_row_spacings (2);
        controls_table.set_col_spacings (2);
        controls_table.set_border_width (2);
-       controls_table.set_homogeneous (true);
 
-       controls_table.attach (name_hbox, 0, 5, 0, 1,  Gtk::FILL|Gtk::EXPAND,  Gtk::FILL|Gtk::EXPAND, 3, 0);
+       if (ARDOUR::Profile->get_mixbus() ) {
+               controls_table.attach (name_hbox, 4, 5, 0, 2,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+       } else {
+               controls_table.attach (name_hbox, 1, 2, 0, 2,  Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+       }
        controls_table.show_all ();
        controls_table.set_no_show_all ();
 
-       HSeparator* separator = manage (new HSeparator());
-       separator->set_name("TrackSeparator");
-       separator->set_size_request(-1, 1);
-       separator->show();
-
        controls_vbox.pack_start (controls_table, false, false);
        controls_vbox.show ();
 
-       controls_hbox.pack_start (controls_vbox, true, true);
-       controls_hbox.show ();
+       top_hbox.pack_start (controls_vbox, true, true);
+       top_hbox.show ();
 
-       //controls_ebox.set_name ("TimeAxisViewControlsBaseUnselected");
-       controls_ebox.add (controls_hbox);
+       controls_ebox.add (time_axis_hbox);
        controls_ebox.add_events (Gdk::BUTTON_PRESS_MASK|
                                  Gdk::BUTTON_RELEASE_MASK|
                                  Gdk::POINTER_MOTION_MASK|
@@ -164,9 +198,25 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
        controls_ebox.signal_leave_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_leave));
        controls_ebox.show ();
 
-       time_axis_vbox.pack_start (controls_ebox, true, true, 0);
-       time_axis_vbox.pack_end (*separator, false, false);
+       time_axis_frame.set_shadow_type (Gtk::SHADOW_NONE);
+       time_axis_frame.add(top_hbox);
+       time_axis_frame.show();
+
+       HSeparator* separator = manage (new HSeparator());
+       separator->set_name("TrackSeparator");
+       separator->set_size_request(-1, 1);
+       separator->show();
+
+       scroomer_placeholder.set_size_request (-1, -1);
+       scroomer_placeholder.show();
+       midi_scroomer_size_group->add_widget (scroomer_placeholder);
+
+       time_axis_vbox.pack_start (*separator, false, false);
+       time_axis_vbox.pack_start (time_axis_frame, true, true);
        time_axis_vbox.show();
+       time_axis_hbox.pack_start (time_axis_vbox, true, true);
+       time_axis_hbox.show();
+       top_hbox.pack_start (scroomer_placeholder, false, false); // OR pack_end to move after meters ?
 
        ColorsChanged.connect (sigc::mem_fun (*this, &TimeAxisView::color_handler));
 
@@ -175,6 +225,8 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
 
 TimeAxisView::~TimeAxisView()
 {
+       CatchDeletion (this);
+
        in_destructor = true;
 
        for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
@@ -182,16 +234,16 @@ TimeAxisView::~TimeAxisView()
        }
 
        for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
+               delete (*i)->rect; (*i)->rect=0;
+               delete (*i)->start_trim; (*i)->start_trim = 0;
+               delete (*i)->end_trim; (*i)->end_trim = 0;
 
        }
 
        for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) {
-               delete (*i)->rect;
-               delete (*i)->start_trim;
-               delete (*i)->end_trim;
+               delete (*i)->rect; (*i)->rect = 0;
+               delete (*i)->start_trim; (*i)->start_trim = 0;
+               delete (*i)->end_trim; (*i)->end_trim = 0;
        }
 
        delete selection_group;
@@ -214,9 +266,10 @@ TimeAxisView::hide ()
        }
 
        _canvas_display->hide ();
+       _canvas_separator->hide ();
 
        if (control_parent) {
-               control_parent->remove (time_axis_vbox);
+               control_parent->remove (TOP_LEVEL_WIDGET);
                control_parent = 0;
        }
 
@@ -248,11 +301,11 @@ guint32
 TimeAxisView::show_at (double y, int& nth, VBox *parent)
 {
        if (control_parent) {
-               control_parent->reorder_child (time_axis_vbox, nth);
+               control_parent->reorder_child (TOP_LEVEL_WIDGET, nth);
        } else {
                control_parent = parent;
-               parent->pack_start (time_axis_vbox, false, false);
-               parent->reorder_child (time_axis_vbox, nth);
+               parent->pack_start (TOP_LEVEL_WIDGET, false, false);
+               parent->reorder_child (TOP_LEVEL_WIDGET, nth);
        }
 
        _order = nth;
@@ -260,12 +313,11 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
        if (_y_position != y) {
                _canvas_display->set_y_position (y);
                _y_position = y;
-
        }
 
        _canvas_display->raise_to_top ();
        _canvas_display->show ();
-
+       
        _hidden = false;
 
        _effective_height = current_height ();
@@ -281,12 +333,48 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
                }
        }
 
+       /* put separator at the bottom of this time axis view */
+
+       _canvas_separator->set (ArdourCanvas::Duple(0, height), ArdourCanvas::Duple(ArdourCanvas::COORD_MAX, height));
+       _canvas_separator->lower_to_bottom ();
+       _canvas_separator->show ();
+
        return _effective_height;
 }
 
 bool
 TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
 {
+       switch (ev->direction) {
+       case GDK_SCROLL_UP:
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
+                       /* See Editor::_stepping_axis_view for notes on this hack */
+                       Editor& e = dynamic_cast<Editor&> (_editor);
+                       if (!e.stepping_axis_view ()) {
+                               e.set_stepping_axis_view (this);
+                       }
+                       e.stepping_axis_view()->step_height (false);
+                       return true;
+               } 
+               break;
+
+       case GDK_SCROLL_DOWN:
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
+                       /* See Editor::_stepping_axis_view for notes on this hack */
+                       Editor& e = dynamic_cast<Editor&> (_editor);
+                       if (!e.stepping_axis_view ()) {
+                               e.set_stepping_axis_view (this);
+                       }
+                       e.stepping_axis_view()->step_height (true);
+                       return true;
+               } 
+               break;
+
+       default:
+               /* no handling for left/right, yet */
+               break;
+       }
+
        /* Just forward to the normal canvas scroll method. The coordinate
           systems are different but since the canvas is always larger than the
           track headers, and aligned with the trackview area, this will work.
@@ -294,7 +382,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
           In the not too distant future this layout is going away anyway and
           headers will be on the canvas.
        */
-       return _editor.canvas_scroll_event (ev);
+       return _editor.canvas_scroll_event (ev, false);
 }
 
 bool
@@ -326,9 +414,9 @@ TimeAxisView::controls_ebox_button_press (GdkEventButton* event)
 }
 
 void
-TimeAxisView::idle_resize (uint32_t h)
+TimeAxisView::idle_resize (int32_t h)
 {
-       set_height (h);
+       set_height (std::max(0, h));
 }
 
 
@@ -341,15 +429,16 @@ TimeAxisView::controls_ebox_motion (GdkEventMotion* ev)
                 * are pretending that the drag is taking place over the canvas
                 * (which perhaps in the glorious future, when track headers
                 * and the canvas are unified, will actually be true.)
-               */
+                */
 
                _editor.maybe_autoscroll (false, true, true);
 
                /* now schedule the actual TAV resize */
-                int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start);
-                _editor.add_to_idle_resize (this, delta);
-                _resize_drag_start = ev->y_root;
-        } else {
+               int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start);
+               _editor.add_to_idle_resize (this, delta);
+               _resize_drag_start = ev->y_root;
+               _did_resize = true;
+       } else {
                /* not dragging but ... */
                maybe_set_cursor (ev->y);
        }
@@ -407,6 +496,11 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
                }
                _editor.stop_canvas_autoscroll ();
                _resize_drag_start = -1;
+               if (_did_resize) {
+                       _did_resize = false;
+                       // don't change selection
+                       return true;
+               }
        }
 
        if (!_ebox_release_can_act) {
@@ -480,7 +574,7 @@ TimeAxisView::set_height (uint32_t h)
                h = preset_height (HeightSmall);
        }
 
-       time_axis_vbox.property_height_request () = h;
+       TOP_LEVEL_WIDGET.property_height_request () = h;
        height = h;
 
        char buf[32];
@@ -559,6 +653,8 @@ TimeAxisView::begin_name_edit ()
 
                name_entry = manage (new Gtkmm2ext::FocusEntry);
                
+               name_entry->set_width_chars(8); // min width, entry expands
+
                name_entry->set_name ("EditorTrackNameDisplay");
                name_entry->signal_key_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_press), false);
                name_entry->signal_key_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_release), false);
@@ -570,7 +666,7 @@ TimeAxisView::begin_name_edit ()
                        name_hbox.remove (name_label);
                }
                
-               name_hbox.pack_start (*name_entry);
+               name_hbox.pack_end (*name_entry, true, true);
                name_entry->show ();
 
                name_entry->select_region (0, -1);
@@ -615,7 +711,7 @@ TimeAxisView::end_name_edit (int response)
 
        /* put the name label back */
 
-       name_hbox.pack_start (name_label);
+       name_hbox.pack_end (name_label);
        name_label.show ();
 
        if (edit_next) {
@@ -644,7 +740,7 @@ TimeAxisView::end_name_edit (int response)
                }
 
                if ((i != allviews.end()) && (*i != this) && !(*i)->hidden()) {
-                       _editor.ensure_time_axis_view_is_visible (**i);
+                       _editor.ensure_time_axis_view_is_visible (**i, false);
                        (*i)->begin_name_edit ();
                } 
 
@@ -675,7 +771,7 @@ TimeAxisView::end_name_edit (int response)
                }
                
                if ((i != allviews.end()) && (*i != this) && !(*i)->hidden()) {
-                       _editor.ensure_time_axis_view_is_visible (**i);
+                       _editor.ensure_time_axis_view_is_visible (**i, false);
                        (*i)->begin_name_edit ();
                } 
        }
@@ -714,6 +810,10 @@ TimeAxisView::popup_display_menu (guint32 when)
 void
 TimeAxisView::set_selected (bool yn)
 {
+       if (can_edit_name() && name_entry && name_entry->get_visible()) {
+               end_name_edit (RESPONSE_CANCEL);
+       }
+
        if (yn == _selected) {
                return;
        }
@@ -721,13 +821,18 @@ TimeAxisView::set_selected (bool yn)
        Selectable::set_selected (yn);
 
        if (_selected) {
+               time_axis_frame.set_shadow_type (Gtk::SHADOW_IN);
+               time_axis_frame.set_name ("MixerStripSelectedFrame");
                controls_ebox.set_name (controls_base_selected_name);
-               time_axis_vbox.set_name (controls_base_selected_name);
                controls_vbox.set_name (controls_base_selected_name);
+               time_axis_vbox.set_name (controls_base_selected_name);
        } else {
+               time_axis_frame.set_shadow_type (Gtk::SHADOW_NONE);
+               time_axis_frame.set_name (controls_base_unselected_name);
                controls_ebox.set_name (controls_base_unselected_name);
-               time_axis_vbox.set_name (controls_base_unselected_name);
                controls_vbox.set_name (controls_base_unselected_name);
+               time_axis_vbox.set_name (controls_base_unselected_name);
+
                hide_selection ();
 
                /* children will be set for the yn=true case. but when deselecting
@@ -739,6 +844,9 @@ TimeAxisView::set_selected (bool yn)
                        (*i)->set_selected (false);
                }
        }
+
+       time_axis_frame.show();
+
 }
 
 void
@@ -784,7 +892,8 @@ TimeAxisView::show_selection (TimeSelection& ts)
        double x1;
        double x2;
        double y2;
-       SelectionRect *rect;
+       SelectionRect *rect;    time_axis_frame.show();
+
 
        for (Children::iterator i = children.begin(); i != children.end(); ++i) {
                (*i)->show_selection (ts);
@@ -816,14 +925,14 @@ TimeAxisView::show_selection (TimeSelection& ts)
 
                x1 = _editor.sample_to_pixel (start);
                x2 = _editor.sample_to_pixel (start + cnt - 1);
-               y2 = current_height();
+               y2 = current_height() - 1;
 
-               rect->rect->set (ArdourCanvas::Rect (x1, 1, x2, y2));
+               rect->rect->set (ArdourCanvas::Rect (x1, 0, x2, y2));
 
                // trim boxes are at the top for selections
 
                if (x2 > x1) {
-                       rect->start_trim->set (ArdourCanvas::Rect (x1, 1, x1 + trim_handle_size, y2));
+                       rect->start_trim->set (ArdourCanvas::Rect (x1, 0, x1 + trim_handle_size, y2));
                        rect->end_trim->set (ArdourCanvas::Rect (x2 - trim_handle_size, 1, x2, y2));
 
                        rect->start_trim->show();
@@ -919,18 +1028,18 @@ TimeAxisView::get_selection_rect (uint32_t id)
 
                rect = new SelectionRect;
 
-               rect->rect = new ArdourCanvas::Rectangle (selection_group);
+               rect->rect = new ArdourCanvas::TimeRectangle (selection_group);
                CANVAS_DEBUG_NAME (rect->rect, "selection rect");
                rect->rect->set_outline (false);
-               rect->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect());
+               rect->rect->set_fill_color (ARDOUR_UI::config()->color_mod ("selection rect", "selection rect"));
 
                rect->start_trim = new ArdourCanvas::Rectangle (selection_group);
-               CANVAS_DEBUG_NAME (rect->rect, "selection rect start trim");
+               CANVAS_DEBUG_NAME (rect->start_trim, "selection rect start trim");
                rect->start_trim->set_outline (false);
                rect->start_trim->set_fill (false);
 
                rect->end_trim = new ArdourCanvas::Rectangle (selection_group);
-               CANVAS_DEBUG_NAME (rect->rect, "selection rect end trim");
+               CANVAS_DEBUG_NAME (rect->end_trim, "selection rect end trim");
                rect->end_trim->set_outline (false);
                rect->end_trim->set_fill (false);
 
@@ -979,7 +1088,7 @@ TimeAxisView::remove_child (boost::shared_ptr<TimeAxisView> child)
  *  @param result Filled in with selectable things.
  */
 void
-TimeAxisView::get_selectables (framepos_t /*start*/, framepos_t /*end*/, double /*top*/, double /*bot*/, list<Selectable*>& /*result*/)
+TimeAxisView::get_selectables (framepos_t /*start*/, framepos_t /*end*/, double /*top*/, double /*bot*/, list<Selectable*>& /*result*/, bool /*within*/)
 {
        return;
 }
@@ -1054,38 +1163,27 @@ TimeAxisView::reset_height ()
 void
 TimeAxisView::compute_heights ()
 {
+       // TODO this function should be re-evaluated when font-scaling changes (!)
        Gtk::Window window (Gtk::WINDOW_TOPLEVEL);
-       Gtk::Table two_row_table (2, 8);
-       Gtk::Table one_row_table (1, 8);
-       Button* buttons[5];
+       Gtk::Table one_row_table (1, 1);
+       ArdourButton* test_button = manage (new ArdourButton);
        const int border_width = 2;
-
-       const int separator_height = 2;
-       extra_height = (2 * border_width) + separator_height;
+       const int frame_height = 2;
+       extra_height = (2 * border_width) + frame_height;
 
        window.add (one_row_table);
+       test_button->set_name ("mute button");
+       test_button->set_text (_("M"));
+       test_button->set_tweaks (ArdourButton::TrackHeader);
 
        one_row_table.set_border_width (border_width);
-       one_row_table.set_row_spacings (0);
-       one_row_table.set_col_spacings (0);
-       one_row_table.set_homogeneous (true);
-
-       two_row_table.set_border_width (border_width);
-       two_row_table.set_row_spacings (0);
-       two_row_table.set_col_spacings (0);
-       two_row_table.set_homogeneous (true);
-
-       for (int i = 0; i < 5; ++i) {
-               buttons[i] = manage (new Button (X_("f")));
-               buttons[i]->set_name ("TrackMuteButton");
-       }
-
-       one_row_table.attach (*buttons[0], 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+       one_row_table.set_row_spacings (2);
+       one_row_table.set_col_spacings (2);
 
+       one_row_table.attach (*test_button, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0);
        one_row_table.show_all ();
-       Gtk::Requisition req(one_row_table.size_request ());
 
-       // height required to show 1 row of buttons
+       Gtk::Requisition req(one_row_table.size_request ());
        button_height = req.height;
 }
 
@@ -1098,26 +1196,26 @@ TimeAxisView::color_handler ()
 
        for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) {
 
-               (*i)->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect());
-               (*i)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->rect->set_fill_color (ARDOUR_UI::config()->color_mod ("selection rect", "selection rect"));
+               (*i)->rect->set_outline_color (ARDOUR_UI::config()->color ("selection"));
 
-               (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection());
-               (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->color ("selection"));
+               (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->color ("selection"));
                
-               (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection());
-               (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->color ("selection"));
+               (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->color ("selection"));
        }
        
        for (list<SelectionRect*>::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) {
                
-               (*i)->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect());
-               (*i)->rect->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->rect->set_fill_color (ARDOUR_UI::config()->color_mod ("selection rect", "selection rect"));
+               (*i)->rect->set_outline_color (ARDOUR_UI::config()->color ("selection"));
                
-               (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection());
-               (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->start_trim->set_fill_color (ARDOUR_UI::config()->color ("selection"));
+               (*i)->start_trim->set_outline_color (ARDOUR_UI::config()->color ("selection"));
                
-               (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->get_canvasvar_Selection());
-               (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->get_canvasvar_Selection());
+               (*i)->end_trim->set_fill_color (ARDOUR_UI::config()->color ("selection"));
+               (*i)->end_trim->set_outline_color (ARDOUR_UI::config()->color ("selection"));
        }
 }
 
@@ -1222,7 +1320,7 @@ TimeAxisView::preset_height (Height h)
                return button_height + extra_height;
        }
 
-       /* NOTREACHED */
+       abort(); /* NOTREACHED */
        return 0;
 }