X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmain.cc;h=abdfa35877a8e461b925664e20f252b2d408bf74;hb=c4696fe2d568bce461aa9f8b4fbc6be19b6113ae;hp=307325a1526bc82cbc5165be5c62cc926a9a662a;hpb=7cc5f8b321e88afbe0bc71a42401a5f9e18288fb;p=ardour.git diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc index 307325a152..abdfa35877 100644 --- a/gtk2_ardour/main.cc +++ b/gtk2_ardour/main.cc @@ -37,7 +37,6 @@ #endif #include "ardour/revision.h" -#include "ardour/version.h" #include "ardour/ardour.h" #include "ardour/audioengine.h" #include "ardour/session_utils.h" @@ -48,8 +47,6 @@ #include #include -#include "version.h" -#include "utils.h" #include "ardour_ui.h" #include "opts.h" #include "enums.h" @@ -57,6 +54,14 @@ #include "i18n.h" +#ifdef PLATFORM_WINDOWS +#include // Needed for '_fmode' +#include // console +#endif + +#ifdef WAF_BUILD +#include "gtk2ardour-version.h" +#endif using namespace std; using namespace Gtk; @@ -69,7 +74,7 @@ TextReceiver text_receiver ("ardour"); extern int curvetest (string); static ARDOUR_UI *ui = 0; -static const char* localedir = LOCALEDIR; +static string localedir (LOCALEDIR); void gui_jack_error () @@ -114,7 +119,7 @@ Click OK to exit %1."), PROGRAM_NAME, AudioEngine::instance()->current_backend_n } else { /* engine has already run, so this is a mid-session backend death */ - + MessageDialog msg (string_compose (_("The audio backend (%1) has failed, or terminated"), AudioEngine::instance()->current_backend_name()), false); msg.set_secondary_text (string_compose (_("%2 exited unexpectedly, and without notifying %1."), PROGRAM_NAME, AudioEngine::instance()->current_backend_name())); @@ -123,11 +128,11 @@ Click OK to exit %1."), PROGRAM_NAME, AudioEngine::instance()->current_backend_n return false; /* do not call again */ } +#ifndef PLATFORM_WINDOWS static void sigpipe_handler (int /*signal*/) { - /* XXX fix this so that we do this again after a reconnect to the backend - */ + /* XXX fix this so that we do this again after a reconnect to the backend */ static bool done_the_backend_thing = false; @@ -137,6 +142,91 @@ sigpipe_handler (int /*signal*/) done_the_backend_thing = true; } } +#endif + +#if (!defined COMPILER_MSVC && defined PLATFORM_WINDOWS) + +static FILE* pStdOut = 0; +static FILE* pStdErr = 0; +static BOOL bConsole; +static HANDLE hStdOut; + +static bool +IsAConsolePort (HANDLE handle) +{ + DWORD mode; + return (GetConsoleMode(handle, &mode) != 0); +} + +static void +console_madness_begin () +{ + bConsole = AttachConsole(ATTACH_PARENT_PROCESS); + hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + + /* re-attach to the console so we can see 'printf()' output etc. + * for MSVC see gtk2_ardour/msvc/winmain.cc + */ + + if ((bConsole) && (IsAConsolePort(hStdOut))) { + pStdOut = freopen( "CONOUT$", "w", stdout ); + pStdErr = freopen( "CONOUT$", "w", stderr ); + } +} + +static void +console_madness_end () +{ + if (pStdOut) { + fclose (pStdOut); + } + if (pStdErr) { + fclose (pStdErr); + } + + if (bConsole) { + // Detach and free the console from our application + INPUT_RECORD input_record; + + input_record.EventType = KEY_EVENT; + input_record.Event.KeyEvent.bKeyDown = TRUE; + input_record.Event.KeyEvent.dwControlKeyState = 0; + input_record.Event.KeyEvent.uChar.UnicodeChar = VK_RETURN; + input_record.Event.KeyEvent.wRepeatCount = 1; + input_record.Event.KeyEvent.wVirtualKeyCode = VK_RETURN; + input_record.Event.KeyEvent.wVirtualScanCode = MapVirtualKey( VK_RETURN, 0 ); + + DWORD written = 0; + WriteConsoleInput( GetStdHandle( STD_INPUT_HANDLE ), &input_record, 1, &written ); + + FreeConsole(); + } +} + +static void command_line_parse_error (int *argc, char** argv[]) {} + +#elif (defined(COMPILER_MSVC) && defined(NDEBUG) && !defined(RDC_BUILD)) + +// these are not used here. for MSVC see gtk2_ardour/msvc/winmain.cc +static void console_madness_begin () {} +static void console_madness_end () {} + +static void command_line_parse_error (int *argc, char** argv[]) { + // Since we don't ordinarily have access to stdout and stderr with + // an MSVC app, let the user know we encountered a parsing error. + Gtk::Main app(argc, argv); // Calls 'gtk_init()' + + Gtk::MessageDialog dlgReportParseError (string_compose (_("\n %1 could not understand your command line "), PROGRAM_NAME), + false, MESSAGE_ERROR, BUTTONS_CLOSE, true); + dlgReportParseError.set_title (string_compose (_("An error was encountered while launching %1"), PROGRAM_NAME)); + dlgReportParseError.run (); +} + +#else +static void console_madness_begin () {} +static void console_madness_end () {} +static void command_line_parse_error (int *argc, char** argv[]) {} +#endif #if (defined(COMPILER_MSVC) && defined(NDEBUG) && !defined(RDC_BUILD)) /* @@ -161,7 +251,9 @@ int ardour_main (int argc, char *argv[]) int main (int argc, char *argv[]) #endif { - fixup_bundle_environment (argc, argv, &localedir); + ARDOUR::check_for_old_configuration_files(); + + fixup_bundle_environment (argc, argv, localedir); load_custom_fonts(); /* needs to happen before any gtk and pango init calls */ @@ -173,7 +265,9 @@ int main (int argc, char *argv[]) gtk_set_locale (); #endif -#ifdef WINDOWS_VST_SUPPORT + console_madness_begin(); + +#if (defined WINDOWS_VST_SUPPORT && !defined PLATFORM_WINDOWS) /* this does some magic that is needed to make GTK and X11 client interact properly. * the platform dependent code is in windows_vst_plugin_ui.cc */ @@ -183,7 +277,7 @@ int main (int argc, char *argv[]) #ifdef ENABLE_NLS cerr << "bind txt domain [" << PACKAGE << "] to " << localedir << endl; - (void) bindtextdomain (PACKAGE, localedir); + (void) bindtextdomain (PACKAGE, localedir.c_str()); /* our i18n translations are all in UTF-8, so make sure that even if the user locale doesn't specify UTF-8, we use that when handling them. @@ -207,6 +301,7 @@ int main (int argc, char *argv[]) #endif if (parse_opts (argc, argv)) { + command_line_parse_error (&argc, &argv); exit (1); } @@ -225,7 +320,7 @@ int main (int argc, char *argv[]) } if (no_splash) { - cerr << _("Copyright (C) 1999-2012 Paul Davis") << endl + cerr << _("Copyright (C) 1999-2015 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 @@ -235,9 +330,7 @@ int main (int argc, char *argv[]) << endl; } - /* some GUI objects need this */ - - if (!ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization, localedir)) { + if (!ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization, localedir.c_str())) { error << string_compose (_("could not initialize %1."), PROGRAM_NAME) << endmsg; exit (1); } @@ -253,7 +346,7 @@ int main (int argc, char *argv[]) #endif try { - ui = new ARDOUR_UI (&argc, &argv, localedir); + ui = new ARDOUR_UI (&argc, &argv, localedir.c_str()); } catch (failed_constructor& err) { error << string_compose (_("could not create %1 GUI"), PROGRAM_NAME) << endmsg; exit (1); @@ -267,6 +360,8 @@ int main (int argc, char *argv[]) ARDOUR::cleanup (); pthread_cancel_all (); + console_madness_end (); + return 0; } #if (defined WINDOWS_VST_SUPPORT && !defined PLATFORM_WINDOWS)