2 Copyright (C) 2001-2007 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <sigc++/bind.h>
23 #include <gtkmm/settings.h>
25 #include <pbd/error.h>
26 #include <pbd/textreceiver.h>
27 #include <pbd/failed_constructor.h>
28 #include <pbd/pthread_utils.h>
30 #include <jack/jack.h>
32 #include <ardour/version.h>
33 #include <ardour/ardour.h>
34 #include <ardour/audioengine.h>
35 #include <ardour/session_utils.h>
37 #include <gtkmm/main.h>
38 #include <gtkmm2ext/popup.h>
39 #include <gtkmm2ext/utils.h>
41 #include "svn_revision.h"
43 #include "ardour_ui.h"
50 using namespace ARDOUR_COMMAND_LINE;
51 using namespace ARDOUR;
55 TextReceiver text_receiver ("ardour");
57 extern int curvetest (string);
59 static ARDOUR_UI *ui = 0;
60 static const char* localedir = LOCALEDIR;
63 show_ui_callback (void *arg)
65 ARDOUR_UI * ui = (ARDOUR_UI *) arg;
75 MessageDialog win (_("Ardour could not connect to JACK."),
78 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
79 win.set_secondary_text(_("There are several possible reasons:\n\
81 1) JACK is not running.\n\
82 2) JACK is running as another user, perhaps root.\n\
83 3) There is already another client called \"ardour\".\n\
85 Please consider the possibilities, and perhaps (re)start JACK."));
87 win.add_button (Stock::QUIT, RESPONSE_CLOSE);
88 win.set_default_response (RESPONSE_CLOSE);
91 win.set_position (Gtk::WIN_POS_CENTER);
97 /* we just don't care about the result, but we want to block */
105 #include <mach-o/dyld.h>
106 #include <sys/param.h>
110 fixup_bundle_environment ()
112 if (!getenv ("ARDOUR_BUNDLED")) {
116 char execpath[MAXPATHLEN+1];
117 uint32_t pathsz = sizeof (execpath);
119 _NSGetExecutablePath (execpath, &pathsz);
121 Glib::ustring exec_path (execpath);
122 Glib::ustring dir_path = Glib::path_get_dirname (exec_path);
124 const char *cstr = getenv ("PATH");
126 /* ensure that we find any bundled executables (e.g. JACK) */
133 setenv ("PATH", path.c_str(), 1);
136 path += "/../Resources";
138 path += "/../Resources/Surfaces";
140 path += "/../Resources/Panners";
142 setenv ("ARDOUR_MODULE_PATH", path.c_str(), 1);
145 path += "/../Resources/icons:";
147 path += "/../Resources/pixmaps:";
149 path += "/../Resources/share:";
151 path += "/../Resources";
153 setenv ("ARDOUR_PATH", path.c_str(), 1);
154 setenv ("ARDOUR_CONFIG_PATH", path.c_str(), 1);
155 setenv ("ARDOUR_DATA_PATH", path.c_str(), 1);
157 cstr = getenv ("LADSPA_PATH");
163 path += "/../Plugins";
165 setenv ("LADSPA_PATH", path.c_str(), 1);
168 path += "/../Frameworks/clearlooks";
170 setenv ("GTK_PATH", path.c_str(), 1);
173 path += "/../Resources/locale";
175 localedir = strdup (path.c_str());
177 /* write a pango.rc file and tell pango to use it */
180 path += "/../Resources/pango.rc";
182 std::ofstream pangorc (path.c_str());
184 error << string_compose (_("cannot open pango.rc file %1") , path) << endmsg;
186 pangorc << "[Pango]\nModuleFiles=";
187 Glib::ustring mpath = dir_path;
188 mpath += "/../Resources/pango.modules";
189 pangorc << mpath << endl;
192 setenv ("PANGO_RC_FILE", path.c_str(), 1);
195 // gettext charset aliases
197 setenv ("CHARSETALIASDIR", path.c_str(), 1);
202 path += "/../Resources/fonts.conf";
204 setenv ("FONTCONFIG_FILE", path.c_str(), 1);
206 // GDK Pixbuf loader module file
209 path += "/../Resources/gdk-pixbuf.loaders";
211 setenv ("GDK_PIXBUF_MODULE_FILE", path.c_str(), 1);
213 if (getenv ("ARDOUR_WITH_JACK")) {
217 path += "/../Frameworks";
219 setenv ("JACK_DRIVER_DIR", path.c_str(), 1);
226 /* this is called from the entry point of a wine-compiled
227 executable that is linked against gtk2_ardour built
231 int ardour_main (int argc, char *argv[])
233 int main (int argc, char *argv[])
236 vector<Glib::ustring> null_file_list;
239 fixup_bundle_environment ();
245 (void) bindtextdomain (PACKAGE, localedir);
246 /* our i18n translations are all in UTF-8, so make sure
247 that even if the user locale doesn't specify UTF-8,
248 we use that when handling them.
250 (void) bind_textdomain_codeset (PACKAGE,"UTF-8");
251 (void) textdomain (PACKAGE);
253 pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
255 // catch error message system signals ();
257 text_receiver.listen_to (error);
258 text_receiver.listen_to (info);
259 text_receiver.listen_to (fatal);
260 text_receiver.listen_to (warning);
262 if (parse_opts (argc, argv)) {
266 if (curvetest_file) {
267 return curvetest (curvetest_file);
270 cout << _("Ardour/GTK ")
272 << _("\n (built using ")
273 << ardour_svn_revision
275 << _(" and GCC version ") << __VERSION__
285 cerr << _("Copyright (C) 1999-2007 Paul Davis") << endl
286 << _("Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel Baker") << endl
288 << _("Ardour comes with ABSOLUTELY NO WARRANTY") << endl
289 << _("not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.") << endl
290 << _("This is free software, and you are welcome to redistribute it ") << endl
291 << _("under certain conditions; see the source for copying conditions.")
295 /* some GUI objects need this */
300 ui = new ARDOUR_UI (&argc, &argv);
301 } catch (failed_constructor& err) {
302 error << _("could not create ARDOUR GUI") << endmsg;
308 if (session_name.length()) {
309 g_timeout_add (4000, show_ui_callback, ui);
313 if (!keybindings_path.empty()) {
314 ui->set_keybindings_path (keybindings_path);
317 ui->run (text_receiver);
321 pthread_cancel_all ();
325 } // end of extern C block