Fix mismatched types (warnings).
[ardour.git] / gtk2_ardour / editor.cc
index 6c276f3b0c96591c1a219afd87400e608439451c..fb62ad8d70409945ac8f2cfbebfc6359b79ce9ae 100644 (file)
@@ -85,6 +85,7 @@
 #include "simpleline.h"
 #include "rhythm_ferret.h"
 #include "actions.h"
+#include "tempo_lines.h"
 
 #ifdef FFT_ANALYSIS
 #include "analysis_window.h"
@@ -195,6 +196,15 @@ show_me_the_size (Requisition* r, const char* what)
        cerr << "size of " << what << " = " << r->width << " x " << r->height << endl;
 }
 
+void
+DragInfo::clear_copied_locations ()
+{
+       for (list<Location*>::iterator i = copied_locations.begin(); i != copied_locations.end(); ++i) {
+               delete *i;
+       }
+       copied_locations.clear ();
+}
+
 Editor::Editor ()
        : 
          /* time display buttons */
@@ -228,6 +238,9 @@ Editor::Editor ()
          automation_mode_button (_("mode")),
          global_automation_button (_("automation")),
 
+         midi_panic_button (_("Panic")),
+         midi_tools_tearoff (0),
+
 #ifdef WITH_CMT
          image_socket_listener(0),
 #endif
@@ -263,9 +276,9 @@ Editor::Editor ()
        clicked_control_point = 0;
        last_update_frame = 0;
        drag_info.item = 0;
-       drag_info.copied_location = 0;
        current_mixer_strip = 0;
        current_bbt_points = 0;
+       tempo_lines = 0;
        
        snap_type_strings =  I18N (_snap_type_strings);
        snap_mode_strings =  I18N (_snap_mode_strings);
@@ -295,8 +308,6 @@ Editor::Editor ()
        _show_waveforms = true;
        _show_waveforms_recording = true;
        first_action_message = 0;
-       export_dialog = 0;
-       export_range_markers_dialog = 0;
        show_gain_after_trim = false;
        ignore_route_list_reorder = false;
        no_route_list_redisplay = false;
@@ -341,7 +352,6 @@ Editor::Editor ()
        last_canvas_frame = 0;
        playhead_cursor = 0;
        button_release_can_deselect = true;
-       canvas_idle_queued = false;
        _dragging_playhead = false;
        _dragging_edit_point = false;
        _dragging_hscrollbar = false;
@@ -370,7 +380,6 @@ Editor::Editor ()
 
        range_marker_drag_rect = 0;
        marker_drag_line = 0;
-       tempo_map_change_idle_handler_id = -1;
        set_midi_edit_mode (MidiEditPencil, true);
        set_mouse_mode (MouseObject, true);
 
@@ -396,7 +405,7 @@ Editor::Editor ()
        
        controls_layout.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
        controls_layout.signal_button_release_event().connect (mem_fun(*this, &Editor::edit_controls_button_release));
-       controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
+       controls_layout_size_request_connection = controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
 
        edit_vscrollbar.set_adjustment (vertical_adjustment);
        edit_hscrollbar.set_adjustment (horizontal_adjustment);
@@ -502,10 +511,28 @@ Editor::Editor ()
        edit_packer.set_homogeneous (false);
        edit_packer.set_border_width (0);
        edit_packer.set_name ("EditorWindow");
+
+#ifndef THE_OLD_WAY
+
+       edit_packer.attach (ruler_label_event_box,   0, 1, 0, 1,    FILL,        SHRINK, 0, 0);
+
+       edit_packer.attach (time_button_event_box,   0, 1, 1, 2,    FILL,        SHRINK, 0, 0);
+       edit_packer.attach (time_canvas_event_box,   1, 2, 0, 1,    FILL|EXPAND, FILL, 0, 0);
+
+       edit_packer.attach (controls_layout,         0, 1, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
+       edit_packer.attach (track_canvas_event_box,  1, 2, 1, 3,    FILL|EXPAND, FILL|EXPAND, 0, 0);
+
+       edit_packer.attach (zoom_box,                0, 1, 3, 4,    FILL,         FILL, 0, 0);
+       edit_packer.attach (edit_hscrollbar,         1, 2, 3, 4,    FILL|EXPAND,  FILL, 0, 0);
+
+       edit_packer.attach (edit_vscrollbar,         3, 4, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
+
+#else
        
        edit_packer.attach (edit_vscrollbar,         0, 1, 0, 4,    FILL,        FILL|EXPAND, 0, 0);
-       edit_packer.attach (ruler_label_event_box,       1, 2, 0, 1,    FILL,        SHRINK, 0, 0);
-       edit_packer.attach (time_button_event_box,       1, 2, 1, 2,    FILL,        SHRINK, 0, 0);
+
+       edit_packer.attach (ruler_label_event_box,   1, 2, 0, 1,    FILL,        SHRINK, 0, 0);
+       edit_packer.attach (time_button_event_box,   1, 2, 1, 2,    FILL,        SHRINK, 0, 0);
        edit_packer.attach (time_canvas_event_box,   2, 3, 0, 1,    FILL|EXPAND, FILL, 0, 0);
 
        edit_packer.attach (controls_layout,         1, 2, 2, 3,    FILL,        FILL|EXPAND, 0, 0);
@@ -513,6 +540,7 @@ Editor::Editor ()
 
        edit_packer.attach (zoom_box,                1, 2, 3, 4,    FILL,         FILL, 0, 0);
        edit_packer.attach (edit_hscrollbar,         2, 3, 3, 4,    FILL|EXPAND,  FILL, 0, 0);
+#endif
 
        bottom_hbox.set_border_width (2);
        bottom_hbox.set_spacing (3);
@@ -624,8 +652,21 @@ Editor::Editor ()
 
        region_list_display.set_model (region_list_model);
        region_list_display.append_column (_("Regions"), region_list_columns.name);
-       region_list_display.set_headers_visible (false);
-
+       region_list_display.append_column (_("Start"), region_list_columns.start);
+       region_list_display.append_column (_("End"), region_list_columns.end);
+       region_list_display.append_column (_("Length"), region_list_columns.length);
+       region_list_display.append_column (_("Sync"), region_list_columns.sync);
+       region_list_display.append_column (_("Fade In"), region_list_columns.fadein);
+       region_list_display.append_column (_("Fade Out"), region_list_columns.fadeout);
+       region_list_display.append_column (_("L"), region_list_columns.locked);
+       region_list_display.append_column (_("G"), region_list_columns.glued);
+       region_list_display.append_column (_("M"), region_list_columns.muted);
+       region_list_display.append_column (_("O"), region_list_columns.opaque);
+       region_list_display.append_column (_("Used"), region_list_columns.used);
+       region_list_display.append_column (_("Path"), region_list_columns.path);
+       region_list_display.set_headers_visible (true);
+       region_list_display.set_grid_lines (TREE_VIEW_GRID_LINES_BOTH);
+       
        CellRendererText* region_name_cell = dynamic_cast<CellRendererText*>(region_list_display.get_column_cell_renderer (0));
        region_name_cell->property_editable() = true;
        region_name_cell->signal_edited().connect (mem_fun (*this, &Editor::region_name_edit));
@@ -639,7 +680,7 @@ Editor::Editor ()
        
        region_list_display.get_selection()->set_mode (SELECTION_MULTIPLE);
        region_list_display.add_object_drag (region_list_columns.region.index(), "regions");
-
+       
        /* setup DnD handling */
        
        list<TargetEntry> region_list_target_table;
@@ -652,8 +693,8 @@ Editor::Editor ()
        region_list_display.signal_drag_data_received().connect (mem_fun(*this, &Editor::region_list_display_drag_data_received));
 
        region_list_scroller.add (region_list_display);
-       region_list_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
-
+       region_list_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
+       
        region_list_display.signal_key_press_event().connect (mem_fun(*this, &Editor::region_list_display_key_press));
        region_list_display.signal_key_release_event().connect (mem_fun(*this, &Editor::region_list_display_key_release));
        region_list_display.signal_button_press_event().connect (mem_fun(*this, &Editor::region_list_display_button_press), false);
@@ -661,6 +702,10 @@ Editor::Editor ()
        region_list_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::region_list_selection_changed));
        // region_list_display.signal_popup_menu().connect (bind (mem_fun (*this, &Editor::show_region_list_display_context_menu), 1, 0));
        
+       //ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (mem_fun(*this, &Editor::redisplay_regions));
+       ARDOUR_UI::instance()->secondary_clock.mode_changed.connect (mem_fun(*this, &Editor::update_all_region_rows));
+       ARDOUR::Region::RegionPropertyChanged.connect (mem_fun(*this, &Editor::update_region_row));
+       
        named_selection_scroller.add (named_selection_display);
        named_selection_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
 
@@ -717,6 +762,7 @@ Editor::Editor ()
        the_notebook.set_scrollable (true);
        the_notebook.popup_enable ();
        the_notebook.set_tab_pos (Gtk::POS_RIGHT);
+       the_notebook.show_all ();
 
        post_maximal_editor_width = 0;
        post_maximal_pane_position = 0;
@@ -826,8 +872,7 @@ Editor::Editor ()
 Editor::~Editor()
 {
 #ifdef WITH_CMT
-       if(image_socket_listener)
-       {
+       if(image_socket_listener) {
                if(image_socket_listener->is_connected())
                {
                        image_socket_listener->close_connection() ;
@@ -842,11 +887,6 @@ Editor::~Editor()
                delete track_canvas;
                track_canvas = 0;
        }
-
-       if (track_canvas) {
-               delete track_canvas;
-               track_canvas = 0;
-       }
 }
 
 void
@@ -1239,6 +1279,8 @@ Editor::connect_to_session (Session *t)
        nudge_clock.set_session (session);
        nudge_clock.set (session->frame_rate() * 5); // default of 5 seconds
 
+       playhead_cursor->canvas_item.show ();
+
        if (rhythm_ferret) {
                rhythm_ferret->set_session (session);
        }
@@ -1890,62 +1932,57 @@ Editor::add_region_context_items (StreamView* sv, boost::shared_ptr<Region> regi
        items.push_back (SeparatorElem());
 
        sigc::connection fooc;
+       boost::shared_ptr<Region> region_to_check;
 
        if (region) {
-               items.push_back (CheckMenuElem (_("Lock")));
-               CheckMenuItem* region_lock_item = static_cast<CheckMenuItem*>(&items.back());
-               if (region->locked()) {
-                       region_lock_item->set_active();
-               }
-               region_lock_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_lock));
-
-               items.push_back (CheckMenuElem (_("Glue to Bars&Beats")));
-               CheckMenuItem* bbt_glue_item = static_cast<CheckMenuItem*>(&items.back());
-
-               switch (region->positional_lock_style()) {
-               case Region::MusicTime:
-                       bbt_glue_item->set_active (true);
-                       break;
-               default:
-                       bbt_glue_item->set_active (false);
-                       break;
-               }
-
-               bbt_glue_item->signal_activate().connect (bind (mem_fun (*this, &Editor::set_region_lock_style), Region::MusicTime));
+               region_to_check = region;
+       } else {
+               region_to_check = selection->regions.front()->region();
+       }
 
-               items.push_back (CheckMenuElem (_("Mute")));
-               CheckMenuItem* region_mute_item = static_cast<CheckMenuItem*>(&items.back());
-               fooc = region_mute_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_mute));
-               if (region->muted()) {
-                       fooc.block (true);
-                       region_mute_item->set_active();
-                       fooc.block (false);
-               }
+       items.push_back (CheckMenuElem (_("Lock")));
+       CheckMenuItem* region_lock_item = static_cast<CheckMenuItem*>(&items.back());
+       if (region_to_check->locked()) {
+               region_lock_item->set_active();
+       }
+       region_lock_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_lock));
        
-               if (!Profile->get_sae()) {
-                       items.push_back (CheckMenuElem (_("Opaque")));
-                       CheckMenuItem* region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
-                       fooc = region_opaque_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_opaque));
-                       if (region->opaque()) {
-                               fooc.block (true);
-                               region_opaque_item->set_active();
-                               fooc.block (false);
-                       }
-               }
-       } else {
-               // multiple regions selected
-               // how should these act? 
-               // here they toggle the property of all selected regions
+       items.push_back (CheckMenuElem (_("Glue to Bars&Beats")));
+       CheckMenuItem* bbt_glue_item = static_cast<CheckMenuItem*>(&items.back());
        
-               items.push_back (MenuElem (_("Lock"), mem_fun(*this, &Editor::toggle_region_lock)));
-               items.push_back (MenuElem (_("Mute"), mem_fun(*this, &Editor::toggle_region_mute)));
-               if (!Profile->get_sae()) {
-                       items.push_back (MenuElem (_("Opaque"), mem_fun(*this, &Editor::toggle_region_opaque)));
+       switch (region_to_check->positional_lock_style()) {
+       case Region::MusicTime:
+               bbt_glue_item->set_active (true);
+               break;
+       default:
+               bbt_glue_item->set_active (false);
+               break;
+       }
+       
+       bbt_glue_item->signal_activate().connect (bind (mem_fun (*this, &Editor::set_region_lock_style), Region::MusicTime));
+       
+       items.push_back (CheckMenuElem (_("Mute")));
+       CheckMenuItem* region_mute_item = static_cast<CheckMenuItem*>(&items.back());
+       fooc = region_mute_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_mute));
+       if (region_to_check->muted()) {
+               fooc.block (true);
+               region_mute_item->set_active();
+               fooc.block (false);
+       }
+       
+       if (!Profile->get_sae()) {
+               items.push_back (CheckMenuElem (_("Opaque")));
+               CheckMenuItem* region_opaque_item = static_cast<CheckMenuItem*>(&items.back());
+               fooc = region_opaque_item->signal_activate().connect (mem_fun(*this, &Editor::toggle_region_opaque));
+               if (region_to_check->opaque()) {
+                       fooc.block (true);
+                       region_opaque_item->set_active();
+                       fooc.block (false);
                }
        }
-
+       
        items.push_back (CheckMenuElem (_("Original position"), mem_fun(*this, &Editor::naturalize)));
-       if (region && region->at_natural_position()) {
+       if (region_to_check->at_natural_position()) {
                items.back().set_sensitive (false);
        }
        
@@ -2103,7 +2140,7 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
        items.push_back (SeparatorElem());
        items.push_back (MenuElem (_("Consolidate range"), bind (mem_fun(*this, &Editor::bounce_range_selection), true)));
        items.push_back (MenuElem (_("Bounce range to region list"), bind (mem_fun(*this, &Editor::bounce_range_selection), false)));
-       items.push_back (MenuElem (_("Export range"), mem_fun(*this, &Editor::export_selection)));
+       items.push_back (MenuElem (_("Export range"), mem_fun(*this, &Editor::export_range)));
 }
 
        
@@ -2343,7 +2380,7 @@ Editor::set_edit_point_preference (EditPoint ep, bool force)
                break;
        }
 
-       const char* action;
+       const char* action=NULL;
 
        switch (_edit_point) {
        case EditAtPlayhead:
@@ -2397,12 +2434,12 @@ Editor::set_state (const XMLNode& node)
 
        } else {
 
-               g.base_width = atoi(geometry->property("x_size")->value());
-               g.base_height = atoi(geometry->property("y_size")->value());
-               x = atoi(geometry->property("x_pos")->value());
-               y = atoi(geometry->property("y_pos")->value());
-               xoff = atoi(geometry->property("x_off")->value());
-               yoff = atoi(geometry->property("y_off")->value());
+               g.base_width = atoi(geometry->property("x-size")->value());
+               g.base_height = atoi(geometry->property("y-size")->value());
+               x = atoi(geometry->property("x-pos")->value());
+               y = atoi(geometry->property("y-pos")->value());
+               xoff = atoi(geometry->property("x-off")->value());
+               yoff = atoi(geometry->property("y-off")->value());
        }
 
        set_default_size (g.base_width, g.base_height);
@@ -2570,17 +2607,17 @@ Editor::get_state ()
                XMLNode* geometry = new XMLNode ("geometry");
 
                snprintf(buf, sizeof(buf), "%d", width);
-               geometry->add_property("x_size", string(buf));
+               geometry->add_property("x-size", string(buf));
                snprintf(buf, sizeof(buf), "%d", height);
-               geometry->add_property("y_size", string(buf));
+               geometry->add_property("y-size", string(buf));
                snprintf(buf, sizeof(buf), "%d", x);
-               geometry->add_property("x_pos", string(buf));
+               geometry->add_property("x-pos", string(buf));
                snprintf(buf, sizeof(buf), "%d", y);
-               geometry->add_property("y_pos", string(buf));
+               geometry->add_property("y-pos", string(buf));
                snprintf(buf, sizeof(buf), "%d", xoff);
-               geometry->add_property("x_off", string(buf));
+               geometry->add_property("x-off", string(buf));
                snprintf(buf, sizeof(buf), "%d", yoff);
-               geometry->add_property("y_off", string(buf));
+               geometry->add_property("y-off", string(buf));
                snprintf(buf,sizeof(buf), "%d",gtk_paned_get_position (static_cast<Paned*>(&edit_pane)->gobj()));
                geometry->add_property("edit_pane_pos", string(buf));
 
@@ -3136,6 +3173,15 @@ Editor::setup_toolbar ()
        toolbar_frame.add (toolbar_base);
 }
 
+void
+Editor::midi_panic_toggle ()
+{
+       if (session) {
+               session->midi_panic();
+               midi_panic_button.set_active (false);
+               midi_panic_button.set_state (STATE_NORMAL);
+       }
+}
 
 void
 Editor::setup_midi_toolbar ()
@@ -3194,6 +3240,14 @@ Editor::setup_midi_toolbar ()
                                &Editor::midi_edit_mode_toggled), Editing::MidiEditResize));
        midi_tool_erase_button.signal_toggled().connect (bind (mem_fun(*this,
                                &Editor::midi_edit_mode_toggled), Editing::MidiEditErase));
+
+       /* Panic */
+       
+       VBox* panic_box = manage (new VBox);
+       midi_panic_button.set_name("MidiPanicButton");
+       midi_panic_button.signal_pressed().connect (
+                       mem_fun(this, &Editor::midi_panic_toggle));
+       panic_box->pack_start (midi_panic_button, true, true);
        
        /* Pack everything in... */
 
@@ -3215,6 +3269,8 @@ Editor::setup_midi_toolbar ()
        midi_toolbar_hbox.set_border_width (1);
 
        midi_toolbar_hbox.pack_start (*midi_tools_tearoff, false, true);
+       
+       midi_toolbar_hbox.pack_start(*panic_box, false, true, 4);
 
        midi_tool_button_box.show_all ();
        midi_toolbar_hbox.show_all();
@@ -3864,8 +3920,8 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
                width = default_width;
                height = default_height;
        } else {
-               width = atoi(geometry->property("x_size")->value());
-               height = atoi(geometry->property("y_size")->value());
+               width = atoi(geometry->property("x-size")->value());
+               height = atoi(geometry->property("y-size")->value());
        }
 
        if (which == static_cast<Paned*> (&edit_pane)) {
@@ -3874,14 +3930,14 @@ Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
                        return;
                }
 
-               if (!geometry || (prop = geometry->property ("edit_pane_pos")) == 0) {
+               if (!geometry || (prop = geometry->property ("edit-pane-pos")) == 0) {
                        /* initial allocation is 90% to canvas, 10% to notebook */
                        pos = (int) floor (alloc.get_width() * 0.90f);
                        snprintf (buf, sizeof(buf), "%d", pos);
                } else {
                        pos = atoi (prop->value());
                }
-               
+
                if ((done = GTK_WIDGET(edit_pane.gobj())->allocation.width > pos)) {
                        edit_pane.set_position (pos);
                        pre_maximal_pane_position = pos;
@@ -3913,6 +3969,8 @@ Editor::set_show_measures (bool yn)
                hide_measures ();
 
                if ((_show_measures = yn) == true) {
+                       if (tempo_lines)
+                               tempo_lines->show();
                        draw_measures ();
                }
                instant_save ();
@@ -4276,8 +4334,6 @@ Editor::session_state_saved (string snap_name)
 void
 Editor::maximise_editing_space ()
 {
-       initial_ruler_update_required = true;
-
        mouse_mode_tearoff->set_visible (false);
        tools_tearoff->set_visible (false);
 
@@ -4301,9 +4357,8 @@ Editor::maximise_editing_space ()
 void
 Editor::restore_editing_space ()
 {
-       initial_ruler_update_required = true;
-
        // user changed width of pane during fullscreen
+
        if(post_maximal_pane_position != edit_pane.get_position()) {
                post_maximal_pane_position = edit_pane.get_position();
        }
@@ -4314,10 +4369,7 @@ Editor::restore_editing_space ()
        tools_tearoff->set_visible (true);
        post_maximal_editor_width = this->get_width();
 
-
-       edit_pane.set_position (
-               pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width)
-       );
+       edit_pane.set_position (pre_maximal_pane_position + abs(this->get_width() - pre_maximal_editor_width));
 }
 
 /**
@@ -4330,7 +4382,9 @@ void
 Editor::new_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("new playlists"));
-       mapover_tracks (mem_fun (*this, &Editor::mapped_use_new_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_new_playlist), playlists), v );
        commit_reversible_command ();
 }
 
@@ -4344,7 +4398,9 @@ void
 Editor::copy_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("copy playlists"));
-       mapover_tracks (mem_fun (*this, &Editor::mapped_use_copy_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_tracks ( bind(mem_fun (*this, &Editor::mapped_use_copy_playlist), playlists), v );
        commit_reversible_command ();
 }
 
@@ -4358,20 +4414,22 @@ void
 Editor::clear_playlists (TimeAxisView* v)
 {
        begin_reversible_command (_("clear playlists"));
-       mapover_tracks (mem_fun (*this, &Editor::mapped_clear_playlist), v);
+       vector<boost::shared_ptr<ARDOUR::Playlist> > playlists;
+       session->get_playlists(playlists);
+       mapover_tracks ( mem_fun (*this, &Editor::mapped_clear_playlist), v );
        commit_reversible_command ();
 }
 
 void 
-Editor::mapped_use_new_playlist (RouteTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_new_playlist (RouteTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
 {
-       atv.use_new_playlist (sz > 1 ? false : true);
+       atv.use_new_playlist (sz > 1 ? false : true, playlists);
 }
 
 void
-Editor::mapped_use_copy_playlist (RouteTimeAxisView& atv, uint32_t sz)
+Editor::mapped_use_copy_playlist (RouteTimeAxisView& atv, uint32_t sz, vector<boost::shared_ptr<ARDOUR::Playlist> > const & playlists)
 {
-       atv.use_copy_playlist (sz > 1 ? false : true);
+       atv.use_copy_playlist (sz > 1 ? false : true, playlists);
 }
 
 void 
@@ -4523,6 +4581,9 @@ Editor::set_frames_per_unit (double fpu)
        if (max_frames / fpu < 800.0) {
                return;
        }
+       
+       if (tempo_lines)
+               tempo_lines->tempo_map_changed();
 
        frames_per_unit = fpu;
        post_zoom ();
@@ -4610,7 +4671,7 @@ Editor::idle_visual_changer ()
        }
        if (p & VisualChange::TimeOrigin) {
 
-               nframes64_t csf, cef;
+               nframes64_t csf=0, cef=0;
                nframes64_t current_time_origin = (nframes64_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
 
                if (session) {
@@ -4621,10 +4682,8 @@ Editor::idle_visual_changer ()
                /* if we seek beyond the current end of the canvas, move the end */
 
                if (current_time_origin != pending_visual_change.time_origin) {
-                       //if (horizontal_adjustment.get_upper() < pending_visual_change.time_origin) {
                        last_canvas_frame = (cef > (pending_visual_change.time_origin + current_page_frames())) ? cef : pending_visual_change.time_origin + current_page_frames();
                        horizontal_adjustment.set_upper ((cef - csf) / frames_per_unit);
-                       //}
                        horizontal_adjustment.set_value (pending_visual_change.time_origin / frames_per_unit);
                } else {
                        update_fixed_rulers();