X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fmain.cpp;h=a2d288f15eff91315e794a5a14f8ed1419ce370a;hb=ba54332d190b19c00bb8f15ee7d7b7634221646d;hp=f86b18951048f3313831b64686a602fd58ba19b9;hpb=d1fc083d53ce4fd04949c76b590b4bdf6db73a70;p=xonotic%2Fnetradiant.git diff --git a/radiant/main.cpp b/radiant/main.cpp index f86b1895..a2d288f1 100644 --- a/radiant/main.cpp +++ b/radiant/main.cpp @@ -49,7 +49,7 @@ \link math/plane.h math/plane.h \endlink - Planes \n \link math/aabb.h math/aabb.h \endlink - AABBs \n - Callback MemberCaller FunctionCaller - callbacks similar to using boost::function with boost::bind \n + Callback MemberCaller0 FunctionCaller - callbacks similar to using boost::function with boost::bind \n SmartPointer SmartReference - smart-pointer and smart-reference similar to Loki's SmartPtr \n \link generic/bitfield.h generic/bitfield.h \endlink - Type-safe bitfield \n @@ -62,8 +62,7 @@ */ #include "main.h" - -#include "version.h" +#include "globaldefs.h" #include "debugging/debugging.h" @@ -89,7 +88,7 @@ #include "referencecache.h" #include "stacktrace.h" -#ifdef WIN32 +#if GDEF_OS_WINDOWS #include #endif @@ -213,12 +212,12 @@ void error_redirect( const gchar *domain, GLogLevelFlags log_level, const gchar } } -#if defined ( _DEBUG ) && defined ( WIN32 ) && defined ( _MSC_VER ) +#if GDEF_COMPILER_MSVC && GDEF_DEBUG #include "crtdbg.h" #endif void crt_init(){ -#if defined ( _DEBUG ) && defined ( WIN32 ) && defined ( _MSC_VER ) +#if GDEF_COMPILER_MSVC && GDEF_DEBUG _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif } @@ -301,16 +300,16 @@ bool handleMessage(){ globalErrorStream() << m_buffer.c_str(); if ( !m_lock.locked() ) { ScopedLock lock( m_lock ); -#if defined _DEBUG - m_buffer << "Break into the debugger?\n"; - bool handled = ui::root.alert( 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::root.alert( m_buffer.c_str(), "Radiant - Runtime Error", ui::alert_type::OK, ui::alert_icon::Error ); - m_buffer.clear(); -#endif + 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; } @@ -324,18 +323,14 @@ void streams_init(){ } void paths_init(){ - const char* home = environment_get_home_path(); - Q_mkdir( home ); - - { - StringOutputStream path( 256 ); - path << home << "/"; - g_strSettingsPath = path.c_str(); - } + g_strSettingsPath = environment_get_home_path(); Q_mkdir( g_strSettingsPath.c_str() ); + 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 @@ -343,12 +338,12 @@ void paths_init(){ // (for now I had to create symlinks) { StringOutputStream path( 256 ); - path << g_strAppPath.c_str() << "bitmaps/"; + 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; + g_strGameToolsPath = g_strDataPath; } bool check_version_file( const char* filename, const char* version ){ @@ -368,42 +363,6 @@ bool check_version_file( const char* filename, const char* 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 -#ifndef _DEBUG -#define CHECK_VERSION -#endif -#ifdef CHECK_VERSION - // 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::root.alert( msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Default); - } - return bVerIsGood; -#else - return true; -#endif -} - void create_global_pid(){ /*! the global prefs loading / game selection dialog might fail for any reason we don't know about @@ -424,30 +383,31 @@ void create_global_pid(){ if ( remove( g_pidFile.c_str() ) == -1 ) { StringOutputStream msg( 256 ); msg << "WARNING: Could not delete " << g_pidFile.c_str(); - ui::root.alert( msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error ); + 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 !defined( _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::root.alert( msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::YES ) { - g_GamesDialog.Reset(); - } + 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 fails to start again."; + msg.clear(); + msg << "Logging console output to " << SettingsPath_get() + << "radiant.log\nRefer to the log if " RADIANT_NAME " fails to start again."; - ui::root.alert( msg.c_str(), "Radiant - Console Log", ui::alert_type::OK ); -#endif + 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_LogFile( true ); + Sys_EnableLogFile( true ); } // create a primary .pid for global init run @@ -465,7 +425,7 @@ void remove_global_pid(){ if ( remove( g_pidFile.c_str() ) == -1 ) { StringOutputStream msg( 256 ); msg << "WARNING: Could not delete " << g_pidFile.c_str(); - ui::root.alert( msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error ); + ui::alert( ui::root, msg.c_str(), RADIANT_NAME, ui::alert_type::OK, ui::alert_icon::Error ); } } @@ -483,29 +443,30 @@ void create_local_pid(){ if ( remove( g_pidGameFile.c_str() ) == -1 ) { StringOutputStream msg; msg << "WARNING: Could not delete " << g_pidGameFile.c_str(); - ui::root.alert( msg.c_str(), "Radiant", ui::alert_type::OK, ui::alert_icon::Error ); + 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 !defined( _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::root.alert( msg.c_str(), "Radiant - Startup Failure", ui::alert_type::YESNO, ui::alert_icon::Question ) == ui::alert_response::YES ) { - Preferences_Reset(); - } + 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?"; - msg.clear(); - msg << "Logging console output to " << SettingsPath_get() << "radiant.log\nRefer to the log if Radiant fails to start again."; + 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(); + } - ui::root.alert( msg.c_str(), "Radiant - Console Log", ui::alert_type::OK ); -#endif + 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_LogFile( true ); + Sys_EnableLogFile( true ); } else { @@ -541,25 +502,84 @@ void user_shortcuts_save(){ SaveCommandMap( path.c_str() ); } +void add_local_rc_files(){ +#define GARUX_DISABLE_GTKTHEME +#ifndef GARUX_DISABLE_GTKTHEME +/* FIXME: HACK: not GTK3 compatible + https://developer.gnome.org/gtk2/stable/gtk2-Resource-Files.html#gtk-rc-add-default-file + https://developer.gnome.org/gtk3/stable/gtk3-Resource-Files.html#gtk-rc-add-default-file + > gtk_rc_add_default_file has been deprecated since version 3.0 and should not be used in newly-written code. + > Use GtkStyleContext with a custom GtkStyleProvider instead +*/ + + { + StringOutputStream path( 512 ); + path << AppPath_get() << ".gtkrc-2.0.radiant"; + gtk_rc_add_default_file( path.c_str() ); + } +#ifdef WIN32 + { + StringOutputStream path( 512 ); + path << AppPath_get() << ".gtkrc-2.0.win"; + gtk_rc_add_default_file( path.c_str() ); + } +#endif +#endif // GARUX_DISABLE_GTKTHEME +} + +/* HACK: If ui::main is not called yet, +gtk_main_quit will not quit, so tell main +to not call ui::main. This happens when a +map is loaded from command line and require +a restart because of wrong format. +Delete this when the code to not have to +restart to load another format is merged. */ +bool g_dontStart = false; + 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(); -#ifdef WIN32 +#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 ); + bool Aero = false; + for ( int i = 1; i < argc; ++i ){ + if ( !stricmp( argv[i], "-aero" ) ){ + Aero = true; + qDwmEnableComposition( TRUE ); + break; + } + } + // disable Aero + if ( !Aero ){ + qDwmEnableComposition( FALSE ); + } } FreeLibrary( lib ); } + _setmaxstdio(2048); #endif const char* mapname = NULL; + +#if GDEF_OS_WINDOWS + StringOutputStream mapname_buffer( 256 ); +#endif + char const *error = NULL; + if ( !ui::init( &argc, &argv, "", &error) ) { g_print( "%s\n", error ); return -1; @@ -568,16 +588,21 @@ int main( int argc, char* argv[] ){ // 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]; + + if ( g_str_has_suffix( mapname, ".map" ) ) { + if ( !g_path_is_absolute( mapname ) ) { + mapname = g_build_filename( g_get_current_dir(), mapname, NULL ); } - else { - mapname = g_build_filename( g_get_current_dir(), argv[1], NULL ); - } + +#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", argv[1] ); + g_print( "bad file name, will not load: %s\n", mapname ); + mapname = NULL; } } } @@ -600,13 +625,11 @@ int main( int argc, char* argv[] ){ GlobalDebugMessageHandler::instance().setHandler( GlobalPopupDebugMessageHandler::instance() ); - environment_init( argc, argv ); + environment_init(argc, (char const **) argv); paths_init(); - if ( !check_version() ) { - return EXIT_FAILURE; - } + add_local_rc_files(); show_splash(); @@ -628,7 +651,7 @@ int main( int argc, char* argv[] ){ // 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 ); + Sys_EnableLogFile( true ); g_Console_enableLogging = true; g_GamesDialog.m_bForceLogConsole = false; } @@ -643,6 +666,12 @@ int main( int argc, char* argv[] ){ hide_splash(); +#ifdef WIN32 + if( openCmdMap && *openCmdMap ){ + Map_LoadFile( openCmdMap ); + } + else +#endif // WIN32 if ( mapname != NULL ) { Map_LoadFile( mapname ); } @@ -661,7 +690,17 @@ int main( int argc, char* argv[] ){ remove_local_pid(); + /* HACK: If ui::main is not called yet, + gtk_main_quit will not quit, so tell main + to not call ui::main. This happens when a + map is loaded from command line and require + a restart because of wrong format. + Delete this when the code to not have to + restart to load another format is merged. */ + if ( !g_dontStart ) + { ui::main(); + } // avoid saving prefs when the app is minimized if ( g_pParentWnd->IsSleeping() ) { @@ -682,7 +721,7 @@ int main( int argc, char* argv[] ){ Radiant_Shutdown(); // close the log file if any - Sys_LogFile( false ); + Sys_EnableLogFile( false ); return EXIT_SUCCESS; }