34#define STDOUT_LOG_FILE_NAME "openmsx_system/openmsx.stdout"
35#define STDERR_LOG_FILE_NAME "openmsx_system/openmsx.stderr"
44static int setenv(
const char* name,
const char* value,
int overwrite)
46 if (!overwrite && getenv(name)) {
49 return _putenv_s(name, value);
55static void EnableConsoleOutput()
57 if (AttachConsole(ATTACH_PARENT_PROCESS)) {
58 freopen(
"CONOUT$",
"w", stdout);
59 freopen(
"CONOUT$",
"w", stderr);
64static void initializeSDL()
67#ifndef SDL_JOYSTICK_DISABLED
68 flags |= SDL_INIT_JOYSTICK;
71 flags |= SDL_INIT_NOPARACHUTE;
73 if (SDL_Init(flags) < 0) {
74 throw FatalError(
"Couldn't init SDL: ", SDL_GetError());
82 setenv(
"FREETYPE_PROPERTIES",
"truetype:interpreter-version=35", 0);
85static int main(
int argc,
char **argv)
88 ad_printf(
"Redirecting stdout to %s and stderr to %s\n",
89 STDOUT_LOG_FILE_NAME, STDERR_LOG_FILE_NAME);
91 if (!freopen(STDOUT_LOG_FILE_NAME,
"a", stdout)) {
92 ad_printf(
"Couldn't redirect stdout to logfile, aborting\n");
93 std::cerr <<
"Couldn't redirect stdout to "
94 STDOUT_LOG_FILE_NAME
"\n";
97 if (!freopen(STDERR_LOG_FILE_NAME,
"a", stderr)) {
98 ad_printf(
"Couldn't redirect stderr to logfile, aborting\n");
99 std::cout <<
"Couldn't redirect stderr to "
100 STDERR_LOG_FILE_NAME
"\n";
104 std::string msg =
Date::toString(time(
nullptr)) +
": starting openMSX";
105 std::cout << msg <<
'\n';
106 std::cerr << msg <<
'\n';
110 EnableConsoleOutput();
120 ArgumentGenerator argGen;
121 argv = argGen.GetArguments(argc);
123 CommandLineParser parser(reactor);
124 parser.parse({argv, size_t(argc)});
128 if (!parser.isHiddenStartup()) {
129 auto& render = reactor.getDisplay().getRenderSettings().getRendererSetting();
130 render.setValue(render.getRestoreValue());
137 reactor.getEventDistributor().deliverEvents();
140 CliServer cliServer(reactor.getCommandController(),
141 reactor.getEventDistributor(),
142 reactor.getGlobalCliComm());
146 }
catch (FatalError&
e) {
147 std::cerr <<
"Fatal error: " <<
e.getMessage() <<
'\n';
149 }
catch (MSXException&
e) {
150 std::cerr <<
"Uncaught exception: " <<
e.getMessage() <<
'\n';
152 }
catch (std::exception&
e) {
153 std::cerr <<
"Uncaught std::exception: " <<
e.what() <<
'\n';
156 std::cerr <<
"Uncaught exception of unexpected type." <<
'\n';
160 if (SDL_WasInit(SDL_INIT_EVERYTHING)) {
176 return openmsx::main(argc, argv);
int main(int argc, char **argv)
std::string toString(time_t time)
void setMainThread()
Store ID of the main thread, should be called exactly once from the main thread.
This file implemented 3 utility functions:
void randomize()
Seed the (shared) random number generator.