/*
- Copyright (C) 2001-2007 Paul Davis
+ Copyright (C) 2001-2012 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <signal.h>
#include <cerrno>
#include <fstream>
+#include <vector>
#include <sigc++/bind.h>
#include <gtkmm/settings.h>
_NSGetExecutablePath (execpath, &pathsz);
- std::string dir_path = Glib::path_get_dirname (execpath);
std::string path;
- const char *cstr = getenv ("PATH");
+ std::string exec_dir = Glib::path_get_dirname (execpath);
+ std::string bundle_dir;
+ std::string 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
- */
+ bundle_dir = Glib::path_get_dirname (exec_dir);
- path = dir_path;
+ export_search_path (bundle_dir, "ARDOUR_DLL_PATH", "/lib");
- /* 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 ...
+ /* inside an OS X .app bundle, there is no difference
+ between DATA and CONFIG locations, since OS X doesn't
+ attempt to do anything to expose the notion of
+ machine-independent shared data.
*/
- path += ':';
- path += "/usr/local/bin";
-
- if (cstr) {
- path += ':';
- path += cstr;
- }
- setenv ("PATH", path.c_str(), 1);
-
- path = dir_path;
- path += "/../Resources";
- path += dir_path;
- path += "/../Surfaces";
- path += dir_path;
- path += "/../Panners";
-
- setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
-
- path = user_config_directory().to_string();
- path += ':';
- path += dir_path;
- path += "/../Resources/icons:";
- path += dir_path;
- path += "/../Resources/pixmaps:";
- path += dir_path;
- path += "/../Resources/share:";
- path += dir_path;
- path += "/../Resources";
-
- setenv ("ARDOUR_PATH", path.c_str(), 1);
- setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
-
- path = dir_path;
- path += "/../Resources";
- setenv ("ARDOUR_INSTANT_XML_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);
+ export_search_path (bundle_dir, "ARDOUR_DATA_PATH", "/Resources");
+ export_search_path (bundle_dir, "ARDOUR_CONFIG_PATH", "/Resources");
+ export_search_path (bundle_dir, "ARDOUR_INSTANT_XML_PATH", "/Resources");
+ export_search_path (bundle_dir, "LADSPA_PATH", "/Plugins");
+ export_search_path (bundle_dir, "VAMP_PATH", "/lib");
+ export_search_path (bundle_dir, "SUIL_MODULE_DIR", "/lib");
+ export_search_path (bundle_dir, "GTK_PATH", "/lib/clearlooks");
/* 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";
-
- localedir = strdup (path.c_str());
- setenv ("GTK_LOCALEDIR", localedir, 1);
+ export_search_path (bundle_dir, "GTK_LOCALEDIR", "/Resources/locale");
}
/* write a pango.rc file and tell pango to use it. we'd love
actually exists ...
*/
- try {
- sys::create_directories (user_config_directory ());
- }
- catch (const sys::filesystem_error& ex) {
- error << _("Could not create user configuration directory") << endmsg;
- }
-
- sys::path pangopath = user_config_directory();
- pangopath /= "pango.rc";
- path = pangopath.to_string();
+ if (g_mkdir_with_parents (userconfigdir.c_str(), 0755) < 0) {
+ error << string_compose (_("cannot create user ardour folder %1 (%2)"), userconfigdir, strerror (errno))
+ << endmsg;
+ return;
+ }
+ 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;
- return;
} else {
- pangorc << "[Pango]\nModuleFiles=";
-
- pangopath = dir_path;
- pangopath /= "..";
- pangopath /= "Resources";
- pangopath /= "pango.modules";
-
- pangorc << pangopath.to_string() << endl;
-
+ pangorc << "[Pango]\nModuleFiles="
+ << Glib::build_filename (bundle_dir, "Resources/pango.modules")
+ << endl;
pangorc.close ();
setenv ("PANGO_RC_FILE", path.c_str(), 1);
}
- // gettext charset aliases
+ // gettext charset aliases XXX do we really need this, since the path
+ // is totally wrong?
setenv ("CHARSETALIASDIR", path.c_str(), 1);
- // font config
-
- path = dir_path;
- path += "/../Resources/fonts.conf";
-
- setenv ("FONTCONFIG_FILE", path.c_str(), 1);
+ setenv ("FONTCONFIG_FILE", Glib::build_filename (bundle_dir, "Resources/fonts.conf").c_str(), 1);
// GDK Pixbuf loader module file
- path = dir_path;
- path += "/../Resources/gdk-pixbuf.loaders";
-
- setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
-
- if (getenv ("ARDOUR_WITH_JACK")) {
- // JACK driver dir
-
- path = dir_path;
- path += "/../Frameworks";
-
- setenv ("JACK_DRIVER_DIR", path.c_str(), 1);
- }
+ setenv ("GDK_PIXBUF_MODULE_FILE", Glib::build_filename (bundle_dir, "Resources/gdk-pixbuf.loaders").c_str(), 1);
}
#else
void
fixup_bundle_environment (int /*argc*/, char* argv[])
{
+ /* THIS IS FOR LINUX - its just about the only place where its
+ * acceptable to build paths directly using '/'.
+ */
+
if (!getenv ("ARDOUR_BUNDLED")) {
return;
}
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 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
- */
+ std::string path;
+ std::string dir_path = Glib::path_get_dirname (Glib::path_get_dirname (argv[0]));
+ std::string userconfigdir = user_config_directory().to_string();
/* 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 += "/lib/surfaces:";
- path += dir_path;
- path += "/lib/panners:";
-
- setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
-
- path = userconfigdir;
- path += ':';
- path += dir_path;
- path += "/etc/icons:";
- path += dir_path;
- path += "/etc/pixmaps:";
- path += dir_path;
- path += "/share:";
- path += dir_path;
- path += "/etc";
-
- setenv ("ARDOUR_PATH", path.c_str(), 1);
- setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
-
- path = dir_path;
- path += "/etc";
- setenv ("ARDOUR_INSTANT_XML_PATH", path.c_str(), 1);
-
- export_search_path (dir_path, "LADSPA_PATH", "/../plugins");
+ export_search_path (dir_path, "ARDOUR_DLL_PATH", "/lib");
+ export_search_path (dir_path, "ARDOUR_CONFIG_PATH", "/etc");
+ export_search_path (dir_path, "ARDOUR_INSTANT_XML_PATH", "/share");
+ export_search_path (dir_path, "ARDOUR_DATA_PATH", "/share");
+ 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");
+ export_search_path (dir_path, "SUIL_MODULE_DIR", "/lib");
- path = dir_path;
- path += "/lib/clearlooks";
- setenv ("GTK_PATH", path.c_str(), 1);
+ export_search_path (dir_path, "GTK_PATH", "/lib/clearlooks");
/* 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 += "/share/locale";
+ export_search_path (dir_path, "GTK_LOCALEDIR", "/share/locale");
+ }
+
+ /* Tell fontconfig where to find fonts.conf. Use the system version
+ if it exists, otherwise use the stuff we included in the bundle
+ */
- localedir = strdup (path.c_str());
- setenv ("GTK_LOCALEDIR", localedir, 1);
+ if (Glib::file_test ("/etc/fonts/fonts.conf", Glib::FILE_TEST_EXISTS)) {
+ setenv ("FONTCONFIG_FILE", "/etc/fonts/fonts.conf", 1);
+ setenv ("FONTCONFIG_PATH", "/etc/fonts", 1);
+ } else {
+ /* use the one included in the bundle */
+
+ path = Glib::build_filename (dir_path, "etc/fonts/fonts.conf");
+ setenv ("FONTCONFIG_FILE", path.c_str(), 1);
+ export_search_path (dir_path, "FONTCONFIG_PATH", "/etc/fonts");
}
/* write a pango.rc file and tell pango to use it. we'd love
if (g_mkdir_with_parents (userconfigdir.c_str(), 0755) < 0) {
error << string_compose (_("cannot create user ardour folder %1 (%2)"), userconfigdir, strerror (errno))
<< endmsg;
- } else {
-
- 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;
- } else {
- mpath = Glib::build_filename (userconfigdir, "pango.modules");
-
- pangorc << "[Pango]\nModuleFiles=";
- pangorc << mpath << endl;
- pangorc.close ();
- }
-
- 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.
- */
+ return;
+ }
- mpath = Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders");
- setenv ("GDK_PIXBUF_MODULE_FILE", mpath.c_str(), 1);
+ 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 {
+ pangorc << "[Pango]\nModuleFiles="
+ << Glib::build_filename (userconfigdir, "pango.modules")
+ << endl;
+ pangorc.close ();
}
+
+ 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.
+ */
+
+ setenv ("GDK_PIXBUF_MODULE_FILE", Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders").c_str(), 1);
}
#endif
}
}
-#ifdef HAVE_LV2
-void close_external_ui_windows();
-#endif
-
#ifdef WINDOWS_VST_SUPPORT
extern int windows_vst_gui_init (int* argc, char** argv[]);
ARDOUR::cleanup ();
pthread_cancel_all ();
-#ifdef HAVE_LV2
- close_external_ui_windows();
-#endif
return 0;
}
#ifdef WINDOWS_VST_SUPPORT