X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=6a000d298190820f2e2464540748b7826b89ac11;hb=90ea64d1fc9e64347aca9df8c64ff0aeb674410d;hp=83931816be1780d98b50576c514cd83059036b24;hpb=8a3ebe7510195b7d7f2c3eba3ae75b0e76b8db70;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 83931816be..6a000d2981 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -21,18 +21,17 @@ #include "gtk2ardour-config.h" #endif -#include - #include #include +#include +#include +#include + +#include #include #include #include #include -#include -#include - -#include #include #include @@ -88,6 +87,7 @@ typedef uint64_t microseconds_t; #include "ambiguous_file_dialog.h" #include "ardour_ui.h" #include "audio_clock.h" +#include "big_clock_window.h" #include "bundle_manager.h" #include "engine_dialog.h" #include "gain_meter.h" @@ -95,6 +95,7 @@ typedef uint64_t microseconds_t; #include "gui_object.h" #include "gui_thread.h" #include "keyboard.h" +#include "keyeditor.h" #include "location_ui.h" #include "main_clock.h" #include "missing_file_dialog.h" @@ -106,8 +107,11 @@ typedef uint64_t microseconds_t; #include "processor_box.h" #include "prompter.h" #include "public_editor.h" +#include "rc_option_editor.h" #include "route_time_axis.h" +#include "route_params_ui.h" #include "session_metadata_dialog.h" +#include "session_option_editor.h" #include "shuttle_control.h" #include "speaker_dialog.h" #include "splash.h" @@ -115,13 +119,10 @@ typedef uint64_t microseconds_t; #include "theme_manager.h" #include "time_axis_view_item.h" #include "utils.h" -#include "window_proxy.h" -#ifdef WITH_VIDEOTIMELINE #include "video_server_dialog.h" #include "add_video_dialog.h" #include "transcode_video_dialog.h" -#include "system_exec.h" /* to launch video-server */ -#endif +#include "system_exec.h" #include "i18n.h" @@ -138,18 +139,29 @@ sigc::signal ARDOUR_UI::Blink; sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; sigc::signal ARDOUR_UI::Clock; +sigc::signal ARDOUR_UI::CloseAllDialogs; ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) : Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp) - + , gui_object_state (new GUIObjectState) + , primary_clock (new MainClock (X_("primary"), false, X_("transport"), true, true, true, false, true)) , secondary_clock (new MainClock (X_("secondary"), false, X_("secondary"), true, true, false, false, true)) /* big clock */ , big_clock (new AudioClock (X_("bigclock"), false, "big", true, true, false, false)) + , video_timeline(0) + + /* start of private members */ + + , _startup (0) + , engine (0) + , nsm (0) + , _was_dirty (false) + , _mixer_on_top (false) /* transport */ @@ -169,6 +181,23 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , solo_alert_button (_("solo")) , feedback_alert_button (_("feedback")) + , editor_meter(0) + + , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) + , theme_manager (X_("theme-manager"), _("Theme Manager")) + , key_editor (X_("key-editor"), _("Key Bindings")) + , rc_option_editor (X_("rc-options-editor"), _("Preferences")) + , add_route_dialog (X_("add-routes"), _("Add Tracks/Busses")) + , about (X_("about"), _("About")) + , location_ui (X_("locations"), _("Locations")) + , route_params (X_("inspector"), _("Tracks and Busses")) + , session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this)) + , add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this)) + , bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this)) + , big_clock_window (X_("big-clock"), _("Big Clock"), boost::bind (&ARDOUR_UI::create_big_clock_window, this)) + , audio_port_matrix (X_("audio-connection-manager"), _("Audio Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::AUDIO)) + , midi_port_matrix (X_("midi-connection-manager"), _("MIDI Connections"), boost::bind (&ARDOUR_UI::create_global_port_matrix, this, ARDOUR::DataType::MIDI)) + , error_log_button (_("Errors")) , _status_bar_visibility (X_("status-bar")) @@ -177,47 +206,28 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) { Gtkmm2ext::init(localedir); - about = 0; splash = 0; - _startup = 0; if (theArdourUI == 0) { theArdourUI = this; } ui_config = new UIConfiguration(); - theme_manager = new ThemeManager(); - - key_editor = 0; editor = 0; mixer = 0; + meterbridge = 0; editor = 0; engine = 0; _session_is_new = false; - big_clock_window = 0; - big_clock_height = 0; - big_clock_resize_in_progress = false; session_selector_window = 0; last_key_press_time = 0; - add_route_dialog = 0; -#ifdef WITH_VIDEOTIMELINE - add_video_dialog = 0; video_server_process = 0; -#endif - route_params = 0; - bundle_manager = 0; - rc_option_editor = 0; - session_option_editor = 0; - location_ui = 0; open_session_selector = 0; have_configure_timeout = false; have_disk_speed_dialog_displayed = false; session_loaded = false; ignore_dual_punch = false; - original_big_clock_width = -1; - original_big_clock_height = -1; - original_big_clock_font_size = 0; roll_button.set_controllable (roll_controllable); stop_button.set_controllable (stop_controllable); @@ -311,26 +321,53 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) TimeAxisViewItem::set_constant_heights (); - /* The following must happen after ARDOUR::init() so that Config is set up */ - - location_ui = new ActionWindowProxy (X_("locations"), Config->extra_xml (X_("UI")), X_("ToggleLocations")); - big_clock_window = new ActionWindowProxy (X_("bigclock"), Config->extra_xml (X_("UI")), X_("ToggleBigClock")); - speaker_config_window = new ActionWindowProxy (X_("speakerconf"), Config->extra_xml (X_("UI")), X_("toggle-speaker-config")); - - for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) { - _global_port_matrix[*i] = new ActionWindowProxy ( - string_compose ("GlobalPortMatrix-%1", (*i).to_string()), - Config->extra_xml (X_("UI")), - string_compose ("toggle-%1-connection-manager", (*i).to_string()) - ); - } + /* Set this up so that our window proxies can register actions */ - setup_clock (); + ActionManager::init (); - SpeakerDialog* s = new SpeakerDialog (); - s->signal_unmap().connect (sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), X_("/Common/toggle-speaker-config"))); - speaker_config_window->set (s); + /* The following must happen after ARDOUR::init() so that Config is set up */ + const XMLNode* ui_xml = Config->extra_xml (X_("UI")); + + if (ui_xml) { + theme_manager.set_state (*ui_xml); + key_editor.set_state (*ui_xml); + rc_option_editor.set_state (*ui_xml); + session_option_editor.set_state (*ui_xml); + speaker_config_window.set_state (*ui_xml); + about.set_state (*ui_xml); + add_route_dialog.set_state (*ui_xml); + add_video_dialog.set_state (*ui_xml); + route_params.set_state (*ui_xml); + bundle_manager.set_state (*ui_xml); + location_ui.set_state (*ui_xml); + big_clock_window.set_state (*ui_xml); + audio_port_matrix.set_state (*ui_xml); + midi_port_matrix.set_state (*ui_xml); + } + + WM::Manager::instance().register_window (&theme_manager); + WM::Manager::instance().register_window (&key_editor); + WM::Manager::instance().register_window (&rc_option_editor); + WM::Manager::instance().register_window (&session_option_editor); + WM::Manager::instance().register_window (&speaker_config_window); + WM::Manager::instance().register_window (&about); + WM::Manager::instance().register_window (&add_route_dialog); + WM::Manager::instance().register_window (&add_video_dialog); + WM::Manager::instance().register_window (&route_params); + WM::Manager::instance().register_window (&bundle_manager); + WM::Manager::instance().register_window (&location_ui); + WM::Manager::instance().register_window (&big_clock_window); + WM::Manager::instance().register_window (&audio_port_matrix); + WM::Manager::instance().register_window (&midi_port_matrix); + + /* We need to instantiate the theme manager because it loads our + theme files. This should really change so that its window + and its functionality are separate + */ + + (void) theme_manager.get (true); + starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup)); stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown)); @@ -340,6 +377,14 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets)); } +GlobalPortMatrixWindow* +ARDOUR_UI::create_global_port_matrix (ARDOUR::DataType type) +{ + if (!_session) { + return 0; + } + return new GlobalPortMatrixWindow (_session, type); +} int ARDOUR_UI::create_engine () @@ -381,12 +426,10 @@ ARDOUR_UI::post_engine () ARDOUR::init_post_engine (); - /* load up the UI manager */ - - ActionManager::init (); - _tooltips.enable(); + ActionManager::load_menus (); + if (setup_windows ()) { throw failed_constructor (); } @@ -470,11 +513,9 @@ ARDOUR_UI::~ARDOUR_UI () delete keyboard; delete editor; delete mixer; - delete add_route_dialog; -#ifdef WITH_VIDEOTIMELINE - if (add_video_dialog) delete add_video_dialog; + delete meterbridge; + stop_video_server(); -#endif } void @@ -660,7 +701,6 @@ ARDOUR_UI::startup () app->ready (); nsm_url = getenv ("NSM_URL"); - nsm = 0; if (nsm_url) { nsm = new NSM_Client; @@ -718,14 +758,7 @@ ARDOUR_UI::startup () goto_editor_window (); - /* Add the window proxies here; their addition may cause windows to be opened, and we want them - to be opened on top of the editor window that goto_editor_window() just opened. - */ - add_window_proxy (location_ui); - add_window_proxy (big_clock_window); - for (ARDOUR::DataType::iterator i = ARDOUR::DataType::begin(); i != ARDOUR::DataType::end(); ++i) { - add_window_proxy (_global_port_matrix[*i]); - } + WM::Manager::instance().show_visible (); /* We have to do this here since goto_editor_window() ends up calling show_all() on the * editor window, and we may want stuff to be hidden. @@ -785,13 +818,13 @@ ARDOUR_UI::check_memory_locking () "runs out of memory. \n\n" "You can view the memory limit with 'ulimit -l', " "and it is normally controlled by %2"), - PROGRAM_NAME).c_str(), + PROGRAM_NAME, #ifdef __FreeBSD__ - X_("/etc/login.conf") + X_("/etc/login.conf") #else - X_(" /etc/security/limits.conf") + X_(" /etc/security/limits.conf") #endif - ); + ).c_str()); msg.set_default_response (RESPONSE_OK); @@ -834,13 +867,8 @@ ARDOUR_UI::idle_finish () void ARDOUR_UI::finish() { -#ifdef WITH_VIDEOTIMELINE - /* close video-monitor & pending requests - * would better be done in ~Editor() but that is not called.. - */ - ARDOUR_UI::instance()->video_timeline->close_session(); -#endif if (_session) { + ARDOUR_UI::instance()->video_timeline->sync_session_state(); if (_session->dirty()) { vector actions; @@ -849,7 +877,6 @@ ARDOUR_UI::finish() actions.push_back (_("Save and quit")); switch (ask_about_saving_session(actions)) { case -1: - ARDOUR_UI::instance()->video_timeline->set_session(_session); return; break; case 1: @@ -873,14 +900,12 @@ If you still wish to quit, please use the\n\n\ second_connection.disconnect (); point_one_second_connection.disconnect (); - point_oh_five_second_connection.disconnect (); - point_zero_one_second_connection.disconnect(); + point_zero_something_second_connection.disconnect(); } -#ifdef WITH_VIDEOTIMELINE delete ARDOUR_UI::instance()->video_timeline; + ARDOUR_UI::instance()->video_timeline = NULL; stop_video_server(); -#endif /* Save state before deleting the session, as that causes some windows to be destroyed before their visible state can be @@ -888,6 +913,8 @@ If you still wish to quit, please use the\n\n\ */ save_ardour_state (); + close_all_dialogs (); + loading_message (string_compose (_("Please wait while %1 cleans up..."), PROGRAM_NAME)); if (_session) { @@ -898,7 +925,6 @@ If you still wish to quit, please use the\n\n\ _session = 0; } - ArdourDialog::close_all_dialogs (); engine->stop (true); quit (); } @@ -945,7 +971,6 @@ ARDOUR_UI::ask_about_saving_session (const vector& actions) window.get_vbox()->pack_start (dhbox); window.set_name (_("Prompter")); - window.set_position (Gtk::WIN_POS_MOUSE); window.set_modal (true); window.set_resizable (false); @@ -1005,11 +1030,14 @@ ARDOUR_UI::every_point_one_seconds () } gint -ARDOUR_UI::every_point_zero_one_seconds () +ARDOUR_UI::every_point_zero_something_seconds () { - // august 2007: actual update frequency: 40Hz, not 100Hz + // august 2007: actual update frequency: 25Hz (40ms), not 100Hz SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ + if (editor_meter) { + editor_meter->update_meters(); + } return TRUE; } @@ -1379,8 +1407,6 @@ ARDOUR_UI::open_recent_session () while (true) { - session_selector_window->set_position (WIN_POS_MOUSE); - ResponseType r = (ResponseType) session_selector_window->run (); switch (r) { @@ -1467,7 +1493,14 @@ ARDOUR_UI::open_session () open_session_selector->set_current_folder(Config->get_default_session_parent_dir()); } - open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir()); + string default_session_folder = Config->get_default_session_parent_dir(); + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + open_session_selector->add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } FileFilter session_filter; session_filter.add_pattern ("*.ardour"); @@ -2318,11 +2351,7 @@ ARDOUR_UI::save_state (const string & name, bool switch_to_it) { XMLNode* node = new XMLNode (X_("UI")); - for (list::iterator i = _window_proxies.begin(); i != _window_proxies.end(); ++i) { - if (!(*i)->rc_configured()) { - node->add_child_nocopy (*((*i)->get_state ())); - } - } + WM::Manager::instance().add_state (*node); node->add_child_nocopy (gui_object_state->get_state()); @@ -2556,11 +2585,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri * treat a non-dirty session this way, so that it stays visible * as we bring up the new session dialog. */ -#ifdef WITH_VIDEOTIMELINE + if (_session && ARDOUR_UI::instance()->video_timeline) { - ARDOUR_UI::instance()->video_timeline->close_session(); + ARDOUR_UI::instance()->video_timeline->sync_session_state(); } -#endif + if (_session && _session->dirty()) { if (unload_session (false)) { /* unload cancelled by user */ @@ -2745,9 +2774,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri void ARDOUR_UI::close_session() { -#ifdef WITH_VIDEOTIMELINE - ARDOUR_UI::instance()->video_timeline->close_session(); -#endif if (!check_audioengine()) { return; } @@ -2960,18 +2986,6 @@ ARDOUR_UI::launch_chat () #endif } -void -ARDOUR_UI::show_about () -{ - if (about == 0) { - about = new About; - about->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::about_signal_response)); - } - - about->set_transient_for(*editor); - about->show_all (); -} - void ARDOUR_UI::launch_manual () { @@ -2984,21 +2998,6 @@ ARDOUR_UI::launch_reference () PBD::open_uri (Config->get_reference_manual_url()); } -void -ARDOUR_UI::hide_about () -{ - if (about) { - about->get_window()->set_cursor (); - about->hide (); - } -} - -void -ARDOUR_UI::about_signal_response (int /*response*/) -{ - hide_about(); -} - void ARDOUR_UI::loading_message (const std::string& msg) { @@ -3259,19 +3258,15 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) return; } - if (add_route_dialog == 0) { - add_route_dialog = new AddRouteDialog (_session); - add_route_dialog->set_position (WIN_POS_MOUSE); - if (float_window) { - add_route_dialog->set_transient_for (*float_window); - } - } - if (add_route_dialog->is_visible()) { /* we're already doing this */ return; } + if (float_window) { + add_route_dialog->set_transient_for (*float_window); + } + ResponseType r = (ResponseType) add_route_dialog->run (); add_route_dialog->hide(); @@ -3339,7 +3334,6 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) /* idle connection will end at scope end */ } -#ifdef WITH_VIDEOTIMELINE void ARDOUR_UI::stop_video_server (bool ask_confirm) { @@ -3444,9 +3438,28 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg) Config->set_video_advanced_setup(true); } + if (video_server_process) { + delete video_server_process; + } + video_server_process = new SystemExec(icsd_exec, argp); - video_server_process->start(); - sleep(1); + if (video_server_process->start()) { + warning << _("Cannot launch the video-server") << endmsg; + continue; + } + int timeout = 120; // 6 sec + while (!ARDOUR_UI::instance()->video_timeline->check_server()) { + usleep (50000); + if (--timeout <= 0 || !video_server_process->is_running()) break; + } + if (timeout <= 0) { + warning << _("Video-server was started but does not respond to requests...") << endmsg; + } else { + if (!ARDOUR_UI::instance()->video_timeline->check_server_docroot()) { + delete video_server_process; + video_server_process = 0; + } + } } return true; } @@ -3463,23 +3476,25 @@ ARDOUR_UI::add_video (Gtk::Window* float_window) return; } - if (add_video_dialog == 0) { - add_video_dialog = new AddVideoDialog (_session); - if (float_window) { - add_video_dialog->set_transient_for (*float_window); - } + if (float_window) { + add_video_dialog->set_transient_for (*float_window); } if (add_video_dialog->is_visible()) { /* we're already doing this */ return; } + ResponseType r = (ResponseType) add_video_dialog->run (); add_video_dialog->hide(); if (r != RESPONSE_ACCEPT) { return; } - bool local_file; + bool local_file, orig_local_file; std::string path = add_video_dialog->file_name(local_file); + + std::string orig_path = path; + orig_local_file = local_file; + bool auto_set_session_fps = add_video_dialog->auto_set_session_fps(); if (local_file && !Glib::file_test(path, Glib::FILE_TEST_EXISTS)) { @@ -3538,6 +3553,11 @@ ARDOUR_UI::add_video (Gtk::Window* float_window) node->add_property (X_("Filename"), path); node->add_property (X_("AutoFPS"), auto_set_session_fps?X_("1"):X_("0")); node->add_property (X_("LocalFile"), local_file?X_("1"):X_("0")); + if (orig_local_file) { + node->add_property (X_("OriginalVideoFile"), orig_path); + } else { + node->remove_property (X_("OriginalVideoFile")); + } _session->add_extra_xml (*node); _session->set_dirty (); @@ -3580,7 +3600,6 @@ ARDOUR_UI::flush_videotimeline_cache (bool localcacheonly) } editor->queue_visual_videotimeline_update(); } -#endif XMLNode* ARDOUR_UI::mixer_settings () const @@ -3788,12 +3807,14 @@ audio may be played at the wrong sample rate.\n"), desired, PROGRAM_NAME, actual image->show(); hbox->show(); - switch (dialog.run ()) { + switch (dialog.run()) { case RESPONSE_ACCEPT: return 0; default: - return 1; + break; } + + return 1; } @@ -3847,15 +3868,12 @@ ARDOUR_UI::update_transport_clocks (framepos_t pos) secondary_clock->set (pos); } - if (big_clock_window->get()) { + if (big_clock_window) { big_clock->set (pos); } -#ifdef WITH_VIDEOTIMELINE ARDOUR_UI::instance()->video_timeline->manual_seek_video_monitor(pos); -#endif } - void ARDOUR_UI::step_edit_status_change (bool yn) { @@ -3876,7 +3894,7 @@ ARDOUR_UI::record_state_changed () { ENSURE_GUI_THREAD (*this, &ARDOUR_UI::record_state_changed); - if (!_session || !big_clock_window->get()) { + if (!_session || !big_clock_window) { /* why bother - the clock isn't visible */ return; } @@ -4015,26 +4033,6 @@ ARDOUR_UI::setup_profile () } } -/** Add a window proxy to our list, so that its state will be saved. - * This call also causes the window to be created and opened if its - * state was saved as `visible'. - */ -void -ARDOUR_UI::add_window_proxy (WindowProxyBase* p) -{ - _window_proxies.push_back (p); - p->maybe_show (); -} - -/** Remove a window proxy from our list. Must be called if a WindowProxy - * is deleted, to prevent hanging pointers. - */ -void -ARDOUR_UI::remove_window_proxy (WindowProxyBase* p) -{ - _window_proxies.remove (p); -} - int ARDOUR_UI::missing_file (Session*s, std::string str, DataType type) { @@ -4121,3 +4119,29 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat msg.run (); } + + +void +ARDOUR_UI::reset_peak_display () +{ + if (!_session || !_session->master_out() || !editor_meter) return; + editor_meter->clear_meters(); +} + +void +ARDOUR_UI::reset_group_peak_display (RouteGroup* group) +{ + if (!_session || !_session->master_out()) return; + if (group == _session->master_out()->route_group()) { + reset_peak_display (); + } +} + +void +ARDOUR_UI::reset_route_peak_display (Route* route) +{ + if (!_session || !_session->master_out()) return; + if (_session->master_out().get() == route) { + reset_peak_display (); + } +}