diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 5ce4cf9736..ab5dbc6bab 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -1,26 +1,4 @@ - - - - - - - - - - - - - - - - - - -#ifdef GTKOSX - -#endif - @@ -135,13 +113,11 @@ - - - + @@ -188,11 +164,11 @@ - + @@ -357,6 +333,7 @@ + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index cde9d0d9ee..3948b5cc8c 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -221,6 +221,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) splash = 0; + _numpad_locate_happening = false; + if (theArdourUI == 0) { theArdourUI = this; } @@ -490,8 +492,6 @@ ARDOUR_UI::post_engine () _tooltips.enable(); - ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file); - if (setup_windows ()) { throw failed_constructor (); } @@ -1909,7 +1909,7 @@ ARDOUR_UI::transport_roll () } } - } else if (_session->get_play_range () && !Config->get_always_play_range()) { + } else if (_session->get_play_range () ) { /* stop playing a range if we currently are */ _session->request_play_range (0, true); } @@ -1976,10 +1976,10 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if ( Config->get_always_play_range() ) { + if ( Config->get_follow_edits() && ( editor->get_selection().time.front().start == _session->transport_frame() ) ) { //if playhead is exactly at the start of a range, we can assume it was placed there by follow_edits _session->request_play_range (&editor->get_selection().time, true); + _session->set_requested_return_frame( editor->get_selection().time.front().start ); //force an auto-return here } - _session->request_transport_speed (1.0f); } } @@ -2153,7 +2153,7 @@ ARDOUR_UI::map_transport_state () auto_loop_button.set_active (false); } - if (Config->get_always_play_range()) { + if (Config->get_follow_edits()) { /* light up both roll and play-selection if they are joined */ roll_button.set_active (true); play_selection_button.set_active (true); @@ -4411,3 +4411,47 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate) } +gint +ARDOUR_UI::transport_numpad_timeout () +{ + _numpad_locate_happening = false; + if (_numpad_timeout_connection.connected() ) + _numpad_timeout_connection.disconnect(); + return 1; +} + +void +ARDOUR_UI::transport_numpad_decimal () +{ + _numpad_timeout_connection.disconnect(); + + if (_numpad_locate_happening) { + if (editor) editor->goto_nth_marker(_pending_locate_num - 1); + _numpad_locate_happening = false; + } else { + _pending_locate_num = 0; + _numpad_locate_happening = true; + _numpad_timeout_connection = Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::transport_numpad_timeout), 2*1000); + } +} + +void +ARDOUR_UI::transport_numpad_event (int num) +{ + if ( _numpad_locate_happening ) { + _pending_locate_num = _pending_locate_num*10 + num; + } else { + switch (num) { + case 0: toggle_roll(false, false); break; + case 1: transport_rewind(1); break; + case 2: transport_forward(1); break; + case 3: transport_record(true); break; + case 4: if (_session) _session->request_play_loop(true); break; + case 5: if (_session) _session->request_play_loop(true); transport_record(false); break; + case 6: toggle_punch(); break; + case 7: toggle_click(); break; + case 8: toggle_auto_return(); break; + case 9: toggle_follow_edits(); break; + } + } +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 1c637a436d..5d10c6f13d 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -424,7 +424,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr boost::shared_ptr play_selection_controllable; boost::shared_ptr rec_controllable; - void toggle_always_play_range (); + void toggle_follow_edits (); void set_transport_controllable_state (const XMLNode&); XMLNode& get_transport_controllable_state (); @@ -561,6 +561,15 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void set_transport_sensitivity (bool); + //stuff for ProTools-style numpad + void transport_numpad_event (int num); + void transport_numpad_decimal (); + bool _numpad_locate_happening; + int _pending_locate_num; + gint transport_numpad_timeout (); + sigc::connection _numpad_timeout_connection; + + void transport_goto_nth_marker (int nth); void transport_goto_zero (); void transport_goto_start (); void transport_goto_end (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index f78d096000..53efcbb48b 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -657,7 +657,7 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev) } void -ARDOUR_UI::toggle_always_play_range () +ARDOUR_UI::toggle_follow_edits () { RefPtr act = ActionManager::get_action (X_("Transport"), X_("ToggleFollowEdits")); assert (act); @@ -665,7 +665,7 @@ ARDOUR_UI::toggle_always_play_range () RefPtr tact = RefPtr::cast_dynamic (act); assert (tact); - Config->set_always_play_range (tact->get_active ()); + Config->set_follow_edits (tact->get_active ()); } diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc index fbfc8c7afd..bb0f375942 100644 --- a/gtk2_ardour/ardour_ui_dependents.cc +++ b/gtk2_ardour/ardour_ui_dependents.cc @@ -31,6 +31,7 @@ #include "ardour/session.h" +#include "actions.h" #include "ardour_ui.h" #include "public_editor.h" #include "mixer_ui.h" @@ -59,6 +60,11 @@ ARDOUR_UI::we_have_dependents () editor->setup_tooltips (); editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks)); + /* all actions are defined */ + + ActionManager::enable_accelerators (); + ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file); + editor->track_mixer_selection (); mixer->track_editor_selection (); } diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 6c69f42793..90d297ab9b 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -229,6 +229,9 @@ ARDOUR_UI::install_actions () act = ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("alternate-ToggleRoll"), _("Start/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, false)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); act = ActionManager::register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -267,6 +270,10 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("alternate-record-roll"), _("Start Recording"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_record), true)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::write_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); act = ActionManager::register_action (transport_actions, X_("Rewind"), _("Rewind"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::transport_rewind), 0)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -291,6 +298,9 @@ ARDOUR_UI::install_actions () act = ActionManager::register_action (transport_actions, X_("GotoStart"), _("Goto Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("alternate-GotoStart"), _("Goto Start"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_start)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); act = ActionManager::register_action (transport_actions, X_("GotoEnd"), _("Goto End"), sigc::mem_fun(*this, &ARDOUR_UI::transport_goto_end)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -298,6 +308,41 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); + //these actions handle the numpad events, ProTools style + act = ActionManager::register_action (transport_actions, X_("numpad-decimal"), _("Numpad Decimal"), mem_fun(*this, &ARDOUR_UI::transport_numpad_decimal)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-0"), _("Numpad 0"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 0)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-1"), _("Numpad 1"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 1)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-2"), _("Numpad 2"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 2)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-3"), _("Numpad 3"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 3)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-4"), _("Numpad 4"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 4)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-5"), _("Numpad 5"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 5)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-6"), _("Numpad 6"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 6)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-7"), _("Numpad 7"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 7)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-8"), _("Numpad 8"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 8)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("numpad-9"), _("Numpad 9"), bind (mem_fun(*this, &ARDOUR_UI::transport_numpad_event), 9)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::transport_sensitive_actions.push_back (act); + act = ActionManager::register_action (transport_actions, X_("focus-on-clock"), _("Focus On Clock"), sigc::mem_fun(*this, &ARDOUR_UI::focus_on_clock)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -344,7 +389,7 @@ ARDOUR_UI::install_actions () act = ActionManager::register_toggle_action (transport_actions, X_("ToggleAutoReturn"), _("Auto Return"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_auto_return)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_always_play_range)); + act = ActionManager::register_toggle_action (transport_actions, X_("ToggleFollowEdits"), _("Follow Edits"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_follow_edits)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index 365810df75..79f44a5116 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -328,7 +328,7 @@ ARDOUR_UI::parameter_changed (std::string p) } else if (p == "always-play-range") { - ActionManager::map_some_state ("Transport", "ToggleFollowEdits", &RCConfiguration::get_always_play_range); + ActionManager::map_some_state ("Transport", "ToggleFollowEdits", &RCConfiguration::get_follow_edits); } else if (p == "send-mtc") { diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 053e285091..5994305aa1 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -4546,6 +4546,8 @@ Editor::get_regions_from_selection_and_edit_point () if (_edit_point == EditAtMouse && entered_regionview && !selection->regions.contains (entered_regionview)) { regions.add (entered_regionview); + } else { + regions = selection->regions; } if (regions.empty() && _edit_point != EditAtMouse) { diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index e8f3804fd5..b5533ec689 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1328,6 +1328,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void set_punch_range (framepos_t start, framepos_t end, std::string cmd); void add_location_from_playhead_cursor (); + void remove_location_at_playhead_cursor (); bool select_new_marker; void reverse_selection (); diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 4570736617..e696efebab 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -194,8 +194,11 @@ Editor::register_actions () reg_sens (editor_actions, "select-all", _("Select All"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all), Selection::Set)); reg_sens (editor_actions, "deselect-all", _("Deselect All"), sigc::mem_fun(*this, &Editor::deselect_all)); reg_sens (editor_actions, "invert-selection", _("Invert Selection"), sigc::mem_fun(*this, &Editor::invert_selection)); + reg_sens (editor_actions, "select-all-after-edit-cursor", _("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true)); + reg_sens (editor_actions, "alternate-select-all-after-edit-cursor", _("Select All After Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), true)); reg_sens (editor_actions, "select-all-before-edit-cursor", _("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false)); + reg_sens (editor_actions, "alternate-select-all-before-edit-cursor", _("Select All Before Edit Point"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_using_edit), false)); reg_sens (editor_actions, "select-all-between-cursors", _("Select All Overlapping Edit Range"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), false)); reg_sens (editor_actions, "select-all-within-cursors", _("Select All Inside Edit Range"), sigc::bind (sigc::mem_fun(*this, &Editor::select_all_selectables_between), true)); @@ -237,7 +240,12 @@ Editor::register_actions () reg_sens (editor_actions, "jump-forward-to-mark", _("Jump to Next Mark"), sigc::mem_fun(*this, &Editor::jump_forward_to_mark)); reg_sens (editor_actions, "jump-backward-to-mark", _("Jump to Previous Mark"), sigc::mem_fun(*this, &Editor::jump_backward_to_mark)); + reg_sens (editor_actions, "add-location-from-playhead", _("Add Mark from Playhead"), sigc::mem_fun(*this, &Editor::add_location_from_playhead_cursor)); + reg_sens (editor_actions, "alternate-add-location-from-playhead", _("Add Mark from Playhead"), sigc::mem_fun(*this, &Editor::add_location_from_playhead_cursor)); + + reg_sens (editor_actions, "remove-location-from-playhead", _("Remove Mark at Playhead"), sigc::mem_fun(*this, &Editor::remove_location_at_playhead_cursor)); + reg_sens (editor_actions, "alternate-remove-location-from-playhead", _("Remove Mark at Playhead"), sigc::mem_fun(*this, &Editor::remove_location_at_playhead_cursor)); reg_sens (editor_actions, "nudge-next-forward", _("Nudge Next Later"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_forward), true, false)); reg_sens (editor_actions, "nudge-next-backward", _("Nudge Next Earlier"), sigc::bind (sigc::mem_fun(*this, &Editor::nudge_backward), true, false)); @@ -298,7 +306,10 @@ Editor::register_actions () reg_sens (editor_actions, "duplicate-range", _("Duplicate Range"), sigc::bind (sigc::mem_fun(*this, &Editor::duplicate_range), false)); undo_action = reg_sens (editor_actions, "undo", S_("Command|Undo"), sigc::bind (sigc::mem_fun(*this, &Editor::undo), 1U)); + redo_action = reg_sens (editor_actions, "redo", _("Redo"), sigc::bind (sigc::mem_fun(*this, &Editor::redo), 1U)); + redo_action = reg_sens (editor_actions, "alternate-redo", _("Redo"), sigc::bind (sigc::mem_fun(*this, &Editor::redo), 1U)); + redo_action = reg_sens (editor_actions, "alternate-alternate-redo", _("Redo"), sigc::bind (sigc::mem_fun(*this, &Editor::redo), 1U)); reg_sens (editor_actions, "export-audio", _("Export Audio"), sigc::mem_fun(*this, &Editor::export_audio)); reg_sens (editor_actions, "export-range", _("Export Range"), sigc::mem_fun(*this, &Editor::export_range)); @@ -317,6 +328,7 @@ Editor::register_actions () reg_sens (editor_actions, "editor-cut", _("Cut"), sigc::mem_fun(*this, &Editor::cut)); reg_sens (editor_actions, "editor-delete", _("Delete"), sigc::mem_fun(*this, &Editor::delete_)); + reg_sens (editor_actions, "alternate-editor-delete", _("Delete"), sigc::mem_fun(*this, &Editor::delete_)); reg_sens (editor_actions, "editor-copy", _("Copy"), sigc::mem_fun(*this, &Editor::copy)); reg_sens (editor_actions, "editor-paste", _("Paste"), sigc::mem_fun(*this, &Editor::keyboard_paste)); @@ -327,7 +339,9 @@ Editor::register_actions () sigc::mem_fun (ARDOUR_UI::instance(), &ARDOUR_UI::toggle_errors)); reg_sens (editor_actions, "tab-to-transient-forwards", _("Move Later to Transient"), sigc::bind (sigc::mem_fun(*this, &Editor::tab_to_transient), true)); + reg_sens (editor_actions, "alternate-tab-to-transient-forwards", _("Move Later to Transient"), sigc::bind (sigc::mem_fun(*this, &Editor::tab_to_transient), true)); reg_sens (editor_actions, "tab-to-transient-backwards", _("Move Earlier to Transient"), sigc::bind (sigc::mem_fun(*this, &Editor::tab_to_transient), false)); + reg_sens (editor_actions, "alternate-tab-to-transient-backwards", _("Move Earlier to Transient"), sigc::bind (sigc::mem_fun(*this, &Editor::tab_to_transient), false)); reg_sens (editor_actions, "crop", _("Crop"), sigc::mem_fun(*this, &Editor::crop_region_to_selection)); @@ -489,7 +503,7 @@ Editor::register_actions () ActionManager::register_action (editor_actions, "set-edit-ripple", _("Ripple"), bind (mem_fun (*this, &Editor::set_edit_mode), Ripple)); ActionManager::register_action (editor_actions, "set-edit-slide", _("Slide"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Slide)); ActionManager::register_action (editor_actions, "set-edit-lock", _("Lock"), sigc::bind (sigc::mem_fun (*this, &Editor::set_edit_mode), Lock)); - ActionManager::register_action (editor_actions, "toggle-edit-mode", _("Toggle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode)); + ActionManager::register_action (editor_actions, "cycle-edit-mode", _("Cycle Edit Mode"), sigc::mem_fun (*this, &Editor::cycle_edit_mode)); ActionManager::register_action (editor_actions, X_("SnapTo"), _("Snap to")); ActionManager::register_action (editor_actions, X_("SnapMode"), _("Snap Mode")); @@ -1868,7 +1882,10 @@ Editor::register_region_actions () ); reg_sens (_region_actions, "set-fade-in-length", _("Set Fade In Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), true)); + reg_sens (_region_actions, "alternate-set-fade-in-length", _("Set Fade In Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), true)); reg_sens (_region_actions, "set-fade-out-length", _("Set Fade Out Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), false)); + reg_sens (_region_actions, "alternate-set-fade-out-length", _("Set Fade Out Length"), sigc::bind (sigc::mem_fun (*this, &Editor::set_fade_length), false)); + reg_sens (_region_actions, "set-tempo-from-region", _("Set Tempo from Region = Bar"), sigc::mem_fun (*this, &Editor::set_tempo_from_region)); reg_sens ( @@ -1912,7 +1929,9 @@ Editor::register_region_actions () reg_sens (_region_actions, "set-selection-from-region", _("Set Range Selection"), sigc::mem_fun (*this, &Editor::set_selection_from_region)); reg_sens (_region_actions, "nudge-forward", _("Nudge Later"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_forward), false, false)); + reg_sens (_region_actions, "alternate-nudge-forward", _("Nudge Later"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_forward), false, false)); reg_sens (_region_actions, "nudge-backward", _("Nudge Earlier"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_backward), false, false)); + reg_sens (_region_actions, "alternate-nudge-backward", _("Nudge Earlier"), sigc::bind (sigc::mem_fun (*this, &Editor::nudge_backward), false, false)); reg_sens (_region_actions, "sequence-regions", _("Sequence Regions"), sigc::mem_fun (*this, &Editor::sequence_regions)); diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 6fec1f77f7..f852981487 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4349,8 +4349,11 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) if ( s->get_play_range() && s->transport_rolling() ) { s->request_play_range (&_editor->selection->time, true); } else { - if (Config->get_always_play_range() && !s->transport_rolling()) { - s->request_locate (_editor->get_selection().time.start()); + if (Config->get_follow_edits() && !s->transport_rolling()) { + if (_operation == SelectionEndTrim) + _editor->maybe_locate_with_edit_preroll( _editor->get_selection().time.end_frame()); + else + s->request_locate (_editor->get_selection().time.start()); } } } diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 75c4fb57cf..62cf89e35c 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1293,7 +1293,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } //not rolling, range mode click + join_play_range : locate the PH here - if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_always_play_range() ) { + if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_follow_edits() ) { framepos_t where = canvas_event_sample (event); snap_to(where); _session->request_locate (where, false); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index b7a246d589..052fad0f6b 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -133,7 +133,8 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) { bool frozen = false; - list > used_playlists; + list > used_playlists; + list used_trackviews; if (regions.empty()) { return; @@ -188,9 +189,16 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) /* remember used playlists so we can thaw them later */ used_playlists.push_back(pl); + + TimeAxisView& tv = (*a)->get_time_axis_view(); + RouteTimeAxisView* rtv = dynamic_cast (&tv); + if (rtv) { + used_trackviews.push_back (rtv); + } pl->freeze(); } + if (pl) { pl->clear_changes (); pl->split_region ((*a)->region(), where); @@ -200,17 +208,34 @@ Editor::split_regions_at (framepos_t where, RegionSelection& regions) a = tmp; } + vector region_added_connections; + + for (list::iterator i = used_trackviews.begin(); i != used_trackviews.end(); ++i) { + region_added_connections.push_back ((*i)->view()->RegionViewAdded.connect (sigc::mem_fun(*this, &Editor::collect_new_region_view))); + } + + latest_regionviews.clear (); + while (used_playlists.size() > 0) { list >::iterator i = used_playlists.begin(); (*i)->thaw(); used_playlists.pop_front(); } + for (vector::iterator c = region_added_connections.begin(); c != region_added_connections.end(); ++c) { + (*c).disconnect (); + } + commit_reversible_command (); if (frozen){ EditorThaw(); /* Emit Signal */ } + + if (!latest_regionviews.empty()) { + selection->add (latest_regionviews); + } + } /** Move one extreme of the current range selection. If more than one range is selected, @@ -1892,6 +1917,35 @@ Editor::add_location_from_playhead_cursor () add_location_mark (_session->audible_frame()); } +void +Editor::remove_location_at_playhead_cursor () +{ + if (_session) { + + //set up for undo + _session->begin_reversible_command (_("remove marker")); + XMLNode &before = _session->locations()->get_state(); + bool removed = false; + + //find location(s) at this time + Locations::LocationList locs; + _session->locations()->find_all_between (_session->audible_frame(), _session->audible_frame()+1, locs, Location::Flags(0)); + for (Locations::LocationList::iterator i = locs.begin(); i != locs.end(); ++i) { + if ((*i)->is_mark()) { + _session->locations()->remove (*i); + removed = true; + } + } + + //store undo + if (removed) { + XMLNode &after = _session->locations()->get_state(); + _session->add_command(new MementoCommand(*(_session->locations()), &before, &after)); + _session->commit_reversible_command (); + } + } +} + /** Add a range marker around each selected region */ void Editor::add_locations_from_region () @@ -2213,7 +2267,7 @@ Editor::get_preroll () void Editor::maybe_locate_with_edit_preroll ( framepos_t location ) { - if ( _session->transport_rolling() || !Config->get_always_play_range() ) + if ( _session->transport_rolling() || !Config->get_follow_edits() ) return; location -= get_preroll(); @@ -5535,7 +5589,7 @@ Editor::set_playhead_cursor () } } - if ( Config->get_always_play_range() ) + if ( Config->get_follow_edits() ) cancel_time_selection(); } diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 203df9f322..fd9d68fe93 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1013,10 +1013,6 @@ Editor::time_selection_changed () } else { ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); } - - if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->time.empty()) { - _session->request_locate (selection->time.start()); - } } /** Set all region actions to have a given sensitivity */ diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 27cf9b7719..437aea7d39 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -1337,6 +1337,21 @@ EngineControl::set_state (const XMLNode& root) /* now see if there was an active state and switch the setup to it */ + // purge states of backend that are not available in this built + vector backends = ARDOUR::AudioEngine::instance()->available_backends(); + vector backend_names; + + for (vector::const_iterator i = backends.begin(); i != backends.end(); ++i) { + backend_names.push_back((*i)->name); + } + for (StateList::iterator i = states.begin(); i != states.end();) { + if (std::find(backend_names.begin(), backend_names.end(), (*i)->backend) == backend_names.end()) { + i = states.erase(i); + } else { + ++i; + } + } + for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) { if ((*i)->active) { diff --git a/gtk2_ardour/keyboard.cc b/gtk2_ardour/keyboard.cc index 3b5b207ce2..d4bf237780 100644 --- a/gtk2_ardour/keyboard.cc +++ b/gtk2_ardour/keyboard.cc @@ -23,6 +23,7 @@ #include "ardour/filesystem_paths.h" #include "ardour_ui.h" +#include "public_editor.h" #include "keyboard.h" #include "opts.h" diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 8ab050e867..6346bf6cd3 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -97,11 +97,6 @@ This mode provides many different operations on both regions and control points, @eep|Editor/cycle-edit-point|grave|next EP w/o marker @eep|Editor/cycle-edit-point-with-marker|<@PRIMARY@>grave|next EP w/marker -@aep|Editor/move-range-start-to-previous-region-boundary|less|range start to prev region edge -@aep|Editor/move-range-start-to-next-region-boundary|<@PRIMARY@>less|range start to next region edge -@aep|Editor/move-range-end-to-previous-region-boundary|<@PRIMARY@>greater|range end to next prev edge -@aep|Editor/move-range-end-to-next-region-boundary|greater|range end to next region edge - @trans|Transport/ToggleRoll|space|toggle roll @epp|Editor/play-edit-range|<@SECONDARY@>space|play edit range @epp|Editor/play-from-edit-point-and-return|<@LEVEL4@>space|play from EP \& return @@ -109,6 +104,11 @@ This mode provides many different operations on both regions and control points, @trans|Transport/ToggleRollForgetCapture|<@PRIMARY@>space|stop and destroy @trans|Transport/record-roll|<@TERTIARY@>space|start recording +@trans|Editor/add-location-from-playhead|nabla|add marker +@trans|Editor/remove-location-from-playhead|<@PRIMARY@>nabla|add marker +;@trans|Transport/GotoStart|Return|to start marker +@movp|Transport/alternate-GotoStart|KP_Return|to edit point + @rop|Region/set-fade-in-length|slash|set fade in length @rop|Region/toggle-region-fade-out|<@PRIMARY@>slash|toggle fade in active @rop|Region/set-fade-out-length|backslash|set fade out length @@ -143,6 +143,8 @@ This mode provides many different operations on both regions and control points, @wvis|Common/goto-editor|<@WINDOW@>e|toggle editor window @mmode|MouseMode/set-mouse-mode-range|r|range mode @edit|Editor/redo|<@PRIMARY@>r|redo +@edit|Editor/alternate-redo|<@PRIMARY@>y|redo +@edit|Editor/alternate-alternate-redo|<@PRIMARY@><@TERTIARY@>z|redo @rop|Region/reverse-region|<@SECONDARY@>r|reverse @trans|Transport/Record|<@TERTIARY@>r|engage record @mmode|MouseMode/set-mouse-mode-timefx|t|timefx mode @@ -257,12 +259,9 @@ This mode provides many different operations on both regions and control points, @movp|Transport/GotoStart|Home|to start marker @movp|Transport/GotoEnd|End|to end marker @edit|Editor/editor-delete|Delete|delete +@edit|Editor/alternate-editor-delete|BackSpace|backspace (delete) -@movp|Editor/playhead-to-edit|Return|to edit point -@eep|Editor/edit-to-playhead|<@SECONDARY@>Return|move EP to playhead -@trans|Editor/remove-last-capture|<@PRIMARY@>Delete|destroy last recording - -@-group|Editor/escape|Escape|break drag or deselect all +@select|Editor/escape|Escape|break drag or deselect all ;; keypad @@ -280,26 +279,28 @@ This mode provides many different operations on both regions and control points, @-group|Editor/alt-start-range|<@PRIMARY@>KP_Down|some text @-group|Editor/alt-finish-range|<@PRIMARY@>KP_Up|some text -@markers|Editor/add-location-from-playhead|KP_Enter|add mark at playhead +@markers|Editor/alternate-add-location-from-playhead|KP_Enter|add mark at playhead +@markers|Editor/alternate-remove-location-from-playhead|<@PRIMARY@>KP_Enter|add mark at playhead @wvis|Transport/focus-on-clock|KP_Divide|focus on main clock -@movp|Transport/GotoZero|KP_0|to zero -@-group|Editor/goto-mark-1|KP_1|some text -@-group|Editor/goto-mark-2|KP_2|some text -@-group|Editor/goto-mark-3|KP_3|some text -@-group|Editor/goto-mark-4|KP_4|some text -@-group|Editor/goto-mark-5|KP_5|some text -@-group|Editor/goto-mark-6|KP_6|some text -@-group|Editor/goto-mark-7|KP_7|some text -@-group|Editor/goto-mark-8|KP_8|some text -@-group|Editor/goto-mark-9|KP_9|some text +@movp|Transport/numpad-decimal|KP_Decimal|numpad decimal should initiate and finalize a locate-to-marker + +@movp|Transport/numpad-0|KP_0|some text +@-group|Transport/numpad-1|KP_1|some text +@-group|Transport/numpad-2|KP_2|some text +@-group|Transport/numpad-3|KP_3|some text +@-group|Transport/numpad-4|KP_4|some text +@-group|Transport/numpad-5|KP_5|some text +@-group|Transport/numpad-6|KP_6|some text +@-group|Transport/numpad-7|KP_7|some text +@-group|Transport/numpad-8|KP_8|some text +@-group|Transport/numpad-9|KP_9|some text ;; F-N keys @-group|Editor/edit-cursor-to-range-start|F1|some text @-group|Editor/edit-cursor-to-range-end|F2|some text @-group|Editor/pitch-shift-region|F5|some text -@select|Editor/select-range-between-cursors|F6|convert edit range to range @-group|Editor/save-visual-state-1|<@PRIMARY@>F1|some text @-group|Editor/save-visual-state-2|<@PRIMARY@>F2|some text diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 9eac1be2f7..722f5e2f2b 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -213,6 +213,9 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi virtual void play_selection () = 0; virtual void play_with_preroll () = 0; virtual void maybe_locate_with_edit_preroll (framepos_t location) = 0; + virtual void goto_nth_marker (int nth) = 0; + virtual void add_location_from_playhead_cursor () = 0; + virtual void remove_location_at_playhead_cursor () = 0; virtual void set_show_measures (bool yn) = 0; virtual bool show_measures () const = 0; diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index c0c76d3826..85c5a35ab5 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -148,7 +148,7 @@ CONFIG_VARIABLE (bool, secondary_clock_delta_edit_cursor, "secondary-clock-delta CONFIG_VARIABLE (bool, show_track_meters, "show-track-meters", true) CONFIG_VARIABLE (bool, locate_while_waiting_for_sync, "locate-while-waiting-for-sync", false) CONFIG_VARIABLE (bool, disable_disarm_during_roll, "disable-disarm-during-roll", false) -CONFIG_VARIABLE (bool, always_play_range, "always-play-range", false) +CONFIG_VARIABLE (bool, follow_edits, "follow-edits", false) CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", false) /* metering */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 6d01e6d973..de54d60b2c 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -508,6 +508,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop framepos_t transport_frame () const {return _transport_frame; } framepos_t audible_frame () const; framepos_t requested_return_frame() const { return _requested_return_frame; } + void set_requested_return_frame(framepos_t return_to); enum PullupFormat { pullup_Plus4Plus1, diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 5df58ea846..665ddac5d6 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -145,10 +145,12 @@ Route::init () _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2)); _output->PortCountChanging.connect_same_thread (*this, boost::bind (&Route::output_port_count_changing, this, _1)); +#if 0 // not used - just yet if (!is_master() && !is_monitor() && !is_auditioner()) { _delayline.reset (new DelayLine (_session, _name)); add_processor (_delayline, PreFader); } +#endif /* add amp processor */ @@ -2605,8 +2607,10 @@ Route::set_processor_state (const XMLNode& node) _meter->set_state (**niter, Stateful::current_state_version); new_order.push_back (_meter); } else if (prop->value() == "delay") { - _delayline->set_state (**niter, Stateful::current_state_version); - new_order.push_back (_delayline); + if (_delayline) { + _delayline->set_state (**niter, Stateful::current_state_version); + new_order.push_back (_delayline); + } } else if (prop->value() == "main-outs") { _main_outs->set_state (**niter, Stateful::current_state_version); } else if (prop->value() == "intreturn") { @@ -4141,9 +4145,11 @@ Route::setup_invisible_processors () } } +#if 0 // not used - just yet if (!is_master() && !is_monitor() && !is_auditioner()) { new_processors.push_front (_delayline); } +#endif /* MONITOR CONTROL */ diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 19f86eb2b3..2cd8de49bf 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -1635,6 +1635,13 @@ Session::request_bounded_roll (framepos_t start, framepos_t end) lar.push_back (ar); request_play_range (&lar, true); } + +void +Session::set_requested_return_frame (framepos_t return_to) +{ + _requested_return_frame = return_to; +} + void Session::request_roll_at_and_return (framepos_t start, framepos_t return_to) { diff --git a/libs/canvas/wave_view.cc b/libs/canvas/wave_view.cc index 6c0cc50494..225010ed4d 100644 --- a/libs/canvas/wave_view.cc +++ b/libs/canvas/wave_view.cc @@ -920,23 +920,35 @@ WaveView::set_global_logscaled (bool yn) } void -WaveView::region_resized () +WaveView::set_region_start (frameoffset_t start) { if (!_region) { return; } - /* special: do not use _region->length() here to compute - bounding box because it will already have changed. - - if we have a bounding box, use it. + if (_region_start == start) { + return; + } + + begin_change (); + _region_start = start; + _bounding_box_dirty = true; + end_change (); +} + +void +WaveView::region_resized () +{ + /* Called when the region start or end (thus length) has changed. */ - _pre_change_bounding_box = _bounding_box; + if (!_region) { + return; + } + begin_change (); + _region_start = _region->start(); _bounding_box_dirty = true; - compute_bounding_box (); - end_change (); } diff --git a/libs/gtkmm2ext/actions.cc b/libs/gtkmm2ext/actions.cc index f4159c71e2..5f853b0170 100644 --- a/libs/gtkmm2ext/actions.cc +++ b/libs/gtkmm2ext/actions.cc @@ -34,6 +34,8 @@ #include #include +#include + #include "pbd/error.h" #include "gtkmm2ext/actions.h" @@ -235,6 +237,50 @@ ActionManager::get_all_actions (vector& names, vector& paths, ve } } +void +ActionManager::enable_accelerators () +{ + /* the C++ API for functions used here appears to be broken in + gtkmm2.6, so we fall back to the C level. + */ + + GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj()); + GList* node; + GList* acts; + string ui_string = ""; + + /* get all actions, build a string describing them all as + */ + + for (node = list; node; node = g_list_next (node)) { + + GtkActionGroup* group = (GtkActionGroup*) node->data; + + for (acts = gtk_action_group_list_actions (group); acts; acts = g_list_next (acts)) { + ui_string += "data); + + ui_string += Glib::path_get_basename (fullpath); + ui_string += "\"/>"; + } + } + + ui_string += ""; + + /* and load it */ + + ui_manager->add_ui_from_string (ui_string); +} + struct ActionState { GtkAction* action; bool sensitive; diff --git a/libs/gtkmm2ext/gtkmm2ext/actions.h b/libs/gtkmm2ext/gtkmm2ext/actions.h index 536bd326be..d13a16f2d5 100644 --- a/libs/gtkmm2ext/gtkmm2ext/actions.h +++ b/libs/gtkmm2ext/gtkmm2ext/actions.h @@ -50,6 +50,7 @@ namespace ActionManager { LIBGTKMM2EXT_API extern void set_toggle_action (const char* group, const char* name, bool); LIBGTKMM2EXT_API extern void add_action_group (Glib::RefPtr); + LIBGTKMM2EXT_API extern void enable_accelerators (); LIBGTKMM2EXT_API extern Glib::RefPtr register_action (Glib::RefPtr group, const char * name, const char * label); diff --git a/libs/pbd/xml++.cc b/libs/pbd/xml++.cc index 69187995a1..5fb777bdc7 100644 --- a/libs/pbd/xml++.cc +++ b/libs/pbd/xml++.cc @@ -155,6 +155,20 @@ XMLTree::write() const xmlSetDocCompressMode(doc, _compression); writenode(doc, _root, doc->children, 1); result = xmlSaveFormatFileEnc(_filename.c_str(), doc, "UTF-8", 1); +#ifndef NDEBUG + if (result == -1) { + xmlErrorPtr xerr = xmlGetLastError (); + if (!xerr) { + std::cerr << "unknown XML error during xmlSaveFormatFileEnc()." << std::endl; + } else { + std::cerr << "xmlSaveFormatFileEnc: error" + << " domain: " << xerr->domain + << " code: " << xerr->code + << " msg: " << xerr->message + << std::endl; + } + } +#endif xmlFreeDoc(doc); if (result == -1) {