X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fmain.cpp;h=3df10170085eddb32f17e53830fa55b3495ad5dc;hb=7abfd4e21a8a66400a4970b83f08d7856b67832e;hp=006842a954ecd09f4eb29d9ce373061f082c2390;hpb=9dfae1c9b270ee369c6362903a9205b30751b95f;p=xonotic%2Fnetradiant.git diff --git a/radiant/main.cpp b/radiant/main.cpp index 006842a9..3df10170 100644 --- a/radiant/main.cpp +++ b/radiant/main.cpp @@ -64,8 +64,6 @@ #include "main.h" #include "globaldefs.h" -#include "version.h" - #include "debugging/debugging.h" #include "iundo.h" @@ -95,113 +93,122 @@ #endif void show_splash(); - void hide_splash(); -void error_redirect(const gchar *domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data) -{ - gboolean in_recursion; - gboolean is_fatal; - char buf[256]; - - in_recursion = (log_level & G_LOG_FLAG_RECURSION) != 0; - is_fatal = (log_level & G_LOG_FLAG_FATAL) != 0; - log_level = (GLogLevelFlags) (log_level & G_LOG_LEVEL_MASK); - - if (!message) { - message = "(0) message"; - } - - if (domain) { - strcpy(buf, domain); - } else { - strcpy(buf, "**"); - } - strcat(buf, "-"); - - switch (log_level) { - case G_LOG_LEVEL_ERROR: - if (in_recursion) { - strcat(buf, "ERROR (recursed) **: "); - } else { - strcat(buf, "ERROR **: "); - } - break; - case G_LOG_LEVEL_CRITICAL: - if (in_recursion) { - strcat(buf, "CRITICAL (recursed) **: "); - } else { - strcat(buf, "CRITICAL **: "); - } - break; - case G_LOG_LEVEL_WARNING: - if (in_recursion) { - strcat(buf, "WARNING (recursed) **: "); - } else { - strcat(buf, "WARNING **: "); - } - break; - case G_LOG_LEVEL_MESSAGE: - if (in_recursion) { - strcat(buf, "Message (recursed): "); - } else { - strcat(buf, "Message: "); - } - break; - case G_LOG_LEVEL_INFO: - if (in_recursion) { - strcat(buf, "INFO (recursed): "); - } else { - strcat(buf, "INFO: "); - } - break; - case G_LOG_LEVEL_DEBUG: - if (in_recursion) { - strcat(buf, "DEBUG (recursed): "); - } else { - strcat(buf, "DEBUG: "); - } - break; - default: - /* we are used for a log level that is not defined by GLib itself, - * try to make the best out of it. - */ - if (in_recursion) { - strcat(buf, "LOG (recursed:"); - } else { - strcat(buf, "LOG ("); - } - if (log_level) { - gchar string[] = "0x00): "; - gchar *p = string + 2; - guint i; - - i = g_bit_nth_msf(log_level, -1); - *p = i >> 4; - p++; - *p = '0' + (i & 0xf); - if (*p > '9') { - *p += 'A' - '9' - 1; - } - - strcat(buf, string); - } else { - strcat(buf, "): "); - } - } - - strcat(buf, message); - if (is_fatal) { - strcat(buf, "\naborting...\n"); - } else { - strcat(buf, "\n"); - } - - // spam it... - globalErrorStream() << buf << "\n"; - - if (is_fatal) { - ERROR_MESSAGE("GTK+ error: " << buf); +void error_redirect( const gchar *domain, GLogLevelFlags log_level, const gchar *message, gpointer user_data ){ + gboolean in_recursion; + gboolean is_fatal; + char buf[256]; + + in_recursion = ( log_level & G_LOG_FLAG_RECURSION ) != 0; + is_fatal = ( log_level & G_LOG_FLAG_FATAL ) != 0; + log_level = (GLogLevelFlags) ( log_level & G_LOG_LEVEL_MASK ); + + if ( !message ) { + message = "(0) message"; + } + + if ( domain ) { + strcpy( buf, domain ); + } + else{ + strcpy( buf, "**" ); + } + strcat( buf, "-" ); + + switch ( log_level ) + { + case G_LOG_LEVEL_ERROR: + if ( in_recursion ) { + strcat( buf, "ERROR (recursed) **: " ); + } + else{ + strcat( buf, "ERROR **: " ); + } + break; + case G_LOG_LEVEL_CRITICAL: + if ( in_recursion ) { + strcat( buf, "CRITICAL (recursed) **: " ); + } + else{ + strcat( buf, "CRITICAL **: " ); + } + break; + case G_LOG_LEVEL_WARNING: + if ( in_recursion ) { + strcat( buf, "WARNING (recursed) **: " ); + } + else{ + strcat( buf, "WARNING **: " ); + } + break; + case G_LOG_LEVEL_MESSAGE: + if ( in_recursion ) { + strcat( buf, "Message (recursed): " ); + } + else{ + strcat( buf, "Message: " ); + } + break; + case G_LOG_LEVEL_INFO: + if ( in_recursion ) { + strcat( buf, "INFO (recursed): " ); + } + else{ + strcat( buf, "INFO: " ); + } + break; + case G_LOG_LEVEL_DEBUG: + if ( in_recursion ) { + strcat( buf, "DEBUG (recursed): " ); + } + else{ + strcat( buf, "DEBUG: " ); + } + break; + default: + /* we are used for a log level that is not defined by GLib itself, + * try to make the best out of it. + */ + if ( in_recursion ) { + strcat( buf, "LOG (recursed:" ); + } + else{ + strcat( buf, "LOG (" ); + } + if ( log_level ) { + gchar string[] = "0x00): "; + gchar *p = string + 2; + guint i; + + i = g_bit_nth_msf( log_level, -1 ); + *p = i >> 4; + p++; + *p = '0' + ( i & 0xf ); + if ( *p > '9' ) { + *p += 'A' - '9' - 1; + } + + strcat( buf, string ); + } + else{ + strcat( buf, "): " ); + } + } + + strcat( buf, message ); + if ( is_fatal ) { + strcat( buf, "\naborting...\n" ); + } + else{ + strcat( buf, "\n" ); + } + + // spam it... + globalErrorStream() << buf << "\n"; + + if (is_fatal) { + ERROR_MESSAGE( "GTK+ error: " << buf ); } } @@ -209,318 +216,266 @@ void error_redirect(const gchar *domain, GLogLevelFlags log_level, const gchar * #include "crtdbg.h" #endif -void crt_init() -{ +void crt_init(){ #if GDEF_COMPILER_MSVC && GDEF_DEBUG - _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); + _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif } -class Lock { - bool m_locked; +class Lock +{ +bool m_locked; public: - Lock() : m_locked(false) - { - } - - void lock() - { - m_locked = true; - } - - void unlock() - { - m_locked = false; - } - - bool locked() const - { - return m_locked; - } +Lock() : m_locked( false ){ +} +void lock(){ + m_locked = true; +} +void unlock(){ + m_locked = false; +} +bool locked() const { + return m_locked; +} }; -class ScopedLock { - Lock &m_lock; +class ScopedLock +{ +Lock& m_lock; public: - ScopedLock(Lock &lock) : m_lock(lock) - { - m_lock.lock(); - } - - ~ScopedLock() - { - m_lock.unlock(); - } +ScopedLock( Lock& lock ) : m_lock( lock ){ + m_lock.lock(); +} +~ScopedLock(){ + m_lock.unlock(); +} }; -class LineLimitedTextOutputStream : public TextOutputStream { - TextOutputStream &outputStream; - std::size_t count; +class LineLimitedTextOutputStream : public TextOutputStream +{ +TextOutputStream& outputStream; +std::size_t count; public: - LineLimitedTextOutputStream(TextOutputStream &outputStream, std::size_t count) - : outputStream(outputStream), count(count) - { - } - - std::size_t write(const char *buffer, std::size_t length) - { - if (count != 0) { - const char *p = buffer; - const char *end = buffer + length; - for (;;) { - p = std::find(p, end, '\n'); - if (p == end) { - break; - } - ++p; - if (--count == 0) { - length = p - buffer; - break; - } - } - outputStream.write(buffer, length); - } - return length; - } +LineLimitedTextOutputStream( TextOutputStream& outputStream, std::size_t count ) + : outputStream( outputStream ), count( count ){ +} +std::size_t write( const char* buffer, std::size_t length ){ + if ( count != 0 ) { + const char* p = buffer; + const char* end = buffer + length; + for (;; ) + { + p = std::find( p, end, '\n' ); + if ( p == end ) { + break; + } + ++p; + if ( --count == 0 ) { + length = p - buffer; + break; + } + } + outputStream.write( buffer, length ); + } + return length; +} }; -class PopupDebugMessageHandler : public DebugMessageHandler { - StringOutputStream m_buffer; - Lock m_lock; +class PopupDebugMessageHandler : public DebugMessageHandler +{ +StringOutputStream m_buffer; +Lock m_lock; public: - TextOutputStream &getOutputStream() - { - if (!m_lock.locked()) { - return m_buffer; - } - return globalErrorStream(); - } - - bool handleMessage() - { - getOutputStream() << "----------------\n"; - LineLimitedTextOutputStream outputStream(getOutputStream(), 24); - write_stack_trace(outputStream); - getOutputStream() << "----------------\n"; - globalErrorStream() << m_buffer.c_str(); - if (!m_lock.locked()) { - ScopedLock lock(m_lock); - if (GDEF_DEBUG) { - m_buffer << "Break into the debugger?\n"; - bool handled = ui::alert(ui::root, m_buffer.c_str(), "Radiant - Runtime Error", ui::alert_type::YESNO, - ui::alert_icon::Error) == ui::alert_response::NO; - m_buffer.clear(); - return handled; - } else { - m_buffer << "Please report this error to the developers\n"; - ui::alert(ui::root, m_buffer.c_str(), "Radiant - Runtime Error", ui::alert_type::OK, - ui::alert_icon::Error); - m_buffer.clear(); - } +TextOutputStream& getOutputStream(){ + if ( !m_lock.locked() ) { + return m_buffer; + } + return globalErrorStream(); +} +bool handleMessage(){ + getOutputStream() << "----------------\n"; + LineLimitedTextOutputStream outputStream( getOutputStream(), 24 ); + write_stack_trace( outputStream ); + getOutputStream() << "----------------\n"; + globalErrorStream() << m_buffer.c_str(); + if ( !m_lock.locked() ) { + ScopedLock lock( m_lock ); + if (GDEF_DEBUG) { + m_buffer << "Break into the debugger?\n"; + bool handled = ui::alert(ui::root, m_buffer.c_str(), RADIANT_NAME " - Runtime Error", ui::alert_type::YESNO, ui::alert_icon::Error) == ui::alert_response::NO; + m_buffer.clear(); + return handled; + } else { + m_buffer << "Please report this error to the developers\n"; + ui::alert(ui::root, m_buffer.c_str(), RADIANT_NAME " - Runtime Error", ui::alert_type::OK, ui::alert_icon::Error); + m_buffer.clear(); } - return true; - } + } + return true; +} }; typedef Static GlobalPopupDebugMessageHandler; -void streams_init() -{ - GlobalErrorStream::instance().setOutputStream(getSysPrintErrorStream()); - GlobalOutputStream::instance().setOutputStream(getSysPrintOutputStream()); +void streams_init(){ + GlobalErrorStream::instance().setOutputStream( getSysPrintErrorStream() ); + GlobalOutputStream::instance().setOutputStream( getSysPrintOutputStream() ); } -void paths_init() -{ - g_strSettingsPath = environment_get_home_path(); +void paths_init(){ + g_strSettingsPath = environment_get_home_path(); - Q_mkdir(g_strSettingsPath.c_str()); + Q_mkdir( g_strSettingsPath.c_str() ); - g_strAppPath = environment_get_app_path(); + g_strAppFilePath = environment_get_app_filepath(); + g_strAppPath = environment_get_app_path(); + g_strLibPath = environment_get_lib_path(); + g_strDataPath = environment_get_data_path(); - // radiant is installed in the parent dir of "tools/" - // NOTE: this is not very easy for debugging - // maybe add options to lookup in several places? - // (for now I had to create symlinks) - { - StringOutputStream path(256); - path << g_strAppPath.c_str() << "bitmaps/"; - BitmapsPath_set(path.c_str()); - } + // radiant is installed in the parent dir of "tools/" + // NOTE: this is not very easy for debugging + // maybe add options to lookup in several places? + // (for now I had to create symlinks) + { + StringOutputStream path( 256 ); + path << g_strDataPath.c_str() << "bitmaps/"; + BitmapsPath_set( path.c_str() ); + } - // we will set this right after the game selection is done - g_strGameToolsPath = g_strAppPath; + // we will set this right after the game selection is done + g_strGameToolsPath = g_strDataPath; } -bool check_version_file(const char *filename, const char *version) -{ - TextFileInputStream file(filename); - if (!file.failed()) { - char buf[10]; - buf[file.read(buf, 9)] = '\0'; - - // chomp it (the hard way) - int chomp = 0; - while (buf[chomp] >= '0' && buf[chomp] <= '9') { - chomp++; - } - buf[chomp] = '\0'; - - return string_equal(buf, version); - } - return false; +bool check_version_file( const char* filename, const char* version ){ + TextFileInputStream file( filename ); + if ( !file.failed() ) { + char buf[10]; + buf[file.read( buf, 9 )] = '\0'; + + // chomp it (the hard way) + int chomp = 0; + while ( buf[chomp] >= '0' && buf[chomp] <= '9' ) + chomp++; + buf[chomp] = '\0'; + + return string_equal( buf, version ); + } + return false; } -bool check_version() -{ - // a safe check to avoid people running broken installations - // (otherwise, they run it, crash it, and blame us for not forcing them hard enough to pay attention while installing) - // make something idiot proof and someone will make better idiots, this may be overkill - // let's leave it disabled in debug mode in any case - // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=431 - if (GDEF_DEBUG) { - return true; - } - // locate and open RADIANT_MAJOR and RADIANT_MINOR - bool bVerIsGood = true; - { - StringOutputStream ver_file_name(256); - ver_file_name << AppPath_get() << "RADIANT_MAJOR"; - bVerIsGood = check_version_file(ver_file_name.c_str(), RADIANT_MAJOR_VERSION); - } - { - StringOutputStream ver_file_name(256); - ver_file_name << AppPath_get() << "RADIANT_MINOR"; - bVerIsGood = check_version_file(ver_file_name.c_str(), RADIANT_MINOR_VERSION); - } - - if (!bVerIsGood) { - StringOutputStream msg(256); - msg - << "This editor binary (" RADIANT_VERSION ") doesn't match what the latest setup has configured in this directory\n" - "Make sure you run the right/latest editor binary you installed\n" - << AppPath_get(); - ui::alert(ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Default); - } - return bVerIsGood; +void create_global_pid(){ + /*! + the global prefs loading / game selection dialog might fail for any reason we don't know about + we need to catch when it happens, to cleanup the stateful prefs which might be killing it + and to turn on console logging for lookup of the problem + this is the first part of the two step .pid system + http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 + */ + StringOutputStream g_pidFile( 256 ); ///< the global .pid file (only for global part of the startup) + + g_pidFile << SettingsPath_get() << "radiant.pid"; + + FILE *pid; + pid = fopen( g_pidFile.c_str(), "r" ); + if ( pid != 0 ) { + fclose( pid ); + + if ( remove( g_pidFile.c_str() ) == -1 ) { + StringOutputStream msg( 256 ); + msg << "WARNING: Could not delete " << g_pidFile.c_str(); + ui::alert( ui::root, msg.c_str(), RADIANT_NAME, ui::alert_type::OK, ui::alert_icon::Error ); + } + + // in debug, never prompt to clean registry, turn console logging auto after a failed start + if (!GDEF_DEBUG) { + StringOutputStream msg(256); + msg << RADIANT_NAME " failed to start properly the last time it was run.\n" + "The failure may be related to current global preferences.\n" + "Do you want to reset global preferences to defaults?"; + + if (ui::alert(ui::root, msg.c_str(), RADIANT_NAME " - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question) == ui::alert_response::YES) { + g_GamesDialog.Reset(); + } + + msg.clear(); + msg << "Logging console output to " << SettingsPath_get() + << "radiant.log\nRefer to the log if " RADIANT_NAME " fails to start again."; + + ui::alert(ui::root, msg.c_str(), RADIANT_NAME " - Console Log", ui::alert_type::OK); + } + + // set without saving, the class is not in a coherent state yet + // just do the value change and call to start logging, CGamesDialog will pickup when relevant + g_GamesDialog.m_bForceLogConsole = true; + Sys_EnableLogFile( true ); + } + + // create a primary .pid for global init run + pid = fopen( g_pidFile.c_str(), "w" ); + if ( pid ) { + fclose( pid ); + } } -void create_global_pid() -{ - /*! - the global prefs loading / game selection dialog might fail for any reason we don't know about - we need to catch when it happens, to cleanup the stateful prefs which might be killing it - and to turn on console logging for lookup of the problem - this is the first part of the two step .pid system - http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 - */ - StringOutputStream g_pidFile(256); ///< the global .pid file (only for global part of the startup) - - g_pidFile << SettingsPath_get() << "radiant.pid"; - - FILE *pid; - pid = fopen(g_pidFile.c_str(), "r"); - if (pid != 0) { - fclose(pid); - - if (remove(g_pidFile.c_str()) == -1) { - StringOutputStream msg(256); - msg << "WARNING: Could not delete " << g_pidFile.c_str(); - ui::alert(ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error); - } - - // in debug, never prompt to clean registry, turn console logging auto after a failed start - if (!GDEF_DEBUG) { - StringOutputStream msg(256); - msg << "Radiant failed to start properly the last time it was run.\n" - "The failure may be related to current global preferences.\n" - "Do you want to reset global preferences to defaults?"; - - if (ui::alert(ui::root, msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, - ui::alert_icon::Question) == ui::alert_response::YES) { - g_GamesDialog.Reset(); - } - - msg.clear(); - msg << "Logging console output to " << SettingsPath_get() - << "radiant.log\nRefer to the log if Radiant fails to start again."; - - ui::alert(ui::root, msg.c_str(), "Radiant - Console Log", ui::alert_type::OK); - } - - // set without saving, the class is not in a coherent state yet - // just do the value change and call to start logging, CGamesDialog will pickup when relevant - g_GamesDialog.m_bForceLogConsole = true; - Sys_LogFile(true); - } - - // create a primary .pid for global init run - pid = fopen(g_pidFile.c_str(), "w"); - if (pid) { - fclose(pid); - } -} +void remove_global_pid(){ + StringOutputStream g_pidFile( 256 ); + g_pidFile << SettingsPath_get() << "radiant.pid"; -void remove_global_pid() -{ - StringOutputStream g_pidFile(256); - g_pidFile << SettingsPath_get() << "radiant.pid"; - - // close the primary - if (remove(g_pidFile.c_str()) == -1) { - StringOutputStream msg(256); - msg << "WARNING: Could not delete " << g_pidFile.c_str(); - ui::alert(ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error); - } + // close the primary + if ( remove( g_pidFile.c_str() ) == -1 ) { + StringOutputStream msg( 256 ); + msg << "WARNING: Could not delete " << g_pidFile.c_str(); + ui::alert( ui::root, msg.c_str(), RADIANT_NAME, ui::alert_type::OK, ui::alert_icon::Error ); + } } /*! now the secondary game dependant .pid file http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 */ -void create_local_pid() -{ - StringOutputStream g_pidGameFile(256); ///< the game-specific .pid file - g_pidGameFile << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << "/radiant-game.pid"; - - FILE *pid = fopen(g_pidGameFile.c_str(), "r"); - if (pid != 0) { - fclose(pid); - if (remove(g_pidGameFile.c_str()) == -1) { - StringOutputStream msg; - msg << "WARNING: Could not delete " << g_pidGameFile.c_str(); - ui::alert(ui::root, msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error); - } - - // in debug, never prompt to clean registry, turn console logging auto after a failed start - if (!GDEF_DEBUG) { - StringOutputStream msg; - msg << "Radiant failed to start properly the last time it was run.\n" - "The failure may be caused by current preferences.\n" - "Do you want to reset all preferences to defaults?"; - - if (ui::alert(ui::root, msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, - ui::alert_icon::Question) == ui::alert_response::YES) { - Preferences_Reset(); - } - - msg.clear(); - msg << "Logging console output to " << SettingsPath_get() - << "radiant.log\nRefer to the log if Radiant fails to start again."; - - ui::alert(ui::root, msg.c_str(), "Radiant - Console Log", ui::alert_type::OK); - } - - // force console logging on! (will go in prefs too) - g_GamesDialog.m_bForceLogConsole = true; - Sys_LogFile(true); - } else { - // create one, will remove right after entering message loop - pid = fopen(g_pidGameFile.c_str(), "w"); - if (pid) { - fclose(pid); - } - } +void create_local_pid(){ + StringOutputStream g_pidGameFile( 256 ); ///< the game-specific .pid file + g_pidGameFile << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << "/radiant-game.pid"; + + FILE *pid = fopen( g_pidGameFile.c_str(), "r" ); + if ( pid != 0 ) { + fclose( pid ); + if ( remove( g_pidGameFile.c_str() ) == -1 ) { + StringOutputStream msg; + msg << "WARNING: Could not delete " << g_pidGameFile.c_str(); + ui::alert( ui::root, msg.c_str(), RADIANT_NAME, ui::alert_type::OK, ui::alert_icon::Error ); + } + + // in debug, never prompt to clean registry, turn console logging auto after a failed start + if (!GDEF_DEBUG) { + StringOutputStream msg; + msg << RADIANT_NAME " failed to start properly the last time it was run.\n" + "The failure may be caused by current preferences.\n" + "Do you want to reset all preferences to defaults?"; + + if (ui::alert(ui::root, msg.c_str(), RADIANT_NAME " - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question) == ui::alert_response::YES) { + Preferences_Reset(); + } + + msg.clear(); + msg << "Logging console output to " << SettingsPath_get() + << "radiant.log\nRefer to the log if " RADIANT_NAME " fails to start again."; + + ui::alert(ui::root, msg.c_str(), RADIANT_NAME " - Console Log", ui::alert_type::OK); + } + + // force console logging on! (will go in prefs too) + g_GamesDialog.m_bForceLogConsole = true; + Sys_EnableLogFile( true ); + } + else + { + // create one, will remove right after entering message loop + pid = fopen( g_pidGameFile.c_str(), "w" ); + if ( pid ) { + fclose( pid ); + } + } } @@ -528,170 +483,181 @@ void create_local_pid() now the secondary game dependant .pid file http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=297 */ -void remove_local_pid() -{ - StringOutputStream g_pidGameFile(256); - g_pidGameFile << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << "/radiant-game.pid"; - remove(g_pidGameFile.c_str()); +void remove_local_pid(){ + StringOutputStream g_pidGameFile( 256 ); + g_pidGameFile << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << "/radiant-game.pid"; + remove( g_pidGameFile.c_str() ); } -void user_shortcuts_init() -{ - StringOutputStream path(256); - path << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << '/'; - LoadCommandMap(path.c_str()); - SaveCommandMap(path.c_str()); +void user_shortcuts_init(){ + StringOutputStream path( 256 ); + path << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << '/'; + LoadCommandMap( path.c_str() ); + SaveCommandMap( path.c_str() ); } -void user_shortcuts_save() -{ - StringOutputStream path(256); - path << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << '/'; - SaveCommandMap(path.c_str()); +void user_shortcuts_save(){ + StringOutputStream path( 256 ); + path << SettingsPath_get() << g_pGameDescription->mGameFile.c_str() << '/'; + SaveCommandMap( path.c_str() ); } -int main(int argc, char *argv[]) -{ - crt_init(); +int main( int argc, char* argv[] ){ +#if GTK_TARGET == 3 + // HACK: force legacy GL backend as we don't support GL3 yet + setenv("GDK_GL", "LEGACY", 0); +#if GDEF_OS_LINUX || GDEF_OS_BSD + setenv("GDK_BACKEND", "x11", 0); +#endif +#endif // GTK_TARGET == 3 + crt_init(); - streams_init(); + streams_init(); #if GDEF_OS_WINDOWS - HMODULE lib; - lib = LoadLibrary( "dwmapi.dll" ); - if ( lib != 0 ) { - void ( WINAPI *qDwmEnableComposition )( bool bEnable ) = ( void (WINAPI *) ( bool bEnable ) )GetProcAddress( lib, "DwmEnableComposition" ); - if ( qDwmEnableComposition ) { - qDwmEnableComposition( FALSE ); - } - FreeLibrary( lib ); - } + HMODULE lib; + lib = LoadLibrary( "dwmapi.dll" ); + if ( lib != 0 ) { + void ( WINAPI *qDwmEnableComposition )( bool bEnable ) = ( void (WINAPI *) ( bool bEnable ) )GetProcAddress( lib, "DwmEnableComposition" ); + if ( qDwmEnableComposition ) { + qDwmEnableComposition( FALSE ); + } + FreeLibrary( lib ); + } +#endif + + const char* mapname = NULL; + +#if GDEF_OS_WINDOWS + StringOutputStream mapname_buffer( 256 ); #endif - const char *mapname = NULL; char const *error = NULL; - if (!ui::init(&argc, &argv, "", &error)) { - g_print("%s\n", error); - return -1; - } - // Gtk already removed parsed `--options` - if (argc == 2) { - if (strlen(argv[1]) > 1) { - if (g_str_has_suffix(argv[1], ".map")) { - if (g_path_is_absolute(argv[1])) { - mapname = argv[1]; - } else { - mapname = g_build_filename(g_get_current_dir(), argv[1], NULL); - } - } else { - g_print("bad file name, will not load: %s\n", argv[1]); - } - } - } else if (argc > 2) { - g_print("%s\n", "too many arguments"); - return -1; - } + if ( !ui::init( &argc, &argv, "", &error) ) { + g_print( "%s\n", error ); + return -1; + } - // redirect Gtk warnings to the console - g_log_set_handler("Gdk", (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | - G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), error_redirect, 0); - g_log_set_handler("Gtk", (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | - G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), error_redirect, 0); - g_log_set_handler("GtkGLExt", (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | - G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), error_redirect, 0); - g_log_set_handler("GLib", (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | - G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), error_redirect, 0); - g_log_set_handler(0, (GLogLevelFlags) (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | - G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION), error_redirect, 0); - - GlobalDebugMessageHandler::instance().setHandler(GlobalPopupDebugMessageHandler::instance()); - - environment_init(argc, (char const **) argv); - - paths_init(); - - if (!check_version()) { - return EXIT_FAILURE; - } + // Gtk already removed parsed `--options` + if ( argc == 2 ) { + if ( strlen( argv[ 1 ] ) > 1 ) { + mapname = argv[ 1 ]; - show_splash(); + if ( g_str_has_suffix( mapname, ".map" ) ) { + if ( !g_path_is_absolute( mapname ) ) { + mapname = g_build_filename( g_get_current_dir(), mapname, NULL ); + } - create_global_pid(); +#if GDEF_OS_WINDOWS + mapname_buffer << PathCleaned( mapname ); + mapname = mapname_buffer.c_str(); +#endif + } + else { + g_print( "bad file name, will not load: %s\n", mapname ); + mapname = NULL; + } + } + } + else if ( argc > 2 ) { + g_print ( "%s\n", "too many arguments" ); + return -1; + } - GlobalPreferences_Init(); + // redirect Gtk warnings to the console + g_log_set_handler( "Gdk", (GLogLevelFlags)( G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION ), error_redirect, 0 ); + g_log_set_handler( "Gtk", (GLogLevelFlags)( G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION ), error_redirect, 0 ); + g_log_set_handler( "GtkGLExt", (GLogLevelFlags)( G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION ), error_redirect, 0 ); + g_log_set_handler( "GLib", (GLogLevelFlags)( G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION ), error_redirect, 0 ); + g_log_set_handler( 0, (GLogLevelFlags)( G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | + G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION ), error_redirect, 0 ); - g_GamesDialog.Init(); + GlobalDebugMessageHandler::instance().setHandler( GlobalPopupDebugMessageHandler::instance() ); - g_strGameToolsPath = g_pGameDescription->mGameToolsPath; + environment_init(argc, (char const **) argv); - remove_global_pid(); + paths_init(); - g_Preferences.Init(); // must occur before create_local_pid() to allow preferences to be reset + show_splash(); - create_local_pid(); + create_global_pid(); - // in a very particular post-.pid startup - // we may have the console turned on and want to keep it that way - // so we use a latching system - if (g_GamesDialog.m_bForceLogConsole) { - Sys_LogFile(true); - g_Console_enableLogging = true; - g_GamesDialog.m_bForceLogConsole = false; - } + GlobalPreferences_Init(); + g_GamesDialog.Init(); - Radiant_Initialise(); + g_strGameToolsPath = g_pGameDescription->mGameToolsPath; - user_shortcuts_init(); + remove_global_pid(); - g_pParentWnd = 0; - g_pParentWnd = new MainFrame(); + g_Preferences.Init(); // must occur before create_local_pid() to allow preferences to be reset - hide_splash(); + create_local_pid(); - if (mapname != NULL) { - Map_LoadFile(mapname); - } else if (g_bLoadLastMap && !g_strLastMap.empty()) { - Map_LoadFile(g_strLastMap.c_str()); - } else { - Map_New(); - } + // in a very particular post-.pid startup + // we may have the console turned on and want to keep it that way + // so we use a latching system + if ( g_GamesDialog.m_bForceLogConsole ) { + Sys_EnableLogFile( true ); + g_Console_enableLogging = true; + g_GamesDialog.m_bForceLogConsole = false; + } - // load up shaders now that we have the map loaded - // eviltypeguy - TextureBrowser_ShowStartupShaders(GlobalTextureBrowser()); + Radiant_Initialise(); - remove_local_pid(); + user_shortcuts_init(); - ui::main(); + g_pParentWnd = 0; + g_pParentWnd = new MainFrame(); - // avoid saving prefs when the app is minimized - if (g_pParentWnd->IsSleeping()) { - globalOutputStream() << "Shutdown while sleeping, not saving prefs\n"; - g_preferences_globals.disable_ini = true; - } + hide_splash(); - Map_Free(); + if ( mapname != NULL ) { + Map_LoadFile( mapname ); + } + else if ( g_bLoadLastMap && !g_strLastMap.empty() ) { + Map_LoadFile( g_strLastMap.c_str() ); + } + else + { + Map_New(); + } - if (!Map_Unnamed(g_map)) { - g_strLastMap = Map_Name(g_map); - } + // load up shaders now that we have the map loaded + // eviltypeguy + TextureBrowser_ShowStartupShaders( GlobalTextureBrowser() ); + + + remove_local_pid(); + + ui::main(); + + // avoid saving prefs when the app is minimized + if ( g_pParentWnd->IsSleeping() ) { + globalOutputStream() << "Shutdown while sleeping, not saving prefs\n"; + g_preferences_globals.disable_ini = true; + } + + Map_Free(); + + if ( !Map_Unnamed( g_map ) ) { + g_strLastMap = Map_Name( g_map ); + } - delete g_pParentWnd; + delete g_pParentWnd; - user_shortcuts_save(); + user_shortcuts_save(); - Radiant_Shutdown(); + Radiant_Shutdown(); - // close the log file if any - Sys_LogFile(false); + // close the log file if any + Sys_EnableLogFile( false ); - return EXIT_SUCCESS; + return EXIT_SUCCESS; }