ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
: Gtkmm2ext::UI (PROGRAM_NAME, X_("gui"), argcp, argvp)
- , Gtkmm2ext::ActionMapOwner (X_("global"))
, session_load_in_progress (false)
, gui_object_state (new GUIObjectState)
, primary_clock (new MainClock (X_("primary"), X_("transport"), true ))
, _was_dirty (false)
, _mixer_on_top (false)
, _initial_verbose_plugin_scan (false)
- , first_time_engine_run (true)
+ , _shared_popup_menu (0)
, secondary_clock_spacer (0)
, auto_input_button (ArdourButton::led_default_elements)
, time_info_box (0)
, error_alert_button ( ArdourButton::just_led_default_elements )
, editor_meter_peak_display()
, editor_meter(0)
- , _suspend_editor_meter_callbacks (false)
, _numpad_locate_happening (false)
, _session_is_new (false)
, last_key_press_time (0)
MessageDialog msg (string_compose (_("Your configuration files were copied. You can now restart %1."), PROGRAM_NAME), true);
msg.run ();
/* configuration was modified, exit immediately */
- _exit (0);
+ _exit (EXIT_SUCCESS);
}
xmlSetGenericErrorFunc (this, libxml_generic_error_func);
xmlSetStructuredErrorFunc (this, libxml_structured_error_func);
+ /* Set this up early */
+
+ ActionManager::init ();
+
+ /* we like keyboards */
+
+ keyboard = new ArdourKeyboard(*this);
+
+ XMLNode* node = ARDOUR_UI::instance()->keyboard_settings();
+ if (node) {
+ keyboard->set_state (*node, Stateful::loading_state_version);
+ }
+
+ /* actions do not need to be defined when we load keybindings. They
+ * will be lazily discovered. But bindings do need to exist when we
+ * create windows/tabs with their own binding sets.
+ */
+
+ keyboard->setup_keybindings ();
+
+ if ((global_bindings = Bindings::get_bindings (X_("Global"))) == 0) {
+ error << _("Global keybindings are missing") << endmsg;
+ }
+
+ install_actions ();
+
UIConfiguration::instance().ParameterChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed));
boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
UIConfiguration::instance().map_parameters (pc);
SessionEvent::create_per_thread_pool ("GUI", 4096);
- /* we like keyboards */
-
- keyboard = new ArdourKeyboard(*this);
-
- XMLNode* node = ARDOUR_UI::instance()->keyboard_settings();
- if (node) {
- keyboard->set_state (*node, Stateful::loading_state_version);
- }
-
UIConfiguration::instance().reset_dpi ();
TimeAxisViewItem::set_constant_heights ();
- /* Set this up so that our window proxies can register actions */
-
- ActionManager::init ();
-
/* The following must happen after ARDOUR::init() so that Config is set up */
const XMLNode* ui_xml = Config->extra_xml (X_("UI"));
though it may be so, depending on your workflow.\n\
2) Please wait for a helpful writeup of new features.\n\
3) <b>Please do NOT use the forums at ardour.org to report issues</b>.\n\
-4) Please <b>DO</b> use the bugtracker at http://tracker.ardour.org/ to report issues\n\
- making sure to note the product version number as 6.0-pre.\n\
-5) Please <b>DO</b> use the ardour-users mailing list to discuss ideas and pass on comments.\n\
-6) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. You\n\
+4) <b>Please do NOT file bugs for this alpha-development versions at this point in time</b>.\n\
+ There is no bug triaging before the initial development concludes and\n\
+ reporting issue for incomplete, ongoing work-in-progress is mostly useless.\n\
+5) Please <b>DO</b> join us on IRC for real time discussions about %1 %2. You\n\
can get there directly from within the program via the Help->Chat menu option.\n\
+6) Please <b>DO</b> submit patches for issues after discussing them on IRC.\n\
\n\
Full information on all the above can be found on the support page at\n\
\n\
void
ARDOUR_UI::attach_to_engine ()
{
- AudioEngine::instance()->Running.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_running, this), gui_context());
+ AudioEngine::instance()->Running.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_running, this, _1), gui_context());
ARDOUR::Port::set_connecting_blocked (ARDOUR_COMMAND_LINE::no_connect_ports);
}
}
void
-ARDOUR_UI::engine_running ()
+ARDOUR_UI::engine_running (uint32_t cnt)
{
- ENSURE_GUI_THREAD (*this, &ARDOUR_UI::engine_running)
- if (first_time_engine_run) {
+ if (cnt == 0) {
post_engine();
- first_time_engine_run = false;
}
if (_session) {
}
#endif
- ARDOUR::init_post_engine ();
-
/* connect to important signals */
AudioEngine::instance()->Stopped.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_stopped, this), gui_context());
halt_connection.disconnect ();
AudioEngine::instance()->stop ();
- exit (0);
+ exit (EXIT_SUCCESS);
}
output << " <tr><th>Action Name</th><th>Menu Name</th></tr>" << endl;
output << " </thead>\n <tbody>" << endl;
- Gtkmm2ext::ActionMap::get_all_actions (paths, labels, tooltips, keys, actions);
+ ActionManager::get_all_actions (paths, labels, tooltips, keys, actions);
vector<string>::iterator p;
vector<string>::iterator l;
for (p = paths.begin(), l = labels.begin(); p != paths.end(); ++p, ++l) {
- output << " <tr><th><kbd class=\"osc\">" << (*p).substr (10, string::npos);
- output << "</kbd></th><td>" << *l << "</td></tr>" << endl;
+ output << " <tr><th><kbd class=\"osc\">" << *p << "</kbd></th><td>" << *l << "</td></tr>" << endl;
}
output << " </tbody>\n </table>" << endl;
halt_connection.disconnect ();
AudioEngine::instance()->stop ();
- exit (0);
+ exit (EXIT_SUCCESS);
}
/* this being a GUI and all, we want peakfiles */
delete rc_option_editor; rc_option_editor = 0; // failed to wrap object warning
delete nsm; nsm = 0;
delete gui_object_state; gui_object_state = 0;
+ delete _shared_popup_menu ; _shared_popup_menu = 0;
delete main_window_visibility;
FastMeter::flush_pattern_cache ();
ArdourFader::flush_pattern_cache ();
c.signal_toggled().connect (sigc::hide_return (sigc::bind (sigc::ptr_fun (toggle_file_existence), path)));
if (d.run () != RESPONSE_OK) {
- _exit (0);
+ _exit (EXIT_SUCCESS);
}
}
#endif
recent_session_dialog.hide();
return;
} else {
- exit (1);
+ exit (EXIT_FAILURE);
}
}
ARDOUR_COMMAND_LINE::session_name = "";
if (get_session_parameters (true, false)) {
- exit (1);
+ exit (EXIT_FAILURE);
}
}
}
if (ret == -2) {
/* not connected to the AudioEngine, so quit to avoid an infinite loop */
- exit (1);
+ exit (EXIT_FAILURE);
}
if (!ARDOUR_COMMAND_LINE::immediate_save.empty()) {
_session->save_state (ARDOUR_COMMAND_LINE::immediate_save, false);
- exit (1);
+ exit (EXIT_FAILURE);
}
/* clear this to avoid endless attempts to load the
ARDOUR_COMMAND_LINE::session_name = "";
if (get_session_parameters (true, false)) {
- exit (1);
+ exit (EXIT_FAILURE);
}
}
switch (response) {
case RESPONSE_CANCEL:
- exit (1);
+ exit (EXIT_FAILURE);
default:
break;
}
default:
return;
}
+ checker.hide();
ARDOUR::CleanupReport rep;
editor->prepare_for_cleanup ();
/* do not allow flush until a session is reloaded */
-
- Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
- if (act) {
- act->set_sensitive (false);
- }
+ ActionManager::get_action (X_("Main"), X_("FlushWastebasket"))->set_sensitive (false);
if (_session->cleanup_sources (rep)) {
editor->finish_cleanup ();
editor->finish_cleanup ();
- checker.hide();
display_cleanup_results (rep, _("Cleaned Files"), false);
}
msg.run ();
}
-void
-ARDOUR_UI::add_editor_meter_type_item (Menu_Helpers::MenuList& items, RadioMenuItem::Group& group, string const & name, MeterType type)
-{
- using namespace Menu_Helpers;
-
- items.push_back (RadioMenuElem (group, name, sigc::bind (sigc::mem_fun (editor_meter, &LevelMeterHBox::set_meter_type), type)));
- RadioMenuItem* i = dynamic_cast<RadioMenuItem *> (&items.back ());
- i->set_active (editor_meter->meter_type () == type);
-}
-
-void
-ARDOUR_UI::popup_editor_meter_menu (GdkEventButton* ev)
-{
- using namespace Gtk::Menu_Helpers;
-
- Gtk::Menu* m = manage (new Menu);
- MenuList& items = m->items ();
-
- RadioMenuItem::Group group;
-
- _suspend_editor_meter_callbacks = true;
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK12), MeterK12);
- add_editor_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU);
-
- m->popup (ev->button, ev->time);
- _suspend_editor_meter_callbacks = false;
-}
-
-bool
-ARDOUR_UI::editor_meter_button_press (GdkEventButton* ev)
-{
- if (ev->button == 3 && editor_meter) {
- popup_editor_meter_menu (ev);
- return true;
- }
- return false;
-}
-
void
ARDOUR_UI::reset_peak_display ()
{
_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: toggle_session_auto_loop(); break;
- case 5: transport_record(false); toggle_session_auto_loop(); break;
- case 6: toggle_punch(); break;
- case 7: toggle_click(); break;
- case 8: toggle_auto_return(); break;
- case 9: toggle_follow_edits(); break;
+ 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: toggle_session_auto_loop(); break;
+ case 5: transport_record(false); toggle_session_auto_loop(); break;
+ case 6: toggle_punch(); break;
+ case 7: toggle_click(); break;
+ case 8: toggle_auto_return(); break;
+ case 9: toggle_follow_edits(); break;
}
}
}
case Gtk::RESPONSE_NO:
/* save and quit */
save_state_canfail ("");
- exit (0);
+ exit (EXIT_SUCCESS);
break;
case Gtk::RESPONSE_CANCEL:
}
}
- DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tnot yet handled, try global bindings (%1)\n", global_bindings));
if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
}
}
- DEBUG_TRACE (DEBUG::Accelerators, "\tnot yet handled, try global bindings\n");
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tnot yet handled, try global bindings (%1)\n", global_bindings));
if (global_bindings && global_bindings->activate (k, Bindings::Press)) {
DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
return true;
}
-void
-ARDOUR_UI::load_bindings ()
-{
- if ((global_bindings = Bindings::get_bindings (X_("Global"), myactions)) == 0) {
- error << _("Global keybindings are missing") << endmsg;
- }
-}
-
void
ARDOUR_UI::cancel_solo ()
{
}
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
- Glib::RefPtr<Action> act = find_action (X_("Monitor"), "monitor-dim-all");
- assert (act); Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- assert (tact); _monitor->set_dim_all (tact->get_active());
+ Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-dim-all");
+ _monitor->set_dim_all (tact->get_active());
}
void
}
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
- Glib::RefPtr<Action> act = find_action (X_("Monitor"), "monitor-cut-all");
- assert (act); Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- assert (tact); _monitor->set_cut_all (tact->get_active());
+ Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-cut-all");
+ _monitor->set_cut_all (tact->get_active());
}
void
}
boost::shared_ptr<ARDOUR::MonitorProcessor> _monitor = mon->monitor_control ();
- Glib::RefPtr<Action> act = find_action (X_("Monitor"), "monitor-mono");
- assert (act); Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
- assert (tact);_monitor->set_mono (tact->get_active());
+ Glib::RefPtr<ToggleAction> tact = ActionManager::get_toggle_action (X_("Monitor"), "monitor-mono");
+ _monitor->set_mono (tact->get_active());
+}
+
+Gtk::Menu*
+ARDOUR_UI::shared_popup_menu ()
+{
+ ENSURE_GUI_THREAD (*this, &ARDOUR_UI::shared_popup_menu, ignored);
+
+ assert (!_shared_popup_menu || !_shared_popup_menu->is_visible());
+ delete _shared_popup_menu;
+ _shared_popup_menu = new Gtk::Menu;
+ return _shared_popup_menu;
}