X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=affc9365fab104533eea93dc8e70d8535f9526ea;hb=74cef390ce23b493089f414047426c73a1197e5f;hp=8662b204bb5f336ca426408be1b2fe841efa58a7;hpb=05818ea4267c3e2a196071d17d8735d6f6fe65c9;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 8662b204..affc9365 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -425,27 +425,74 @@ inline static char *getLevelArtworkDir(int type) return LEVELDIR_ARTWORK_PATH(leveldir_current, type); } -char *getProgramConfigFilename(char *command_filename_ptr) +char *getProgramMainDataPath(char *command_filename, char *base_path) { - char *command_filename_1 = getStringCopy(command_filename_ptr); + /* check if the program's main data base directory is configured */ + if (!strEqual(base_path, ".")) + return base_path; + + /* if the program is configured to start from current directory (default), + determine program package directory from program binary (some versions + of KDE/Konqueror and Mac OS X (especially "Mavericks") apparently do not + set the current working directory to the program package directory) */ + char *main_data_path = getBasePath(command_filename); + +#if defined(PLATFORM_MACOSX) + if (strSuffix(main_data_path, MAC_APP_BINARY_SUBDIR)) + { + char *main_data_path_old = main_data_path; + + // cut relative path to Mac OS X application binary directory from path + main_data_path[strlen(main_data_path) - + strlen(MAC_APP_BINARY_SUBDIR)] = '\0'; + + // cut trailing path separator from path (but not if path is root directory) + if (strSuffix(main_data_path, "/") && !strEqual(main_data_path, "/")) + main_data_path[strlen(main_data_path) - 1] = '\0'; + + // replace empty path with current directory + if (strEqual(main_data_path, "")) + main_data_path = "."; + + // add relative path to Mac OS X application resources directory to path + main_data_path = getPath2(main_data_path, MAC_APP_FILES_SUBDIR); + + free(main_data_path_old); + } +#endif + + return main_data_path; +} + +char *getProgramConfigFilename(char *command_filename) +{ + char *command_filename_1 = getStringCopy(command_filename); // strip trailing executable suffix from command filename if (strSuffix(command_filename_1, ".exe")) command_filename_1[strlen(command_filename_1) - 4] = '\0'; - char *command_basepath = getBasePath(command_filename_ptr); - char *command_basename = getBaseNameNoSuffix(command_filename_ptr); + char *ro_base_path = getProgramMainDataPath(command_filename, RO_BASE_PATH); + char *conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + + char *command_basepath = getBasePath(command_filename); + char *command_basename = getBaseNameNoSuffix(command_filename); char *command_filename_2 = getPath2(command_basepath, command_basename); char *config_filename_1 = getStringCat2(command_filename_1, ".conf"); char *config_filename_2 = getStringCat2(command_filename_2, ".conf"); + char *config_filename_3 = getPath2(conf_directory, SETUP_FILENAME); // 1st try: look for config file that exactly matches the binary filename if (fileExists(config_filename_1)) return config_filename_1; - // 2nd try: return config filename that matches binary filename without suffix - return config_filename_2; + // 2nd try: look for config file that matches binary filename without suffix + if (fileExists(config_filename_2)) + return config_filename_2; + + // 3rd try: return setup config filename in global program config directory + return config_filename_3; } char *getTapeFilename(int nr)