From 53a5f5d8ca8da56c8e72b01eceadc47a9eb1783a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 3 Jul 2014 10:00:12 -0400 Subject: [PATCH 01/14] actually do something in WaveView::region_resized() which is called whenever the region is resized; implement WaveView::set_region_start() which could be used by an xfade editor etc. --- libs/canvas/wave_view.cc | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) 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 (); } From 043b76569d2420edda4e8a6781b530a281f3be7a Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Thu, 3 Jul 2014 12:25:35 -0500 Subject: [PATCH 02/14] fix the naming and behavior of always-play-range to match the button, which is follow-edits. when you select a range, the playhead should jump to the start of the range and begin to play the selection. BUT (unlike previous implementation) if the user wants to relocate the playhead, then that should be allowed. The user should always remain in charge of the playhead location. NOTE: your previous config setting will be invalidated. You must re-save a session to overwrite with the new config variable --- gtk2_ardour/ardour_ui.cc | 8 ++++---- gtk2_ardour/ardour_ui.h | 2 +- gtk2_ardour/ardour_ui2.cc | 4 ++-- gtk2_ardour/ardour_ui_ed.cc | 2 +- gtk2_ardour/ardour_ui_options.cc | 2 +- gtk2_ardour/editor_drag.cc | 2 +- gtk2_ardour/editor_mouse.cc | 2 +- gtk2_ardour/editor_ops.cc | 4 ++-- gtk2_ardour/editor_selection.cc | 2 +- libs/ardour/ardour/rc_configuration_vars.h | 2 +- libs/ardour/ardour/session.h | 1 + libs/ardour/session_transport.cc | 7 +++++++ 12 files changed, 23 insertions(+), 15 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index cde9d0d9ee..a11c4d556c 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -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); diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 1c637a436d..701be1dfc2 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 (); 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_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 6c69f42793..2c3e7fc569 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -344,7 +344,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_drag.cc b/gtk2_ardour/editor_drag.cc index 6fec1f77f7..0cc6ad45f9 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4349,7 +4349,7 @@ 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()) { + if (Config->get_follow_edits() && !s->transport_rolling()) { 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..3c89ddc448 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2213,7 +2213,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 +5535,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..229d658a5a 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -1014,7 +1014,7 @@ Editor::time_selection_changed () ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, true); } - if (_session && Config->get_always_play_range() && !_session->transport_rolling() && !selection->time.empty()) { + if (_session && Config->get_follow_edits() && !_session->transport_rolling() && !selection->time.empty()) { _session->request_locate (selection->time.start()); } } 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 de2dc6189e..f9affaa78d 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -502,6 +502,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/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) { From 80d1631aa31bedebb0b22956db1b585df8649578 Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Thu, 3 Jul 2014 12:49:59 -0500 Subject: [PATCH 03/14] if a Range end is trimmed, in follow-edits mode, locate to the range end so it can be auditioned. (same as trimming a region end) --- gtk2_ardour/editor_drag.cc | 5 ++++- gtk2_ardour/editor_selection.cc | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 0cc6ad45f9..f852981487 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4350,7 +4350,10 @@ SelectionDrag::finished (GdkEvent* event, bool movement_occurred) s->request_play_range (&_editor->selection->time, true); } else { if (Config->get_follow_edits() && !s->transport_rolling()) { - s->request_locate (_editor->get_selection().time.start()); + 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_selection.cc b/gtk2_ardour/editor_selection.cc index 229d658a5a..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_follow_edits() && !_session->transport_rolling() && !selection->time.empty()) { - _session->request_locate (selection->time.start()); - } } /** Set all region actions to have a given sensitivity */ From ba33c6dab6c6c41cb3392e06b824f4b46e3debf1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 3 Jul 2014 15:48:20 -0400 Subject: [PATCH 04/14] revert part of 0f1c7b1d7107 which broke lots of stuff based on region selection --- gtk2_ardour/editor.cc | 2 ++ 1 file changed, 2 insertions(+) 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) { From 555a5d6348d544a86fe9df1410db8a549ba05c5f Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Thu, 3 Jul 2014 17:50:14 -0500 Subject: [PATCH 05/14] lots of keybinding changes. added a new action to allow removing markers at the playhead location. numpad now allows you to access marks higher than 9. to locate to a marker, use the numpad decimal to start and end the operation - for example press .19. to locate to marker 19. also added alternate bindings for redo, delete, and several other alternates that will be needed in subsequent commits. tab is not working, using either Tab or nabla in the binding.in file --- gtk2_ardour/ardour.menus.in | 41 ++++++++++++++++++++++--- gtk2_ardour/ardour_ui.cc | 46 +++++++++++++++++++++++++++++ gtk2_ardour/ardour_ui.h | 9 ++++++ gtk2_ardour/ardour_ui_ed.cc | 45 ++++++++++++++++++++++++++++ gtk2_ardour/editor.h | 1 + gtk2_ardour/editor_actions.cc | 19 ++++++++++++ gtk2_ardour/editor_ops.cc | 29 ++++++++++++++++++ gtk2_ardour/keyboard.cc | 1 + gtk2_ardour/mnemonic-us.bindings.in | 46 +++++++++++++++-------------- gtk2_ardour/public_editor.h | 3 ++ 10 files changed, 214 insertions(+), 26 deletions(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 5ce4cf9736..8336a55035 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -14,9 +14,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #ifdef GTKOSX #endif @@ -135,13 +169,11 @@ - - - + @@ -188,11 +220,11 @@ - + @@ -357,6 +389,7 @@ + diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index a11c4d556c..ef3dbe2de9 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; } @@ -4411,3 +4413,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 701be1dfc2..5d10c6f13d 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -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_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 2c3e7fc569..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); 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..751de09311 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)); @@ -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_ops.cc b/gtk2_ardour/editor_ops.cc index 3c89ddc448..7489199504 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -1892,6 +1892,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 () 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..1b0ee2430f 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,12 @@ 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|Transport/add-location-from-playhead|Tab|add marker +@trans|Transport/remove-location-from-playhead|<@PRIMARY@>nabla|add marker +;@trans|Transport/GotoStart|3270_enter|Return +;@trans|Transport/GotoStart|F35|Return (numpad) +@movp|Transport/alternate-GotoStart|Return|to edit point THIS KEYBINDING WORKS. WHY!!???! + @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 +144,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 +260,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 +280,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; From ba8898bd5f67b24d4b2be97288def7914c26be76 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 3 Jul 2014 19:43:28 -0400 Subject: [PATCH 06/14] add new regions created by split to selection after operation is complete --- gtk2_ardour/editor_ops.cc | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 7489199504..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, From a2c7fe03ef75d4db79b71b5c6202c7077df59ab6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Jul 2014 07:36:49 -0400 Subject: [PATCH 07/14] remove all accelerator declarations from ardour.menus.in, since they are about to be automatically registered for ALL actions --- gtk2_ardour/ardour.menus.in | 56 ------------------------------------- 1 file changed, 56 deletions(-) diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index 8336a55035..ab5dbc6bab 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -1,60 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#ifdef GTKOSX - -#endif - From 08b1a9d52082612d99a209dc3841792a69010374 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Jul 2014 07:48:41 -0400 Subject: [PATCH 08/14] add ActionManager::enable_accelerators(), which takes all known Actions and registers them via the UIManager as accelerators. This makes them available for use with key bindings/shortcuts/accelerators even if they have no proxy widget --- libs/gtkmm2ext/actions.cc | 46 ++++++++++++++++++++++++++++++ libs/gtkmm2ext/gtkmm2ext/actions.h | 1 + 2 files changed, 47 insertions(+) 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); From b64634e32e9962bd0e0d2f8a93bbae3e51b710ed Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Jul 2014 07:49:26 -0400 Subject: [PATCH 09/14] move location of menus file loading and call ActionManager::enable_accelerators() to get all actions setup for binding options --- gtk2_ardour/ardour_ui.cc | 2 -- gtk2_ardour/ardour_ui_dependents.cc | 6 ++++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index ef3dbe2de9..3948b5cc8c 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -492,8 +492,6 @@ ARDOUR_UI::post_engine () _tooltips.enable(); - ActionManager::load_menus (ARDOUR_COMMAND_LINE::menus_file); - if (setup_windows ()) { throw failed_constructor (); } 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 (); } From e083deff834dd74e41749f5bef1bbef7aa3ce340 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Jul 2014 07:49:46 -0400 Subject: [PATCH 10/14] rename the action that cycles through edit modes, since there are more than two --- gtk2_ardour/editor_actions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/editor_actions.cc b/gtk2_ardour/editor_actions.cc index 751de09311..e696efebab 100644 --- a/gtk2_ardour/editor_actions.cc +++ b/gtk2_ardour/editor_actions.cc @@ -503,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")); From 8fa0f7bc0b18d485125dc8ef40204b3ff1d64735 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 4 Jul 2014 13:02:55 +0200 Subject: [PATCH 11/14] disable latency-compensation preparations for now Don't add delaylines to tracks by default just yet, currently only sends are aligned with delaylines --- libs/ardour/route.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 */ From a86c98df7a42df4e927936148e4708d83ccaed32 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 4 Jul 2014 08:03:39 -0400 Subject: [PATCH 12/14] fix up various keybindings added/modified by Ben so that they work. There is still the mystery of why we can specify Return and KP_Return but not Tab. --- gtk2_ardour/mnemonic-us.bindings.in | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/mnemonic-us.bindings.in b/gtk2_ardour/mnemonic-us.bindings.in index 1b0ee2430f..6346bf6cd3 100644 --- a/gtk2_ardour/mnemonic-us.bindings.in +++ b/gtk2_ardour/mnemonic-us.bindings.in @@ -104,11 +104,10 @@ 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|Transport/add-location-from-playhead|Tab|add marker -@trans|Transport/remove-location-from-playhead|<@PRIMARY@>nabla|add marker -;@trans|Transport/GotoStart|3270_enter|Return -;@trans|Transport/GotoStart|F35|Return (numpad) -@movp|Transport/alternate-GotoStart|Return|to edit point THIS KEYBINDING WORKS. WHY!!???! +@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 From 63d81d2419e08b357af2e9d94d077eb1556a72a6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 4 Jul 2014 15:50:34 +0200 Subject: [PATCH 13/14] purge states of Audio-backends that are N/A fixes crashes/assert() when using different builds while sharing ardour.rc with n/a engine backends marked active. --- gtk2_ardour/engine_dialog.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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) { From c9b0f0fcb7626de7afef2f3fca1b0c1dbd01bd5b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 5 Jul 2014 20:53:22 +0200 Subject: [PATCH 14/14] debug info to trace down "cannot rename temp session file" errors ..but actually, the real error may be concurrent calls to Session::save_state() --- libs/pbd/xml++.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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) {