From 65720796a80fd8fac1012e56b5273806658ab524 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Sat, 4 Jun 2016 08:06:32 -0400 Subject: [PATCH 1/2] Changed UI handlers to be stored as std::function(); implemented old set_handler() on top of this --- src/emu/ui/uimain.h | 1 + src/frontend/mame/ui/ui.cpp | 31 +++++++++++++++++++++++++------ src/frontend/mame/ui/ui.h | 12 +++++++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/emu/ui/uimain.h b/src/emu/ui/uimain.h index f17b4eb0cfd..9e18a667ec7 100644 --- a/src/emu/ui/uimain.h +++ b/src/emu/ui/uimain.h @@ -29,6 +29,7 @@ public: virtual void set_startup_text(const char *text, bool force) { } + // is a menuing system active? we want to disable certain keyboard/mouse inputs under such context virtual bool is_menu_active() { return false; } bool use_natural_keyboard() const { return m_use_natural_keyboard; } diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 50221829b22..472b26092a3 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -302,10 +302,30 @@ void mame_ui_manager::initialize(running_machine &machine) // pair for the current UI handler //------------------------------------------------- -UINT32 mame_ui_manager::set_handler(ui_callback callback, UINT32 param) +void mame_ui_manager::set_handler(ui_callback_type callback_type, const std::function callback) { m_handler_callback = callback; - m_handler_param = param; + m_handler_callback_type = callback_type; +} + + +//------------------------------------------------- +// set_handler - set a callback/parameter +// pair for the current UI handler +//------------------------------------------------- + +UINT32 mame_ui_manager::set_handler(ui_callback callback, UINT32 param) +{ + ui_callback_type callback_type; + if (callback == ui::menu::ui_handler) + callback_type = UI_CALLBACK_TYPE_MENU; + else if (callback == handler_messagebox_anykey) + callback_type = UI_CALLBACK_TYPE_MODAL; + else + callback_type = UI_CALLBACK_TYPE_GENERAL; + + auto callback_func = [=](render_container *container) { return callback(*this, container, param); }; + set_handler(callback_type, callback_func); return param; } @@ -374,7 +394,7 @@ void mame_ui_manager::display_startup_screens(bool first_time) while (machine().input().poll_switches() != INPUT_CODE_INVALID) { } // loop while we have a handler - while (m_handler_callback != handler_ingame && !machine().scheduled_event_pending() && !ui::menu::stack_has_special_main_menu()) + while (m_handler_callback_type == UI_CALLBACK_TYPE_MODAL && !machine().scheduled_event_pending() && !ui::menu::stack_has_special_main_menu()) { machine().video().frame_update(); } @@ -443,8 +463,7 @@ void mame_ui_manager::update_and_render(render_container *container) } // call the current UI handler - assert(m_handler_callback != nullptr); - m_handler_param = (*m_handler_callback)(*this, container, m_handler_param); + m_handler_param = m_handler_callback(container); // display any popup messages if (osd_ticks() < m_popup_text_end) @@ -967,7 +986,7 @@ void mame_ui_manager::show_mouse(bool status) bool mame_ui_manager::is_menu_active(void) { - return (m_handler_callback == ui::menu::ui_handler); + return m_handler_callback_type == UI_CALLBACK_TYPE_MENU; } diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index 299465e2d67..81c25f1568f 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -154,6 +154,13 @@ enum class mame_ui_manager; typedef UINT32 (*ui_callback)(mame_ui_manager &, render_container *, UINT32); +enum ui_callback_type +{ + UI_CALLBACK_TYPE_GENERAL, + UI_CALLBACK_TYPE_MODAL, + UI_CALLBACK_TYPE_MENU +}; + // ======================> mame_ui_manager class mame_ui_manager : public ui_manager, public slider_changed_notifier @@ -175,6 +182,8 @@ public: // methods void initialize(running_machine &machine); std::vector slider_init(running_machine &machine); + + void set_handler(ui_callback_type callback_type, const std::function callback); UINT32 set_handler(ui_callback callback, UINT32 param); void display_startup_screens(bool first_time); virtual void set_startup_text(const char *text, bool force) override; @@ -236,7 +245,8 @@ public: private: // instance variables render_font * m_font; - ui_callback m_handler_callback; + std::function m_handler_callback; + ui_callback_type m_handler_callback_type; UINT32 m_handler_param; bool m_single_step; bool m_showfps; From ff0dddc1aa6228907e13ed6c4868e533ee70e9a4 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Sat, 4 Jun 2016 14:55:01 -0400 Subject: [PATCH 2/2] Added template implementations of mame_ui_manager::set_handler(), and changed call sites --- src/frontend/mame/ui/menu.cpp | 2 +- src/frontend/mame/ui/menu.h | 2 +- src/frontend/mame/ui/sliders.cpp | 4 +- src/frontend/mame/ui/sliders.h | 2 +- src/frontend/mame/ui/ui.cpp | 294 +++++++++++++++---------------- src/frontend/mame/ui/ui.h | 38 +++- src/frontend/mame/ui/viewgfx.cpp | 2 +- src/frontend/mame/ui/viewgfx.h | 2 +- 8 files changed, 182 insertions(+), 164 deletions(-) diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index 995920655e6..35e325a35e7 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -1270,7 +1270,7 @@ void menu::do_handle() // and calls the menu handler //------------------------------------------------- -UINT32 menu::ui_handler(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 menu::ui_handler(render_container *container, mame_ui_manager &mui) { // if we have no menus stacked up, start with the main menu if (!menu_stack) diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index eb0cdb0a0dd..e450cf7399b 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -120,7 +120,7 @@ public: static void draw_arrow(render_container *container, float x0, float y0, float x1, float y1, rgb_t fgcolor, UINT32 orientation); // master handler - static UINT32 ui_handler(mame_ui_manager &mui, render_container *container, UINT32 state); + static UINT32 ui_handler(render_container *container, mame_ui_manager &mui); // Used by sliders void validate_selection(int scandir); diff --git a/src/frontend/mame/ui/sliders.cpp b/src/frontend/mame/ui/sliders.cpp index b94b8f00055..867c396fc79 100644 --- a/src/frontend/mame/ui/sliders.cpp +++ b/src/frontend/mame/ui/sliders.cpp @@ -264,7 +264,7 @@ void menu_sliders::custom_render(void *selectedref, float top, float bottom, flo standard menu handler -------------------------------------------------*/ -UINT32 menu_sliders::ui_handler(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 menu_sliders::ui_handler(render_container *container, mame_ui_manager &mui, bool state) { UINT32 result; @@ -273,7 +273,7 @@ UINT32 menu_sliders::ui_handler(mame_ui_manager &mui, render_container *containe menu::stack_push(mui, container, true); /* handle standard menus */ - result = menu::ui_handler(mui, container, state); + result = menu::ui_handler(container, mui); /* if we are cancelled, pop the sliders menu */ if (result == UI_HANDLER_CANCEL) diff --git a/src/frontend/mame/ui/sliders.h b/src/frontend/mame/ui/sliders.h index 6a7090058cc..726c5c0b81d 100644 --- a/src/frontend/mame/ui/sliders.h +++ b/src/frontend/mame/ui/sliders.h @@ -27,7 +27,7 @@ public: virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override; - static UINT32 ui_handler(mame_ui_manager &mui, render_container *container, UINT32 state); + static UINT32 ui_handler(render_container *container, mame_ui_manager &mui, bool state); private: enum { diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 472b26092a3..4f0f6be9a83 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -242,7 +242,7 @@ void mame_ui_manager::init() decode_ui_color(0, &machine()); // more initialization - set_handler(handler_messagebox, 0); + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_messagebox); m_non_char_keys_down = std::make_unique((ARRAY_LENGTH(non_char_keys) + 7) / 8); m_mouse_show = machine().system().flags & MACHINE_CLICKABLE_ARTWORK ? true : false; @@ -309,27 +309,6 @@ void mame_ui_manager::set_handler(ui_callback_type callback_type, const std::fun } -//------------------------------------------------- -// set_handler - set a callback/parameter -// pair for the current UI handler -//------------------------------------------------- - -UINT32 mame_ui_manager::set_handler(ui_callback callback, UINT32 param) -{ - ui_callback_type callback_type; - if (callback == ui::menu::ui_handler) - callback_type = UI_CALLBACK_TYPE_MENU; - else if (callback == handler_messagebox_anykey) - callback_type = UI_CALLBACK_TYPE_MODAL; - else - callback_type = UI_CALLBACK_TYPE_GENERAL; - - auto callback_func = [=](render_container *container) { return callback(*this, container, param); }; - set_handler(callback_type, callback_func); - return param; -} - - //------------------------------------------------- // display_startup_screens - display the // various startup screens @@ -354,7 +333,7 @@ void mame_ui_manager::display_startup_screens(bool first_time) #endif // loop over states - set_handler(handler_ingame, 0); + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_ingame); for (state = 0; state < maxstate && !machine().scheduled_event_pending() && !ui::menu::stack_has_special_main_menu(); state++) { // default to standard colors @@ -366,7 +345,7 @@ void mame_ui_manager::display_startup_screens(bool first_time) case 0: if (show_warnings && warnings_string(messagebox_text).length() > 0) { - set_handler(handler_messagebox_anykey, 0); + set_handler(UI_CALLBACK_TYPE_MODAL, &mame_ui_manager::handler_messagebox_anykey); if (machine().system().flags & (MACHINE_WRONG_COLORS | MACHINE_IMPERFECT_COLORS | MACHINE_REQUIRES_ARTWORK | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_KEYBOARD | MACHINE_NO_SOUND)) messagebox_backcolor = UI_YELLOW_COLOR; if (machine().system().flags & (MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_MECHANICAL)) @@ -376,7 +355,7 @@ void mame_ui_manager::display_startup_screens(bool first_time) case 1: if (show_gameinfo && game_info_astring(messagebox_text).length() > 0) - set_handler(handler_messagebox_anykey, 0); + set_handler(UI_CALLBACK_TYPE_MODAL, &mame_ui_manager::handler_messagebox_anykey); break; case 2: @@ -400,13 +379,13 @@ void mame_ui_manager::display_startup_screens(bool first_time) } // clear the handler and force an update - set_handler(handler_ingame, 0); + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_ingame); machine().video().frame_update(); } // if we're the empty driver, force the menus on if (ui::menu::stack_has_special_main_menu()) - set_handler(ui::menu::ui_handler, 0); + show_menu(); } @@ -491,7 +470,7 @@ void mame_ui_manager::update_and_render(render_container *container) // cancel takes us back to the ingame handler if (m_handler_param == UI_HANDLER_CANCEL) - set_handler(handler_ingame, 0); + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_ingame); } @@ -965,7 +944,7 @@ bool mame_ui_manager::show_profiler() const void mame_ui_manager::show_menu() { - set_handler(ui::menu::ui_handler, 0); + set_handler(UI_CALLBACK_TYPE_MENU, ui::menu::ui_handler, *this); } @@ -1253,9 +1232,9 @@ std::string &mame_ui_manager::game_info_astring(std::string &str) // messagebox_text string but handles no input //------------------------------------------------- -UINT32 mame_ui_manager::handler_messagebox(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 mame_ui_manager::handler_messagebox(render_container *container) { - mui.draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); + draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); return 0; } @@ -1266,20 +1245,22 @@ UINT32 mame_ui_manager::handler_messagebox(mame_ui_manager &mui, render_containe // any keypress //------------------------------------------------- -UINT32 mame_ui_manager::handler_messagebox_anykey(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 mame_ui_manager::handler_messagebox_anykey(render_container *container) { + UINT32 state = 0; + // draw a standard message window - mui.draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); + draw_text_box(container, messagebox_text.c_str(), JUSTIFY_LEFT, 0.5f, 0.5f, messagebox_backcolor); // if the user cancels, exit out completely - if (mui.machine().ui_input().pressed(IPT_UI_CANCEL)) + if (machine().ui_input().pressed(IPT_UI_CANCEL)) { - mui.machine().schedule_exit(); + machine().schedule_exit(); state = UI_HANDLER_CANCEL; } // if any key is pressed, just exit - else if (mui.machine().input().poll_switches() != INPUT_CODE_INVALID) + else if (machine().input().poll_switches() != INPUT_CODE_INVALID) state = UI_HANDLER_CANCEL; return state; @@ -1480,62 +1461,62 @@ void mame_ui_manager::image_display(const device_type &type, device_image_interf // of the standard keypresses //------------------------------------------------- -UINT32 mame_ui_manager::handler_ingame(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 mame_ui_manager::handler_ingame(render_container *container) { - bool is_paused = mui.machine().paused(); + bool is_paused = machine().paused(); // first draw the FPS counter - if (mui.show_fps_counter()) + if (show_fps_counter()) { - mui.draw_text_full(container, mui.machine().video().speed_text().c_str(), 0.0f, 0.0f, 1.0f, + draw_text_full(container, machine().video().speed_text().c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, rgb_t::white, rgb_t::black, nullptr, nullptr); } // Show the duration of current part (intro or gameplay or extra) - if (mui.show_timecode_counter()) { + if (show_timecode_counter()) { std::string tempstring; - mui.draw_text_full(container, mui.machine().video().timecode_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f, + draw_text_full(container, machine().video().timecode_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_RIGHT, WRAP_WORD, DRAW_OPAQUE, rgb_t(0xf0,0xf0,0x10,0x10), rgb_t::black, nullptr, nullptr); } // Show the total time elapsed for the video preview (all parts intro, gameplay, extras) - if (mui.show_timecode_total()) { + if (show_timecode_total()) { std::string tempstring; - mui.draw_text_full(container, mui.machine().video().timecode_total_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f, + draw_text_full(container, machine().video().timecode_total_text(tempstring).c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, rgb_t(0xf0,0x10,0xf0,0x10), rgb_t::black, nullptr, nullptr); } // draw the profiler if visible - if (mui.show_profiler()) + if (show_profiler()) { - const char *text = g_profiler.text(mui.machine()); - mui.draw_text_full(container, text, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, rgb_t::white, rgb_t::black, nullptr, nullptr); + const char *text = g_profiler.text(machine()); + draw_text_full(container, text, 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_WORD, DRAW_OPAQUE, rgb_t::white, rgb_t::black, nullptr, nullptr); } // if we're single-stepping, pause now - if (mui.single_step()) + if (single_step()) { - mui.machine().pause(); - mui.set_single_step(false); + machine().pause(); + set_single_step(false); } // determine if we should disable the rest of the UI - bool has_keyboard = mui.machine().ioport().has_keyboard(); - bool ui_disabled = (has_keyboard && !mui.machine().ui_active()); + bool has_keyboard = machine().ioport().has_keyboard(); + bool ui_disabled = (has_keyboard && !machine().ui_active()); // is ScrLk UI toggling applicable here? if (has_keyboard) { // are we toggling the UI with ScrLk? - if (mui.machine().ui_input().pressed(IPT_UI_TOGGLE_UI)) + if (machine().ui_input().pressed(IPT_UI_TOGGLE_UI)) { // toggle the UI - mui.machine().set_ui_active(!mui.machine().ui_active()); + machine().set_ui_active(!machine().ui_active()); // display a popup indicating the new status - if (mui.machine().ui_active()) + if (machine().ui_active()) { - mui.popup_time(2, "%s\n%s\n%s\n%s\n%s\n%s\n", + popup_time(2, "%s\n%s\n%s\n%s\n%s\n%s\n", _("Keyboard Emulation Status"), "-------------------------", _("Mode: PARTIAL Emulation"), @@ -1545,7 +1526,7 @@ UINT32 mame_ui_manager::handler_ingame(mame_ui_manager &mui, render_container *c } else { - mui.popup_time(2, "%s\n%s\n%s\n%s\n%s\n%s\n", + popup_time(2, "%s\n%s\n%s\n%s\n%s\n%s\n", _("Keyboard Emulation Status"), "-------------------------", _("Mode: FULL Emulation"), @@ -1557,64 +1538,71 @@ UINT32 mame_ui_manager::handler_ingame(mame_ui_manager &mui, render_container *c } // is the natural keyboard enabled? - if (mui.use_natural_keyboard() && (mui.machine().phase() == MACHINE_PHASE_RUNNING)) - mui.process_natural_keyboard(); + if (use_natural_keyboard() && (machine().phase() == MACHINE_PHASE_RUNNING)) + process_natural_keyboard(); if (!ui_disabled) { // paste command - if (mui.machine().ui_input().pressed(IPT_UI_PASTE)) - mui.paste(); + if (machine().ui_input().pressed(IPT_UI_PASTE)) + paste(); } - mui.image_handler_ingame(); + image_handler_ingame(); // handle a save input timecode request - if (mui.machine().ui_input().pressed(IPT_UI_TIMECODE)) - mui.machine().video().save_input_timecode(); + if (machine().ui_input().pressed(IPT_UI_TIMECODE)) + machine().video().save_input_timecode(); if (ui_disabled) return ui_disabled; - if (mui.machine().ui_input().pressed(IPT_UI_CANCEL)) + if (machine().ui_input().pressed(IPT_UI_CANCEL)) { - mui.request_quit(); + request_quit(); return 0; } // turn on menus if requested - if (mui.machine().ui_input().pressed(IPT_UI_CONFIGURE)) - return mui.set_handler(ui::menu::ui_handler, 0); + if (machine().ui_input().pressed(IPT_UI_CONFIGURE)) + { + show_menu(); + return 0; + } // if the on-screen display isn't up and the user has toggled it, turn it on - if ((mui.machine().debug_flags & DEBUG_FLAG_ENABLED) == 0 && mui.machine().ui_input().pressed(IPT_UI_ON_SCREEN_DISPLAY)) - return mui.set_handler(ui::menu_sliders::ui_handler, 1); + if ((machine().debug_flags & DEBUG_FLAG_ENABLED) == 0 && machine().ui_input().pressed(IPT_UI_ON_SCREEN_DISPLAY)) + { + set_handler(UI_CALLBACK_TYPE_GENERAL, ui::menu_sliders::ui_handler, *this, true); + return 1; + } // handle a reset request - if (mui.machine().ui_input().pressed(IPT_UI_RESET_MACHINE)) - mui.machine().schedule_hard_reset(); - if (mui.machine().ui_input().pressed(IPT_UI_SOFT_RESET)) - mui.machine().schedule_soft_reset(); + if (machine().ui_input().pressed(IPT_UI_RESET_MACHINE)) + machine().schedule_hard_reset(); + if (machine().ui_input().pressed(IPT_UI_SOFT_RESET)) + machine().schedule_soft_reset(); // handle a request to display graphics/palette - if (mui.machine().ui_input().pressed(IPT_UI_SHOW_GFX)) + if (machine().ui_input().pressed(IPT_UI_SHOW_GFX)) { if (!is_paused) - mui.machine().pause(); - return mui.set_handler(ui_gfx_ui_handler, is_paused); + machine().pause(); + set_handler(UI_CALLBACK_TYPE_GENERAL, ui_gfx_ui_handler, *this, is_paused); + return is_paused ? 1 : 0; } // handle a tape control key - if (mui.machine().ui_input().pressed(IPT_UI_TAPE_START)) + if (machine().ui_input().pressed(IPT_UI_TAPE_START)) { - for (cassette_image_device &cass : cassette_device_iterator(mui.machine().root_device())) + for (cassette_image_device &cass : cassette_device_iterator(machine().root_device())) { cass.change_state(CASSETTE_PLAY, CASSETTE_MASK_UISTATE); return 0; } } - if (mui.machine().ui_input().pressed(IPT_UI_TAPE_STOP)) + if (machine().ui_input().pressed(IPT_UI_TAPE_STOP)) { - for (cassette_image_device &cass : cassette_device_iterator(mui.machine().root_device())) + for (cassette_image_device &cass : cassette_device_iterator(machine().root_device())) { cass.change_state(CASSETTE_STOPPED, CASSETTE_MASK_UISTATE); return 0; @@ -1622,87 +1610,89 @@ UINT32 mame_ui_manager::handler_ingame(mame_ui_manager &mui, render_container *c } // handle a save state request - if (mui.machine().ui_input().pressed(IPT_UI_SAVE_STATE)) + if (machine().ui_input().pressed(IPT_UI_SAVE_STATE)) { - mui.machine().pause(); - mui.m_load_save_hold = true; - return mui.set_handler(handler_load_save, LOADSAVE_SAVE); + machine().pause(); + m_load_save_hold = true; + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_load_save, (UINT32)LOADSAVE_SAVE); + return LOADSAVE_SAVE; } // handle a load state request - if (mui.machine().ui_input().pressed(IPT_UI_LOAD_STATE)) + if (machine().ui_input().pressed(IPT_UI_LOAD_STATE)) { - mui.machine().pause(); - mui.m_load_save_hold = true; - return mui.set_handler(handler_load_save, LOADSAVE_LOAD); + machine().pause(); + m_load_save_hold = true; + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_load_save, (UINT32)LOADSAVE_LOAD); + return LOADSAVE_LOAD; } // handle a save snapshot request - if (mui.machine().ui_input().pressed(IPT_UI_SNAPSHOT)) - mui.machine().video().save_active_screen_snapshots(); + if (machine().ui_input().pressed(IPT_UI_SNAPSHOT)) + machine().video().save_active_screen_snapshots(); // toggle pause - if (mui.machine().ui_input().pressed(IPT_UI_PAUSE)) - mui.machine().toggle_pause(); + if (machine().ui_input().pressed(IPT_UI_PAUSE)) + machine().toggle_pause(); // pause single step - if (mui.machine().ui_input().pressed(IPT_UI_PAUSE_SINGLE)) + if (machine().ui_input().pressed(IPT_UI_PAUSE_SINGLE)) { - mui.set_single_step(true); - mui.machine().resume(); + set_single_step(true); + machine().resume(); } // handle a toggle cheats request - if (mui.machine().ui_input().pressed(IPT_UI_TOGGLE_CHEAT)) + if (machine().ui_input().pressed(IPT_UI_TOGGLE_CHEAT)) mame_machine_manager::instance()->cheat().set_enable(!mame_machine_manager::instance()->cheat().enabled()); // toggle movie recording - if (mui.machine().ui_input().pressed(IPT_UI_RECORD_MOVIE)) - mui.machine().video().toggle_record_movie(); + if (machine().ui_input().pressed(IPT_UI_RECORD_MOVIE)) + machine().video().toggle_record_movie(); // toggle profiler display - if (mui.machine().ui_input().pressed(IPT_UI_SHOW_PROFILER)) - mui.set_show_profiler(!mui.show_profiler()); + if (machine().ui_input().pressed(IPT_UI_SHOW_PROFILER)) + set_show_profiler(!show_profiler()); // toggle FPS display - if (mui.machine().ui_input().pressed(IPT_UI_SHOW_FPS)) - mui.set_show_fps(!mui.show_fps()); + if (machine().ui_input().pressed(IPT_UI_SHOW_FPS)) + set_show_fps(!show_fps()); // increment frameskip? - if (mui.machine().ui_input().pressed(IPT_UI_FRAMESKIP_INC)) - mui.increase_frameskip(); + if (machine().ui_input().pressed(IPT_UI_FRAMESKIP_INC)) + increase_frameskip(); // decrement frameskip? - if (mui.machine().ui_input().pressed(IPT_UI_FRAMESKIP_DEC)) - mui.decrease_frameskip(); + if (machine().ui_input().pressed(IPT_UI_FRAMESKIP_DEC)) + decrease_frameskip(); // toggle throttle? - if (mui.machine().ui_input().pressed(IPT_UI_THROTTLE)) - mui.machine().video().toggle_throttle(); + if (machine().ui_input().pressed(IPT_UI_THROTTLE)) + machine().video().toggle_throttle(); // toggle autofire - if (mui.machine().ui_input().pressed(IPT_UI_TOGGLE_AUTOFIRE)) + if (machine().ui_input().pressed(IPT_UI_TOGGLE_AUTOFIRE)) { - if (!mui.machine().options().cheat()) + if (!machine().options().cheat()) { - mui.machine().popmessage(_("Autofire can't be enabled")); + machine().popmessage(_("Autofire can't be enabled")); } else { - bool autofire_toggle = mui.machine().ioport().get_autofire_toggle(); - mui.machine().ioport().set_autofire_toggle(!autofire_toggle); - mui.machine().popmessage("Autofire %s", autofire_toggle ? _("Enabled") : _("Disabled")); + bool autofire_toggle = machine().ioport().get_autofire_toggle(); + machine().ioport().set_autofire_toggle(!autofire_toggle); + machine().popmessage("Autofire %s", autofire_toggle ? _("Enabled") : _("Disabled")); } } // check for fast forward - if (mui.machine().ioport().type_pressed(IPT_UI_FAST_FORWARD)) + if (machine().ioport().type_pressed(IPT_UI_FAST_FORWARD)) { - mui.machine().video().set_fastforward(true); - mui.show_fps_temp(0.5); + machine().video().set_fastforward(true); + show_fps_temp(0.5); } else - mui.machine().video().set_fastforward(false); + machine().video().set_fastforward(false); return 0; } @@ -1713,7 +1703,7 @@ UINT32 mame_ui_manager::handler_ingame(mame_ui_manager &mui, render_container *c // specifying a game to save or load //------------------------------------------------- -UINT32 mame_ui_manager::handler_load_save(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 mame_ui_manager::handler_load_save(render_container *container, UINT32 state) { char filename[20]; char file = 0; @@ -1724,52 +1714,52 @@ UINT32 mame_ui_manager::handler_load_save(mame_ui_manager &mui, render_container // okay, we're waiting for a key to select a slot; display a message if (state == LOADSAVE_SAVE) - mui.draw_message_window(container, _("Select position to save to")); + draw_message_window(container, _("Select position to save to")); else - mui.draw_message_window(container, _("Select position to load from")); + draw_message_window(container, _("Select position to load from")); // if load/save state sequence is still being pressed, do not read the filename yet - if (mui.m_load_save_hold) { + if (m_load_save_hold) { bool seq_in_progress = false; const input_seq &load_save_seq = state == LOADSAVE_SAVE ? - mui.machine().ioport().type_seq(IPT_UI_SAVE_STATE) : - mui.machine().ioport().type_seq(IPT_UI_LOAD_STATE); + machine().ioport().type_seq(IPT_UI_SAVE_STATE) : + machine().ioport().type_seq(IPT_UI_LOAD_STATE); for (int i = 0; i < load_save_seq.length(); i++) - if (mui.machine().input().code_pressed_once(load_save_seq[i])) + if (machine().input().code_pressed_once(load_save_seq[i])) seq_in_progress = true; if (seq_in_progress) return state; else - mui.m_load_save_hold = false; + m_load_save_hold = false; } // check for cancel key - if (mui.machine().ui_input().pressed(IPT_UI_CANCEL)) + if (machine().ui_input().pressed(IPT_UI_CANCEL)) { // display a popup indicating things were cancelled if (state == LOADSAVE_SAVE) - mui.machine().popmessage(_("Save cancelled")); + machine().popmessage(_("Save cancelled")); else - mui.machine().popmessage(_("Load cancelled")); + machine().popmessage(_("Load cancelled")); // reset the state - mui.machine().resume(); + machine().resume(); return UI_HANDLER_CANCEL; } // check for A-Z or 0-9 for (input_item_id id = ITEM_ID_A; id <= ITEM_ID_Z; ++id) - if (mui.machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) + if (machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) file = id - ITEM_ID_A + 'a'; if (file == 0) for (input_item_id id = ITEM_ID_0; id <= ITEM_ID_9; ++id) - if (mui.machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) + if (machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) file = id - ITEM_ID_0 + '0'; if (file == 0) for (input_item_id id = ITEM_ID_0_PAD; id <= ITEM_ID_9_PAD; ++id) - if (mui.machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) + if (machine().input().code_pressed_once(input_code(DEVICE_CLASS_KEYBOARD, 0, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) file = id - ITEM_ID_0_PAD + '0'; if (file == 0) { @@ -1777,7 +1767,7 @@ UINT32 mame_ui_manager::handler_load_save(mame_ui_manager &mui, render_container for (int joy_index = 0; joy_index <= MAX_SAVED_STATE_JOYSTICK; joy_index++) for (input_item_id id = ITEM_ID_BUTTON1; id <= ITEM_ID_BUTTON32; ++id) - if (mui.machine().input().code_pressed_once(input_code(DEVICE_CLASS_JOYSTICK, joy_index, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) + if (machine().input().code_pressed_once(input_code(DEVICE_CLASS_JOYSTICK, joy_index, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, id))) { snprintf(filename, sizeof(filename), "joy%i-%i", joy_index, id - ITEM_ID_BUTTON1 + 1); found = true; @@ -1795,20 +1785,20 @@ UINT32 mame_ui_manager::handler_load_save(mame_ui_manager &mui, render_container // display a popup indicating that the save will proceed if (state == LOADSAVE_SAVE) { - mui.machine().popmessage(_("Save to position %s"), filename); - mui.machine().schedule_save(filename); + machine().popmessage(_("Save to position %s"), filename); + machine().schedule_save(filename); } else { - mui.machine().popmessage(_("Load from position %s"), filename); - mui.machine().schedule_load(filename); + machine().popmessage(_("Load from position %s"), filename); + machine().schedule_load(filename); } // avoid handling the name of the save state slot as a seperate input - mui.machine().ui_input().mark_all_as_pressed(); + machine().ui_input().mark_all_as_pressed(); // remove the pause and reset the state - mui.machine().resume(); + machine().resume(); return UI_HANDLER_CANCEL; } @@ -1822,7 +1812,7 @@ void mame_ui_manager::request_quit() if (!machine().options().confirm_quit()) machine().schedule_exit(); else - set_handler(handler_confirm_quit, 0); + set_handler(UI_CALLBACK_TYPE_GENERAL, &mame_ui_manager::handler_confirm_quit); } @@ -1831,13 +1821,15 @@ void mame_ui_manager::request_quit() // confirming quit emulation //------------------------------------------------- -UINT32 mame_ui_manager::handler_confirm_quit(mame_ui_manager &mui, render_container *container, UINT32 state) +UINT32 mame_ui_manager::handler_confirm_quit(render_container *container) { + UINT32 state = 0; + // get the text for 'UI Select' - std::string ui_select_text = mui.machine().input().seq_name(mui.machine().ioport().type_seq(IPT_UI_SELECT, 0, SEQ_TYPE_STANDARD)); + std::string ui_select_text = machine().input().seq_name(machine().ioport().type_seq(IPT_UI_SELECT, 0, SEQ_TYPE_STANDARD)); // get the text for 'UI Cancel' - std::string ui_cancel_text = mui.machine().input().seq_name(mui.machine().ioport().type_seq(IPT_UI_CANCEL, 0, SEQ_TYPE_STANDARD)); + std::string ui_cancel_text = machine().input().seq_name(machine().ioport().type_seq(IPT_UI_CANCEL, 0, SEQ_TYPE_STANDARD)); // assemble the quit message std::string quit_message = string_format(_("Are you sure you want to quit?\n\n" @@ -1846,17 +1838,17 @@ UINT32 mame_ui_manager::handler_confirm_quit(mame_ui_manager &mui, render_contai ui_select_text, ui_cancel_text); - mui.draw_text_box(container, quit_message.c_str(), JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR); - mui.machine().pause(); + draw_text_box(container, quit_message.c_str(), JUSTIFY_CENTER, 0.5f, 0.5f, UI_RED_COLOR); + machine().pause(); // if the user press ENTER, quit the game - if (mui.machine().ui_input().pressed(IPT_UI_SELECT)) - mui.machine().schedule_exit(); + if (machine().ui_input().pressed(IPT_UI_SELECT)) + machine().schedule_exit(); // if the user press ESC, just continue - else if (mui.machine().ui_input().pressed(IPT_UI_CANCEL)) + else if (machine().ui_input().pressed(IPT_UI_CANCEL)) { - mui.machine().resume(); + machine().resume(); state = UI_HANDLER_CANCEL; } diff --git a/src/frontend/mame/ui/ui.h b/src/frontend/mame/ui/ui.h index 81c25f1568f..c5e4127a369 100644 --- a/src/frontend/mame/ui/ui.h +++ b/src/frontend/mame/ui/ui.h @@ -184,7 +184,33 @@ public: std::vector slider_init(running_machine &machine); void set_handler(ui_callback_type callback_type, const std::function callback); - UINT32 set_handler(ui_callback callback, UINT32 param); + + template + void set_handler(ui_callback_type callback_type, T &obj, UINT32(T::*callback)(render_container *, Params...), Params ...args) + { + auto lambda = [=, &obj](render_container *container) + { + return ((obj).*(callback))(container, args...); + }; + set_handler(callback_type, lambda); + } + + template + void set_handler(ui_callback_type callback_type, UINT32(mame_ui_manager::*callback)(render_container *, Params...), Params ...args) + { + set_handler(callback_type, *this, callback, args...); + } + + template + void set_handler(ui_callback_type callback_type, UINT32(*callback)(render_container *, Params...), Params ...args) + { + auto lambda = [&, callback](render_container *container) + { + return callback(container, args...); + }; + set_handler(callback_type, lambda); + } + void display_startup_screens(bool first_time); virtual void set_startup_text(const char *text, bool force) override; void update_and_render(render_container *container); @@ -271,11 +297,11 @@ private: std::string &warnings_string(std::string &buffer); // UI handlers - static UINT32 handler_messagebox(mame_ui_manager &mui, render_container *container, UINT32 state); - static UINT32 handler_messagebox_anykey(mame_ui_manager &mui, render_container *container, UINT32 state); - static UINT32 handler_ingame(mame_ui_manager &mui, render_container *container, UINT32 state); - static UINT32 handler_load_save(mame_ui_manager &mui, render_container *container, UINT32 state); - static UINT32 handler_confirm_quit(mame_ui_manager &mui, render_container *container, UINT32 state); + UINT32 handler_messagebox(render_container *container); + UINT32 handler_messagebox_anykey(render_container *container); + UINT32 handler_ingame(render_container *container); + UINT32 handler_load_save(render_container *container, UINT32 state); + UINT32 handler_confirm_quit(render_container *container); // private methods void exit(); diff --git a/src/frontend/mame/ui/viewgfx.cpp b/src/frontend/mame/ui/viewgfx.cpp index 67cc2990ab5..7a416b0704d 100644 --- a/src/frontend/mame/ui/viewgfx.cpp +++ b/src/frontend/mame/ui/viewgfx.cpp @@ -240,7 +240,7 @@ bool ui_gfx_is_relevant(running_machine &machine) // ui_gfx_ui_handler - primary UI handler //------------------------------------------------- -UINT32 ui_gfx_ui_handler(mame_ui_manager &mui, render_container *container, UINT32 uistate) +UINT32 ui_gfx_ui_handler(render_container *container, mame_ui_manager &mui, bool uistate) { ui_gfx_state &state = ui_gfx; diff --git a/src/frontend/mame/ui/viewgfx.h b/src/frontend/mame/ui/viewgfx.h index 88906163d88..2e6467833dd 100644 --- a/src/frontend/mame/ui/viewgfx.h +++ b/src/frontend/mame/ui/viewgfx.h @@ -26,7 +26,7 @@ void ui_gfx_init(running_machine &machine); bool ui_gfx_is_relevant(running_machine &machine); // master handler -UINT32 ui_gfx_ui_handler(mame_ui_manager &mui, render_container *container, UINT32 state); +UINT32 ui_gfx_ui_handler(render_container *container, mame_ui_manager &mui, bool uistate); #endif /* __UI_VIEWGFX_H__ */