X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmain.cc;h=bb9fabb6bb3fed0034d9de2b062a9fe46d69fa36;hb=983bf548cdc1fb184d122c62190fb76069328a27;hp=d212edef92fdfd2bb3f5f97baf46fc731cfb4f63;hpb=2a7ed69c28c5c4606ff13b3605b9bc9c3eba607d;p=ardour.git diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc index d212edef92..bb9fabb6bb 100644 --- a/gtk2_ardour/main.cc +++ b/gtk2_ardour/main.cc @@ -27,7 +27,6 @@ #include #include "pbd/error.h" -#include "pbd/epa.h" #include "pbd/file_utils.h" #include "pbd/textreceiver.h" #include "pbd/failed_constructor.h" @@ -49,19 +48,15 @@ #include #include -#include - #include "version.h" #include "utils.h" #include "ardour_ui.h" #include "opts.h" #include "enums.h" +#include "bundle_env.h" #include "i18n.h" -#ifdef __APPLE__ -#include -#endif using namespace std; using namespace Gtk; @@ -99,270 +94,6 @@ gui_jack_error () win.run (); } -static void export_search_path (const string& base_dir, const char* varname, const char* dir) -{ - string path; - const char * cstr = g_getenv (varname); - - if (cstr) { - path = cstr; - path += ':'; - } else { - path = ""; - } - path += base_dir; - path += dir; - - g_setenv (varname, path.c_str(), 1); -} - -#ifdef __APPLE__ - -#include -#include - -extern void set_language_preference (); // cocoacarbon.mm - -void -fixup_bundle_environment (int, char* []) -{ - if (!g_getenv ("ARDOUR_BUNDLED")) { - return; - } - - EnvironmentalProtectionAgency::set_global_epa (new EnvironmentalProtectionAgency (true, "PREBUNDLE_ENV")); - - set_language_preference (); - - char execpath[MAXPATHLEN+1]; - uint32_t pathsz = sizeof (execpath); - - _NSGetExecutablePath (execpath, &pathsz); - - std::string path; - std::string exec_dir = Glib::path_get_dirname (execpath); - std::string bundle_dir; - std::string userconfigdir = user_config_directory(); - - bundle_dir = Glib::path_get_dirname (exec_dir); - -#ifdef ENABLE_NLS - if (!ARDOUR::translations_are_enabled ()) { - localedir = "/this/cannot/exist"; - } else { - /* force localedir into the bundle */ - - vector lpath; - lpath.push_back (bundle_dir); - lpath.push_back ("Resources"); - lpath.push_back ("locale"); - localedir = strdup (Glib::build_filename (lpath).c_str()); - } -#endif - - export_search_path (bundle_dir, "ARDOUR_DLL_PATH", "/lib"); - - /* 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. - */ - - 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, "GTK_PATH", "/lib/gtkengines"); - - g_setenv ("SUIL_MODULE_DIR", (bundle_dir + "/lib").c_str(), 1); - g_setenv ("PATH", (bundle_dir + "/MacOS:" + std::string(g_getenv ("PATH"))).c_str(), 1); - - /* unset GTK_RC_FILES so that we only load the RC files that we define - */ - - g_unsetenv ("GTK_RC_FILES"); - - /* write a pango.rc file and tell pango to use it. we'd love - to put this into the PROGRAM_NAME.app bundle and leave it there, - but the user may not have write permission. so ... - - we also have to make sure that the user ardour directory - actually exists ... - */ - - if (g_mkdir_with_parents (userconfigdir.c_str(), 0755) < 0) { - error << string_compose (_("cannot create user %3 folder %1 (%2)"), userconfigdir, strerror (errno), PROGRAM_NAME) - << endmsg; - } else { - - 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 (bundle_dir, "Resources/pango.modules") - << endl; - pangorc.close (); - - g_setenv ("PANGO_RC_FILE", path.c_str(), 1); - } - } - - g_setenv ("CHARSETALIASDIR", bundle_dir.c_str(), 1); - g_setenv ("FONTCONFIG_FILE", Glib::build_filename (bundle_dir, "Resources/fonts.conf").c_str(), 1); - g_setenv ("GDK_PIXBUF_MODULE_FILE", Glib::build_filename (bundle_dir, "Resources/gdk-pixbuf.loaders").c_str(), 1); -} - -static void load_custom_fonts() { -/* this code will only compile on OS X 10.6 and above, and we currently do not - * need it for earlier versions since we fall back on a non-monospace, - * non-custom font. - */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - std::string ardour_mono_file; - - if (!find_file_in_search_path (ardour_data_search_path(), "ArdourMono.ttf", ardour_mono_file)) { - cerr << _("Cannot find ArdourMono TrueType font") << endl; - } - - CFStringRef ttf; - CFURLRef fontURL; - CFErrorRef error; - ttf = CFStringCreateWithBytes( - kCFAllocatorDefault, (UInt8*) ardour_mono_file.c_str(), - ardour_mono_file.length(), - kCFStringEncodingUTF8, FALSE); - fontURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, ttf, kCFURLPOSIXPathStyle, TRUE); - if (CTFontManagerRegisterFontsForURL(fontURL, kCTFontManagerScopeProcess, &error) != true) { - cerr << _("Cannot load ArdourMono TrueType font.") << endl; - } -#endif -} - -#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 (!g_getenv ("ARDOUR_BUNDLED")) { - return; - } - - EnvironmentalProtectionAgency::set_global_epa (new EnvironmentalProtectionAgency (true, "PREBUNDLE_ENV")); - - std::string path; - std::string dir_path = Glib::path_get_dirname (Glib::path_get_dirname (argv[0])); - std::string userconfigdir = user_config_directory(); - -#ifdef ENABLE_NLS - if (!ARDOUR::translations_are_enabled ()) { - localedir = "/this/cannot/exist"; - } else { - /* force localedir into the bundle */ - vector lpath; - lpath.push_back (dir_path); - lpath.push_back ("share"); - lpath.push_back ("locale"); - localedir = canonical_path (Glib::build_filename (lpath)).c_str(); - } -#endif - - /* note that this function is POSIX/Linux specific, so using / as - a dir separator in this context is just fine. - */ - - 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, "GTK_PATH", "/lib/gtkengines"); - - g_setenv ("SUIL_MODULE_DIR", (dir_path + "/lib").c_str(), 1); - g_setenv ("PATH", (dir_path + "/bin:" + std::string(g_getenv ("PATH"))).c_str(), 1); - - /* unset GTK_RC_FILES so that we only load the RC files that we define - */ - - g_unsetenv ("GTK_RC_FILES"); - - /* Tell fontconfig where to find fonts.conf. Use the system version - if it exists, otherwise use the stuff we included in the bundle - */ - - if (Glib::file_test ("/etc/fonts/fonts.conf", Glib::FILE_TEST_EXISTS)) { - g_setenv ("FONTCONFIG_FILE", "/etc/fonts/fonts.conf", 1); - g_setenv ("FONTCONFIG_PATH", "/etc/fonts", 1); - } else { - error << _("No fontconfig file found on your system. Things may looked very odd or ugly") << endmsg; - } - - /* 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 ... - - we also have to make sure that the user ardour directory - actually exists ... - */ - - if (g_mkdir_with_parents (userconfigdir.c_str(), 0755) < 0) { - error << string_compose (_("cannot create user %3 folder %1 (%2)"), userconfigdir, strerror (errno), PROGRAM_NAME) - << endmsg; - } else { - - 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 (); - } - - g_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. - */ - - g_setenv ("GDK_PIXBUF_MODULE_FILE", Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders").c_str(), 1); - } - - /* this doesn't do much but setting it should prevent various parts of the GTK/GNU stack - from looking outside the bundle to find the charset.alias file. - */ - g_setenv ("CHARSETALIASDIR", dir_path.c_str(), 1); - -} - -static void load_custom_fonts() { - std::string ardour_mono_file; - if (!find_file_in_search_path (ardour_data_search_path(), "ArdourMono.ttf", ardour_mono_file)) { - cerr << _("Cannot find ArdourMono TrueType font") << endl; - } - - FcConfig *config = FcInitLoadConfigAndFonts(); - FcBool ret = FcConfigAppFontAddFile(config, reinterpret_cast(ardour_mono_file.c_str())); - if (ret == FcFalse) { - cerr << _("Cannot load ArdourMono TrueType font.") << endl; - } - ret = FcConfigSetCurrent(config); - if (ret == FcFalse) { - cerr << _("Failed to set fontconfig configuration.") << endl; - } -} - -#endif - static gboolean tell_about_backend_death (void* /* ignored */) { @@ -421,7 +152,7 @@ int ardour_main (int argc, char *argv[]) int main (int argc, char *argv[]) #endif { - fixup_bundle_environment (argc, argv); + fixup_bundle_environment (argc, argv, &localedir); load_custom_fonts(); /* needs to happend before any gtk and pango init calls */