]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/environment.cpp
Merge commit '87f4eea939309a5ea1972323e237d23afdf01104' into master-merge
[xonotic/netradiant.git] / radiant / environment.cpp
index 484258d79f73d1a04d3b2f078a3528c7da9317de..1e02a14153336f81fdb408ae11cc2b4d51b25b85 100644 (file)
@@ -110,7 +110,8 @@ bool gamedetect_check_game( char const *gamefile, const char *checkfile1, const
 void gamedetect(){
        // if we're inside a Nexuiz install
        // default to nexuiz.game (unless the user used an option to inhibit this)
-       bool nogamedetect = false;
+       //bool nogamedetect = false;
+       bool nogamedetect = true;
        int i;
        for ( i = 1; i < g_argc - 1; ++i )
        {
@@ -139,8 +140,10 @@ void gamedetect(){
                        if ( gamedetect_check_game( "nexuiz.game", "data/common-spog.pk3", "nexuiz.exe", buf, p - buf ) )
 #elif GDEF_OS_MACOS
                        if ( gamedetect_check_game( "nexuiz.game", "data/common-spog.pk3", "Nexuiz.app/Contents/Info.plist", buf, p - buf ) )
-#else
+#elif GDEF_OS_LINUX
                        if ( gamedetect_check_game( "nexuiz.game", "data/common-spog.pk3", "nexuiz-linux-glx.sh", buf, p - buf ) )
+#else
+                       if ( gamedetect_check_game( "nexuiz.game", "data/common-spog.pk3", NULL, buf, p - buf ) )
 #endif
                        { return; }
 
@@ -165,8 +168,17 @@ 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(){
@@ -177,16 +189,40 @@ const char* environment_get_app_path(){
        return app_path.c_str();
 }
 
+const char *environment_get_lib_path()
+{
+       return lib_path.c_str();
+}
+
+const char *environment_get_data_path()
+{
+       return data_path.c_str();
+}
+
 bool portable_app_setup(){
        StringOutputStream confdir( 256 );
        confdir << app_path.c_str() << "settings/";
-       if ( file_exists( confdir.c_str() ) ) {
+       if ( file_is_directory( confdir.c_str() ) ) {
                home_path = confdir.c_str();
                return true;
        }
        return false;
 }
 
+
+const char* openCmdMap;
+
+void cmdMap(){
+       openCmdMap = NULL;
+       for ( int i = 1; i < g_argc; ++i )
+       {
+               //if ( !stricmp( g_argv[i] + strlen(g_argv[i]) - 4, ".map" ) ){
+               if( string_equal_suffix_nocase( g_argv[i], ".map" ) ){
+                       openCmdMap = g_argv[i];
+               }
+       }
+}
+
 #if GDEF_OS_POSIX
 
 #include <stdlib.h>
@@ -198,28 +234,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';
 
@@ -247,17 +287,71 @@ 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 );
+       }
+
+       {
+#if defined(RADIANT_FHS_INSTALL)
+               StringOutputStream buffer;
+       #if defined(RADIANT_ADDONS_DIR)
+               buffer << RADIANT_ADDONS_DIR << "/";
+       #else
+               buffer << app_path.c_str() << "../lib/";
+               buffer << RADIANT_LIB_ARCH << "/";
+               buffer << RADIANT_BASENAME << "/";
+       #endif
+               lib_path = buffer.c_str();
+#else
+               lib_path = app_path.c_str();
+#endif
+       }
+
+       {
+#if defined(RADIANT_FHS_INSTALL)
+               StringOutputStream buffer;
+       #if defined(RADIANT_DATA_DIR)
+               buffer << RADIANT_DATA_DIR << "/";
+       #else
+               buffer << app_path.c_str() << "../share/";
+               buffer << RADIANT_BASENAME << "/";
+       #endif
+               data_path = buffer.c_str();
+#else
+               data_path = app_path.c_str();
+#endif
        }
 
        if ( !portable_app_setup() ) {
                StringOutputStream home( 256 );
-               home << DirectoryCleaned( g_get_user_config_dir() ) << "netradiant/";
+#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();
+       cmdMap();
 }
 
 #elif GDEF_OS_WINDOWS
@@ -270,7 +364,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';
@@ -279,20 +380,28 @@ 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;
        }
 
        if ( !portable_app_setup() ) {
                char *appdata = getenv( "APPDATA" );
+
                StringOutputStream home( 256 );
                home << PathCleaned( appdata );
-               home << "/NetRadiantSettings/";
+               home << "/";
+               home << RADIANT_NAME;
+               home << "/";
+
                Q_mkdir( home.c_str() );
                home_path = home.c_str();
        }
        gamedetect();
+       cmdMap();
 }
 
 #else