#include <iostream>
#include <binreloc.h>
#include <tinygettext/log.hpp>
+#include <boost/format.hpp>
+extern "C" {
+#include <findlocale.h>
+}
#include "supertux/main.hpp"
namespace { DrawingContext *context_pointer; }
+#ifdef _WIN32
+# define WRITEDIR_NAME PACKAGE_NAME
+#else
+# define WRITEDIR_NAME "." PACKAGE_NAME
+#endif
+
void
Main::init_config()
{
if (g_config->locale != "")
{
dictionary_manager->set_language(tinygettext::Language::from_name(g_config->locale));
+ } else {
+ FL_Locale *locale;
+ FL_FindLocale(&locale);
+ tinygettext::Language language = tinygettext::Language::from_spec( locale->lang?locale->lang:"", locale->country?locale->country:"", locale->variant?locale->variant:"");
+ FL_FreeLocale(&locale);
+ dictionary_manager->set_language(language);
}
}
// Initialize physfs (this is a slightly modified version of
// PHYSFS_setSaneConfig)
- const char* application = PACKAGE_NAME;
- const char* userdir = PHYSFS_getUserDir();
-
- char* writedir = new char[strlen(userdir) + strlen(application) +
-#ifndef _WIN32
- 2];
-#else
- 1];
-#endif
-
- // Set configuration directory
- sprintf(writedir,
-#ifndef _WIN32
- "%s.%s",
-#else
- "%s%s",
-#endif
- userdir, application);
- if(!PHYSFS_setWriteDir(writedir)) {
- // try to create the directory
- char* mkdir = new char[strlen(application) +
-#ifndef _WIN32
- 2];
-#else
- 1];
-#endif
- sprintf(mkdir,
-#ifndef _WIN32
- ".%s",
-#else
- "%s",
-#endif
- application);
- if(!PHYSFS_setWriteDir(userdir) || !PHYSFS_mkdir(mkdir)) {
- std::ostringstream msg;
- msg << "Failed creating configuration directory '"
- << writedir << "': " << PHYSFS_getLastError();
- delete[] writedir;
- delete[] mkdir;
- throw std::runtime_error(msg.str());
- }
- delete[] mkdir;
+ const char *env_writedir;
+ std::string writedir;
- if(!PHYSFS_setWriteDir(writedir)) {
+ if ((env_writedir = getenv("SUPERTUX2_USER_DIR")) != NULL) {
+ writedir = env_writedir;
+ if(!PHYSFS_setWriteDir(writedir.c_str())) {
std::ostringstream msg;
msg << "Failed to use configuration directory '"
<< writedir << "': " << PHYSFS_getLastError();
- delete[] writedir;
throw std::runtime_error(msg.str());
}
+
+ } else {
+ std::string userdir = PHYSFS_getUserDir();
+
+ // Set configuration directory
+ writedir = userdir + WRITEDIR_NAME;
+ if(!PHYSFS_setWriteDir(writedir.c_str())) {
+ // try to create the directory
+ if(!PHYSFS_setWriteDir(userdir.c_str()) || !PHYSFS_mkdir(WRITEDIR_NAME)) {
+ std::ostringstream msg;
+ msg << "Failed creating configuration directory '"
+ << writedir << "': " << PHYSFS_getLastError();
+ throw std::runtime_error(msg.str());
+ }
+
+ if(!PHYSFS_setWriteDir(writedir.c_str())) {
+ std::ostringstream msg;
+ msg << "Failed to use configuration directory '"
+ << writedir << "': " << PHYSFS_getLastError();
+ throw std::runtime_error(msg.str());
+ }
+ }
}
- PHYSFS_addToSearchPath(writedir, 0);
- delete[] writedir;
+ PHYSFS_addToSearchPath(writedir.c_str(), 0);
// when started from source dir...
std::string dir = PHYSFS_getBaseDir();
- dir += "/data";
+ if (dir[dir.length() - 1] != '/')
+ dir += "/";
+ dir += "data";
std::string testfname = dir;
testfname += "/credits.txt";
bool sourcedir = false;
void
Main::print_usage(const char* argv0)
{
- std::cerr << _("Usage: ") << argv0 << _(" [OPTIONS] [LEVELFILE]\n\n")
- << _("Options:\n"
+ std::string default_user_data_dir =
+ std::string(PHYSFS_getUserDir()) + WRITEDIR_NAME;
+
+ std::cerr << boost::format(_(
+ "\n"
+ "Usage: %s [OPTIONS] [LEVELFILE]\n\n"
+ "Options:\n"
" -f, --fullscreen Run in fullscreen mode\n"
" -w, --window Run in window mode\n"
" -g, --geometry WIDTHxHEIGHT Run SuperTux in given resolution\n"
" --record-demo FILE LEVEL Record a demo to FILE\n"
" --play-demo FILE LEVEL Play a recorded demo\n"
" -s, --debug-scripts Enable script debugger.\n"
- "\n")
+ " --print-datadir Print supertux's primary data directory.\n"
+ "\n"
+ "Environment variables:\n"
+ " SUPERTUX2_USER_DIR Directory for user data (savegames, etc.);\n"
+ " default %s\n"
+ "\n"
+ ))
+ % argv0 % default_user_data_dir
<< std::flush;
}
print_usage(argv[0]);
return true;
}
+ if(arg == "--print-datadir") {
+ /*
+ * Print the datadir searchpath to stdout, one path per
+ * line. Then exit. Intended for use by the supertux-editor.
+ */
+ char **sp;
+ size_t sp_index;
+ sp = PHYSFS_getSearchPath();
+ if (sp)
+ for (sp_index = 0; sp[sp_index]; sp_index++)
+ std::cout << sp[sp_index] << std::endl;
+ PHYSFS_freeList(sp);
+ return true;
+ }
}
return false;
int result = 0;
try {
+ /* Do this before pre_parse_commandline, because --help now shows the
+ * default user data dir. */
+ init_physfs(argv[0]);
if(pre_parse_commandline(argc, argv))
return 0;
Console::instance = new Console();
- init_physfs(argv[0]);
init_sdl();
timelog("controller");
- g_main_controller = new JoystickKeyboardController();
+ g_jk_controller = new JoystickKeyboardController();
timelog("config");
init_config();
g_config->save();
delete g_config;
g_config = NULL;
- delete g_main_controller;
- g_main_controller = NULL;
+ delete g_jk_controller;
+ g_jk_controller = NULL;
delete Console::instance;
Console::instance = NULL;
scripting::exit_squirrel();