summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend
diff options
context:
space:
mode:
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
commit292178da5c2c3d610bebe5a555e4e758d629652d (patch)
tree820596b14b538fa0d38dcd06bf7f8cb782126a77 /src/frontend
parentf1f9992f909a7af2eee7a32d330bd3c20e2c2954 (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')
-rw-r--r--src/frontend/mame/ui/auditmenu.cpp5
-rw-r--r--src/frontend/mame/ui/auditmenu.h1
-rw-r--r--src/frontend/mame/ui/confswitch.cpp30
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;
+ }
}
}
}