X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fenvironment.cpp;h=f79755183bb7682456369cd7fb38c26013328542;hb=194f81c25d91995457d19fce3042c6cb2d1ff474;hp=bc64964ab7e26cf4db3bdf9c4e31183cb54526cf;hpb=692df76213412df4baa68ec14868de8d0082274f;p=xonotic%2Fnetradiant.git diff --git a/radiant/environment.cpp b/radiant/environment.cpp index bc64964a..f7975518 100644 --- a/radiant/environment.cpp +++ b/radiant/environment.cpp @@ -167,12 +167,19 @@ void gamedetect(){ namespace { -CopiedString home_path; -CopiedString app_path; + // executable file path + CopiedString app_filepath; + // directory paths + CopiedString home_path; + CopiedString app_path; CopiedString lib_path; CopiedString data_path; } +const char* environment_get_app_filepath(){ + return app_filepath.c_str(); +} + const char* environment_get_home_path(){ return home_path.c_str(); } @@ -181,7 +188,6 @@ const char* environment_get_app_path(){ return app_path.c_str(); } - const char *environment_get_lib_path() { return lib_path.c_str(); @@ -213,28 +219,32 @@ bool portable_app_setup(){ const char* LINK_NAME = #if GDEF_OS_LINUX "/proc/self/exe" -#else // FreeBSD and OSX +#else // FreeBSD and macOS "/proc/curproc/file" #endif ; -/// brief Returns the filename of the executable belonging to the current process, or 0 if not found. +/// brief Returns the filename of the executable belonging to the current process, or empty string if not found. char const* getexename( char *buf ){ /* Now read the symbolic link */ - int ret = readlink( LINK_NAME, buf, PATH_MAX ); + const int ret = readlink( LINK_NAME, buf, PATH_MAX ); if ( ret == -1 ) { globalOutputStream() << "getexename: falling back to argv[0]: " << makeQuoted( g_argv[0] ); - const char* path = realpath( g_argv[0], buf ); - if ( path == 0 ) { + if( realpath( g_argv[0], buf ) == 0 ) { /* In case of an error, leave the handling up to the caller */ - return ""; + *buf = '\0'; } } + else { + /* Ensure proper NUL termination */ + buf[ret] = 0; + } - /* Ensure proper NUL termination */ - buf[ret] = 0; + return buf; +} +char const* getexepath( char *buf ) { /* delete the program name */ *( strrchr( buf, '/' ) ) = '\0'; @@ -262,8 +272,11 @@ void environment_init( int argc, char const* argv[] ){ { char real[PATH_MAX]; - app_path = getexename( real ); - ASSERT_MESSAGE( !string_empty( app_path.c_str() ), "failed to deduce app path" ); + app_filepath = getexename( real ); + ASSERT_MESSAGE( !string_empty( app_filepath.c_str() ), "failed to deduce app path" ); + + strncpy( real, app_filepath.c_str(), strlen( app_filepath.c_str() ) ); + app_path = getexepath( real ); } { @@ -290,10 +303,29 @@ void environment_init( int argc, char const* argv[] ){ if ( !portable_app_setup() ) { StringOutputStream home( 256 ); - home << DirectoryCleaned(g_get_user_config_dir()) << "/" << RADIANT_BASENAME << "/"; +#if GDEF_OS_MACOS + /* This is used on macOS, this will produce + ~/Library/Application Support/NetRadiant folder. */ + home << DirectoryCleaned( g_get_home_dir() ); + Q_mkdir( home.c_str() ); + home << "Library/"; + Q_mkdir( home.c_str() ); + home << "Application Support/"; + Q_mkdir( home.c_str() ); + home << RADIANT_NAME << "/"; +#else // if GDEF_OS_XDG + /* This is used on both Linux and FreeBSD, + this will produce ~/.config/netradiant folder + when environment has default settings, the + XDG_CONFIG_HOME variable modifies it. */ + home << DirectoryCleaned( g_get_user_config_dir() ); + Q_mkdir( home.c_str() ); + home << RADIANT_BASENAME << "/"; +#endif // ! GDEF_OS_MACOS Q_mkdir( home.c_str() ); home_path = home.c_str(); } + gamedetect(); } @@ -307,7 +339,14 @@ void environment_init( int argc, char const* argv[] ){ { // get path to the editor char filename[MAX_PATH + 1]; + StringOutputStream app_filepath_stream( 256 ); + StringOutputStream app_path_stream( 256 ); + GetModuleFileName( 0, filename, MAX_PATH ); + + app_filepath_stream << PathCleaned( filename ); + app_filepath = app_filepath_stream.c_str(); + char* last_separator = strrchr( filename, '\\' ); if ( last_separator != 0 ) { *( last_separator + 1 ) = '\0'; @@ -316,9 +355,9 @@ void environment_init( int argc, char const* argv[] ){ { filename[0] = '\0'; } - StringOutputStream app( 256 ); - app << PathCleaned( filename ); - app_path = app.c_str(); + + app_path_stream << PathCleaned( filename ); + app_path = app_path_stream.c_str(); lib_path = app_path; data_path = app_path;