prevent Primary-click or Shift-click from deselecting when clicking on a track "backg...
[ardour.git] / gtk2_ardour / main.cc
index 6af714a02f1b423e08c8eec972386f8f4514c5c8..cebef59f26c5995f7f18ccc2b945b819f68c0045 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    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
@@ -21,6 +21,7 @@
 #include <signal.h>
 #include <cerrno>
 #include <fstream>
+#include <vector>
 
 #include <sigc++/bind.h>
 #include <gtkmm/settings.h>
@@ -140,69 +141,28 @@ fixup_bundle_environment (int, char* [])
 
        _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();
 
-       /* 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
         */
@@ -210,12 +170,7 @@ fixup_bundle_environment (int, char* [])
        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
@@ -226,62 +181,28 @@ fixup_bundle_environment (int, char* [])
           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();
-
-       std::ofstream pangorc (path.c_str());
-       if (!pangorc) {
-               error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
-               return;
+       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 {
-               pangorc << "[Pango]\nModuleFiles=";
-
-               pangopath = dir_path;
-               pangopath /= "..";
-               pangopath /= "Resources";
-               pangopath /= "pango.modules";
-
-               pangorc << pangopath.to_string() << endl;
-
-               pangorc.close ();
-
-               setenv ("PANGO_RC_FILE", path.c_str(), 1);
-       }
-
-       // gettext charset aliases
-
-       setenv ("CHARSETALIASDIR", path.c_str(), 1);
-
-       // font config
-
-       path = dir_path;
-       path += "/../Resources/fonts.conf";
-
-       setenv ("FONTCONFIG_FILE", path.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);
+               
+               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 ();
+                       
+                       setenv ("PANGO_RC_FILE", path.c_str(), 1);
+               }
        }
+       
+       setenv ("CHARSETALIASDIR", bundle_dir.c_str(), 1);
+       setenv ("FONTCONFIG_FILE", Glib::build_filename (bundle_dir, "Resources/fonts.conf").c_str(), 1);
+       setenv ("GDK_PIXBUF_MODULE_FILE", Glib::build_filename (bundle_dir, "Resources/gdk-pixbuf.loaders").c_str(), 1);
 }
 
 #else
@@ -289,62 +210,33 @@ fixup_bundle_environment (int, char* [])
 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();
 
        /* 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
         */
@@ -352,11 +244,22 @@ fixup_bundle_environment (int /*argc*/, char* argv[])
        unsetenv ("GTK_RC_FILES");
 
        if (!ARDOUR::translations_are_disabled ()) {
-               path = dir_path;
-               path += "/share/locale";
+               export_search_path (dir_path, "GTK_LOCALEDIR", "/share/locale");
+       }
 
-               localedir = strdup (path.c_str());
-               setenv ("GTK_LOCALEDIR", localedir, 1);
+       /* 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)) {
+               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
@@ -371,31 +274,32 @@ fixup_bundle_environment (int /*argc*/, char* argv[])
                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 << "[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.
                */
-
-               mpath = Glib::build_filename (userconfigdir, "gdk-pixbuf.loaders");
-               setenv ("GDK_PIXBUF_MODULE_FILE", mpath.c_str(), 1);
+               
+               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.
+        */
+        setenv ("CHARSETALIASDIR", dir_path.c_str(), 1);
+
 }
 
 #endif
@@ -448,10 +352,6 @@ sigpipe_handler (int /*signal*/)
        }
 }
 
-#ifdef HAVE_LV2
-void close_external_ui_windows();
-#endif
-
 #ifdef WINDOWS_VST_SUPPORT
 
 extern int windows_vst_gui_init (int* argc, char** argv[]);
@@ -527,8 +427,8 @@ int main (int argc, char *argv[])
        }
 
        if (no_splash) {
-               cerr << _("Copyright (C) 1999-2011 Paul Davis") << endl
-                    << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
+               cerr << _("Copyright (C) 1999-2012 Paul Davis") << endl
+                    << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker, Robin Gareus") << endl
                     << endl
                     << string_compose (_("%1 comes with ABSOLUTELY NO WARRANTY"), PROGRAM_NAME) << endl
                     << _("not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.") << endl
@@ -559,9 +459,6 @@ int main (int argc, char *argv[])
        ARDOUR::cleanup ();
        pthread_cancel_all ();
 
-#ifdef HAVE_LV2
-       close_external_ui_windows();
-#endif
        return 0;
 }
 #ifdef WINDOWS_VST_SUPPORT