Wrap calls to add_shortcut_folder() in try { ... } block.
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 1d08d65215ac3785d86cee8587724f70315f4e0c..556dee99feaa4d3d0e0237341b6db8a2b7bb7607 100644 (file)
@@ -27,8 +27,6 @@
 #include <cerrno>
 #include <fstream>
 
-#include <boost/locale.hpp>
-
 #include <stdint.h>
 #include <fcntl.h>
 #include <signal.h>
@@ -146,14 +144,24 @@ sigc::signal<void>      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 */
 
@@ -197,7 +205,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        Gtkmm2ext::init(localedir);
 
        splash = 0;
-       _startup = 0;
 
        if (theArdourUI == 0) {
                theArdourUI = this;
@@ -207,6 +214,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        editor = 0;
        mixer = 0;
+       meterbridge = 0;
        editor = 0;
        engine = 0;
        _session_is_new = false;
@@ -311,7 +319,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        TimeAxisViewItem::set_constant_heights ();
 
-       /* load up the UI manager */
+        /* Set this up so that our window proxies can register actions */
 
        ActionManager::init ();
 
@@ -336,20 +344,20 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
                midi_port_matrix.set_state (*ui_xml);
        }
 
-       WindowManager::instance().register_window (&theme_manager);
-       WindowManager::instance().register_window (&key_editor);
-       WindowManager::instance().register_window (&rc_option_editor);
-       WindowManager::instance().register_window (&session_option_editor);
-       WindowManager::instance().register_window (&speaker_config_window);
-       WindowManager::instance().register_window (&about);
-       WindowManager::instance().register_window (&add_route_dialog);
-       WindowManager::instance().register_window (&add_video_dialog);
-       WindowManager::instance().register_window (&route_params);
-       WindowManager::instance().register_window (&bundle_manager);
-       WindowManager::instance().register_window (&location_ui);
-       WindowManager::instance().register_window (&big_clock_window);
-       WindowManager::instance().register_window (&audio_port_matrix);
-       WindowManager::instance().register_window (&midi_port_matrix);
+       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
@@ -418,6 +426,8 @@ ARDOUR_UI::post_engine ()
 
        _tooltips.enable();
 
+       ActionManager::load_menus ();
+
        if (setup_windows ()) {
                throw failed_constructor ();
        }
@@ -501,6 +511,7 @@ ARDOUR_UI::~ARDOUR_UI ()
        delete keyboard;
        delete editor;
        delete mixer;
+       delete meterbridge;
 
        stop_video_server();
 }
@@ -688,7 +699,6 @@ ARDOUR_UI::startup ()
        app->ready ();
 
        nsm_url = getenv ("NSM_URL");
-       nsm = 0;
 
        if (nsm_url) {
                nsm = new NSM_Client;
@@ -746,7 +756,7 @@ ARDOUR_UI::startup ()
 
        goto_editor_window ();
 
-       WindowManager::instance().show_visible ();
+       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.
@@ -806,13 +816,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);
 
@@ -888,11 +898,11 @@ 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();
        }
 
        delete ARDOUR_UI::instance()->video_timeline;
+       ARDOUR_UI::instance()->video_timeline = NULL;
        stop_video_server();
 
        /* Save state before deleting the session, as that causes some
@@ -1018,9 +1028,9 @@ 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 */
        return TRUE;
@@ -1478,7 +1488,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");
@@ -2329,7 +2346,7 @@ ARDOUR_UI::save_state (const string & name, bool switch_to_it)
 {
        XMLNode* node = new XMLNode (X_("UI"));
 
-       WindowManager::instance().add_state (*node);
+       WM::Manager::instance().add_state (*node);
 
        node->add_child_nocopy (gui_object_state->get_state());
 
@@ -3416,9 +3433,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;
 }
@@ -3448,8 +3484,12 @@ ARDOUR_UI::add_video (Gtk::Window* float_window)
        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)) {
@@ -3508,6 +3548,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 ();