merge with master, including manual merge conflict resolution
authorPaul Davis <paul@linuxaudiosystems.com>
Sat, 6 Apr 2013 20:12:15 +0000 (16:12 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Sat, 6 Apr 2013 20:12:15 +0000 (16:12 -0400)
1  2 
gtk2_ardour/ardour_ui.cc
gtk2_ardour/editor.cc
gtk2_ardour/route_time_axis.cc
gtk2_ardour/tempo_lines.cc
libs/ardour/wscript
wscript

diff --combined gtk2_ardour/ardour_ui.cc
index 1022acee2d082440387188ea2e9cb84edfa2d834,c29c8136a08e07822f4dc322d8f53ce896dfcf43..8484ffff36d2452ec75795e1fa8574be214c5f29
@@@ -689,7 -689,6 +689,6 @@@ ARDOUR_UI::startup (
  
                        // nsm requires these actions disabled
                        vector<string> action_names;
-                       action_names.push_back("Snapshot");
                        action_names.push_back("SaveAs");
                        action_names.push_back("Rename");
                        action_names.push_back("New");
@@@ -2347,7 -2346,6 +2346,7 @@@ ARDOUR_UI::save_state_canfail (string n
        }
  
        save_ardour_state (); /* XXX cannot fail? yeah, right ... */
 +      editor->save_canvas_state ();
        return 0;
  }
  
diff --combined gtk2_ardour/editor.cc
index 194c3442410bb1bdbd44bc5f51f97cd1eb68adc5,f2acaca7494dfb149e6f33d25ed4cf4d71a85916..7f49c56d7be29f85b35edaf4bbb1bcd0de030db8
@@@ -70,9 -70,6 +70,9 @@@
  #include "ardour/tempo.h"
  #include "ardour/utils.h"
  
 +#include "canvas/debug.h"
 +#include "canvas/text.h"
 +
  #include "control_protocol/control_protocol.h"
  
  #include "actions.h"
@@@ -84,6 -81,8 +84,6 @@@
  #include "audio_time_axis.h"
  #include "automation_time_axis.h"
  #include "bundle_manager.h"
 -#include "canvas-noevent-text.h"
 -#include "canvas_impl.h"
  #include "crossfade_edit.h"
  #include "debug.h"
  #include "editing.h"
  #include "rhythm_ferret.h"
  #include "selection.h"
  #include "sfdb_ui.h"
 -#include "simpleline.h"
  #include "tempo_lines.h"
  #include "time_axis_view.h"
  #include "utils.h"
@@@ -316,8 -316,8 +316,8 @@@ Editor::Editor (
  
        snap_threshold = 5.0;
        bbt_beat_subdivision = 4;
 -      _canvas_width = 0;
 -      _canvas_height = 0;
 +      _visible_canvas_width = 0;
 +      _visible_canvas_height = 0;
        last_autoscroll_x = 0;
        last_autoscroll_y = 0;
        autoscroll_active = false;
        _internal_editing = false;
        current_canvas_cursor = 0;
  
 -      frames_per_unit = 2048; /* too early to use reset_zoom () */
 +      frames_per_pixel = 2048; /* too early to use reset_zoom () */
  
        _scroll_callbacks = 0;
  
  
        edit_controls_vbox.set_spacing (0);
        vertical_adjustment.signal_value_changed().connect (sigc::mem_fun(*this, &Editor::tie_vertical_scrolling), true);
 -      track_canvas->signal_map_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_map_handler));
 +      _track_canvas->signal_map_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_map_handler));
  
        HBox* h = manage (new HBox);
        _group_tabs = new EditorGroupTabs (this);
  
        _cursors = new MouseCursors;
  
 -      ArdourCanvas::Canvas* time_pad = manage(new ArdourCanvas::Canvas());
 -      ArdourCanvas::SimpleLine* pad_line_1 = manage(new ArdourCanvas::SimpleLine(*time_pad->root(),
 -                      0.0, 1.0, 100.0, 1.0));
 +      ArdourCanvas::GtkCanvas* time_pad = manage (new ArdourCanvas::GtkCanvas ());
  
 -      pad_line_1->property_color_rgba() = 0xFF0000FF;
 +      ArdourCanvas::Line* pad_line_1 = new ArdourCanvas::Line (time_pad->root());
 +      pad_line_1->set (ArdourCanvas::Duple (0.0, 1.0), ArdourCanvas::Duple (100.0, 1.0));
 +      pad_line_1->set_outline_color (0xFF0000FF);
        pad_line_1->show();
  
 +      // CAIROCANVAS
        time_pad->show();
  
        time_canvas_vbox.set_size_request (-1, (int)(timebar_height * visible_timebars) + 2);
        ruler_label_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
        ruler_label_event_box.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::ruler_label_button_release));
  
 -      time_button_event_box.add (time_button_vbox);
 -      time_button_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
 -      time_button_event_box.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::ruler_label_button_release));
 +      time_bars_event_box.add (time_bars_vbox);
 +      time_bars_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
 +      time_bars_event_box.signal_button_release_event().connect (sigc::mem_fun(*this, &Editor::ruler_label_button_release));
  
        /* these enable us to have a dedicated window (for cursor setting, etc.)
           for the canvas areas.
        */
  
 -      track_canvas_event_box.add (*track_canvas);
 +      track_canvas_event_box.add (*_track_canvas_viewport);
  
        time_canvas_event_box.add (time_canvas_vbox);
        time_canvas_event_box.set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
  
        /* labels for the rulers */
        edit_packer.attach (ruler_label_event_box,   1, 2, 0, 1,    FILL,        SHRINK, 0, 0);
 -      /* labels for the marker "tracks" */
 -      edit_packer.attach (time_button_event_box,   1, 2, 1, 2,    FILL,        SHRINK, 0, 0);
 +      /* labels for the marker "tracks" (time bars) */
 +      edit_packer.attach (time_bars_event_box,     1, 2, 1, 2,    FILL,        SHRINK, 0, 0);
        /* the rulers */
        edit_packer.attach (time_canvas_event_box,   2, 3, 0, 1,    FILL|EXPAND, FILL, 0, 0);
        /* track controls */
        edit_packer.attach (controls_layout,         0, 2, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
 -      /* main canvas */
 -      edit_packer.attach (track_canvas_event_box,  2, 3, 1, 3,    FILL|EXPAND, FILL|EXPAND, 0, 0);
 +      /* time bars canvas */
 +      edit_packer.attach (*_time_bars_canvas_viewport, 2, 3, 1, 2,    FILL,    FILL, 0, 0);
 +      /* track canvas */
 +      edit_packer.attach (track_canvas_event_box,  2, 3, 2, 3,    FILL|EXPAND, FILL|EXPAND, 0, 0);
  
        bottom_hbox.set_border_width (2);
        bottom_hbox.set_spacing (3);
@@@ -788,7 -785,7 +788,7 @@@ Editor::~Editor(
          delete button_bindings;
        delete _routes;
        delete _route_groups;
 -      delete track_canvas;
 +      delete _track_canvas_viewport;
        delete _drags;
  }
  
@@@ -937,11 -934,11 +937,11 @@@ Editor::zoom_adjustment_changed (
                return;
        }
  
 -      double fpu = zoom_range_clock->current_duration() / _canvas_width;
 -      bool clamped = clamp_frames_per_unit (fpu);
 +      double fpu = zoom_range_clock->current_duration() / _visible_canvas_width;
 +      bool clamped = clamp_frames_per_pixel (fpu);
        
        if (clamped) {
 -              zoom_range_clock->set ((framepos_t) floor (fpu * _canvas_width));
 +              zoom_range_clock->set ((framepos_t) floor (fpu * _visible_canvas_width));
        }
  
        temporal_zoom (fpu);
@@@ -1148,7 -1145,7 +1148,7 @@@ Editor::map_position_change (framepos_
  void
  Editor::center_screen (framepos_t frame)
  {
 -      double page = _canvas_width * frames_per_unit;
 +      double const page = _visible_canvas_width * frames_per_pixel;
  
        /* if we're off the page, then scroll.
         */
@@@ -1278,7 -1275,7 +1278,7 @@@ Editor::set_session (Session *t
  
        /* catch up with the playhead */
  
 -      _session->request_locate (playhead_cursor->current_frame);
 +      _session->request_locate (playhead_cursor->current_frame ());
        _pending_initial_locate = true;
  
        update_title ();
        _session->locations()->StateChanged.connect (_session_connections, invalidator (*this), boost::bind (&Editor::refresh_location_display, this), gui_context());
        _session->history().Changed.connect (_session_connections, invalidator (*this), boost::bind (&Editor::history_changed, this), gui_context());
  
 -      playhead_cursor->canvas_item.show ();
 +      playhead_cursor->show ();
  
        boost::function<void (string)> pc (boost::bind (&Editor::parameter_changed, this, _1));
        Config->map_parameters (pc);
        _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
  
        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
 -              (static_cast<TimeAxisView*>(*i))->set_samples_per_unit (frames_per_unit);
 +              (static_cast<TimeAxisView*>(*i))->set_frames_per_pixel (frames_per_pixel);
        }
  
        super_rapid_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (
@@@ -2290,7 -2287,7 +2290,7 @@@ Editor::set_state (const XMLNode& node
        if ((prop = node.property ("zoom"))) {
                reset_zoom (PBD::atof (prop->value()));
        } else {
 -              reset_zoom (frames_per_unit);
 +              reset_zoom (frames_per_pixel);
        }
  
        if ((prop = node.property ("snap-to"))) {
@@@ -2510,7 -2507,7 +2510,7 @@@ Editor::get_state (
        maybe_add_mixer_strip_width (*node);
  
        node->add_property ("zoom-focus", enum_2_string (zoom_focus));
 -      snprintf (buf, sizeof(buf), "%f", frames_per_unit);
 +      snprintf (buf, sizeof(buf), "%f", frames_per_pixel);
        node->add_property ("zoom", buf);
        node->add_property ("snap-to", enum_2_string (_snap_type));
        node->add_property ("snap-mode", enum_2_string (_snap_mode));
        node->add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode));
        node->add_property ("edit-point", enum_2_string (_edit_point));
  
 -      snprintf (buf, sizeof (buf), "%" PRIi64, playhead_cursor->current_frame);
 +      snprintf (buf, sizeof (buf), "%" PRIi64, playhead_cursor->current_frame ());
        node->add_property ("playhead", buf);
        snprintf (buf, sizeof (buf), "%" PRIi64, leftmost_frame);
        node->add_property ("left-frame", buf);
@@@ -4136,16 -4133,16 +4136,16 @@@ Editor::reset_y_origin (double y
  }
  
  void
 -Editor::reset_zoom (double fpu)
 +Editor::reset_zoom (double fpp)
  {
 -      clamp_frames_per_unit (fpu);
 +      clamp_frames_per_pixel (fpp);
  
 -      if (fpu == frames_per_unit) {
 +      if (fpp == frames_per_pixel) {
                return;
        }
  
        pending_visual_change.add (VisualChange::ZoomLevel);
 -      pending_visual_change.frames_per_unit = fpu;
 +      pending_visual_change.frames_per_pixel = fpp;
        ensure_visual_change_idle_handler ();
  }
  
@@@ -4175,7 -4172,7 +4175,7 @@@ Editor::current_visual_state (bool with
  {
        VisualState* vs = new VisualState (with_tracks);
        vs->y_position = vertical_adjustment.get_value();
 -      vs->frames_per_unit = frames_per_unit;
 +      vs->frames_per_pixel = frames_per_pixel;
        vs->leftmost_frame = leftmost_frame;
        vs->zoom_focus = zoom_focus;
  
@@@ -4237,7 -4234,7 +4237,7 @@@ Editor::use_visual_state (VisualState& 
        vertical_adjustment.set_value (vs.y_position);
  
        set_zoom_focus (vs.zoom_focus);
 -      reposition_and_zoom (vs.leftmost_frame, vs.frames_per_unit);
 +      reposition_and_zoom (vs.leftmost_frame, vs.frames_per_pixel);
        
        if (vs.gui_state) {
                *ARDOUR_UI::instance()->gui_object_state = *vs.gui_state;
   *  @param fpu New frames per unit; should already have been clamped so that it is sensible.
   */
  void
 -Editor::set_frames_per_unit (double fpu)
 +Editor::set_frames_per_pixel (double fpp)
  {
        if (tempo_lines) {
                tempo_lines->tempo_map_changed();
        }
  
 -      frames_per_unit = fpu;
 +      frames_per_pixel = fpp;
  
        /* convert fpu to frame count */
  
 -      framepos_t frames = (framepos_t) floor (frames_per_unit * _canvas_width);
 +      framepos_t frames = (framepos_t) floor (frames_per_pixel * _visible_canvas_width);
  
 -      if (frames_per_unit != zoom_range_clock->current_duration()) {
 +      if (frames_per_pixel != zoom_range_clock->current_duration()) {
                zoom_range_clock->set (frames);
        }
  
        //reset_scrolling_region ();
  
        if (playhead_cursor) {
 -              playhead_cursor->set_position (playhead_cursor->current_frame);
 +              playhead_cursor->set_position (playhead_cursor->current_frame ());
        }
  
        refresh_location_display();
@@@ -4316,7 -4313,6 +4316,7 @@@ Editor::ensure_visual_change_idle_handl
  {
        if (pending_visual_change.idle_handler_id < 0) {
                pending_visual_change.idle_handler_id = g_idle_add (_idle_visual_changer, this);
 +              pending_visual_change.being_handled = false;
        }
  }
  
@@@ -4348,7 -4344,7 +4348,7 @@@ Editor::idle_visual_changer (
        double const last_time_origin = horizontal_position ();
  
        if (p & VisualChange::ZoomLevel) {
 -              set_frames_per_unit (pending_visual_change.frames_per_unit);
 +              set_frames_per_pixel (pending_visual_change.frames_per_pixel);
  
                compute_fixed_ruler_scale ();
  
  #endif
  
        if (p & VisualChange::TimeOrigin) {
 -              set_horizontal_position (pending_visual_change.time_origin / frames_per_unit);
 +              set_horizontal_position (pending_visual_change.time_origin / frames_per_pixel);
        }
  
        if (p & VisualChange::YOrigin) {
@@@ -4871,17 -4867,17 +4871,17 @@@ Editor::add_routes (RouteList& routes
        for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
                boost::shared_ptr<Route> route = (*x);
  
-               if (route->is_hidden() || route->is_monitor()) {
+               if (route->is_auditioner() || route->is_monitor()) {
                        continue;
                }
  
                DataType dt = route->input()->default_type();
  
                if (dt == ARDOUR::DataType::AUDIO) {
 -                      rtv = new AudioTimeAxisView (*this, _session, *track_canvas);
 +                      rtv = new AudioTimeAxisView (*this, _session, *_track_canvas);
                        rtv->set_route (route);
                } else if (dt == ARDOUR::DataType::MIDI) {
 -                      rtv = new MidiTimeAxisView (*this, _session, *track_canvas);
 +                      rtv = new MidiTimeAxisView (*this, _session, *_track_canvas);
                        rtv->set_route (route);
                } else {
                        throw unknown_type();
@@@ -5184,7 -5180,7 +5184,7 @@@ Editor::scroll_release (
  void
  Editor::reset_x_origin_to_follow_playhead ()
  {
 -      framepos_t const frame = playhead_cursor->current_frame;
 +      framepos_t const frame = playhead_cursor->current_frame ();
  
        if (frame < leftmost_frame || frame > leftmost_frame + current_page_frames()) {
  
@@@ -5295,11 -5291,11 +5295,11 @@@ Editor::super_rapid_screen_update (
                        */
  #if 0
                        // FIXME DO SOMETHING THAT WORKS HERE - this is 2.X code
 -                      double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_unit;
 +                      double target = ((double)frame - (double)current_page_frames()/2.0) / frames_per_pixel;
                        if (target <= 0.0) {
                                target = 0.0;
                        }
 -                      if (fabs(target - current) < current_page_frames() / frames_per_unit) {
 +                      if (fabs(target - current) < current_page_frames() / frames_per_pixel) {
                                target = (target * 0.15) + (current * 0.85);
                        } else {
                                /* relax */
@@@ -5334,7 -5330,7 +5334,7 @@@ Editor::session_going_away (
        last_update_frame = 0;
        _drags->abort ();
  
 -      playhead_cursor->canvas_item.hide ();
 +      playhead_cursor->hide ();
  
        /* rip everything out of the list displays */
  
@@@ -5539,12 -5535,3 +5539,12 @@@ Editor::shift_key_released (
  {
        _stepping_axis_view = 0;
  }
 +
 +
 +void
 +Editor::save_canvas_state ()
 +{
 +      XMLTree* tree = static_cast<ArdourCanvas::Canvas*>(_track_canvas)->get_state ();
 +      string path = string_compose ("%1/canvas-state.xml", _session->path());
 +      tree->write (path);
 +}
index 2d83dbd4e765b3720d0387d35ab842737f9114c1,fa78d6dbf6d0839113d093e8e5c25565317fae41..d9b96066d3a361c86035b464bc4bd62595d705cd
@@@ -57,6 -57,7 +57,6 @@@
  #include "global_signals.h"
  #include "route_time_axis.h"
  #include "automation_time_axis.h"
 -#include "canvas_impl.h"
  #include "enums.h"
  #include "gui_thread.h"
  #include "keyboard.h"
@@@ -67,6 -68,7 +67,6 @@@
  #include "region_view.h"
  #include "rgb_macros.h"
  #include "selection.h"
 -#include "simplerect.h"
  #include "streamview.h"
  #include "utils.h"
  #include "route_group_menu.h"
@@@ -83,7 -85,7 +83,7 @@@ using namespace Editing
  using namespace std;
  using std::list;
  
 -RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, Canvas& canvas)
 +RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, ArdourCanvas::Canvas& canvas)
        : AxisView(sess)
        , RouteUI(sess)
        , TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas)
@@@ -122,7 -124,7 +122,7 @@@ RouteTimeAxisView::set_route (boost::sh
                set_height (preset_height (HeightNormal));
        }
  
-       if (!_route->is_hidden()) {
+       if (!_route->is_auditioner()) {
                if (gui_property ("visible").empty()) {
                        set_gui_property ("visible", true);
                }
  
        } 
  
 -      _editor.ZoomChanged.connect (sigc::mem_fun(*this, &RouteTimeAxisView::reset_samples_per_unit));
 +      _editor.ZoomChanged.connect (sigc::mem_fun(*this, &RouteTimeAxisView::reset_frames_per_pixel));
        _editor.HorizontalPositionChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::horizontal_position_changed));
        ColorsChanged.connect (sigc::mem_fun (*this, &RouteTimeAxisView::color_handler));
  
@@@ -773,9 -775,13 +773,9 @@@ RouteTimeAxisView::show_timestretch (fr
  #endif
  
        if (timestretch_rect == 0) {
 -              timestretch_rect = new SimpleRect (*canvas_display ());
 -              timestretch_rect->property_x1() =  0.0;
 -              timestretch_rect->property_y1() =  0.0;
 -              timestretch_rect->property_x2() =  0.0;
 -              timestretch_rect->property_y2() =  0.0;
 -              timestretch_rect->property_fill_color_rgba() =  ARDOUR_UI::config()->canvasvar_TimeStretchFill.get();
 -              timestretch_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get();
 +              timestretch_rect = new ArdourCanvas::Rectangle (canvas_display ());
 +              timestretch_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_TimeStretchFill.get());
 +              timestretch_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get());
        }
  
        timestretch_rect->show ();
        double const x1 = start / _editor.get_current_zoom();
        double const x2 = (end - 1) / _editor.get_current_zoom();
  
 -      timestretch_rect->property_x1() = x1;
 -      timestretch_rect->property_y1() = current_height() * (layers - layer - 1) / layers;
 -      timestretch_rect->property_x2() = x2;
 -      timestretch_rect->property_y2() = current_height() * (layers - layer) / layers;
 +      timestretch_rect->set (ArdourCanvas::Rect (x1, current_height() * (layers - layer - 1) / layers,
 +                                                 x2, current_height() * (layers - layer) / layers));
  }
  
  void
@@@ -890,9 -898,9 +890,9 @@@ RouteTimeAxisView::route_color_changed 
  }
  
  void
 -RouteTimeAxisView::reset_samples_per_unit ()
 +RouteTimeAxisView::reset_frames_per_pixel ()
  {
 -      set_samples_per_unit (_editor.get_current_zoom());
 +      set_frames_per_pixel (_editor.get_current_zoom());
  }
  
  void
@@@ -904,7 -912,7 +904,7 @@@ RouteTimeAxisView::horizontal_position_
  }
  
  void
 -RouteTimeAxisView::set_samples_per_unit (double spu)
 +RouteTimeAxisView::set_frames_per_pixel (double fpp)
  {
        double speed = 1.0;
  
        }
  
        if (_view) {
 -              _view->set_samples_per_unit (spu * speed);
 +              _view->set_frames_per_pixel (fpp * speed);
        }
  
 -      TimeAxisView::set_samples_per_unit (spu * speed);
 +      TimeAxisView::set_frames_per_pixel (fpp * speed);
  }
  
  void
@@@ -1134,7 -1142,7 +1134,7 @@@ RouteTimeAxisView::clear_playlist (
  void
  RouteTimeAxisView::speed_changed ()
  {
 -      Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteTimeAxisView::reset_samples_per_unit, this));
 +      Gtkmm2ext::UI::instance()->call_slot (invalidator (*this), boost::bind (&RouteTimeAxisView::reset_frames_per_pixel, this));
  }
  
  void
@@@ -1612,11 -1620,11 +1612,11 @@@ RouteTimeAxisView::color_handler (
  {
        //case cTimeStretchOutline:
        if (timestretch_rect) {
 -              timestretch_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get();
 +              timestretch_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_TimeStretchOutline.get());
        }
        //case cTimeStretchFill:
        if (timestretch_rect) {
 -              timestretch_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeStretchFill.get();
 +              timestretch_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_TimeStretchFill.get());
        }
  
        reset_meter();
index 208ba4af136ce7e5c33057a05a9e982743b8e337,97aa662c38549779db1a67b9c38880c81a0469c8..9a9619c826e1d40bedd1cc44902a73ec18141e29
@@@ -17,9 -17,8 +17,9 @@@
  
  */
  
 -#include <libgnomecanvasmm/canvas.h>
 -#include <libgnomecanvasmm/group.h>
 +#include "canvas/line.h"
 +#include "canvas/canvas.h"
 +#include "canvas/debug.h"
  #include "tempo_lines.h"
  #include "ardour_ui.h"
  
@@@ -27,8 -26,8 +27,8 @@@ using namespace std
  
  #define MAX_CACHED_LINES 128
  
 -TempoLines::TempoLines(ArdourCanvas::Canvas& canvas, ArdourCanvas::Group* group, double screen_height)
 -      : _canvas(canvas)
 +TempoLines::TempoLines (ArdourCanvas::GtkCanvasViewport& canvas_viewport, ArdourCanvas::Group* group, double screen_height)
 +      : _canvas_viewport (canvas_viewport)
        , _group(group)
        , _clean_left(DBL_MAX)
        , _clean_right(0.0)
@@@ -47,9 -46,9 +47,9 @@@ TempoLines::tempo_map_changed(
        for (Lines::iterator i = _lines.begin(); i != _lines.end(); d += 1.0) {
                Lines::iterator next = i;
                ++next;
 -              i->second->property_x1() = - d;
 -              i->second->property_x2() = - d;
 -              ArdourCanvas::SimpleLine* f = i->second;
 +              i->second->set_x0 (-d);
 +              i->second->set_x1 (-d);
 +              ArdourCanvas::Line* f = i->second;
                _lines.erase(i);
                _lines.insert(make_pair(- d, f));
                i = next;
@@@ -75,12 -74,13 +75,12 @@@ TempoLines::hide (
  void
  TempoLines::draw (const ARDOUR::TempoMap::BBTPointList::const_iterator& begin, 
                  const ARDOUR::TempoMap::BBTPointList::const_iterator& end, 
 -                double frames_per_unit)
 +                double frames_per_pixel)
  {
        ARDOUR::TempoMap::BBTPointList::const_iterator i;
 -      ArdourCanvas::SimpleLine *line = NULL;
 +      ArdourCanvas::Line *line = 0;
        gdouble xpos;
 -      double who_cares;
 -      double x1, x2, y1, beat_density;
 +      double  beat_density;
  
        uint32_t beats = 0;
        uint32_t bars = 0;
@@@ -88,7 -88,7 +88,7 @@@
  
        const size_t needed = distance (begin, end);
  
 -      _canvas.get_scroll_region (x1, y1, x2, who_cares);
 +      ArdourCanvas::Rect const visible = _canvas_viewport.visible_area ();
  
        /* get the first bar spacing */
  
@@@ -97,7 -97,7 +97,7 @@@
        bars = (*i).bar - (*begin).bar;
        beats = distance (begin, end) - bars;
  
 -      beat_density = (beats * 10.0f) / _canvas.get_width ();
 +      beat_density = (beats * 10.0f) / visible.width ();
  
        if (beat_density > 4.0f) {
                /* if the lines are too close together, they become useless */
                return;
        }
  
 -      xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_unit);
 +      xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_pixel);
        const double needed_right = xpos;
  
        i = begin;
  
 -      xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_unit);
 +      xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_pixel);
        const double needed_left = xpos;
  
        Lines::iterator left = _lines.lower_bound(xpos); // first line >= xpos
  
        //cout << endl << "*** LINE CACHE MISS" << endl;
  
-       bool inserted_last_time = true;
        bool invalidated = false;
  
        for (i = begin; i != end; ++i) {
                        color = ARDOUR_UI::config()->canvasvar_MeasureLineBeat.get();
                }
  
 -              xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_unit);
 +              xpos = rint(((framepos_t)(*i).frame) / (double)frames_per_pixel);
  
                li = _lines.lower_bound(xpos); // first line >= xpos
  
 -              line = (li != _lines.end()) ? li->second : NULL;
 -              assert(!line || line->property_x1() == li->first);
 +              line = (li != _lines.end()) ? li->second : 0;
 +              assert(!line || line->x0() == li->first);
                
                Lines::iterator next = li;
                if (next != _lines.end())
                exhausted = (next == _lines.end());
  
                // Hooray, line is perfect
 -              if (line && line->property_x1() == xpos) {
 +              if (line && line->x0() == xpos) {
                        if (li != _lines.end())
                                ++li;
                        
 -                      line->property_color_rgba() = color;
 +                      line->set_outline_color (color);
-                       inserted_last_time = false; // don't search next time
++
                        // Use existing line, moving if necessary
                } else if (!exhausted) {
                        Lines::iterator steal = _lines.end();
                                double const x = steal->first;
                                line = steal->second;
                                _lines.erase(steal);
 -                              line->property_x1() = xpos;
 -                              line->property_x2() = xpos;
 -                              line->property_color_rgba() = color;
 +                              line->set_x0 (xpos);
 +                              line->set_x1 (xpos);
 +                              line->set_outline_color (color);
                                _lines.insert(make_pair(xpos, line));
-                               inserted_last_time = true; // search next time
                                invalidated = true;
                                
                                // Shift clean range left
                                if (existing != _lines.end()) {
                                        //cout << "*** EXISTING LINE" << endl;
                                        li = existing;
 -                                      li->second->property_color_rgba() = color;
 +                                      li->second->set_outline_color (color);
-                                       inserted_last_time = false; // don't search next time
                                } else {
                                        //cout << "*** MOVING LINE" << endl;
 -                                      const double x1 = line->property_x1();
 +                                      const double x1 = line->x0();
                                        const bool was_clean = x1 >= _clean_left && x1 <= _clean_right;
                                        invalidated = invalidated || was_clean;
                                        // Invalidate clean portion (XXX: too harsh?)
                                        _clean_left  = needed_left;
                                        _clean_right = needed_right;
                                        _lines.erase(li);
 -                                      line->property_color_rgba() = color;
 -                                      line->property_x1() = xpos;
 -                                      line->property_x2() = xpos;
 +                                      line->set_outline_color (color);
 +                                      line->set_x0 (xpos);
 +                                      line->set_x1 (xpos);
                                        _lines.insert(make_pair(xpos, line));
-                                       inserted_last_time = true; // search next time
                                }
                        }
                        
                        //cout << "*** CREATING LINE" << endl;
                        /* if we already have a line there ... don't sweat it */
                        if (_lines.find (xpos) == _lines.end()) {
 -                              line = new ArdourCanvas::SimpleLine (*_group);
 -                              line->property_x1() = xpos;
 -                              line->property_x2() = xpos;
 -                              line->property_y1() = 0.0;
 -                              line->property_y2() = _height;
 -                              line->property_color_rgba() = color;
 +                              line = new ArdourCanvas::Line (_group);
 +                              line->set_x0 (xpos);
 +                              line->set_x1 (xpos);
 +                              line->set_y0 (0.0);
 +                              line->set_y1 (_height);
 +                              line->set_outline_color (color);
                                _lines.insert(make_pair(xpos, line));
-                               inserted_last_time = true;
                        }
                        
                        // Steal from the left
                                double const x = steal->first;
                                line = steal->second;
                                _lines.erase(steal);
 -                              line->property_color_rgba() = color;
 -                              line->property_x1() = xpos;
 -                              line->property_x2() = xpos;
 +                              line->set_outline_color (color);
 +                              line->set_x0 (xpos);
 +                              line->set_x1 (xpos);
                                _lines.insert(make_pair(xpos, line));
-                               inserted_last_time = true; // search next time
                                invalidated = true;
                        
                                // Shift clean range right
diff --combined libs/ardour/wscript
index b575dfd53f6a73727f47a9d6374d5635d716f78c,782cb7be1c90905371d792cbdbbeb9c921c946df..c9c5089d46ccde1c91834e9979680043a4f39d5b
@@@ -379,7 -379,7 +379,7 @@@ def build(bld)
  
      obj.export_includes = ['.']
      obj.includes     = ['.', '../surfaces/control_protocol', '..']
 -    obj.name         = 'ardour'
 +    obj.name         = 'libardour'
      obj.target       = 'ardour'
      obj.uselib       = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
                          'JACK','SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
  # Tests that don't work
  #                test/mantis_3356_test.cc
  
-         testobj.includes     = obj.includes + ['test', '../pbd']
+         testobj.includes     = obj.includes + ['test', '../pbd', '../libltc', '../audiographer']
          testobj.uselib       = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
                                  'SAMPLERATE','XML','LRDF','COREAUDIO']
-         testobj.use          = ['libpbd','libmidipp','libardour']
+         testobj.use          = ['libpbd','libmidipp','ardour','libltc','libaudiographer']
          testobj.name         = 'libardour-tests'
          testobj.target       = 'run-tests'
          testobj.install_path = ''
          session_load_tester.includes.append ('test')
          session_load_tester.uselib    = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
                               'SAMPLERATE','XML','LRDF','COREAUDIO']
-         session_load_tester.use       = ['libpbd','libmidipp','libardour']
+         session_load_tester.use       = ['libpbd','libmidipp','ardour']
          session_load_tester.name      = 'libardour-session-load-tester'
          session_load_tester.target    = 'load-session'
          session_load_tester.install_path = ''
              profilingobj.includes.append ('test')
              profilingobj.uselib    = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
                               'SAMPLERATE','XML','LRDF','COREAUDIO']
-             profilingobj.use       = ['libpbd','libmidipp','libardour']
+             profilingobj.use       = ['libpbd','libmidipp','ardour']
              profilingobj.name      = 'libardour-profiling'
              profilingobj.target    = p
              profilingobj.install_path = ''
diff --combined wscript
index a8c2bb753c6afec85a3e49c71afe74ae7cedc035,c0d518cbe6f83cdfde04e74369b2f8b7e1b20ffe..f49ce3a11fd435318474e3bc7ed4df6b57e05376
+++ b/wscript
@@@ -41,9 -41,7 +41,8 @@@ children = 
          'libs/gtkmm2ext',
          'libs/clearlooks-newer',
          'libs/audiographer',
 +        'libs/canvas',
          'gtk2_ardour',
-         'templates',
          'export',
          'midi_maps',
          'mcp',
@@@ -371,8 -369,6 +370,8 @@@ def set_compiler_flags (conf,opt)
  
      conf.env.append_value('CXXFLAGS', '-D__STDC_LIMIT_MACROS')
      conf.env.append_value('CXXFLAGS', '-D__STDC_FORMAT_MACROS')
 +    conf.env.append_value('CXXFLAGS', '-DCANVAS_COMPATIBILITY')
 +    conf.env.append_value('CXXFLAGS', '-DCANVAS_DEBUG')
  
      if opt.nls:
          conf.env.append_value('CXXFLAGS', '-DENABLE_NLS')
@@@ -610,6 -606,7 +609,7 @@@ def configure(conf)
      autowaf.check_pkg(conf, 'sndfile', uselib_store='SNDFILE', atleast_version='1.0.18')
      autowaf.check_pkg(conf, 'giomm-2.4', uselib_store='GIOMM', atleast_version='2.2')
      autowaf.check_pkg(conf, 'libcurl', uselib_store='CURL', atleast_version='7.0.0')
+     autowaf.check_pkg(conf, 'liblo', uselib_store='LO', atleast_version='0.26')
  
      conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')