Repair thinko in previous commit.
[ardour.git] / gtk2_ardour / main.cc
index 07dd846ae297ed1155d803d0792652f46adf2460..6c868978b1e5bb7252ec119230b93545b36886c6 100644 (file)
 #include <gtkmm/settings.h>
 
 #include "pbd/error.h"
 #include <gtkmm/settings.h>
 
 #include "pbd/error.h"
+#include "pbd/epa.h"
 #include "pbd/file_utils.h"
 #include "pbd/textreceiver.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/pthread_utils.h"
 #include "pbd/file_utils.h"
 #include "pbd/textreceiver.h"
 #include "pbd/failed_constructor.h"
 #include "pbd/pthread_utils.h"
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+#include "pbd/boost_debug.h"
+#endif
 
 #include <jack/jack.h>
 
 
 #include <jack/jack.h>
 
@@ -96,6 +100,22 @@ Please consider the possibilities, and perhaps (re)start JACK."));
        win.run ();
 }
 
        win.run ();
 }
 
+static void export_search_path (const string& base_dir, const char* varname, const char* dir)
+{
+       string path;
+       const char * cstr = getenv (varname);
+
+       if (cstr) {
+               path = cstr;
+               path += ':';
+       } else {
+               path = "";
+       }
+       path += base_dir;
+       path += dir;
+
+       setenv (varname, path.c_str(), 1);
+}
 
 #ifdef __APPLE__
 
 
 #ifdef __APPLE__
 
@@ -105,12 +125,14 @@ Please consider the possibilities, and perhaps (re)start JACK."));
 extern void set_language_preference (); // cocoacarbon.mm
 
 void
 extern void set_language_preference (); // cocoacarbon.mm
 
 void
-fixup_bundle_environment ()
+fixup_bundle_environment (int, char* [])
 {
        if (!getenv ("ARDOUR_BUNDLED")) {
                return;
        }
 
 {
        if (!getenv ("ARDOUR_BUNDLED")) {
                return;
        }
 
+       EnvironmentalProtectionAgency::set_global_epa (new EnvironmentalProtectionAgency (true, "PREBUNDLE_ENV"));
+
        set_language_preference ();
 
        char execpath[MAXPATHLEN+1];
        set_language_preference ();
 
        char execpath[MAXPATHLEN+1];
@@ -118,8 +140,7 @@ fixup_bundle_environment ()
 
        _NSGetExecutablePath (execpath, &pathsz);
 
 
        _NSGetExecutablePath (execpath, &pathsz);
 
-       std::string exec_path (execpath);
-       std::string dir_path = Glib::path_get_dirname (exec_path);
+       std::string dir_path = Glib::path_get_dirname (execpath);
        std::string path;
        const char *cstr = getenv ("PATH");
 
        std::string path;
        const char *cstr = getenv ("PATH");
 
@@ -130,11 +151,11 @@ fixup_bundle_environment ()
 
        path = dir_path;
 
 
        path = dir_path;
 
-       /* JACK is often in /usr/local/bin and since Info.plist refuses to 
+       /* JACK is often in /usr/local/bin and since Info.plist refuses to
           set PATH, we have to force this in order to discover a running
           instance of JACK ...
        */
           set PATH, we have to force this in order to discover a running
           instance of JACK ...
        */
-       
+
        path += ':';
        path += "/usr/local/bin";
 
        path += ':';
        path += "/usr/local/bin";
 
@@ -147,14 +168,14 @@ fixup_bundle_environment ()
        path = dir_path;
        path += "/../Resources";
        path += dir_path;
        path = dir_path;
        path += "/../Resources";
        path += dir_path;
-       path += "/../Resources/Surfaces";
+       path += "/../Surfaces";
        path += dir_path;
        path += dir_path;
-       path += "/../Resources/Panners";
+       path += "/../Panners";
 
        setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
 
 
        setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
 
-        path = user_config_directory().to_string();
-        path += ':';
+       path = user_config_directory().to_string();
+       path += ':';
        path += dir_path;
        path += "/../Resources/icons:";
        path += dir_path;
        path += dir_path;
        path += "/../Resources/icons:";
        path += dir_path;
@@ -166,70 +187,33 @@ fixup_bundle_environment ()
 
        setenv ("ARDOUR_PATH", path.c_str(), 1);
        setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
 
        setenv ("ARDOUR_PATH", path.c_str(), 1);
        setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
-       setenv ("ARDOUR_DATA_PATH", path.c_str(), 1);
 
        path = dir_path;
        path += "/../Resources";
        setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
 
 
        path = dir_path;
        path += "/../Resources";
        setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
 
-       cstr = getenv ("LADSPA_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/../Plugins";
-
-       setenv ("LADSPA_PATH", path.c_str(), 1);
-
-       cstr = getenv ("VAMP_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/../Frameworks";
-
-       setenv ("VAMP_PATH", path.c_str(), 1);
-
-       cstr = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/../Surfaces";
-
-       setenv ("ARDOUR_CONTROL_SURFACE_PATH", path.c_str(), 1);
-
-       cstr = getenv ("LV2_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/../Plugins";
-
-       setenv ("LV2_PATH", path.c_str(), 1);
+       export_search_path (dir_path, "LADSPA_PATH", "/../Plugins");
+       export_search_path (dir_path, "VAMP_PATH", "/../Frameworks");
+       export_search_path (dir_path, "ARDOUR_PANNER_PATH", "/../Panners");
+       export_search_path (dir_path, "ARDOUR_SURFACES_PATH", "/../Surfaces");
+       export_search_path (dir_path, "ARDOUR_MIDIMAPS_PATH", "/../MidiMaps");
+       export_search_path (dir_path, "ARDOUR_EXPORT_FORMATS_PATH", "/../ExportFormats");
 
        path = dir_path;
        path += "/../Frameworks/clearlooks";
 
        setenv ("GTK_PATH", path.c_str(), 1);
 
 
        path = dir_path;
        path += "/../Frameworks/clearlooks";
 
        setenv ("GTK_PATH", path.c_str(), 1);
 
+       /* unset GTK_RC_FILES so that we only load the RC files that we define
+        */
+
+       unsetenv ("GTK_RC_FILES");
+
        if (!ARDOUR::translations_are_disabled ()) {
 
                path = dir_path;
                path += "/../Resources/locale";
        if (!ARDOUR::translations_are_disabled ()) {
 
                path = dir_path;
                path += "/../Resources/locale";
-               
+
                localedir = strdup (path.c_str());
                setenv ("GTK_LOCALEDIR", localedir, 1);
        }
                localedir = strdup (path.c_str());
                setenv ("GTK_LOCALEDIR", localedir, 1);
        }
@@ -303,26 +287,26 @@ fixup_bundle_environment ()
 #else
 
 void
 #else
 
 void
-fixup_bundle_environment (int argc, char* argv[])
+fixup_bundle_environment (int /*argc*/, char* argv[])
 {
        if (!getenv ("ARDOUR_BUNDLED")) {
                return;
        }
 {
        if (!getenv ("ARDOUR_BUNDLED")) {
                return;
        }
-       
-       Glib::ustring exec_path = argv[0];
-       Glib::ustring dir_path = Glib::path_get_dirname (Glib::path_get_dirname (exec_path));
+
+       EnvironmentalProtectionAgency::set_global_epa (new EnvironmentalProtectionAgency (true, "PREBUNDLE_ENV"));
+
+       Glib::ustring dir_path = Glib::path_get_dirname (Glib::path_get_dirname (argv[0]));
        Glib::ustring path;
        Glib::ustring path;
-       const char *cstr = getenv ("PATH");
-        Glib::ustring userconfigdir = user_config_directory().to_string();
+       Glib::ustring userconfigdir = user_config_directory().to_string();
 
        /* ensure that we find any bundled executables (e.g. JACK),
           and find them before any instances of the same name
           elsewhere in PATH
        */
 
 
        /* ensure that we find any bundled executables (e.g. JACK),
           and find them before any instances of the same name
           elsewhere in PATH
        */
 
-        /* note that this function is POSIX/Linux specific, so using / as 
-           a dir separator in this context is just fine.
-        */
+       /* note that this function is POSIX/Linux specific, so using / as
+          a dir separator in this context is just fine.
+       */
 
        path = dir_path;
        path += "/etc:";
 
        path = dir_path;
        path += "/etc:";
@@ -333,8 +317,8 @@ fixup_bundle_environment (int argc, char* argv[])
 
        setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
 
 
        setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
 
-        path = userconfigdir;
-        path += ':';
+       path = userconfigdir;
+       path += ':';
        path += dir_path;
        path += "/etc/icons:";
        path += dir_path;
        path += dir_path;
        path += "/etc/icons:";
        path += dir_path;
@@ -346,76 +330,38 @@ fixup_bundle_environment (int argc, char* argv[])
 
        setenv ("ARDOUR_PATH", path.c_str(), 1);
        setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
 
        setenv ("ARDOUR_PATH", path.c_str(), 1);
        setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
-       setenv ("ARDOUR_DATA_PATH", path.c_str(), 1);
 
        path = dir_path;
        path += "/etc";
        setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
 
 
        path = dir_path;
        path += "/etc";
        setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
 
-       cstr = getenv ("LADSPA_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/lib/plugins";
-       
-       setenv ("LADSPA_PATH", path.c_str(), 1);
-
-       cstr = getenv ("VAMP_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/lib";
-       
-       setenv ("VAMP_PATH", path.c_str(), 1);
-
-       cstr = getenv ("ARDOUR_CONTROL_SURFACE_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/lib/surfaces";
-       
-       setenv ("ARDOUR_CONTROL_SURFACE_PATH", path.c_str(), 1);
-
-       cstr = getenv ("LV2_PATH");
-       if (cstr) {
-               path = cstr;
-               path += ':';
-       } else {
-               path = "";
-       }
-       path += dir_path;
-       path += "/lib/plugins";
-       
-       setenv ("LV2_PATH", path.c_str(), 1);
+       export_search_path (dir_path, "LADSPA_PATH", "/../plugins");
+       export_search_path (dir_path, "VAMP_PATH", "/lib");
+       export_search_path (dir_path, "ARDOUR_PANNER_PATH", "/lib/panners");
+       export_search_path (dir_path, "ARDOUR_SURFACES_PATH", "/lib/surfaces");
+       export_search_path (dir_path, "ARDOUR_MIDIMAPS_PATH", "/share/midi_maps");
+       export_search_path (dir_path, "ARDOUR_EXPORT_FORMATS_PATH", "/share/export");
 
        path = dir_path;
        path += "/lib/clearlooks";
 
        path = dir_path;
        path += "/lib/clearlooks";
-
        setenv ("GTK_PATH", path.c_str(), 1);
 
        setenv ("GTK_PATH", path.c_str(), 1);
 
+       /* unset GTK_RC_FILES so that we only load the RC files that we define
+        */
+
+       unsetenv ("GTK_RC_FILES");
+
        if (!ARDOUR::translations_are_disabled ()) {
        if (!ARDOUR::translations_are_disabled ()) {
-                path = dir_path;
-                path += "/share/locale";
-                
-                localedir = strdup (path.c_str());
-                setenv ("GTK_LOCALEDIR", localedir, 1);
-        }
+               path = dir_path;
+               path += "/share/locale";
+
+               localedir = strdup (path.c_str());
+               setenv ("GTK_LOCALEDIR", localedir, 1);
+       }
 
        /* write a pango.rc file and tell pango to use it. we'd love
           to put this into the Ardour.app bundle and leave it there,
 
        /* write a pango.rc file and tell pango to use it. we'd love
           to put this into the Ardour.app bundle and leave it there,
-          but the user may not have write permission. so ... 
+          but the user may not have write permission. so ...
 
           we also have to make sure that the user ardour directory
           actually exists ...
 
           we also have to make sure that the user ardour directory
           actually exists ...
@@ -426,29 +372,29 @@ fixup_bundle_environment (int argc, char* argv[])
                      << endmsg;
        } else {
 
                      << endmsg;
        } else {
 
-                Glib::ustring mpath;
+               Glib::ustring mpath;
 
                path = Glib::build_filename (userconfigdir, "pango.rc");
 
                std::ofstream pangorc (path.c_str());
                if (!pangorc) {
                        error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
 
                path = Glib::build_filename (userconfigdir, "pango.rc");
 
                std::ofstream pangorc (path.c_str());
                if (!pangorc) {
                        error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
-                } else {
-                        mpath = Glib::build_filename (userconfigdir, "pango.modules");
-                        
+               } else {
+                       mpath = Glib::build_filename (userconfigdir, "pango.modules");
+
                        pangorc << "[Pango]\nModuleFiles=";
                        pangorc << mpath << endl;
                        pangorc.close ();
                        pangorc << "[Pango]\nModuleFiles=";
                        pangorc << mpath << endl;
                        pangorc.close ();
-                }
+               }
 
 
-                setenv ("PANGO_RC_FILE", path.c_str(), 1);
+               setenv ("PANGO_RC_FILE", path.c_str(), 1);
 
 
-                /* similar for GDK pixbuf loaders, but there's no RC file required
-                   to specify where it lives.
-                */
+               /* similar for GDK pixbuf loaders, but there's no RC file required
+                  to specify where it lives.
+               */
 
 
-                mpath = Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders");
-                setenv ("GDK_PIXBUF_MODULE_FILE", mpath.c_str(), 1);
+               mpath = Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders");
+               setenv ("GDK_PIXBUF_MODULE_FILE", mpath.c_str(), 1);
        }
 }
 
        }
 }
 
@@ -467,14 +413,14 @@ tell_about_jack_death (void* /* ignored */)
 This could be due to misconfiguration or to an error inside JACK.\n\
 \n\
 Click OK to exit %1."), PROGRAM_NAME));
 This could be due to misconfiguration or to an error inside JACK.\n\
 \n\
 Click OK to exit %1."), PROGRAM_NAME));
-    
+
                msg.run ();
                _exit (0);
                msg.run ();
                _exit (0);
-               
+
        } else {
 
                /* engine has already run, so this is a mid-session JACK death */
        } else {
 
                /* engine has already run, so this is a mid-session JACK death */
-               
+
                MessageDialog* msg = manage (new MessageDialog (_("JACK exited"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE));
                msg->set_secondary_text (string_compose (_(
 "JACK exited unexpectedly, and without notifying %1.\n\
                MessageDialog* msg = manage (new MessageDialog (_("JACK exited"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_NONE));
                msg->set_secondary_text (string_compose (_(
 "JACK exited unexpectedly, and without notifying %1.\n\
@@ -488,13 +434,13 @@ session at this time, because we would lose your connection information.\n"), PR
 }
 
 static void
 }
 
 static void
-sigpipe_handler (int sig)
+sigpipe_handler (int /*signal*/)
 {
 {
-        /* XXX fix this so that we do this again after a reconnect to JACK
-         */
+       /* XXX fix this so that we do this again after a reconnect to JACK
+        */
+
+       static bool done_the_jack_thing = false;
 
 
-        static bool done_the_jack_thing = false;
-       
        if (!done_the_jack_thing) {
                AudioEngine::instance()->died ();
                g_idle_add (tell_about_jack_death, 0);
        if (!done_the_jack_thing) {
                AudioEngine::instance()->died ();
                g_idle_add (tell_about_jack_death, 0);
@@ -520,12 +466,11 @@ int ardour_main (int argc, char *argv[])
 int main (int argc, char *argv[])
 #endif
 {
 int main (int argc, char *argv[])
 #endif
 {
-#ifdef __APPLE__
-       fixup_bundle_environment ();
-#endif
+       fixup_bundle_environment (argc, argv);
 
 
-       if (!Glib::thread_supported())
+       if (!Glib::thread_supported()) {
                Glib::thread_init();
                Glib::thread_init();
+       }
 
        gtk_set_locale ();
 
 
        gtk_set_locale ();
 
@@ -553,6 +498,12 @@ int main (int argc, char *argv[])
        text_receiver.listen_to (fatal);
        text_receiver.listen_to (warning);
 
        text_receiver.listen_to (fatal);
        text_receiver.listen_to (warning);
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+       if (getenv ("BOOST_DEBUG")) {
+               boost_debug_shared_ptr_show_live_debugging (true);
+       }
+#endif
+
        if (parse_opts (argc, argv)) {
                exit (1);
        }
        if (parse_opts (argc, argv)) {
                exit (1);
        }
@@ -576,7 +527,7 @@ int main (int argc, char *argv[])
        }
 
        if (no_splash) {
        }
 
        if (no_splash) {
-               cerr << _("Copyright (C) 1999-2010 Paul Davis") << endl
+               cerr << _("Copyright (C) 1999-2011 Paul Davis") << endl
                     << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
                     << endl
                     << string_compose (_("%1 comes with ABSOLUTELY NO WARRANTY"), PROGRAM_NAME) << endl
                     << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
                     << endl
                     << string_compose (_("%1 comes with ABSOLUTELY NO WARRANTY"), PROGRAM_NAME) << endl
@@ -602,7 +553,7 @@ int main (int argc, char *argv[])
        }
 
        ui->run (text_receiver);
        }
 
        ui->run (text_receiver);
-        Gtkmm2ext::Application::instance()->cleanup();
+       Gtkmm2ext::Application::instance()->cleanup();
        ui = 0;
 
        ARDOUR::cleanup ();
        ui = 0;
 
        ARDOUR::cleanup ();