move SystemExec to libpbd
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 8487d1d547a9ede6869d61fb288787e70a42d3c0..9781bd01d9d53911d22b89a42ec38c19b859bc34 100644 (file)
 #include <cerrno>
 #include <fstream>
 
+#ifndef PLATFORM_WINDOWS
+#include <sys/resource.h>
+#endif
+
 #include <stdint.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <unistd.h>
 #include <time.h>
 
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <sys/sysctl.h>
+#include <glib.h>
+#include <glib/gstdio.h>
 
 #include <gtkmm/messagedialog.h>
 #include <gtkmm/accelmap.h>
@@ -48,6 +51,8 @@
 #include "pbd/memento_command.h"
 #include "pbd/openuri.h"
 #include "pbd/file_utils.h"
+#include "pbd/localtime_r.h"
+#include "pbd/system_exec.h"
 
 #include "gtkmm2ext/application.h"
 #include "gtkmm2ext/bindings.h"
@@ -123,7 +128,6 @@ typedef uint64_t microseconds_t;
 #include "video_server_dialog.h"
 #include "add_video_dialog.h"
 #include "transcode_video_dialog.h"
-#include "system_exec.h"
 
 #include "i18n.h"
 
@@ -162,6 +166,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        , _was_dirty (false)
        , _mixer_on_top (false)
        , first_time_engine_run (true)
+       , blink_timeout_tag (-1)
 
          /* transport */
 
@@ -215,6 +220,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        ui_config = new UIConfiguration();
 
+       ui_config->ParameterChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed));
+       boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
+       ui_config->map_parameters (pc);
+
        editor = 0;
        mixer = 0;
        meterbridge = 0;
@@ -289,7 +298,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        /* and ambiguous files */
 
-       ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2, _3));
+       ARDOUR::FileSource::AmbiguousFileName.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::ambiguous_file, this, _1, _2));
 
        /* lets get this party started */
 
@@ -495,10 +504,13 @@ ARDOUR_UI::post_engine ()
 
                vector<string>::iterator n;
                vector<string>::iterator k;
-               for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
-                       cout << "Action: " << (*n) << " bound to " << (*k) << endl;
+               vector<string>::iterator p;
+               for (n = names.begin(), k = keys.begin(), p = paths.begin(); n != names.end(); ++n, ++k, ++p) {
+                       cout << "Action: '" << (*n) << "' bound to '" << (*k) << "' Path: '" << (*p) << "'" << endl;
                }
 
+               halt_connection.disconnect ();
+               AudioEngine::instance()->stop ();
                exit (0);
        }
 
@@ -749,7 +761,8 @@ ARDOUR_UI::starting ()
                        // wait for announce reply from nsm server
                        for ( i = 0; i < 5000; ++i) {
                                nsm->check ();
-                               usleep (i);
+
+                               Glib::usleep (i);
                                if (nsm->is_active()) {
                                        break;
                                }
@@ -761,7 +774,7 @@ ARDOUR_UI::starting ()
                        // wait for open command from nsm server
                        for ( i = 0; i < 5000; ++i) {
                                nsm->check ();
-                               usleep (1000);
+                               Glib::usleep (1000);
                                if (nsm->client_id ()) {
                                        break;
                                }
@@ -844,7 +857,7 @@ ARDOUR_UI::starting ()
 void
 ARDOUR_UI::check_memory_locking ()
 {
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(PLATFORM_WINDOWS)
        /* OS X doesn't support mlockall(2), and so testing for memory locking capability there is pointless */
        return;
 #else // !__APPLE__
@@ -3098,13 +3111,13 @@ require some unused files to continue to exist."));
                space_adjusted = rep.space;
        } else if (rep.space < 1000000) {
                bprefix = _("kilo");
-               space_adjusted = truncf((float)rep.space / 1000.0);
+               space_adjusted = floorf((float)rep.space / 1000.0);
        } else if (rep.space < 1000000 * 1000) {
                bprefix = _("mega");
-               space_adjusted = truncf((float)rep.space / (1000.0 * 1000.0));
+               space_adjusted = floorf((float)rep.space / (1000.0 * 1000.0));
        } else {
                bprefix = _("giga");
-               space_adjusted = truncf((float)rep.space / (1000.0 * 1000 * 1000.0));
+               space_adjusted = floorf((float)rep.space / (1000.0 * 1000 * 1000.0));
        }
 
        if (msg_delete) {
@@ -3263,7 +3276,7 @@ ARDOUR_UI::setup_order_hint ()
        } else {
                for (TrackSelection::iterator s = editor->get_selection().tracks.begin(); s != editor->get_selection().tracks.end(); ++s) {
                        RouteTimeAxisView* tav = dynamic_cast<RouteTimeAxisView*> (*s);
-                       if (tav->route()->order_key() > order_hint) {
+                       if (tav && tav->route() && tav->route()->order_key() > order_hint) {
                                order_hint = tav->route()->order_key();
                        }
                }
@@ -3383,7 +3396,7 @@ void
 ARDOUR_UI::stop_video_server (bool ask_confirm)
 {
        if (!video_server_process && ask_confirm) {
-               warning << _("Video-Server was not launched by Ardour. The request to stop it is ignored.") << endmsg;
+               warning << string_compose (_("Video-Server was not launched by %1. The request to stop it is ignored."), PROGRAM_NAME) << endmsg;
        }
        if (video_server_process) {
                if(ask_confirm) {
@@ -3449,16 +3462,24 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
                std::string icsd_docroot = video_server_dialog->get_docroot();
                if (icsd_docroot.empty()) {icsd_docroot = X_("/");}
 
-               struct stat sb;
-               if (!lstat (icsd_docroot.c_str(), &sb) == 0 || !S_ISDIR(sb.st_mode)) {
+               GStatBuf sb;
+               if (!g_lstat (icsd_docroot.c_str(), &sb) == 0 || !S_ISDIR(sb.st_mode)) {
                        warning << _("Specified docroot is not an existing directory.") << endmsg;
                        continue;
                }
-               if ( (!lstat (icsd_exec.c_str(), &sb) == 0)
+#ifndef PLATFORM_WINDOWS
+               if ( (!g_lstat (icsd_exec.c_str(), &sb) == 0)
                     || (sb.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)) == 0 ) {
                        warning << _("Given Video Server is not an executable file.") << endmsg;
                        continue;
                }
+#else
+               if ( (!g_lstat (icsd_exec.c_str(), &sb) == 0)
+                    || (sb.st_mode & (S_IXUSR)) == 0 ) {
+                       warning << _("Given Video Server is not an executable file.") << endmsg;
+                       continue;
+               }
+#endif
 
                char **argp;
                argp=(char**) calloc(9,sizeof(char*));
@@ -3494,7 +3515,7 @@ ARDOUR_UI::start_video_server (Gtk::Window* float_window, bool popup_msg)
                }
                int timeout = 120; // 6 sec
                while (!ARDOUR_UI::instance()->video_timeline->check_server()) {
-                       usleep (50000);
+                       Glib::usleep (50000);
                        if (--timeout <= 0 || !video_server_process->is_running()) break;
                }
                if (timeout <= 0) {
@@ -4122,7 +4143,7 @@ ARDOUR_UI::missing_file (Session*s, std::string str, DataType type)
 }
 
 int
-ARDOUR_UI::ambiguous_file (std::string file, std::string /*path*/, std::vector<std::string> hits)
+ARDOUR_UI::ambiguous_file (std::string file, std::vector<std::string> hits)
 {
        AmbiguousFileDialog dialog (file, hits);