diff options
author | 2019-09-15 20:00:59 -0400 | |
---|---|---|
committer | 2019-09-15 20:00:59 -0400 | |
commit | 2292cf332c989bf374377b61719beead0706b989 (patch) | |
tree | 8ba3c9f5af0b9e6f487a7b3fe8fccf6c3c99154a /src/osd/mac/macmain.cpp | |
parent | fd505eb0d643a8a8a50ba32f7f0704fec400138d (diff) |
Preliminary Mac native OSD. Not working yet. [R. Belmont]
This will compile, link, and run a driver all the way to the first info screen, provided you use -video bgfx.
However, although there's a valid NSWindow created, it never actually appears on screen for unknown (but likely silly) reasons.
Inputs are not implemented and fullscreen exists but is untried.
Diffstat (limited to 'src/osd/mac/macmain.cpp')
-rw-r--r-- | src/osd/mac/macmain.cpp | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/src/osd/mac/macmain.cpp b/src/osd/mac/macmain.cpp new file mode 100644 index 00000000000..8e50361a2b1 --- /dev/null +++ b/src/osd/mac/macmain.cpp @@ -0,0 +1,271 @@ +// license:BSD-3-Clause +// copyright-holders:R. Belmont +//============================================================ +// +// macmain.cpp - C++ side main file for MAME on the Mac +// +// Mac OSD by R. Belmont +// +//============================================================ + +// oslog callback +#include <functional> + +#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 +#include <Carbon/Carbon.h> +#include <crt_externs.h> +#include <unistd.h> + +// MAME headers +#include "osdepend.h" +#include "emu.h" +#include "emuopts.h" +#include "strconv.h" + +// OSD headers +#include "video.h" +#include "osdmac.h" +#include "modules/lib/osdlib.h" +#include "modules/diagnostics/diagnostics_module.h" + +//============================================================ +// OPTIONS +//============================================================ + +#ifndef INI_PATH +#define INI_PATH "$HOME/Library/Application Support/APP_NAME;$HOME/.APP_NAME;.;ini" +#endif // INI_PATH + +//============================================================ +// Local variables +//============================================================ + +const options_entry mac_options::s_option_entries[] = +{ + { MACOPTION_INIPATH, INI_PATH, OPTION_STRING, "path to ini files" }, + + // End of list + { nullptr } +}; + +//============================================================ +// mac_options +//============================================================ + +mac_options::mac_options() +: osd_options() +{ + std::string ini_path(INI_PATH); + add_entries(mac_options::s_option_entries); + strreplace(ini_path,"APP_NAME", emulator_info::get_appname_lower()); + set_default_value(MACOPTION_INIPATH, ini_path.c_str()); +} + +//============================================================ +// main +//============================================================ + +// we do some special sauce on Win32... +int mac_run_emulator() +{ + int argc = *_NSGetArgc(); + char **argv = *_NSGetArgv(); + + std::vector<std::string> args = osd_get_command_line(argc, argv); + int res = 0; + + // disable I/O buffering + setvbuf(stdout, (char *) nullptr, _IONBF, 0); + setvbuf(stderr, (char *) nullptr, _IONBF, 0); + + // Initialize crash diagnostics + diagnostics_module::get_instance()->init_crash_diagnostics(); + + { + mac_options options; + mac_osd_interface osd(options); + osd.register_options(); + res = emulator_info::start_frontend(options, osd, args); + } + + exit(res); +} + +//============================================================ +// constructor +//============================================================ + +mac_osd_interface::mac_osd_interface(mac_options &options) +: osd_common_t(options), m_options(options) +{ +} + + +//============================================================ +// destructor +//============================================================ + +mac_osd_interface::~mac_osd_interface() +{ +} + + +//============================================================ +// osd_exit +//============================================================ + +void mac_osd_interface::osd_exit() +{ + osd_common_t::osd_exit(); +} + +//============================================================ +// 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 _mac_VER #mac_MAJOR_VERSION "." #mac_MINOR_VERSION "." #mac_PATCHLEVEL + +static void defines_verbose(void) +{ + osd_printf_verbose("Build version: %s\n", emulator_info::get_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_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("OpenGL defines: "); + 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_mac_info +//============================================================ + +static void osd_mac_info(void) +{ +} + + +//============================================================ +// video_register +//============================================================ + +void mac_osd_interface::video_register() +{ + video_options_add("opengl", nullptr); + video_options_add("bgfx", nullptr); +} + +//============================================================ +// output_oslog +//============================================================ + +void mac_osd_interface::output_oslog(const char *buffer) +{ + fputs(buffer, stderr); +} + + +//============================================================ +// osd_setup_osd_specific_emu_options +//============================================================ + +void osd_setup_osd_specific_emu_options(emu_options &opts) +{ + opts.add_entries(osd_options::s_option_entries); +} + + +//============================================================ +// init +//============================================================ + +void mac_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(); + if (bench > 0) + { + options().set_value(OPTION_THROTTLE, false, OPTION_PRIORITY_MAXIMUM); + options().set_value(OSDOPTION_SOUND, "none", OPTION_PRIORITY_MAXIMUM); + options().set_value(OSDOPTION_VIDEO, "none", OPTION_PRIORITY_MAXIMUM); + options().set_value(OPTION_SECONDS_TO_RUN, bench, OPTION_PRIORITY_MAXIMUM); + } + + /* 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; + } + } + + osd_mac_info(); + + defines_verbose(); + + osd_common_t::init_subsystems(); + + if (options().oslog()) + { + using namespace std::placeholders; + machine.add_logerror_callback(std::bind(&mac_osd_interface::output_oslog, this, _1)); + } +} |