void Button::add_icon(std::string icon_file, int mw, int mh) { char filename[1024]; if(!icon_file.empty()) { snprintf(filename, 1024, "%s/%s", datadir.c_str(), icon_file.c_str()); if(!faccessible(filename)) snprintf(filename, 1024, "%s/images/icons/default-icon.png", datadir.c_str()); } else { snprintf(filename, 1024, "%s/images/icons/default-icon.png", datadir.c_str()); } if(mw != -1 || mh != -1) { icon.push_back(new Surface(filename,USE_ALPHA)); icon.back()->resize(mw,mh); } else icon.push_back(new Surface(filename,USE_ALPHA)); }
/* Set SuperTux configuration and save directories */ void st_directory_setup(void) { char *home; char str[1024]; /* Get home directory (from $HOME variable)... if we can't determine it, use the current directory ("."): */ if (getenv("HOME") != NULL) home = getenv("HOME"); else home = "."; st_dir = (char *) malloc(sizeof(char) * (strlen(home) + strlen("/.supertux") + 1)); strcpy(st_dir, home); strcat(st_dir, "/.supertux"); /* Remove .supertux config-file from old SuperTux versions */ if(faccessible(st_dir)) { remove (st_dir); } st_save_dir = (char *) malloc(sizeof(char) * (strlen(st_dir) + strlen("/save") + 1)); strcpy(st_save_dir,st_dir); strcat(st_save_dir,"/save"); /* Create them. In the case they exist they won't destroy anything. */ mkdir(st_dir, 0755); mkdir(st_save_dir, 0755); sprintf(str, "%s/levels", st_dir); mkdir(str, 0755); // User has not that a datadir, so we try some magic if (datadir.empty()) { #ifndef WIN32 // Detect datadir char exe_file[PATH_MAX]; if (readlink("/proc/self/exe", exe_file, PATH_MAX) < 0) { puts("Couldn't read /proc/self/exe, using default path: " DATA_PREFIX); datadir = DATA_PREFIX; } else { std::string exedir = std::string(dirname(exe_file)) + "/"; datadir = exedir + "../data"; // SuperTux run from source dir if (access(datadir.c_str(), F_OK) != 0) { datadir = exedir + "../share/supertux"; // SuperTux run from PATH if (access(datadir.c_str(), F_OK) != 0) { // If all fails, fall back to compiled path datadir = DATA_PREFIX; } } } #else datadir = DATA_PREFIX; #endif } printf("Datadir: %s\n", datadir.c_str()); }
/* Note: The user has to free the allocated space. */ string_list_type dsubdirs(const char *rel_path,const char* expected_file) { DIR *dirStructP; struct dirent *direntp; string_list_type sdirs; char filename[1024]; char path[1024]; string_list_init(&sdirs); sprintf(path,"%s/%s",st_dir,rel_path); if((dirStructP = opendir(path)) != NULL) { while((direntp = readdir(dirStructP)) != NULL) { char absolute_filename[1024]; struct stat buf; sprintf(absolute_filename, "%s/%s", path, direntp->d_name); if (stat(absolute_filename, &buf) == 0 && S_ISDIR(buf.st_mode)) { if(expected_file != NULL) { sprintf(filename,"%s/%s/%s",path,direntp->d_name,expected_file); if(!faccessible(filename)) continue; } string_list_add_item(&sdirs,direntp->d_name); } } closedir(dirStructP); } sprintf(path,"%s/%s",datadir.c_str(),rel_path); if((dirStructP = opendir(path)) != NULL) { while((direntp = readdir(dirStructP)) != NULL) { char absolute_filename[1024]; struct stat buf; sprintf(absolute_filename, "%s/%s", path, direntp->d_name); if (stat(absolute_filename, &buf) == 0 && S_ISDIR(buf.st_mode)) { if(expected_file != NULL) { sprintf(filename,"%s/%s/%s",path,direntp->d_name,expected_file); if(!faccessible(filename)) { continue; } else { sprintf(filename,"%s/%s/%s/%s",st_dir,rel_path,direntp->d_name,expected_file); if(faccessible(filename)) continue; } } string_list_add_item(&sdirs,direntp->d_name); } } closedir(dirStructP); } return sdirs; }