diff options
author | Vas Crabb <vas@vastheman.com> | 2021-10-15 11:12:03 +1100 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2021-10-15 11:18:52 +1100 |
commit | 292178da5c2c3d610bebe5a555e4e758d629652d (patch) | |
tree | 820596b14b538fa0d38dcd06bf7f8cb782126a77 /src/frontend/mame/ui | |
parent | f1f9992f909a7af2eee7a32d330bd3c20e2c2954 (diff) |
frontend: Two bug fixes.
Audit menu was using one variable for two things, which obviously
doesn't work.
DIP switch menu could trigger spurious clicks on for systems with too
many DIP switch groups to show.
Also work around Xcode's issues with casting non-const to const
reference wrappers.
Diffstat (limited to 'src/frontend/mame/ui')
-rw-r--r-- | src/frontend/mame/ui/auditmenu.cpp | 5 | ||||
-rw-r--r-- | src/frontend/mame/ui/auditmenu.h | 1 | ||||
-rw-r--r-- | src/frontend/mame/ui/confswitch.cpp | 30 |
3 files changed, 21 insertions, 15 deletions
diff --git a/src/frontend/mame/ui/auditmenu.cpp b/src/frontend/mame/ui/auditmenu.cpp index 7fda02764a0..717973d9cfc 100644 --- a/src/frontend/mame/ui/auditmenu.cpp +++ b/src/frontend/mame/ui/auditmenu.cpp @@ -48,6 +48,7 @@ menu_audit::menu_audit(mame_ui_manager &mui, render_container &container) std::size_t(0), [] (std::size_t n, ui_system_info const &info) { return n + (info.available ? 0 : 1); })) , m_future() + , m_next(0) , m_audited(0) , m_current(nullptr) , m_cancel(false) @@ -163,7 +164,7 @@ void menu_audit::handle() case phase::CANCELLATION: process(PROCESS_CUSTOM_ONLY | PROCESS_NOINPUT); - if ((m_audited.load() >= (m_fast ? m_unavailable : m_availablesorted.size())) || m_cancel.load()) + if ((m_next.load() >= m_availablesorted.size()) || m_cancel.load()) { bool done(true); for (auto &future : m_future) @@ -195,7 +196,7 @@ bool menu_audit::do_audit() { while (true) { - std::size_t const i(m_audited.fetch_add(1)); + std::size_t const i(m_next.fetch_add(1)); if (m_availablesorted.size() <= i) return true; diff --git a/src/frontend/mame/ui/auditmenu.h b/src/frontend/mame/ui/auditmenu.h index 6536c3a19aa..ea1dfa26821 100644 --- a/src/frontend/mame/ui/auditmenu.h +++ b/src/frontend/mame/ui/auditmenu.h @@ -45,6 +45,7 @@ private: std::vector<std::reference_wrapper<ui_system_info> > const &m_availablesorted; std::size_t const m_unavailable; std::vector<std::future<bool> > m_future; + std::atomic<std::size_t> m_next; std::atomic<std::size_t> m_audited; std::atomic<ui_system_info const *> m_current; std::atomic<bool> m_cancel; diff --git a/src/frontend/mame/ui/confswitch.cpp b/src/frontend/mame/ui/confswitch.cpp index b162b57efe5..d45f8f0242c 100644 --- a/src/frontend/mame/ui/confswitch.cpp +++ b/src/frontend/mame/ui/confswitch.cpp @@ -391,25 +391,29 @@ bool menu_settings_dip_switches::custom_mouse_down() float const x(get_mouse_x() - m_first_nub); float const y(get_mouse_y()); - for (unsigned n = 0U; switch_groups().size() > n; ++n) + for (unsigned n = 0U, line = 0U; (switch_groups().size() > n) && (m_visible_switch_groups > line); ++n) { switch_group_descriptor const &group(switch_groups()[n]); - if (group.mask && (y >= m_switch_group_y[n]) && (y < (m_switch_group_y[n] + m_clickable_height))) + if (group.mask) { - unsigned const cnt(group.switch_count()); - for (unsigned i = 0U; cnt > i; ++i) + ++line; + if ((y >= m_switch_group_y[n]) && (y < (m_switch_group_y[n] + m_clickable_height))) { - if (BIT(group.mask, i)) + unsigned const cnt(group.switch_count()); + for (unsigned i = 0U; cnt > i; ++i) { - float const xstart(float(i) * m_single_width); - if ((x >= xstart) && (x < (xstart + m_nub_width))) + if (BIT(group.mask, i)) { - ioport_field::user_settings settings; - group.toggles[i].field->get_user_settings(settings); - settings.value ^= group.toggles[i].mask; - group.toggles[i].field->set_user_settings(settings); - reset(reset_options::REMEMBER_REF); - return true; + float const xstart(float(i) * m_single_width); + if ((x >= xstart) && (x < (xstart + m_nub_width))) + { + ioport_field::user_settings settings; + group.toggles[i].field->get_user_settings(settings); + settings.value ^= group.toggles[i].mask; + group.toggles[i].field->set_user_settings(settings); + reset(reset_options::REMEMBER_REF); + return true; + } } } } |