fix stupid MIDI::Manager design to properly handle multiple MIDI ports with the same...
[ardour.git] / gtk2_ardour / ardour_ui_ed.cc
index 61bb5d6ef7135ecd207c5b3be17bb2357e39c9cb..ee93919ece5531f6f79b3e9419a714a1772528fa 100644 (file)
@@ -39,6 +39,7 @@
 #include "editor.h"
 #include "actions.h"
 #include "mixer_ui.h"
+#include "utils.h"
 
 #ifdef GTKOSX
 #include <gtkmm2ext/sync-menu.h>
@@ -88,10 +89,9 @@ ARDOUR_UI::install_actions ()
        /* menus + submenus that need action items */
 
        ActionManager::register_action (main_actions, X_("Session"), _("Session"));
-       ActionManager::register_action (main_actions, X_("Files"), _("Import/Export"));
-       ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
+       act = ActionManager::register_action (main_actions, X_("Cleanup"), _("Cleanup"));
+       ActionManager::write_sensitive_actions.push_back (act);
        ActionManager::register_action (main_actions, X_("Sync"), _("Sync"));
-       ActionManager::register_action (main_actions, X_("Options"), _("Options"));
        ActionManager::register_action (main_actions, X_("TransportOptions"), _("Options"));
        ActionManager::register_action (main_actions, X_("Help"), _("Help"));
        ActionManager::register_action (main_actions, X_("KeyMouseActions"), _("Misc. Shortcuts"));
@@ -107,7 +107,7 @@ ARDOUR_UI::install_actions ()
 
        /* the real actions */
 
-       act = ActionManager::register_action (main_actions, X_("New"), _("New..."),  hide_return (bind (mem_fun(*this, &ARDOUR_UI::get_session_parameters), true)));
+       act = ActionManager::register_action (main_actions, X_("New"), _("New..."),  hide_return (bind (mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true)));
 
        ActionManager::register_action (main_actions, X_("Open"), _("Open..."),  mem_fun(*this, &ARDOUR_UI::open_session));
        ActionManager::register_action (main_actions, X_("Recent"), _("Recent..."),  mem_fun(*this, &ARDOUR_UI::open_recent_session));
@@ -117,7 +117,7 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus..."),
                                              bind (mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0));
        ActionManager::session_sensitive_actions.push_back (act);
-
+       ActionManager::write_sensitive_actions.push_back (act);
 
 #ifdef WITH_CMT
 
@@ -132,6 +132,7 @@ ARDOUR_UI::install_actions ()
 
        act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."),  mem_fun(*this, &ARDOUR_UI::snapshot_session));
        ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (main_actions, X_("SaveTemplate"), _("Save Template..."),  mem_fun(*this, &ARDOUR_UI::save_template));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -139,10 +140,10 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_action (main_actions, X_("Metadata"), _("Metadata"));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (main_actions, X_("EditMetadata"), _("Edit Metadata"),  mem_fun(*this, &ARDOUR_UI::edit_metadata));
+       act = ActionManager::register_action (main_actions, X_("EditMetadata"), _("Edit Metadata..."),  mem_fun(*this, &ARDOUR_UI::edit_metadata));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (main_actions, X_("ImportMetadata"), _("Import Metadata"),  mem_fun(*this, &ARDOUR_UI::import_metadata));
+       act = ActionManager::register_action (main_actions, X_("ImportMetadata"), _("Import Metadata..."),  mem_fun(*this, &ARDOUR_UI::import_metadata));
        ActionManager::session_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export To Audio File(s)..."),  mem_fun (*editor, &PublicEditor::export_audio));
@@ -151,9 +152,12 @@ ARDOUR_UI::install_actions ()
        act = ActionManager::register_action (main_actions, X_("Export"), _("Export"));
        ActionManager::session_sensitive_actions.push_back (act);
 
-       act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Cleanup Unused Sources"),  mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
+       act = ActionManager::register_action (main_actions, X_("CleanupUnused"), _("Cleanup Unused Sources..."),  mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::cleanup));
        ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
+
        act = ActionManager::register_action (main_actions, X_("FlushWastebasket"), _("Flush Wastebasket"),  mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::flush_trash));
+       ActionManager::write_sensitive_actions.push_back (act);
        ActionManager::session_sensitive_actions.push_back (act);
 
        /* JACK actions for controlling ... JACK */
@@ -213,19 +217,20 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::register_action (common_actions, X_("About"), _("About"),  mem_fun(*this, &ARDOUR_UI::show_about));
        ActionManager::register_toggle_action (common_actions, X_("ToggleThemeManager"), _("Theme Manager"), mem_fun(*this, &ARDOUR_UI::toggle_theme_manager));
-       ActionManager::register_toggle_action (common_actions, X_("ToggleKeyEditor"), _("Keybindings"), mem_fun(*this, &ARDOUR_UI::toggle_key_editor));
+       ActionManager::register_toggle_action (common_actions, X_("ToggleKeyEditor"), _("Key Bindings"), mem_fun(*this, &ARDOUR_UI::toggle_key_editor));
        ActionManager::register_toggle_action (common_actions, X_("ToggleBundleManager"), _("Bundle Manager"), mem_fun(*this, &ARDOUR_UI::toggle_bundle_manager));
 
-       act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal, 1));
+       act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal, (ARDOUR::RouteGroup *) 0, 1));
        ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, 1));
+       act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, (ARDOUR::RouteGroup *) 0, 1));
        ActionManager::session_sensitive_actions.push_back (act);
-       act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_midi_track), 1));
+       act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_midi_track), (ARDOUR::RouteGroup *) 0, 1));
        ActionManager::session_sensitive_actions.push_back (act);
        //act = ActionManager::register_action (common_actions, X_("AddMidiBus"), _("Add Midi Bus"), mem_fun(*this, &ARDOUR_UI::session_add_midi_bus));
        //ActionManager::session_sensitive_actions.push_back (act);
        act = ActionManager::register_action (common_actions, X_("Save"), _("Save"),  bind (mem_fun(*this, &ARDOUR_UI::save_state), string("")));
        ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
        act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), mem_fun(*this, &ARDOUR_UI::remove_last_capture));
        ActionManager::session_sensitive_actions.push_back (act);
 
@@ -246,10 +251,13 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
-       ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (mem_fun (*editor, &PublicEditor::toggle_playback), false));
+       act = ActionManager::register_action (transport_actions, X_("ToggleRoll"), _("Start/Stop"), bind (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"), bind (mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
-       ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), bind (mem_fun(*editor, &PublicEditor::toggle_playback), true));
+       act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), bind (mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false));
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
@@ -259,14 +267,13 @@ ARDOUR_UI::install_actions ()
           - otherwise do nothing
        */
 
-       ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition To Roll"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
-       ActionManager::session_sensitive_actions.push_back (act);
+       act = ActionManager::register_action (transport_actions, X_("TransitionToRoll"), _("Transition To Roll"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), true));
        ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::transport_sensitive_actions.push_back (act);
 
-       ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition To Reverse"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
+       act = ActionManager::register_action (transport_actions, X_("TransitionToReverse"), _("Transition To Reverse"), bind (mem_fun (*editor, &PublicEditor::transition_to_rolling), false));
        ActionManager::session_sensitive_actions.push_back (act);
-       ActionManager::session_sensitive_actions.push_back (act);
-
+       ActionManager::transport_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (transport_actions, X_("Loop"), _("Play Loop Range"), mem_fun(*this, &ARDOUR_UI::toggle_session_auto_loop));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -277,8 +284,10 @@ ARDOUR_UI::install_actions ()
 
        act = ActionManager::register_action (transport_actions, X_("Record"), _("Enable Record"), bind (mem_fun(*this, &ARDOUR_UI::transport_record), false));
        ActionManager::session_sensitive_actions.push_back (act);
+       ActionManager::write_sensitive_actions.push_back (act);
        act = ActionManager::register_action (transport_actions, X_("record-roll"), _("Start Recording"), bind (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"), bind (mem_fun(*this, &ARDOUR_UI::transport_rewind), 0));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -355,9 +364,12 @@ ARDOUR_UI::install_actions ()
        ActionManager::session_sensitive_actions.push_back (act);
        ActionManager::transport_sensitive_actions.push_back (act);
 
-       ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync startup to video"), mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
+       act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync startup to video"), mem_fun(*this, &ARDOUR_UI::toggle_video_sync));
+       ActionManager::session_sensitive_actions.push_back (act);
        act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), mem_fun(*this, &ARDOUR_UI::toggle_time_master));
        ActionManager::session_sensitive_actions.push_back (act);
+       act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), _(""), mem_fun(*this, &ARDOUR_UI::toggle_external_sync));
+       ActionManager::session_sensitive_actions.push_back (act);
 
        act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), bind (mem_fun(*this, &ARDOUR_UI::toggle_record_enable),  0U));
        ActionManager::session_sensitive_actions.push_back (act);
@@ -450,52 +462,6 @@ ARDOUR_UI::install_actions ()
        ActionManager::add_action_group (common_actions);
 }
 
-void
-ARDOUR_UI::toggle_control_protocol (ControlProtocolInfo* cpi)
-{
-       if (!session) {
-               /* this happens when we build the menu bar when control protocol support
-                  has been used in the past for some given protocol - the item needs
-                  to be made active, but there is no session yet.
-               */
-               return;
-       }
-
-       if (cpi->protocol == 0) {
-               ControlProtocolManager::instance().instantiate (*cpi);
-       } else {
-               ControlProtocolManager::instance().teardown (*cpi);
-       }
-}
-
-void
-ARDOUR_UI::toggle_control_protocol_feedback (ControlProtocolInfo* cpi, const char* group, string action)
-{
-       if (!session) {
-               /* this happens when we build the menu bar when control protocol support
-                  has been used in the past for some given protocol - the item needs
-                  to be made active, but there is no session yet.
-               */
-               return;
-       }
-
-       if (cpi->protocol) {
-               Glib::RefPtr<Gtk::Action> act = ActionManager::get_action (group, action.c_str());
-
-               if (act) {
-                       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
-
-                       if (tact) {
-                               bool x = tact->get_active();
-
-                               if (x != cpi->protocol->get_feedback()) {
-                                       cpi->protocol->set_feedback (x);
-                               }
-                       }
-               }
-       }
-}
-
 void
 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
 {
@@ -547,84 +513,9 @@ ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
        }
 }
 
-void
-ARDOUR_UI::build_control_surface_menu ()
-{
-       list<ControlProtocolInfo*>::iterator i;
-       bool with_feedback;
-
-       /* !!! this has to match the top level entry from ardour.menus */
-
-       string ui = "<menubar name='Main' action='MainMenu'>\n"
-               "<menu name='Options' action='Options'>\n"
-               "<menu action='ControlSurfaces'><separator/>\n";
-
-       for (i = ControlProtocolManager::instance().control_protocol_info.begin();
-                       i != ControlProtocolManager::instance().control_protocol_info.end(); ++i) {
-
-               if (!(*i)->mandatory) {
-
-                       // Enable surface
-
-                       string action_name = "Toggle";
-                       action_name += legalize_for_path ((*i)->name);
-                       action_name += "Surface";
-
-                       string action_label = (*i)->name;
-
-                       Glib::RefPtr<Action> act = ActionManager::register_toggle_action (
-                                       editor->editor_actions, action_name.c_str(), action_label.c_str(), (bind (
-                                                       mem_fun (*this, &ARDOUR_UI::toggle_control_protocol),
-                                                       *i)));
-
-                       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
-
-                       with_feedback = false;
-
-                       if ((*i)->protocol || (*i)->requested) {
-                               tact->set_active ();
-                       }
-
-                       ui += "<menuitem action='";
-                       ui += action_name;
-                       ui += "'/>\n";
-
-                       // Enable feedback
-
-                       if ((*i)->supports_feedback) {
-
-                               action_name += "Feedback";
-                               string feedback_label = action_label + " " + _("Feedback");
-
-                               Glib::RefPtr<Action> act = ActionManager::register_toggle_action (
-                                               editor->editor_actions, action_name.c_str(), feedback_label.c_str(), (bind (
-                                                               mem_fun (*this, &ARDOUR_UI::toggle_control_protocol_feedback),
-                                                               *i, "Editor", action_name)));
-                       
-                               ui += "<menuitem action='";
-                               ui += action_name;
-                               ui += "'/>\n";
-
-                               if ((*i)->protocol) {
-                                       Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
-                                       tact->set_active ((*i)->protocol->get_feedback ());
-                               }
-                       }
-               }
-       }
-
-       ui += "</menu>\n</menu>\n</menubar>\n";
-
-       ActionManager::ui_manager->add_ui_from_string (ui);
-}
-
 void
 ARDOUR_UI::build_menu_bar ()
 {
-       if (!Profile->get_sae()) {
-               build_control_surface_menu ();
-       }
-
        menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
        menu_bar->set_name ("MainMenuBar");
 
@@ -689,7 +580,6 @@ ARDOUR_UI::use_menubar_as_top_menubar ()
 #endif
 }
 
-
 void
 ARDOUR_UI::setup_clock ()
 {
@@ -701,12 +591,11 @@ ARDOUR_UI::setup_clock ()
        big_clock_window->set_border_width (0);
        big_clock_window->add  (big_clock);
 
-       WindowTitle title(Glib::get_application_name());
-       title += _("Clock");
-       big_clock_window->set_title (title.get_string());
-       big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_MENU);
+       big_clock_window->set_title (_("Big Clock"));
+       big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY);
        big_clock_window->signal_realize().connect (bind (sigc::ptr_fun (set_decoration), big_clock_window,  (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)));
        big_clock_window->signal_unmap().connect (bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleBigClock")));
+       big_clock_window->signal_key_press_event().connect (bind (sigc::ptr_fun (relay_key_press), big_clock_window), false);
 
        manage_window (*big_clock_window);
 }