From 98131a6b9e152661ff55b4e2f5355b0f1fe9b7e3 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Thu, 23 Feb 2023 06:33:22 +1100 Subject: osd: Cleaner way of dealing with input updates. --- src/emu/machine.cpp | 5 +++-- src/emu/video.cpp | 1 + src/frontend/mame/mame.cpp | 2 -- src/frontend/mame/ui/menu.cpp | 5 +++++ src/frontend/mame/ui/ui.cpp | 3 +++ src/frontend/mame/ui/viewgfx.cpp | 5 +++++ src/osd/mac/osdmac.h | 1 + src/osd/mac/video.cpp | 21 ++++++++++----------- src/osd/mac/window.cpp | 2 -- src/osd/modules/input/input_common.h | 2 +- src/osd/osdepend.h | 1 + src/osd/sdl/osdsdl.cpp | 1 - src/osd/sdl/osdsdl.h | 3 +-- src/osd/sdl/window.cpp | 2 -- src/osd/windows/video.cpp | 1 - src/osd/windows/window.cpp | 5 ----- src/osd/windows/winmain.h | 3 +-- 17 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp index b610c9598e0..2af367d7362 100644 --- a/src/emu/machine.cpp +++ b/src/emu/machine.cpp @@ -148,12 +148,13 @@ void running_machine::start() // initialize UI input m_ui_input = std::make_unique(*this); - // init the osd layer + // init the OSD layer m_manager.osd().init(*this); - // create the video manager + // create the video manager and UI manager m_video = std::make_unique(*this); m_ui = manager().create_ui(*this); + m_ui->set_startup_text("Initializing...", true); // initialize the base time (needed for doing record/playback) ::time(&m_base_time); diff --git a/src/emu/video.cpp b/src/emu/video.cpp index 9cbf89f7625..5bb3ecdaf47 100644 --- a/src/emu/video.cpp +++ b/src/emu/video.cpp @@ -247,6 +247,7 @@ void video_manager::frame_update(bool from_debugger) if (!from_debugger && !skipped_it && phase > machine_phase::INIT && m_low_latency && effective_throttle()) update_throttle(current_time); + machine().osd().input_update(); emulator_info::periodic_check(); if (!from_debugger) diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp index 2873bbb1971..045ef56ac82 100644 --- a/src/frontend/mame/mame.cpp +++ b/src/frontend/mame/mame.cpp @@ -353,8 +353,6 @@ ui_manager* mame_machine_manager::create_ui(running_machine& machine) machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(&mame_machine_manager::reset, this)); - m_ui->set_startup_text("Initializing...", true); - return m_ui.get(); } diff --git a/src/frontend/mame/ui/menu.cpp b/src/frontend/mame/ui/menu.cpp index 1f00a882a9a..c945b3f0297 100644 --- a/src/frontend/mame/ui/menu.cpp +++ b/src/frontend/mame/ui/menu.cpp @@ -25,6 +25,8 @@ #include "rendutil.h" #include "uiinput.h" +#include "osdepend.h" + #include #include #include @@ -1250,6 +1252,9 @@ void menu::validate_selection(int scandir) void menu::do_handle() { + // let OSD do its thing + machine().osd().check_osd_inputs(); + // recompute metrics if necessary render_manager &render(machine().render()); render_target &target(render.ui_target()); diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp index 8f04ae7b980..fc7c6f43298 100644 --- a/src/frontend/mame/ui/ui.cpp +++ b/src/frontend/mame/ui/ui.cpp @@ -1239,6 +1239,9 @@ void mame_ui_manager::image_handler_ingame() uint32_t mame_ui_manager::handler_ingame(render_container &container) { + // let the OSD do its thing first + machine().osd().check_osd_inputs(); + bool is_paused = machine().paused(); // first draw the FPS counter diff --git a/src/frontend/mame/ui/viewgfx.cpp b/src/frontend/mame/ui/viewgfx.cpp index 56dfd008893..4c57e569e10 100644 --- a/src/frontend/mame/ui/viewgfx.cpp +++ b/src/frontend/mame/ui/viewgfx.cpp @@ -21,6 +21,8 @@ #include "util/unicode.h" +#include "osdepend.h" + #include #include @@ -56,6 +58,9 @@ public: if (!is_relevant()) return cancel(uistate); + // let the OSD do its thing + mui.machine().osd().check_osd_inputs(); + // always mark the bitmap dirty if not paused if (!m_machine.paused()) m_bitmap_dirty = true; diff --git a/src/osd/mac/osdmac.h b/src/osd/mac/osdmac.h index ba1adeb69a8..aa7d9086215 100644 --- a/src/osd/mac/osdmac.h +++ b/src/osd/mac/osdmac.h @@ -45,6 +45,7 @@ public: virtual void init(running_machine &machine) override; virtual void update(bool skip_redraw) override; virtual void input_update() override; + virtual void check_osd_inputs() override; // input overridables virtual void customize_input_type_list(std::vector &typelist) override; diff --git a/src/osd/mac/video.cpp b/src/osd/mac/video.cpp index b97a1f06699..b0eed52a1c3 100644 --- a/src/osd/mac/video.cpp +++ b/src/osd/mac/video.cpp @@ -128,41 +128,40 @@ void mac_osd_interface::input_update() process_events_buf(); MacPollInputs(); poll_input_modules(); - check_osd_inputs(machine()); } //============================================================ // check_osd_inputs //============================================================ -static void check_osd_inputs(running_machine &machine) +void mac_osd_interface::check_osd_inputs() { // check for toggling fullscreen mode - if (machine.ui_input().pressed(IPT_OSD_1)) + if (machine().ui_input().pressed(IPT_OSD_1)) { // destroy the renderers first so that the render module can bounce if it depends on having a window handle - for (auto it = osd_common_t::window_list().rbegin(); osd_common_t::window_list().rend() != it; ++it) + for (auto it = window_list().rbegin(); window_list().rend() != it; ++it) (*it)->renderer_reset(); - for (auto const &curwin : osd_common_t::window_list()) + for (auto const &curwin : window_list()) dynamic_cast(*curwin).toggle_full_screen(); } - auto const &window = osd_common_t::window_list().front(); + auto const &window = window_list().front(); //FIXME: on a per window basis - if (machine.ui_input().pressed(IPT_OSD_5)) + if (machine().ui_input().pressed(IPT_OSD_5)) { video_config.filter = !video_config.filter; - machine.ui().popup_time(1, "Filter %s", video_config.filter? "enabled":"disabled"); + machine().ui().popup_time(1, "Filter %s", video_config.filter? "enabled":"disabled"); } - if (machine.ui_input().pressed(IPT_OSD_6)) + if (machine().ui_input().pressed(IPT_OSD_6)) dynamic_cast(*window).modify_prescale(-1); - if (machine.ui_input().pressed(IPT_OSD_7)) + if (machine().ui_input().pressed(IPT_OSD_7)) dynamic_cast(*window).modify_prescale(1); - if (machine.ui_input().pressed(IPT_OSD_8)) + if (machine().ui_input().pressed(IPT_OSD_8)) window->renderer().record(); } diff --git a/src/osd/mac/window.cpp b/src/osd/mac/window.cpp index f8d95a40205..02fecce8986 100644 --- a/src/osd/mac/window.cpp +++ b/src/osd/mac/window.cpp @@ -230,8 +230,6 @@ void mac_window_info::toggle_full_screen() m_windowed_dim = get_size(); } - // reset UI to main menu - machine().ui().menu_reset(); // kill off the drawers renderer_reset(); if (fullscreen() && video_config.switchres) diff --git a/src/osd/modules/input/input_common.h b/src/osd/modules/input/input_common.h index 8a5e22478f4..2893e1c8aee 100644 --- a/src/osd/modules/input/input_common.h +++ b/src/osd/modules/input/input_common.h @@ -397,7 +397,7 @@ class input_module_base : public osd_module, public input_module { private: // 10 milliseconds polling interval - static constexpr inline unsigned MIN_POLLING_INTERVAL = 10; + static constexpr inline unsigned MIN_POLLING_INTERVAL = 2; using clock_type = std::chrono::high_resolution_clock; using timepoint_type = std::chrono::time_point; diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h index 78f485d1759..99ad1dc8834 100644 --- a/src/osd/osdepend.h +++ b/src/osd/osdepend.h @@ -67,6 +67,7 @@ public: virtual void init(running_machine &machine) = 0; virtual void update(bool skip_redraw) = 0; virtual void input_update() = 0; + virtual void check_osd_inputs() = 0; virtual void set_verbose(bool print_verbose) = 0; // debugger overridables diff --git a/src/osd/sdl/osdsdl.cpp b/src/osd/sdl/osdsdl.cpp index b7b71502fbb..8df698d3e5b 100644 --- a/src/osd/sdl/osdsdl.cpp +++ b/src/osd/sdl/osdsdl.cpp @@ -298,7 +298,6 @@ void sdl_osd_interface::input_update() { process_events_buf(); poll_input_modules(); - check_osd_inputs(); } diff --git a/src/osd/sdl/osdsdl.h b/src/osd/sdl/osdsdl.h index e0c939072be..2d695d5dfde 100644 --- a/src/osd/sdl/osdsdl.h +++ b/src/osd/sdl/osdsdl.h @@ -146,6 +146,7 @@ public: virtual void init(running_machine &machine) override; virtual void update(bool skip_redraw) override; virtual void input_update() override; + virtual void check_osd_inputs() override; // input overridables virtual void customize_input_type_list(std::vector &typelist) override; @@ -190,8 +191,6 @@ private: void process_window_event(SDL_Event const &event); void process_textinput_event(SDL_Event const &event); - void check_osd_inputs(); - bool mouse_over_window() const { return m_mouse_over_window > 0; } template sdl_window_info *focus_window(T const &event) const; diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 446d401b151..da5bd790d87 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -239,8 +239,6 @@ void sdl_window_info::toggle_full_screen() m_windowed_dim = get_size(); } - // reset UI to main menu - machine().ui().menu_reset(); // kill off the drawers renderer_reset(); bool is_osx = false; diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp index b12e0a94e06..14339614a0c 100644 --- a/src/osd/windows/video.cpp +++ b/src/osd/windows/video.cpp @@ -119,7 +119,6 @@ void windows_osd_interface::input_update() // poll the joystick values here process_events(true, false); poll_input_modules(); - check_osd_inputs(); } //============================================================ diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index b4ef6d92eab..7c1a6aa366b 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -1727,11 +1727,6 @@ void win_window_info::set_fullscreen(int fullscreen) return; m_fullscreen = fullscreen; - // reset UI to main menu - // FIXME: this cause crash if called when running_machine.m_ui not yet initialised. e.g. when trying to show error/warning messagebox at startup (during auto-switch from full screen to windowed mode). - // the menus need to be able to survive a fullscreen toggle anyway - machine().ui().menu_reset(); - // kill off the renderer renderer_reset(); diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index 7f3d6f7964f..a1797d9cc7e 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -60,6 +60,7 @@ public: virtual void init(running_machine &machine) override; virtual void update(bool skip_redraw) override; virtual void input_update() override; + virtual void check_osd_inputs() override; // input overrideables virtual void customize_input_type_list(std::vector &typelist) override; @@ -92,8 +93,6 @@ protected: virtual void build_slider_list() override; virtual void update_slider_list() override; - void check_osd_inputs(); - private: void process_events(bool ingame, bool nodispatch); virtual void osd_exit() override; -- cgit v1.2.3