diff options
Diffstat (limited to 'src/osd/sdl/sdlmain.cpp')
-rw-r--r-- | src/osd/sdl/sdlmain.cpp | 612 |
1 files changed, 612 insertions, 0 deletions
diff --git a/src/osd/sdl/sdlmain.cpp b/src/osd/sdl/sdlmain.cpp new file mode 100644 index 00000000000..2f382605cbb --- /dev/null +++ b/src/osd/sdl/sdlmain.cpp @@ -0,0 +1,612 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert, R. Belmont +//============================================================ +// +// sdlmain.c - main file for SDLMAME. +// +// SDLMAME by Olivier Galibert and R. Belmont +// +//============================================================ + + +#ifdef SDLMAME_UNIX +#if (!defined(SDLMAME_MACOSX)) && (!defined(SDLMAME_EMSCRIPTEN)) +#ifndef SDLMAME_HAIKU +#include <fontconfig/fontconfig.h> +#endif +#endif +#ifdef SDLMAME_MACOSX +#include <Carbon/Carbon.h> +#endif +#endif + +// standard includes +#if !defined(SDLMAME_WIN32) && !defined(SDLMAME_OS2) +#include <unistd.h> +#endif + +// only for strconv.h +#if defined(SDLMAME_WIN32) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + + +#ifdef SDLMAME_OS2 +#define INCL_DOS +#include <os2.h> +#endif + +#include "sdlinc.h" + +// MAME headers +#include "osdepend.h" +#include "emu.h" +#include "clifront.h" +#include "emuopts.h" +#include "strconv.h" + +// OSD headers +#include "video.h" +#include "input.h" +#include "osdsdl.h" +#include "modules/lib/osdlib.h" + +// we override SDL's normal startup on Win32 +// please see sdlprefix.h as well + +#if defined(SDLMAME_X11) && (SDL_MAJOR_VERSION == 1) && (SDL_MINOR_VERSION == 2) +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#endif + +#include "watchdog.h" + +//============================================================ +// OPTIONS +//============================================================ + +#ifndef INI_PATH +#if defined(SDLMAME_WIN32) || defined(SDLMAME_OS2) + #define INI_PATH ".;ini" +#elif defined(SDLMAME_MACOSX) + #define INI_PATH "$HOME/Library/Application Support/APP_NAME;$HOME/.APP_NAME;.;ini" +#else + #define INI_PATH "$HOME/.APP_NAME;.;ini" +#endif // MACOSX +#endif // INI_PATH + + +//============================================================ +// Global variables +//============================================================ + +#if defined(SDLMAME_UNIX) || defined(SDLMAME_WIN32) +int sdl_entered_debugger; +#endif + +//============================================================ +// Local variables +//============================================================ + +const options_entry sdl_options::s_option_entries[] = +{ + { SDLOPTION_INIPATH, INI_PATH, OPTION_STRING, "path to ini files" }, + + // performance options + { NULL, NULL, OPTION_HEADER, "SDL PERFORMANCE OPTIONS" }, + { SDLOPTION_SDLVIDEOFPS, "0", OPTION_BOOLEAN, "show sdl video performance" }, + // video options + { NULL, NULL, OPTION_HEADER, "SDL VIDEO OPTIONS" }, +// OS X can be trusted to have working hardware OpenGL, so default to it on for the best user experience + { SDLOPTION_CENTERH, "1", OPTION_BOOLEAN, "center horizontally within the view area" }, + { SDLOPTION_CENTERV, "1", OPTION_BOOLEAN, "center vertically within the view area" }, +#if (SDLMAME_SDL2) + { SDLOPTION_SCALEMODE ";sm", OSDOPTVAL_NONE, OPTION_STRING, "Scale mode: none, hwblit, hwbest, yv12, yuy2, yv12x2, yuy2x2 (-video soft only)" }, +#else + { SDLOPTION_SCALEMODE ";sm", OSDOPTVAL_NONE, OPTION_STRING, "Scale mode: none, async, yv12, yuy2, yv12x2, yuy2x2 (-video soft only)" }, +#endif + + // full screen options + #ifdef SDLMAME_X11 + { NULL, NULL, OPTION_HEADER, "SDL FULL SCREEN OPTIONS" }, + { SDLOPTION_USEALLHEADS, "0", OPTION_BOOLEAN, "split full screen image across monitors" }, + #endif + + // keyboard mapping + { NULL, NULL, OPTION_HEADER, "SDL KEYBOARD MAPPING" }, + { SDLOPTION_KEYMAP, "0", OPTION_BOOLEAN, "enable keymap" }, + { SDLOPTION_KEYMAP_FILE, "keymap.dat", OPTION_STRING, "keymap filename" }, + + // joystick mapping + { NULL, NULL, OPTION_HEADER, "SDL JOYSTICK MAPPING" }, + { SDLOPTION_JOYINDEX "1", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #1" }, + { SDLOPTION_JOYINDEX "2", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #2" }, + { SDLOPTION_JOYINDEX "3", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #3" }, + { SDLOPTION_JOYINDEX "4", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #4" }, + { SDLOPTION_JOYINDEX "5", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #5" }, + { SDLOPTION_JOYINDEX "6", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #6" }, + { SDLOPTION_JOYINDEX "7", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #7" }, + { SDLOPTION_JOYINDEX "8", OSDOPTVAL_AUTO, OPTION_STRING, "name of joystick mapped to joystick #8" }, + { SDLOPTION_SIXAXIS, "0", OPTION_BOOLEAN, "Use special handling for PS3 Sixaxis controllers" }, + +#if (USE_XINPUT) + // lightgun mapping + { NULL, NULL, OPTION_HEADER, "SDL LIGHTGUN MAPPING" }, + { SDLOPTION_LIGHTGUNINDEX "1", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #1" }, + { SDLOPTION_LIGHTGUNINDEX "2", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #2" }, + { SDLOPTION_LIGHTGUNINDEX "3", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #3" }, + { SDLOPTION_LIGHTGUNINDEX "4", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #4" }, + { SDLOPTION_LIGHTGUNINDEX "5", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #5" }, + { SDLOPTION_LIGHTGUNINDEX "6", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #6" }, + { SDLOPTION_LIGHTGUNINDEX "7", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #7" }, + { SDLOPTION_LIGHTGUNINDEX "8", OSDOPTVAL_AUTO, OPTION_STRING, "name of lightgun mapped to lightgun #8" }, +#endif + +#if (SDLMAME_SDL2) + { NULL, NULL, OPTION_HEADER, "SDL MOUSE MAPPING" }, + { SDLOPTION_MOUSEINDEX "1", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #1" }, + { SDLOPTION_MOUSEINDEX "2", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #2" }, + { SDLOPTION_MOUSEINDEX "3", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #3" }, + { SDLOPTION_MOUSEINDEX "4", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #4" }, + { SDLOPTION_MOUSEINDEX "5", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #5" }, + { SDLOPTION_MOUSEINDEX "6", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #6" }, + { SDLOPTION_MOUSEINDEX "7", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #7" }, + { SDLOPTION_MOUSEINDEX "8", OSDOPTVAL_AUTO, OPTION_STRING, "name of mouse mapped to mouse #8" }, + + { NULL, NULL, OPTION_HEADER, "SDL KEYBOARD MAPPING" }, + { SDLOPTION_KEYBINDEX "1", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #1" }, + { SDLOPTION_KEYBINDEX "2", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #2" }, + { SDLOPTION_KEYBINDEX "3", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #3" }, + { SDLOPTION_KEYBINDEX "4", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #4" }, + { SDLOPTION_KEYBINDEX "5", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #5" }, + { SDLOPTION_KEYBINDEX "6", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #6" }, + { SDLOPTION_KEYBINDEX "7", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #7" }, + { SDLOPTION_KEYBINDEX "8", OSDOPTVAL_AUTO, OPTION_STRING, "name of keyboard mapped to keyboard #8" }, +#endif + // SDL low level driver options + { NULL, NULL, OPTION_HEADER, "SDL LOWLEVEL DRIVER OPTIONS" }, + { SDLOPTION_VIDEODRIVER ";vd", OSDOPTVAL_AUTO, OPTION_STRING, "sdl video driver to use ('x11', 'directfb', ... or 'auto' for SDL default" }, +#if (SDLMAME_SDL2) + { SDLOPTION_RENDERDRIVER ";rd", OSDOPTVAL_AUTO, OPTION_STRING, "sdl render driver to use ('software', 'opengl', 'directfb' ... or 'auto' for SDL default" }, +#endif + { SDLOPTION_AUDIODRIVER ";ad", OSDOPTVAL_AUTO, OPTION_STRING, "sdl audio driver to use ('alsa', 'arts', ... or 'auto' for SDL default" }, +#if USE_OPENGL + { SDLOPTION_GL_LIB, SDLOPTVAL_GLLIB, OPTION_STRING, "alternative libGL.so to use; 'auto' for system default" }, +#endif + + // End of list + { NULL } +}; + +//============================================================ +// OS2 specific +//============================================================ + +#ifdef SDLMAME_OS2 +void MorphToPM() +{ + PPIB pib; + PTIB tib; + + DosGetInfoBlocks(&tib, &pib); + + // Change flag from VIO to PM: + if (pib->pib_ultype==2) pib->pib_ultype = 3; +} +#endif + +//============================================================ +// sdl_options +//============================================================ + +sdl_options::sdl_options() +: osd_options() +{ + std::string ini_path(INI_PATH); + add_entries(sdl_options::s_option_entries); + strreplace(ini_path,"APP_NAME", emulator_info::get_appname_lower()); + set_default_value(SDLOPTION_INIPATH, ini_path.c_str()); +} + +//============================================================ +// main +//============================================================ + +// we do some special sauce on Win32... + +#if defined(SDLMAME_WIN32) +/* gee */ +extern "C" DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst); +#endif + +// translated to utf8_main +int main(int argc, char *argv[]) +{ + int res = 0; + +#if defined(SDLMAME_X11) && !(SDLMAME_SDL2) + XInitThreads(); +#endif + +#if defined(SDLMAME_WIN32) +#if !(SDLMAME_SDL2) + /* Load SDL dynamic link library */ + if ( SDL_Init(SDL_INIT_NOPARACHUTE) < 0 ) { + fprintf(stderr, "WinMain() error: %s", SDL_GetError()); + return(FALSE); + } + SDL_SetModuleHandle(GetModuleHandle(NULL)); +#endif +#endif + + // disable I/O buffering + setvbuf(stdout, (char *) NULL, _IONBF, 0); + setvbuf(stderr, (char *) NULL, _IONBF, 0); + + // FIXME: this should be done differently + +#ifdef SDLMAME_UNIX + sdl_entered_debugger = 0; +#if (!defined(SDLMAME_MACOSX)) && (!defined(SDLMAME_HAIKU)) && (!defined(SDLMAME_EMSCRIPTEN)) + FcInit(); +#endif +#endif + +#ifdef SDLMAME_OS2 + MorphToPM(); +#endif + +#if defined(SDLMAME_X11) && (SDL_MAJOR_VERSION == 1) && (SDL_MINOR_VERSION == 2) + if (SDL_Linked_Version()->patch < 10) + /* workaround for SDL choosing a 32-bit ARGB visual */ + { + Display *display; + if ((display = XOpenDisplay(NULL)) && (DefaultDepth(display, DefaultScreen(display)) >= 24)) + { + XVisualInfo vi; + char buf[130]; + if (XMatchVisualInfo(display, DefaultScreen(display), 24, TrueColor, &vi)) { + snprintf(buf, sizeof(buf), "0x%lx", vi.visualid); + osd_setenv(SDLENV_VISUALID, buf, 0); + } + } + if (display) + XCloseDisplay(display); + } +#endif + + { + sdl_options options; + sdl_osd_interface osd(options); + osd.register_options(); + cli_frontend frontend(options, osd); + res = frontend.execute(argc, argv); + } + +#ifdef SDLMAME_UNIX +#if (!defined(SDLMAME_MACOSX)) && (!defined(SDLMAME_HAIKU)) && (!defined(SDLMAME_EMSCRIPTEN)) + if (!sdl_entered_debugger) + { + FcFini(); + } +#endif +#endif + + exit(res); +} + + + +//============================================================ +// output_oslog +//============================================================ + +static void output_oslog(const running_machine &machine, const char *buffer) +{ + fputs(buffer, stderr); +} + + + +//============================================================ +// constructor +//============================================================ + +sdl_osd_interface::sdl_osd_interface(sdl_options &options) +: osd_common_t(options), m_options(options) +{ + m_watchdog = NULL; +} + + +//============================================================ +// destructor +//============================================================ + +sdl_osd_interface::~sdl_osd_interface() +{ +} + + +//============================================================ +// osd_exit +//============================================================ + +void sdl_osd_interface::osd_exit() +{ + osd_common_t::osd_exit(); + + if (!SDLMAME_INIT_IN_WORKER_THREAD) + { + /* FixMe: Bug in SDL2.0, Quitting joystick will cause SIGSEGV */ +#if SDLMAME_SDL2 + SDL_QuitSubSystem(SDL_INIT_TIMER| SDL_INIT_VIDEO /*| SDL_INIT_JOYSTICK */); +#else + SDL_Quit(); +#endif + } +} + +//============================================================ +// defines_verbose +//============================================================ + +#define MAC_EXPAND_STR(_m) #_m +#define MACRO_VERBOSE(_mac) \ + do { \ + if (strcmp(MAC_EXPAND_STR(_mac), #_mac) != 0) \ + osd_printf_verbose("%s=%s ", #_mac, MAC_EXPAND_STR(_mac)); \ + } while (0) + +#define _SDL_VER #SDL_MAJOR_VERSION "." #SDL_MINOR_VERSION "." #SDL_PATCHLEVEL + +static void defines_verbose(void) +{ + osd_printf_verbose("Build version: %s\n", build_version); + osd_printf_verbose("Build architecure: "); + MACRO_VERBOSE(SDLMAME_ARCH); + osd_printf_verbose("\n"); + osd_printf_verbose("Build defines 1: "); + MACRO_VERBOSE(SDLMAME_UNIX); + MACRO_VERBOSE(SDLMAME_X11); + MACRO_VERBOSE(SDLMAME_WIN32); + MACRO_VERBOSE(SDLMAME_OS2); + MACRO_VERBOSE(SDLMAME_MACOSX); + MACRO_VERBOSE(SDLMAME_DARWIN); + MACRO_VERBOSE(SDLMAME_LINUX); + MACRO_VERBOSE(SDLMAME_SOLARIS); + MACRO_VERBOSE(SDLMAME_IRIX); + MACRO_VERBOSE(SDLMAME_BSD); + osd_printf_verbose("\n"); + osd_printf_verbose("Build defines 1: "); + MACRO_VERBOSE(LSB_FIRST); + MACRO_VERBOSE(PTR64); + MACRO_VERBOSE(MAME_NOASM); + MACRO_VERBOSE(MAME_DEBUG); + MACRO_VERBOSE(BIGENDIAN); + MACRO_VERBOSE(CPP_COMPILE); + MACRO_VERBOSE(SYNC_IMPLEMENTATION); + osd_printf_verbose("\n"); + osd_printf_verbose("SDL/OpenGL defines: "); + osd_printf_verbose("SDL_COMPILEDVERSION=%d ", SDL_COMPILEDVERSION); + MACRO_VERBOSE(USE_OPENGL); + MACRO_VERBOSE(USE_DISPATCH_GL); + osd_printf_verbose("\n"); + osd_printf_verbose("Compiler defines A: "); + MACRO_VERBOSE(__GNUC__); + MACRO_VERBOSE(__GNUC_MINOR__); + MACRO_VERBOSE(__GNUC_PATCHLEVEL__); + MACRO_VERBOSE(__VERSION__); + osd_printf_verbose("\n"); + osd_printf_verbose("Compiler defines B: "); + MACRO_VERBOSE(__amd64__); + MACRO_VERBOSE(__x86_64__); + MACRO_VERBOSE(__unix__); + MACRO_VERBOSE(__i386__); + MACRO_VERBOSE(__ppc__); + MACRO_VERBOSE(__ppc64__); + osd_printf_verbose("\n"); + osd_printf_verbose("Compiler defines C: "); + MACRO_VERBOSE(_FORTIFY_SOURCE); + MACRO_VERBOSE(__USE_FORTIFY_LEVEL); + osd_printf_verbose("\n"); +} + +//============================================================ +// osd_sdl_info +//============================================================ + +static void osd_sdl_info(void) +{ +#if SDLMAME_SDL2 + int i, num = SDL_GetNumVideoDrivers(); + + osd_printf_verbose("Available videodrivers: "); + for (i=0;i<num;i++) + { + const char *name = SDL_GetVideoDriver(i); + osd_printf_verbose("%s ", name); + } + osd_printf_verbose("\n"); + osd_printf_verbose("Current Videodriver: %s\n", SDL_GetCurrentVideoDriver()); + num = SDL_GetNumVideoDisplays(); + for (i=0;i<num;i++) + { + SDL_DisplayMode mode; + int j; + + osd_printf_verbose("\tDisplay #%d\n", i); + if (SDL_GetDesktopDisplayMode(i, &mode)) + osd_printf_verbose("\t\tDesktop Mode: %dx%d-%d@%d\n", mode.w, mode.h, SDL_BITSPERPIXEL(mode.format), mode.refresh_rate); + if (SDL_GetCurrentDisplayMode(i, &mode)) + osd_printf_verbose("\t\tCurrent Display Mode: %dx%d-%d@%d\n", mode.w, mode.h, SDL_BITSPERPIXEL(mode.format), mode.refresh_rate); + osd_printf_verbose("\t\tRenderdrivers:\n"); + for (j=0; j<SDL_GetNumRenderDrivers(); j++) + { + SDL_RendererInfo info; + SDL_GetRenderDriverInfo(j, &info); + osd_printf_verbose("\t\t\t%10s (%dx%d)\n", info.name, info.max_texture_width, info.max_texture_height); + } + } + + osd_printf_verbose("Available audio drivers: \n"); + num = SDL_GetNumAudioDrivers(); + for (i=0;i<num;i++) + { + osd_printf_verbose("\t%-20s\n", SDL_GetAudioDriver(i)); + } + +#endif +} + + +//============================================================ +// video_register +//============================================================ + +void sdl_osd_interface::video_register() +{ + video_options_add("soft", NULL); + video_options_add("opengl", NULL); + video_options_add("bgfx", NULL); + //video_options_add("auto", NULL); // making d3d video default one +} + +//============================================================ +// init +//============================================================ + + +void sdl_osd_interface::init(running_machine &machine) +{ + // call our parent + osd_common_t::init(machine); + + const char *stemp; + + // determine if we are benchmarking, and adjust options appropriately + int bench = options().bench(); + std::string error_string; + if (bench > 0) + { + options().set_value(OPTION_THROTTLE, false, OPTION_PRIORITY_MAXIMUM, error_string); + options().set_value(OSDOPTION_SOUND, "none", OPTION_PRIORITY_MAXIMUM, error_string); + options().set_value(OSDOPTION_VIDEO, "none", OPTION_PRIORITY_MAXIMUM, error_string); + options().set_value(OPTION_SECONDS_TO_RUN, bench, OPTION_PRIORITY_MAXIMUM, error_string); + assert(error_string.c_str()[0] == 0); + } + + // Some driver options - must be before audio init! + stemp = options().audio_driver(); + if (stemp != NULL && strcmp(stemp, OSDOPTVAL_AUTO) != 0) + { + osd_printf_verbose("Setting SDL audiodriver '%s' ...\n", stemp); + osd_setenv(SDLENV_AUDIODRIVER, stemp, 1); + } + + stemp = options().video_driver(); + if (stemp != NULL && strcmp(stemp, OSDOPTVAL_AUTO) != 0) + { + osd_printf_verbose("Setting SDL videodriver '%s' ...\n", stemp); + osd_setenv(SDLENV_VIDEODRIVER, stemp, 1); + } + +#if (SDLMAME_SDL2) + stemp = options().render_driver(); + if (stemp != NULL) + { + if (strcmp(stemp, OSDOPTVAL_AUTO) != 0) + { + osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", stemp); + //osd_setenv(SDLENV_RENDERDRIVER, stemp, 1); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, stemp); + } + else + { +#if defined(SDLMAME_WIN32) + // OpenGL renderer has less issues with mode switching on windows + osd_printf_verbose("Setting SDL renderdriver '%s' ...\n", "opengl"); + //osd_setenv(SDLENV_RENDERDRIVER, stemp, 1); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); +#endif + } + } +#endif + + /* Set the SDL environment variable for drivers wanting to load the + * lib at startup. + */ +#if USE_OPENGL + /* FIXME: move lib loading code from drawogl.c here */ + + stemp = options().gl_lib(); + if (stemp != NULL && strcmp(stemp, OSDOPTVAL_AUTO) != 0) + { + osd_setenv("SDL_VIDEO_GL_DRIVER", stemp, 1); + osd_printf_verbose("Setting SDL_VIDEO_GL_DRIVER = '%s' ...\n", stemp); + } +#endif + + /* get number of processors */ + stemp = options().numprocessors(); + + osd_num_processors = 0; + + if (strcmp(stemp, "auto") != 0) + { + osd_num_processors = atoi(stemp); + if (osd_num_processors < 1) + { + osd_printf_warning("numprocessors < 1 doesn't make much sense. Assuming auto ...\n"); + osd_num_processors = 0; + } + } + + /* Initialize SDL */ + + if (!SDLMAME_INIT_IN_WORKER_THREAD) + { +#if (SDLMAME_SDL2) +#ifdef SDLMAME_EMSCRIPTEN + // timer brings in threads which are not supported in Emscripten + if (SDL_InitSubSystem(SDL_INIT_VIDEO| SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE)) { +#else + if (SDL_InitSubSystem(SDL_INIT_TIMER| SDL_INIT_VIDEO| SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE)) { +#endif +#else + if (SDL_Init(SDL_INIT_TIMER|SDL_INIT_VIDEO| SDL_INIT_JOYSTICK|SDL_INIT_NOPARACHUTE)) { +#endif + osd_printf_error("Could not initialize SDL %s\n", SDL_GetError()); + exit(-1); + } + osd_sdl_info(); + } + + defines_verbose(); + + osd_common_t::init_subsystems(); + + if (options().oslog()) + machine.add_logerror_callback(output_oslog); + + /* now setup watchdog */ + + int watchdog_timeout = options().watchdog(); + + if (watchdog_timeout != 0) + { + m_watchdog = auto_alloc(machine, watchdog); + m_watchdog->setTimeout(watchdog_timeout); + } + +#if (SDLMAME_SDL2) +#ifdef SDLMAME_EMSCRIPTEN + SDL_EventState(SDL_TEXTINPUT, SDL_FALSE); +#else + SDL_EventState(SDL_TEXTINPUT, SDL_TRUE); +#endif +#else + SDL_EnableUNICODE(SDL_TRUE); +#endif +} |