summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2023-02-05 04:50:30 +1100
committer Vas Crabb <vas@vastheman.com>2023-02-05 05:01:40 +1100
commitb98fb7c98e5e44d436808eac46c927d3d0dc1f3f (patch)
treecd411d4fe24cd36862c78165723833e42de27303 /src
parent519554c8464ba8e8641e474bc949a2a0beae77ae (diff)
Small batch of input refactoring:
emu/input.cpp: Fixed regression in display of some joystick inputs. osd/interface: Split up interface classes into a few more files to reduce where the input device interface class needs to be included. Made OSD independent of concrete input_device class. osd/modules/input, emu/inputdev.cpp, emu/ioport.cpp: Allow input devices to provide tokens for controls without standard item types and additional default input assignments. Fixes issues assigning Yen and Backslash on Japanese keyboards. ui/textbox.cpp: Added a fixed-content text box menu class for future use. Got main.h out of emu.h as it’s only used in a very small number of places, mostly for getting the application name. Added eminline.h to attotime.h as it's used without emu.h. Cleaned up forward declarations in emufwd.h a little.
Diffstat (limited to 'src')
-rw-r--r--src/emu/attotime.h5
-rw-r--r--src/emu/emu.h1
-rw-r--r--src/emu/emufwd.h23
-rw-r--r--src/emu/input.cpp36
-rw-r--r--src/emu/input.h1
-rw-r--r--src/emu/inputdev.cpp66
-rw-r--r--src/emu/inputdev.h7
-rw-r--r--src/emu/ioport.cpp150
-rw-r--r--src/emu/ioport.h10
-rw-r--r--src/emu/main.h18
-rw-r--r--src/frontend/mame/infoxml.cpp10
-rw-r--r--src/frontend/mame/ui/analogipt.cpp7
-rw-r--r--src/frontend/mame/ui/inputdevices.cpp4
-rw-r--r--src/frontend/mame/ui/inputtoggle.cpp11
-rw-r--r--src/frontend/mame/ui/textbox.cpp217
-rw-r--r--src/frontend/mame/ui/textbox.h26
-rw-r--r--src/lib/util/utilfwd.h3
-rw-r--r--src/osd/interface/inputcode.h2
-rw-r--r--src/osd/interface/inputdev.h66
-rw-r--r--src/osd/interface/inputfwd.h36
-rw-r--r--src/osd/interface/inputman.h45
-rw-r--r--src/osd/modules/input/input_common.h9
-rw-r--r--src/osd/modules/input/input_dinput.cpp15
-rw-r--r--src/osd/modules/input/input_rawinput.cpp18
-rw-r--r--src/osd/modules/input/input_sdl.cpp34
-rw-r--r--src/osd/modules/input/input_win32.cpp16
-rw-r--r--src/osd/modules/input/input_windows.cpp5
-rw-r--r--src/osd/modules/input/input_x11.cpp6
-rw-r--r--src/osd/modules/input/input_xinput.cpp37
-rw-r--r--src/osd/modules/render/aviwrite.h2
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp9
-rw-r--r--src/osd/modules/render/drawnone.cpp1
-rw-r--r--src/osd/sdl/sdlopts.cpp1
33 files changed, 666 insertions, 231 deletions
diff --git a/src/emu/attotime.h b/src/emu/attotime.h
index 2b625459386..39fcf6e5310 100644
--- a/src/emu/attotime.h
+++ b/src/emu/attotime.h
@@ -38,9 +38,10 @@
#include "emucore.h"
#include "xtal.h"
+#include "eminline.h"
+
#include <cmath>
-#undef min
-#undef max
+
//**************************************************************************
// CONSTANTS
diff --git a/src/emu/emu.h b/src/emu/emu.h
index 1d455bcfb15..679687f772d 100644
--- a/src/emu/emu.h
+++ b/src/emu/emu.h
@@ -79,7 +79,6 @@
#include "parameters.h"
// the running machine
-#include "main.h"
#include "machine.h"
#include "driver.h"
diff --git a/src/emu/emufwd.h b/src/emu/emufwd.h
index 323a0f14898..d6d8e26929c 100644
--- a/src/emu/emufwd.h
+++ b/src/emu/emufwd.h
@@ -14,6 +14,8 @@
#pragma once
+#include "utilfwd.h"
+
#include <type_traits>
@@ -41,24 +43,6 @@ class osd_midi_device;
//----------------------------------
-// lib/util
-//----------------------------------
-
-// declared in aviio.h
-class avi_file;
-
-// declared in chd.h
-class chd_file;
-
-// declared in unzip.h
-namespace util { class archive_file; }
-
-// declared in xmlfile.h
-namespace util::xml { class data_node; class file; }
-
-
-
-//----------------------------------
// emu
//----------------------------------
@@ -195,6 +179,9 @@ namespace emu::detail { class machine_config_replace; }
struct internal_layout;
class machine_config;
+// declared in main.h
+class machine_manager;
+
// declared in natkeyboard.h
class natural_keyboard;
diff --git a/src/emu/input.cpp b/src/emu/input.cpp
index 11ec532e69b..5775290d9f7 100644
--- a/src/emu/input.cpp
+++ b/src/emu/input.cpp
@@ -437,6 +437,18 @@ input_manager::~input_manager()
//-------------------------------------------------
+// class_enabled - return whether input device
+// class is enabled
+//-------------------------------------------------
+
+bool input_manager::class_enabled(input_device_class devclass) const
+{
+ assert(devclass >= DEVICE_CLASS_FIRST_VALID && devclass <= DEVICE_CLASS_LAST_VALID);
+ return m_class[devclass]->enabled();
+}
+
+
+//-------------------------------------------------
// add_device - add a representation of a host
// input device
//-------------------------------------------------
@@ -659,16 +671,22 @@ std::string input_manager::code_name(input_code code) const
}
// append item name - redundant with joystick switch left/right/up/down
- if ((device_class != DEVICE_CLASS_JOYSTICK) || (code.item_class() == ITEM_CLASS_SWITCH))
+ bool const joydir =
+ (device_class == DEVICE_CLASS_JOYSTICK) &&
+ (code.item_class() == ITEM_CLASS_SWITCH) &&
+ (code.item_modifier() >= ITEM_MODIFIER_LEFT) &&
+ (code.item_modifier() <= ITEM_MODIFIER_DOWN);
+ if (joydir)
{
- if ((code.item_modifier() < ITEM_MODIFIER_LEFT) || (code.item_modifier() > ITEM_MODIFIER_DOWN))
- str.append(item->name());
+ str.append((*modifier_string_table)[code.item_modifier()]);
+ }
+ else
+ {
+ str.append(item->name());
+ char const *const modifier = (*modifier_string_table)[code.item_modifier()];
+ if (modifier && *modifier)
+ str.append(" ").append(modifier);
}
-
- // append the modifier
- char const *const modifier = (*modifier_string_table)[code.item_modifier()];
- if (modifier && *modifier)
- str.append(" ").append(modifier);
return str;
}
@@ -969,7 +987,7 @@ s32 input_manager::seq_axis_value(const input_seq &seq, input_item_class &itemcl
// saturate mixed absolute values, report neutral type
if (ITEM_CLASS_ABSOLUTE == itemclass)
- result = std::clamp(result, osd::INPUT_ABSOLUTE_MIN, osd::INPUT_ABSOLUTE_MAX);
+ result = std::clamp(result, osd::input_device::ABSOLUTE_MIN, osd::input_device::ABSOLUTE_MAX);
else if (ITEM_CLASS_INVALID == itemclass)
itemclass = itemclasszero;
return result;
diff --git a/src/emu/input.h b/src/emu/input.h
index 1b6b1caca93..7c00a590a8d 100644
--- a/src/emu/input.h
+++ b/src/emu/input.h
@@ -52,6 +52,7 @@ public:
~input_manager();
// OSD interface
+ virtual bool class_enabled(input_device_class devclass) const override;
virtual osd::input_device &add_device(input_device_class devclass, std::string_view name, std::string_view id, void *internal) override;
// getters
diff --git a/src/emu/inputdev.cpp b/src/emu/inputdev.cpp
index 5f426374761..321d04e77df 100644
--- a/src/emu/inputdev.cpp
+++ b/src/emu/inputdev.cpp
@@ -31,6 +31,7 @@ public:
input_device_switch_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate);
@@ -62,6 +63,7 @@ public:
input_device_relative_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate);
@@ -84,6 +86,7 @@ public:
input_device_absolute_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate);
@@ -248,8 +251,8 @@ std::string joystick_map::to_string() const
u8 joystick_map::update(s32 xaxisval, s32 yaxisval)
{
// now map the X and Y axes to a 9x9 grid using the raw values
- xaxisval = ((xaxisval - osd::INPUT_ABSOLUTE_MIN) * 9) / (osd::INPUT_ABSOLUTE_MAX - osd::INPUT_ABSOLUTE_MIN + 1);
- yaxisval = ((yaxisval - osd::INPUT_ABSOLUTE_MIN) * 9) / (osd::INPUT_ABSOLUTE_MAX - osd::INPUT_ABSOLUTE_MIN + 1);
+ xaxisval = ((xaxisval - osd::input_device::ABSOLUTE_MIN) * 9) / (osd::input_device::ABSOLUTE_MAX - osd::input_device::ABSOLUTE_MIN + 1);
+ yaxisval = ((yaxisval - osd::input_device::ABSOLUTE_MIN) * 9) / (osd::input_device::ABSOLUTE_MAX - osd::input_device::ABSOLUTE_MIN + 1);
u8 mapval = m_map[yaxisval][xaxisval];
// handle stickiness
@@ -279,7 +282,7 @@ input_device::input_device(input_manager &manager, std::string_view name, std::s
, m_devindex(-1)
, m_maxitem(input_item_id(0))
, m_internal(internal)
- , m_threshold(std::max<s32>(s32(manager.machine().options().joystick_threshold() * osd::INPUT_ABSOLUTE_MAX), 1))
+ , m_threshold(std::max<s32>(s32(manager.machine().options().joystick_threshold() * osd::input_device::ABSOLUTE_MAX), 1))
, m_steadykey_enabled(manager.machine().options().steadykey())
, m_lightgun_reload_button(manager.machine().options().offscreen_reload())
{
@@ -301,6 +304,7 @@ input_device::~input_device()
input_item_id input_device::add_item(
std::string_view name,
+ std::string_view tokenhint,
input_item_id itemid,
item_get_state_func getstate,
void *internal)
@@ -325,15 +329,15 @@ input_item_id input_device::add_item(
switch (m_manager.device_class(devclass()).standard_item_class(originalid))
{
case ITEM_CLASS_SWITCH:
- m_item[itemid] = std::make_unique<input_device_switch_item>(*this, name, internal, itemid, getstate);
+ m_item[itemid] = std::make_unique<input_device_switch_item>(*this, name, tokenhint, internal, itemid, getstate);
break;
case ITEM_CLASS_RELATIVE:
- m_item[itemid] = std::make_unique<input_device_relative_item>(*this, name, internal, itemid, getstate);
+ m_item[itemid] = std::make_unique<input_device_relative_item>(*this, name, tokenhint, internal, itemid, getstate);
break;
case ITEM_CLASS_ABSOLUTE:
- m_item[itemid] = std::make_unique<input_device_absolute_item>(*this, name, internal, itemid, getstate);
+ m_item[itemid] = std::make_unique<input_device_absolute_item>(*this, name, tokenhint, internal, itemid, getstate);
break;
default:
@@ -348,6 +352,17 @@ input_item_id input_device::add_item(
//-------------------------------------------------
+// set_default_assignments - set additional input
+// assignments suitable for device
+//-------------------------------------------------
+
+void input_device::set_default_assignments(assignment_vector &&assignments)
+{
+ m_default_assignments = std::move(assignments);
+}
+
+
+//-------------------------------------------------
// match_device_id - match device id via
// substring search
//-------------------------------------------------
@@ -432,8 +447,8 @@ input_device_lightgun::input_device_lightgun(input_manager &manager, std::string
input_device_joystick::input_device_joystick(input_manager &manager, std::string_view _name, std::string_view _id, void *_internal)
: input_device(manager, _name, _id, _internal)
- , m_deadzone(s32(manager.machine().options().joystick_deadzone() * osd::INPUT_ABSOLUTE_MAX))
- , m_saturation(s32(manager.machine().options().joystick_saturation() * osd::INPUT_ABSOLUTE_MAX))
+ , m_deadzone(s32(manager.machine().options().joystick_deadzone() * osd::input_device::ABSOLUTE_MAX))
+ , m_saturation(s32(manager.machine().options().joystick_saturation() * osd::input_device::ABSOLUTE_MAX))
, m_range(m_saturation - m_deadzone)
{
// get the default joystick map
@@ -468,9 +483,9 @@ s32 input_device_joystick::adjust_absolute_value(s32 result) const
if (result < m_deadzone) // if in the deadzone, return 0
result = 0;
else if (result >= m_saturation) // if saturated, return the max
- result = osd::INPUT_ABSOLUTE_MAX;
+ result = osd::input_device::ABSOLUTE_MAX;
else // otherwise, scale
- result = s64(result - m_deadzone) * s64(osd::INPUT_ABSOLUTE_MAX) / m_range;
+ result = s64(result - m_deadzone) * s64(osd::input_device::ABSOLUTE_MAX) / m_range;
// re-apply sign and return
return negative ? -result : result;
@@ -687,6 +702,7 @@ bool input_class_joystick::set_global_joystick_map(const char *mapstring)
input_device_item::input_device_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate,
@@ -705,6 +721,11 @@ input_device_item::input_device_item(
// use a standard token name for known item IDs
m_token = standard_token;
}
+ else if (!tokenhint.empty())
+ {
+ // fall back to token hint if supplied
+ m_token = tokenhint;
+ }
else
{
// otherwise, create a tokenized name
@@ -732,7 +753,7 @@ input_device_item::~input_device_item()
bool input_device_item::check_axis(input_item_modifier modifier, s32 memory)
{
// use osd::INVALID_AXIS_VALUE as a short-circuit
- return (memory != osd::INVALID_AXIS_VALUE) && item_check_axis(modifier, memory);
+ return (memory != osd::input_device::INVALID_AXIS_VALUE) && item_check_axis(modifier, memory);
}
@@ -747,10 +768,11 @@ bool input_device_item::check_axis(input_item_modifier modifier, s32 memory)
input_device_switch_item::input_device_switch_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate)
- : input_device_item(device, name, internal, itemid, getstate, ITEM_CLASS_SWITCH)
+ : input_device_item(device, name, tokenhint, internal, itemid, getstate, ITEM_CLASS_SWITCH)
, m_steadykey(0)
, m_oldkey(0)
{
@@ -857,10 +879,11 @@ bool input_device_switch_item::steadykey_changed()
input_device_relative_item::input_device_relative_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate)
- : input_device_item(device, name, internal, itemid, getstate, ITEM_CLASS_RELATIVE)
+ : input_device_item(device, name, tokenhint, internal, itemid, getstate, ITEM_CLASS_RELATIVE)
{
}
@@ -927,7 +950,7 @@ bool input_device_relative_item::item_check_axis(input_item_modifier modifier, s
const s32 curval = read_as_relative(modifier);
// for relative axes, look for ~20 pixels movement
- return std::abs(curval - memory) > (20 * osd::INPUT_RELATIVE_PER_PIXEL);
+ return std::abs(curval - memory) > (20 * osd::input_device::RELATIVE_PER_PIXEL);
}
@@ -943,10 +966,11 @@ bool input_device_relative_item::item_check_axis(input_item_modifier modifier, s
input_device_absolute_item::input_device_absolute_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate)
- : input_device_item(device, name, internal, itemid, getstate, ITEM_CLASS_ABSOLUTE)
+ : input_device_item(device, name, tokenhint, internal, itemid, getstate, ITEM_CLASS_ABSOLUTE)
{
}
@@ -1020,7 +1044,7 @@ s32 input_device_absolute_item::read_as_absolute(input_item_modifier modifier)
{
// start with the current value
s32 result = m_device.adjust_absolute(update_value());
- assert(result >= osd::INPUT_ABSOLUTE_MIN && result <= osd::INPUT_ABSOLUTE_MAX);
+ assert(result >= osd::input_device::ABSOLUTE_MIN && result <= osd::input_device::ABSOLUTE_MAX);
// if we're doing a lightgun reload hack, override the value
if (m_device.devclass() == DEVICE_CLASS_LIGHTGUN && m_device.lightgun_reload_button())
@@ -1028,16 +1052,16 @@ s32 input_device_absolute_item::read_as_absolute(input_item_modifier modifier)
// if it is pressed, return (min,max)
input_device_item *button2_item = m_device.item(ITEM_ID_BUTTON2);
if (button2_item != nullptr && button2_item->update_value())
- result = (m_itemid == ITEM_ID_XAXIS) ? osd::INPUT_ABSOLUTE_MIN : osd::INPUT_ABSOLUTE_MAX;
+ result = (m_itemid == ITEM_ID_XAXIS) ? osd::input_device::ABSOLUTE_MIN : osd::input_device::ABSOLUTE_MAX;
}
// positive/negative: scale to full axis
if (modifier == ITEM_MODIFIER_REVERSE)
result = -result;
else if (modifier == ITEM_MODIFIER_POS)
- result = std::max(result, 0) * 2 + osd::INPUT_ABSOLUTE_MIN;
+ result = std::max(result, 0) * 2 + osd::input_device::ABSOLUTE_MIN;
else if (modifier == ITEM_MODIFIER_NEG)
- result = std::max(-result, 0) * 2 + osd::INPUT_ABSOLUTE_MIN;
+ result = std::max(-result, 0) * 2 + osd::input_device::ABSOLUTE_MIN;
return result;
}
@@ -1053,9 +1077,9 @@ bool input_device_absolute_item::item_check_axis(input_item_modifier modifier, s
// so the selection will not be affected by a gun going out of range
const s32 curval = read_as_absolute(modifier);
if (m_device.devclass() == DEVICE_CLASS_LIGHTGUN &&
- (curval == osd::INPUT_ABSOLUTE_MAX || curval == osd::INPUT_ABSOLUTE_MIN))
+ (curval == osd::input_device::ABSOLUTE_MAX || curval == osd::input_device::ABSOLUTE_MIN))
return false;
// for absolute axes, look for 25% of maximum
- return std::abs(curval - memory) > ((osd::INPUT_ABSOLUTE_MAX - osd::INPUT_ABSOLUTE_MIN) / 4);
+ return std::abs(curval - memory) > ((osd::input_device::ABSOLUTE_MAX - osd::input_device::ABSOLUTE_MIN) / 4);
}
diff --git a/src/emu/inputdev.h b/src/emu/inputdev.h
index 06a11866cea..8e914094610 100644
--- a/src/emu/inputdev.h
+++ b/src/emu/inputdev.h
@@ -13,7 +13,7 @@
#pragma once
-#include "interface/inputman.h"
+#include "interface/inputdev.h"
//**************************************************************************
@@ -103,6 +103,7 @@ protected:
input_device_item(
input_device &device,
std::string_view name,
+ std::string_view tokenhint,
void *internal,
input_item_id itemid,
item_get_state_func getstate,
@@ -142,6 +143,7 @@ public:
const std::string &id() const { return m_id; }
int devindex() const { return m_devindex; }
input_device_item *item(input_item_id index) const { return m_item[index].get(); }
+ const assignment_vector &default_assignments() const { return m_default_assignments; }
input_item_id maxitem() const { return m_maxitem; }
void *internal() const { return m_internal; }
s32 threshold() const { return m_threshold; }
@@ -154,9 +156,11 @@ public:
// interface for host input device
virtual input_item_id add_item(
std::string_view name,
+ std::string_view tokenhint,
input_item_id itemid,
item_get_state_func getstate,
void *internal) override;
+ virtual void set_default_assignments(assignment_vector &&assignments) override;
// helpers
s32 adjust_absolute(s32 value) const { return adjust_absolute_value(value); }
@@ -174,6 +178,7 @@ private:
std::string m_id; // id of device
int m_devindex; // device index of this device
std::unique_ptr<input_device_item> m_item[ITEM_ID_ABSOLUTE_MAXIMUM+1]; // array of pointers to items
+ assignment_vector m_default_assignments; // additional assignments
input_item_id m_maxitem; // maximum item index
void *const m_internal; // internal callback pointer
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index 585cf40ae49..aeb3c501c6b 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -1787,6 +1787,7 @@ ioport_manager::ioport_manager(running_machine &machine)
, m_playback_accumulated_speed(0)
, m_playback_accumulated_frames(0)
, m_deselected_card_config()
+ , m_applied_device_defaults(false)
{
for (auto &entries : m_type_to_entry)
std::fill(std::begin(entries), std::end(entries), nullptr);
@@ -2199,6 +2200,17 @@ s32 ioport_manager::frame_interpolate(s32 oldval, s32 newval)
void ioport_manager::load_config(config_type cfg_type, config_level cfg_level, util::xml::data_node const *parentnode)
{
+ // make sure device defaults get applied at some point
+ if ((cfg_type > config_type::CONTROLLER) && !m_applied_device_defaults)
+ {
+ apply_device_defaults();
+
+ // after applying controller config, push that to the backup, as it's what we'll diff against
+ for (input_type_entry &entry : m_typelist)
+ for (input_seq_type seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; ++seqtype)
+ entry.defseq(seqtype) = entry.seq(seqtype);
+ }
+
// in the completion phase, we finish the initialization with the final ports
if (cfg_type == config_type::FINAL)
{
@@ -2213,9 +2225,7 @@ void ioport_manager::load_config(config_type cfg_type, config_level cfg_level, u
// load device map table for controller configs only
if (cfg_type == config_type::CONTROLLER)
{
- // iterate over all the remap nodes
- load_remap_table(*parentnode);
-
+ // iterate over device remapping entries
input_manager::devicemap_table devicemap;
for (util::xml::data_node const *mapdevice_node = parentnode->get_child("mapdevice"); mapdevice_node != nullptr; mapdevice_node = mapdevice_node->get_next_sibling("mapdevice"))
{
@@ -2225,9 +2235,23 @@ void ioport_manager::load_config(config_type cfg_type, config_level cfg_level, u
devicemap.emplace(devicename, controllername);
}
- // map device to controller if we have a device map
- if (!devicemap.empty())
- machine().input().map_device_to_controller(devicemap);
+ // we can't rearrange controllers after applying device-supplied defaults
+ if (!m_applied_device_defaults)
+ {
+ // map device to controller if we have a device map
+ if (!devicemap.empty())
+ machine().input().map_device_to_controller(devicemap);
+
+ // add extra default assignments for input devices
+ apply_device_defaults();
+ }
+ else if (!devicemap.empty())
+ {
+ osd_printf_warning("Controller configuration: Only <mapdevice> elements from the first applicable <system> element are applied\n");
+ }
+
+ // iterate over any input code remapping nodes
+ load_remap_table(*parentnode);
}
// iterate over all the port nodes
@@ -2270,16 +2294,16 @@ void ioport_manager::load_config(config_type cfg_type, config_level cfg_level, u
load_default_config(type, player, newseq);
}
- // after applying the controller config, push that back into the backup, since that is
- // what we will diff against
if (cfg_type == config_type::CONTROLLER)
+ {
+ // after applying the controller config, push that back into the backup, since that is what we will diff against
for (input_type_entry &entry : m_typelist)
for (input_seq_type seqtype = SEQ_TYPE_STANDARD; seqtype < SEQ_TYPE_TOTAL; ++seqtype)
entry.defseq(seqtype) = entry.seq(seqtype);
-
- // load keyboard enable/disable state
- if (cfg_type == config_type::SYSTEM)
+ }
+ else if (cfg_type == config_type::SYSTEM)
{
+ // load keyboard enable/disable state
std::vector<bool> kbd_enable_set;
bool keyboard_enabled = false, missing_enabled = false;
natural_keyboard &natkbd = machine().natkeyboard();
@@ -2611,6 +2635,82 @@ void ioport_manager::load_system_config(
}
+//-------------------------------------------------
+// apply_device_defaults - add default assignments
+// supplied by input devices
+//-------------------------------------------------
+
+void ioport_manager::apply_device_defaults()
+{
+ // make sure this only happens once
+ assert(!m_applied_device_defaults);
+ m_applied_device_defaults = true;
+
+ // TODO: come up with a way to deal with non-multi device classes here?
+ for (input_device_class classno = DEVICE_CLASS_FIRST_VALID; DEVICE_CLASS_LAST_VALID >= classno; ++classno)
+ {
+ input_class &devclass = machine().input().device_class(classno);
+ for (int devnum = 0; devclass.maxindex() >= devnum; ++devnum)
+ {
+ // make sure device exists
+ input_device const *const device = devclass.device(devnum);
+ if (!device)
+ continue;
+
+ // iterate over default assignments
+ for (auto [porttype, seqtype, seq] : device->default_assignments())
+ {
+ assert(!seq.empty());
+ assert(seq.is_valid());
+ assert(!seq.is_default());
+
+ // only apply UI assignments for first device in a class
+ if ((IPT_UI_FIRST < porttype) && (IPT_UI_LAST > porttype) && (device->devindex() != 0))
+ continue;
+
+ // limit to maximum player count
+ if (device->devindex() >= MAX_PLAYERS)
+ continue;
+
+ // find a matching port in the list
+ auto const found = std::find_if(
+ m_typelist.begin(),
+ m_typelist.end(),
+ [type = porttype, device] (input_type_entry const &entry)
+ {
+ return (entry.type() == type) && (entry.player() == device->devindex());
+ });
+ if (m_typelist.end() == found)
+ continue;
+
+ // start with the current setting
+ input_seq remapped(found->seq(seqtype));
+ if (!remapped.empty())
+ remapped += input_seq::or_code;
+
+ // append adjusting the device index
+ for (int i = 0, len = seq.length(); i < len; ++i)
+ {
+ input_code code = seq[i];
+ if (!code.internal())
+ {
+ assert(code.device_class() == classno);
+ assert(code.device_index() == 0);
+ assert(code.item_id() >= ITEM_ID_FIRST_VALID);
+ assert(code.item_id() <= ITEM_ID_ABSOLUTE_MAXIMUM);
+ code.set_device_index(device->devindex());
+ }
+ remapped += code;
+ }
+
+ // apply to the entry
+ found->set_seq(seqtype, remapped);
+ }
+ }
+ }
+}
+
+
//**************************************************************************
// SETTINGS SAVE
@@ -3406,8 +3506,8 @@ analog_field::analog_field(ioport_field &field)
, m_accum(0)
, m_previous(0)
, m_previousanalog(0)
- , m_minimum(osd::INPUT_ABSOLUTE_MIN)
- , m_maximum(osd::INPUT_ABSOLUTE_MAX)
+ , m_minimum(osd::input_device::ABSOLUTE_MIN)
+ , m_maximum(osd::input_device::ABSOLUTE_MAX)
, m_center(0)
, m_reverse_val(0)
, m_scalepos(0)
@@ -3441,7 +3541,7 @@ analog_field::analog_field(ioport_field &field)
case IPT_PEDAL:
case IPT_PEDAL2:
case IPT_PEDAL3:
- m_center = osd::INPUT_ABSOLUTE_MIN;
+ m_center = osd::input_device::ABSOLUTE_MIN;
m_accum = apply_inverse_sensitivity(m_center);
m_absolute = true;
m_autocenter = true;
@@ -3460,7 +3560,7 @@ analog_field::analog_field(ioport_field &field)
// set each position to be 512 units
case IPT_POSITIONAL:
case IPT_POSITIONAL_V:
- m_positionalscale = compute_scale(field.maxval(), osd::INPUT_ABSOLUTE_MAX - osd::INPUT_ABSOLUTE_MIN);
+ m_positionalscale = compute_scale(field.maxval(), osd::input_device::ABSOLUTE_MAX - osd::input_device::ABSOLUTE_MIN);
m_adjmin = 0;
m_adjmax = field.maxval() - 1;
m_wraps = field.analog_wraps();
@@ -3499,10 +3599,10 @@ analog_field::analog_field(ioport_field &field)
// unsigned, potentially passing through zero
m_scalepos = compute_scale(
(m_adjmax - m_adjdefvalue) & (field.mask() >> m_shift),
- osd::INPUT_ABSOLUTE_MAX);
+ osd::input_device::ABSOLUTE_MAX);
m_scaleneg = compute_scale(
(m_adjdefvalue - m_adjmin) & (field.mask() >> m_shift),
- -osd::INPUT_ABSOLUTE_MIN);
+ -osd::input_device::ABSOLUTE_MIN);
// reverse point is at center
m_reverse_val = 0;
@@ -3510,7 +3610,7 @@ analog_field::analog_field(ioport_field &field)
else
{
// single axis that increases from default
- m_scalepos = compute_scale(m_adjmax - m_adjmin, osd::INPUT_ABSOLUTE_MAX - osd::INPUT_ABSOLUTE_MIN);
+ m_scalepos = compute_scale(m_adjmax - m_adjmin, osd::input_device::ABSOLUTE_MAX - osd::input_device::ABSOLUTE_MIN);
// make the scaling the same for easier coding when we need to scale
m_scaleneg = m_scalepos;
@@ -3534,11 +3634,11 @@ analog_field::analog_field(ioport_field &field)
if (m_wraps)
m_adjmax++;
- m_minimum = (m_adjmin - m_adjdefvalue) * osd::INPUT_RELATIVE_PER_PIXEL;
- m_maximum = (m_adjmax - m_adjdefvalue) * osd::INPUT_RELATIVE_PER_PIXEL;
+ m_minimum = (m_adjmin - m_adjdefvalue) * osd::input_device::RELATIVE_PER_PIXEL;
+ m_maximum = (m_adjmax - m_adjdefvalue) * osd::input_device::RELATIVE_PER_PIXEL;
// make the scaling the same for easier coding when we need to scale
- m_scaleneg = m_scalepos = compute_scale(1, osd::INPUT_RELATIVE_PER_PIXEL);
+ m_scaleneg = m_scalepos = compute_scale(1, osd::input_device::RELATIVE_PER_PIXEL);
if (m_field.analog_reset())
{
@@ -3553,11 +3653,11 @@ analog_field::analog_field(ioport_field &field)
// relative controls reverse from 1 past their max range
if (m_wraps)
{
- // FIXME: positional needs -1, using osd::INPUT_RELATIVE_PER_PIXEL skips a position (and reads outside the table array)
+ // FIXME: positional needs -1, using osd::input_device::RELATIVE_PER_PIXEL skips a position (and reads outside the table array)
if (field.type() == IPT_POSITIONAL || field.type() == IPT_POSITIONAL_V)
m_reverse_val--;
else
- m_reverse_val -= osd::INPUT_RELATIVE_PER_PIXEL;
+ m_reverse_val -= osd::input_device::RELATIVE_PER_PIXEL;
}
}
}
@@ -3630,7 +3730,7 @@ s32 analog_field::apply_settings(s32 value) const
else if (m_single_scale)
// it's a pedal or the default value is equal to min/max
// so we need to adjust the center to the minimum
- value -= osd::INPUT_ABSOLUTE_MIN;
+ value -= osd::input_device::ABSOLUTE_MIN;
// map differently for positive and negative values
if (value >= 0)
@@ -3735,7 +3835,7 @@ void analog_field::frame_update(running_machine &machine)
// if port is positional, we will take the full analog control and divide it
// into positions, that way as the control is moved full scale,
// it moves through all the positions
- rawvalue = apply_scale(rawvalue - osd::INPUT_ABSOLUTE_MIN, m_positionalscale) * osd::INPUT_RELATIVE_PER_PIXEL + m_minimum;
+ rawvalue = apply_scale(rawvalue - osd::input_device::ABSOLUTE_MIN, m_positionalscale) * osd::input_device::RELATIVE_PER_PIXEL + m_minimum;
// clamp the high value so it does not roll over
rawvalue = std::min(rawvalue, m_maximum);
diff --git a/src/emu/ioport.h b/src/emu/ioport.h
index b290da8f794..f74f1f54f16 100644
--- a/src/emu/ioport.h
+++ b/src/emu/ioport.h
@@ -49,7 +49,7 @@ constexpr char32_t UCHAR_MAMEKEY_BEGIN = UCHAR_PRIVATE + 2;
// sequence types for input_port_seq() call
-enum input_seq_type
+enum input_seq_type : int
{
SEQ_TYPE_INVALID = -1,
SEQ_TYPE_STANDARD = 0,
@@ -90,7 +90,7 @@ enum ioport_group
// various input port types
-enum ioport_type
+enum ioport_type : u32
{
// pseudo-port types
IPT_INVALID = 0,
@@ -1165,8 +1165,8 @@ private:
ioport_field & m_field; // pointer to the input field referenced
// adjusted values (right-justified and tweaked)
- u8 m_shift; // shift to align final value in the port
- s32 m_adjdefvalue; // adjusted default value from the config
+ u8 const m_shift; // shift to align final value in the port
+ s32 const m_adjdefvalue; // adjusted default value from the config
s32 m_adjmin; // adjusted minimum value from the config
s32 m_adjmax; // adjusted maximum value from the config
s32 m_adjoverride; // programmatically set adjusted value
@@ -1303,6 +1303,7 @@ private:
bool load_default_config(int type, int player, const std::pair<input_seq, char const *> (&newseq)[SEQ_TYPE_TOTAL]);
bool load_controller_config(util::xml::data_node const &portnode, int type, int player, const std::pair<input_seq, char const *> (&newseq)[SEQ_TYPE_TOTAL]);
void load_system_config(util::xml::data_node const &portnode, int type, int player, const std::pair<input_seq, char const *> (&newseq)[SEQ_TYPE_TOTAL]);
+ void apply_device_defaults();
void save_config(config_type cfg_type, util::xml::data_node *parentnode);
bool save_this_input_field_type(ioport_type type);
@@ -1347,6 +1348,7 @@ private:
// storage for inactive configuration
std::unique_ptr<util::xml::file> m_deselected_card_config;
+ bool m_applied_device_defaults;
};
diff --git a/src/emu/main.h b/src/emu/main.h
index 89399e21690..5d51d0ba844 100644
--- a/src/emu/main.h
+++ b/src/emu/main.h
@@ -6,18 +6,17 @@
Controls execution of the core emulator system.
***************************************************************************/
+#ifndef MAME_EMU_MAIN_H
+#define MAME_EMU_MAIN_H
#pragma once
-#ifndef __EMU_H__
-#error Dont include this file directly; include emu.h instead.
-#endif
+#include "emufwd.h"
-#ifndef MAME_EMU_MAIN_H
-#define MAME_EMU_MAIN_H
+#include <memory>
+#include <string>
+#include <vector>
-#include <thread>
-#include <ctime>
//**************************************************************************
// CONSTANTS
@@ -66,10 +65,11 @@ public:
class machine_manager
{
- DISABLE_COPYING(machine_manager);
protected:
// construction/destruction
- machine_manager(emu_options& options, osd_interface& osd);
+ machine_manager(emu_options &options, osd_interface &osd);
+ machine_manager(machine_manager const &) = delete;
+
public:
virtual ~machine_manager();
diff --git a/src/frontend/mame/infoxml.cpp b/src/frontend/mame/infoxml.cpp
index c5a818bad9d..03b23c9ca01 100644
--- a/src/frontend/mame/infoxml.cpp
+++ b/src/frontend/mame/infoxml.cpp
@@ -1389,7 +1389,7 @@ void output_input(std::ostream &out, const ioport_list &portlist)
int player; // player which the input belongs to
int nbuttons; // total number of buttons
int reqbuttons; // total number of non-optional buttons
- int maxbuttons; // max index of buttons (using IPT_BUTTONn) [probably to be removed soonish]
+ uint32_t maxbuttons; // max index of buttons (using IPT_BUTTONn) [probably to be removed soonish]
int ways; // directions for joystick
bool analog; // is analog input?
uint8_t helper[3]; // for dual joysticks [possibly to be removed soonish]
@@ -1404,7 +1404,7 @@ void output_input(std::ostream &out, const ioport_list &portlist)
// tracking info as we iterate
int nplayer = 0;
- int ncoin = 0;
+ uint32_t ncoin = 0;
bool service = false;
bool tilt = false;
@@ -1732,7 +1732,7 @@ void output_input(std::ostream &out, const ioport_list &portlist)
out << "\t\t<input";
util::stream_format(out, " players=\"%d\"", nplayer);
if (ncoin != 0)
- util::stream_format(out, " coins=\"%d\"", ncoin);
+ util::stream_format(out, " coins=\"%u\"", ncoin);
if (service)
util::stream_format(out, " service=\"yes\"");
if (tilt)
@@ -1751,7 +1751,7 @@ void output_input(std::ostream &out, const ioport_list &portlist)
util::stream_format(out, " player=\"%d\"", elem.player);
if (elem.nbuttons > 0)
{
- util::stream_format(out, " buttons=\"%d\"", strcmp(elem.type, "stick") ? elem.nbuttons : elem.maxbuttons);
+ util::stream_format(out, " buttons=\"%u\"", strcmp(elem.type, "stick") ? elem.nbuttons : elem.maxbuttons);
if (elem.reqbuttons < elem.nbuttons)
util::stream_format(out, " reqbuttons=\"%d\"", elem.reqbuttons);
}
@@ -1777,7 +1777,7 @@ void output_input(std::ostream &out, const ioport_list &portlist)
util::stream_format(out, " player=\"%d\"", elem.player);
if (elem.nbuttons > 0)
{
- util::stream_format(out, " buttons=\"%d\"", strcmp(elem.type, "joy") ? elem.nbuttons : elem.maxbuttons);
+ util::stream_format(out, " buttons=\"%u\"", strcmp(elem.type, "joy") ? elem.nbuttons : elem.maxbuttons);
if (elem.reqbuttons < elem.nbuttons)
util::stream_format(out, " reqbuttons=\"%d\"", elem.reqbuttons);
}
diff --git a/src/frontend/mame/ui/analogipt.cpp b/src/frontend/mame/ui/analogipt.cpp
index d8bbbae5eb6..ed0daf0b152 100644
--- a/src/frontend/mame/ui/analogipt.cpp
+++ b/src/frontend/mame/ui/analogipt.cpp
@@ -246,8 +246,13 @@ void menu_analog::handle(event const *ev)
switch (ev->iptkey)
{
- // if selected, reset to default value
+ // flip toggles when selected
case IPT_UI_SELECT:
+ if (ANALOG_ITEM_REVERSE == data.type)
+ newval = newval ? 0 : 1;
+ break;
+
+ // if cleared, reset to default value
case IPT_UI_CLEAR:
newval = data.defvalue;
break;
diff --git a/src/frontend/mame/ui/inputdevices.cpp b/src/frontend/mame/ui/inputdevices.cpp
index 71d09a0b280..4890b1ac724 100644
--- a/src/frontend/mame/ui/inputdevices.cpp
+++ b/src/frontend/mame/ui/inputdevices.cpp
@@ -89,12 +89,12 @@ protected:
s32 const value = (input.itemclass() == ITEM_CLASS_ABSOLUTE) ? input.read_as_absolute(ITEM_MODIFIER_NONE) : input.read_as_relative(ITEM_MODIFIER_NONE);
if (0 < value)
{
- float const fillright = indcentre + (float(value) / float(osd::INPUT_ABSOLUTE_MAX) * (indright - indcentre));
+ float const fillright = indcentre + (float(value) / float(osd::input_device::ABSOLUTE_MAX) * (indright - indcentre));
container().add_rect(indcentre, indtop, (std::min)(fillright, indright), indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
else if (0 > value)
{
- float const fillleft = indcentre - (float(value) / float(osd::INPUT_ABSOLUTE_MIN) * (indcentre - indleft));
+ float const fillleft = indcentre - (float(value) / float(osd::input_device::ABSOLUTE_MIN) * (indcentre - indleft));
container().add_rect((std::max)(fillleft, indleft), indtop, indcentre, indbottom, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
}
container().add_line(indleft, indtop, indright, indtop, UI_LINE_WIDTH, fgcolor, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
diff --git a/src/frontend/mame/ui/inputtoggle.cpp b/src/frontend/mame/ui/inputtoggle.cpp
index e86d41b7031..172ae16b141 100644
--- a/src/frontend/mame/ui/inputtoggle.cpp
+++ b/src/frontend/mame/ui/inputtoggle.cpp
@@ -119,14 +119,13 @@ void menu_input_toggles::handle(event const *ev)
bool invalidate = false;
switch (ev->iptkey)
{
- case IPT_UI_SELECT: // toggle regular items, set multi-value items to default
+ case IPT_UI_SELECT: // toggle regular items, cycle multi-value items
if (field.settings().empty())
- {
field.live().value ^= field.mask();
- invalidate = true;
- break;
- }
- [[fallthrough]];
+ else
+ field.select_next_setting();
+ invalidate = true;
+ break;
case IPT_UI_CLEAR: // set to default
if (field.defvalue() != field.live().value)
diff --git a/src/frontend/mame/ui/textbox.cpp b/src/frontend/mame/ui/textbox.cpp
index 9c6dfded606..e3cb88cdd36 100644
--- a/src/frontend/mame/ui/textbox.cpp
+++ b/src/frontend/mame/ui/textbox.cpp
@@ -15,19 +15,73 @@
#include "ui/utils.h"
#include <string_view>
+#include <utility>
namespace ui {
+namespace {
+
+inline std::string_view split_column(std::string_view &line)
+{
+ auto const split = line.find('\t');
+ if (std::string::npos == split)
+ {
+ return std::exchange(line, std::string_view());
+ }
+ else
+ {
+ std::string_view result = line.substr(0, split);
+ line.remove_prefix(split + 1);
+ return result;
+ }
+}
+
+
+template <typename T, typename U, typename V>
+void populate_three_column_layout(std::string_view text, T &&l, U &&c, V &&r)
+{
+ while (!text.empty())
+ {
+ // pop a line from the front
+ auto const eol = text.find('\n');
+ std::string_view line = (std::string_view::npos != eol)
+ ? text.substr(0, eol + 1)
+ : text;
+ text.remove_prefix(line.length());
+
+ // left-justify up to the first tab
+ std::string_view const lcol = split_column(line);
+ if (!lcol.empty())
+ l(lcol);
+
+ // centre up to the second tab
+ if (!line.empty())
+ {
+ std::string_view const ccol = split_column(line);
+ if (!ccol.empty())
+ c(ccol);
+ }
+
+ // right-justify the rest
+ if (!line.empty())
+ r(line);
+ }
+}
+
+} // anonymous namespace
+
+
+
//-------------------------------------------------
-// constructor
+// menu_textbox - base text box menu class
//-------------------------------------------------
menu_textbox::menu_textbox(mame_ui_manager &mui, render_container &container)
: menu(mui, container)
, m_layout()
- , m_layout_width(-1.0f)
- , m_desired_width(-1.0f)
+ , m_layout_width(-1.0F)
+ , m_desired_width(-1.0F)
, m_desired_lines(-1)
, m_window_lines(0)
, m_top_line(0)
@@ -35,31 +89,19 @@ menu_textbox::menu_textbox(mame_ui_manager &mui, render_container &container)
}
-//-------------------------------------------------
-// destructor
-//-------------------------------------------------
-
menu_textbox::~menu_textbox()
{
}
-//-------------------------------------------------
-// reset_layout - force repopulate and scroll to
-// top
-//-------------------------------------------------
-
void menu_textbox::reset_layout()
{
+ // force recompute and scroll to top
m_layout = std::nullopt;
m_top_line = 0;
}
-//-------------------------------------------------
-// handle_key - handle basic navigation keys
-//-------------------------------------------------
-
void menu_textbox::handle_key(int key)
{
switch (key)
@@ -91,10 +133,6 @@ void menu_textbox::handle_key(int key)
}
-//-------------------------------------------------
-// recompute_metrics - recompute metrics
-//-------------------------------------------------
-
void menu_textbox::recompute_metrics(uint32_t width, uint32_t height, float aspect)
{
menu::recompute_metrics(width, height, aspect);
@@ -103,10 +141,6 @@ void menu_textbox::recompute_metrics(uint32_t width, uint32_t height, float aspe
}
-//-------------------------------------------------
-// custom_mouse_scroll - handle scroll events
-//-------------------------------------------------
-
bool menu_textbox::custom_mouse_scroll(int lines)
{
m_top_line += lines;
@@ -114,25 +148,21 @@ bool menu_textbox::custom_mouse_scroll(int lines)
}
-//-------------------------------------------------
-// draw - draw the menu
-//-------------------------------------------------
-
void menu_textbox::draw(uint32_t flags)
{
- float const visible_width = 1.0f - (2.0f * lr_border());
- float const visible_left = (1.0f - visible_width) * 0.5f;
- float const extra_height = 2.0f * line_height();
+ float const visible_width = 1.0F - (2.0F * lr_border());
+ float const visible_left = (1.0F - visible_width) * 0.5F;
+ float const extra_height = 2.0F * line_height();
float const visible_extra_menu_height = get_customtop() + get_custombottom() + extra_height;
// determine effective positions
- float const maximum_width = visible_width - (2.0f * gutter_width());
+ float const maximum_width = visible_width - (2.0F * gutter_width());
draw_background();
map_mouse();
// account for extra space at the top and bottom and the separator/item for closing
- float visible_main_menu_height = 1.0f - 2.0f * tb_border() - visible_extra_menu_height;
+ float visible_main_menu_height = 1.0F - 2.0F * tb_border() - visible_extra_menu_height;
m_window_lines = int(std::trunc(visible_main_menu_height / line_height()));
// lay out the text if necessary
@@ -146,7 +176,7 @@ void menu_textbox::draw(uint32_t flags)
visible_main_menu_height = float(m_window_lines) * line_height();
// compute top/left of inner menu area by centering, if the menu is at the bottom of the extra, adjust
- float const visible_top = ((1.0f - (visible_main_menu_height + visible_extra_menu_height)) * 0.5f) + get_customtop();
+ float const visible_top = ((1.0F - (visible_main_menu_height + visible_extra_menu_height)) * 0.5F) + get_customtop();
// get width required to draw the sole menu item
menu_item const &pitem = item(0);
@@ -155,13 +185,13 @@ void menu_textbox::draw(uint32_t flags)
float const draw_width = std::min(maximum_width, std::max(itemwidth, m_desired_width));
// compute text box size
- float const x1 = visible_left + ((maximum_width - draw_width) * 0.5f);
+ float const x1 = visible_left + ((maximum_width - draw_width) * 0.5F);
float const y1 = visible_top - tb_border();
- float const x2 = visible_left + visible_width - ((maximum_width - draw_width) * 0.5f);
+ float const x2 = visible_left + visible_width - ((maximum_width - draw_width) * 0.5F);
float const y2 = visible_top + visible_main_menu_height + tb_border() + extra_height;
float const effective_left = x1 + gutter_width();
- float const line_x0 = x1 + 0.5f * UI_LINE_WIDTH;
- float const line_x1 = x2 - 0.5f * UI_LINE_WIDTH;
+ float const line_x0 = x1 + 0.5F * UI_LINE_WIDTH;
+ float const line_x1 = x2 - 0.5F * UI_LINE_WIDTH;
float const separator = visible_top + float(m_window_lines) * line_height();
ui().draw_outlined_box(container(), x1, y1, x2, y2, ui().colors().background_color());
@@ -187,8 +217,8 @@ void menu_textbox::draw(uint32_t flags)
set_hover(HOVER_ARROW_UP);
}
draw_arrow(
- 0.5f * (x1 + x2 - ud_arrow_width()), visible_top + (0.25f * line_height()),
- 0.5f * (x1 + x2 + ud_arrow_width()), visible_top + (0.75f * line_height()),
+ 0.5F * (x1 + x2 - ud_arrow_width()), visible_top + (0.25F * line_height()),
+ 0.5F * (x1 + x2 + ud_arrow_width()), visible_top + (0.75F * line_height()),
fgcolor, ROT0);
}
if ((m_top_line + m_window_lines) < visible_items)
@@ -206,8 +236,8 @@ void menu_textbox::draw(uint32_t flags)
set_hover(HOVER_ARROW_DOWN);
}
draw_arrow(
- 0.5f * (x1 + x2 - ud_arrow_width()), line_y + (0.25f * line_height()),
- 0.5f * (x1 + x2 + ud_arrow_width()), line_y + (0.75f * line_height()),
+ 0.5F * (x1 + x2 - ud_arrow_width()), line_y + (0.25F * line_height()),
+ 0.5F * (x1 + x2 + ud_arrow_width()), line_y + (0.75F * line_height()),
fgcolor, ROT0 ^ ORIENTATION_FLIP_Y);
}
@@ -216,12 +246,12 @@ void menu_textbox::draw(uint32_t flags)
m_layout->emit(
container(),
m_top_line ? (m_top_line + 1) : 0, text_lines,
- effective_left, visible_top + (m_top_line ? line_height() : 0.0f));
+ effective_left, visible_top + (m_top_line ? line_height() : 0.0F));
// add visual separator before the "return to prevous menu" item
container().add_line(
- x1, separator + (0.5f * line_height()),
- x2, separator + (0.5f * line_height()),
+ x1, separator + (0.5F * line_height()),
+ x2, separator + (0.5F * line_height()),
UI_LINE_WIDTH, ui().colors().text_color(), PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA));
float const line_y0 = separator + line_height();
@@ -244,4 +274,101 @@ void menu_textbox::draw(uint32_t flags)
custom_render(get_selection_ref(), get_customtop(), get_custombottom(), x1, y1, x2, y2);
}
+
+
+//-------------------------------------------------
+// menu_fixed_textbox - text box with three-
+// column content supplied at construction
+//-------------------------------------------------
+
+menu_fixed_textbox::menu_fixed_textbox(
+ mame_ui_manager &mui,
+ render_container &container,
+ std::string &&heading,
+ std::string &&content)
+ : menu_textbox(mui, container)
+ , m_heading(std::move(heading))
+ , m_content(std::move(content))
+{
+}
+
+
+menu_fixed_textbox::~menu_fixed_textbox()
+{
+}
+
+
+void menu_fixed_textbox::recompute_metrics(uint32_t width, uint32_t height, float aspect)
+{
+ menu_textbox::recompute_metrics(width, height, aspect);
+
+ set_custom_space(line_height() + 3.0F * tb_border(), 0.0F);
+}
+
+
+void menu_fixed_textbox::custom_render(void *selectedref, float top, float bottom, float x1, float y1, float x2, float y2)
+{
+ std::string_view const toptext[] = { m_heading };
+ draw_text_box(
+ std::begin(toptext), std::end(toptext),
+ x1, x2, y1 - top, y1 - tb_border(),
+ text_layout::text_justify::CENTER, text_layout::word_wrapping::NEVER, false,
+ ui().colors().text_color(), UI_GREEN_COLOR);
+}
+
+
+void menu_fixed_textbox::populate_text(
+ std::optional<text_layout> &layout,
+ float &width,
+ int &lines)
+{
+ // ugly - use temporary layouts to compute required width
+ {
+ text_layout l(create_layout(width));
+ text_layout c(create_layout(width));
+ text_layout r(create_layout(width));
+ populate_three_column_layout(
+ m_content,
+ [&l] (std::string_view s)
+ {
+ l.add_text(s, text_layout::text_justify::LEFT);
+ if (s.back() != '\n')
+ l.add_text("\n", text_layout::text_justify::LEFT);
+ },
+ [&c] (std::string_view s) {
+ c.add_text(s, text_layout::text_justify::LEFT);
+ if (s.back() != '\n')
+ c.add_text("\n", text_layout::text_justify::LEFT);
+ },
+ [&r] (std::string_view s) {
+ r.add_text(s, text_layout::text_justify::LEFT);
+ if (s.back() != '\n')
+ r.add_text("\n", text_layout::text_justify::LEFT);
+ });
+ width = (std::min)(l.actual_width() + c.actual_width() + r.actual_width(), width);
+ }
+
+ // now do it for real
+ layout.emplace(create_layout(width));
+ rgb_t const color = ui().colors().text_color();
+ populate_three_column_layout(
+ m_content,
+ [&layout, color] (std::string_view s) { layout->add_text(s, text_layout::text_justify::LEFT, color); },
+ [&layout, color] (std::string_view s) { layout->add_text(s, text_layout::text_justify::CENTER, color); },
+ [&layout, color] (std::string_view s) { layout->add_text(s, text_layout::text_justify::RIGHT, color); });
+ lines = layout->lines();
+}
+
+
+void menu_fixed_textbox::populate()
+{
+}
+
+
+void menu_fixed_textbox::handle(event const *ev)
+{
+ if (ev)
+ handle_key(ev->iptkey);
+}
+
} // namespace ui
diff --git a/src/frontend/mame/ui/textbox.h b/src/frontend/mame/ui/textbox.h
index 724134a482b..f7993f79121 100644
--- a/src/frontend/mame/ui/textbox.h
+++ b/src/frontend/mame/ui/textbox.h
@@ -14,6 +14,7 @@
#include "ui/text.h"
#include <optional>
+#include <string>
namespace ui {
@@ -45,6 +46,31 @@ private:
int m_top_line;
};
+
+class menu_fixed_textbox : public menu_textbox
+{
+public:
+ menu_fixed_textbox(
+ mame_ui_manager &mui,
+ render_container &container,
+ std::string &&headig,
+ std::string &&content);
+ virtual ~menu_fixed_textbox() override;
+
+protected:
+ virtual void recompute_metrics(uint32_t width, uint32_t height, float aspect) override;
+ virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override;
+
+ virtual void populate_text(std::optional<text_layout> &layout, float &width, int &lines) override;
+
+private:
+ virtual void populate() override;
+ virtual void handle(event const *ev) override;
+
+ std::string const m_heading;
+ std::string const m_content;
+};
+
} // namespace ui
#endif // MAME_FRONTEND_UI_TEXTBOX_H
diff --git a/src/lib/util/utilfwd.h b/src/lib/util/utilfwd.h
index 9cd11f565b1..b99eeb6bc9a 100644
--- a/src/lib/util/utilfwd.h
+++ b/src/lib/util/utilfwd.h
@@ -10,6 +10,9 @@
#ifndef MAME_LIB_UTIL_UTILFWD_H
#define MAME_LIB_UTIL_UTILFWD_H
+// aviio.h
+class avi_file;
+
// chd.h
class chd_file;
diff --git a/src/osd/interface/inputcode.h b/src/osd/interface/inputcode.h
index 13e053923f8..69ae1b13e33 100644
--- a/src/osd/interface/inputcode.h
+++ b/src/osd/interface/inputcode.h
@@ -4,7 +4,7 @@
inputcode.h
- Codes for representing host inputs
+ Codes for representing host controls
***************************************************************************/
#ifndef MAME_OSD_INTERFACE_INPUTCODE_H
diff --git a/src/osd/interface/inputdev.h b/src/osd/interface/inputdev.h
new file mode 100644
index 00000000000..564c1c426d8
--- /dev/null
+++ b/src/osd/interface/inputdev.h
@@ -0,0 +1,66 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+ inputdev.h
+
+ OSD interface to input devices
+
+***************************************************************************/
+#ifndef MAME_OSD_INTERFACE_INPUTDEV_H
+#define MAME_OSD_INTERFACE_INPUTDEV_H
+
+#pragma once
+
+#include "inputcode.h"
+#include "inputfwd.h"
+
+#include <string_view>
+#include <tuple>
+#include <vector>
+
+
+namespace osd {
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// base for application representation of host input device
+
+class input_device
+{
+protected:
+ virtual ~input_device() = default;
+
+public:
+ using assignment_vector = std::vector<std::tuple<ioport_type, input_seq_type, input_seq> >;
+
+ // relative devices return ~512 units per on-screen pixel
+ static inline constexpr s32 RELATIVE_PER_PIXEL = 512;
+
+ // absolute devices return values between -65536 and +65536
+ static inline constexpr s32 ABSOLUTE_MIN = -65'536;
+ static inline constexpr s32 ABSOLUTE_MAX = 65'536;
+
+ // invalid memory value for axis polling
+ static inline constexpr s32 INVALID_AXIS_VALUE = 0x7fff'ffff;
+
+ // callback for getting the value of an individual input on a device
+ typedef s32 (*item_get_state_func)(void *device_internal, void *item_internal);
+
+ // add a control item to an input device
+ virtual input_item_id add_item(
+ std::string_view name,
+ std::string_view tokenhint,
+ input_item_id itemid,
+ item_get_state_func getstate,
+ void *internal) = 0;
+
+ // set additional default assignments suitable for device
+ virtual void set_default_assignments(assignment_vector &&assignments) = 0;
+};
+
+} // namespace osd
+
+#endif // MAME_OSD_INTERFACE_INPUTDEV_H
diff --git a/src/osd/interface/inputfwd.h b/src/osd/interface/inputfwd.h
new file mode 100644
index 00000000000..b87831fca59
--- /dev/null
+++ b/src/osd/interface/inputfwd.h
@@ -0,0 +1,36 @@
+// license:BSD-3-Clause
+// copyright-holders:Aaron Giles
+/***************************************************************************
+
+ inputfwd.h
+
+ Forward declarations for OSD input interface types
+
+***************************************************************************/
+#ifndef MAME_OSD_INTERFACE_INPUTFWD_H
+#define MAME_OSD_INTERFACE_INPUTFWD_H
+
+#include <cstdint>
+
+#pragma once
+
+
+//**************************************************************************
+// FORWARD DECLARATIONS
+//**************************************************************************
+
+enum ioport_type : std::uint32_t;
+enum input_seq_type : int;
+
+class input_code;
+
+
+namespace osd {
+
+class input_device;
+class input_manager;
+class input_seq;
+
+} // namespace osd
+
+#endif // MAME_OSD_INTERFACE_INPUTFWD_H
diff --git a/src/osd/interface/inputman.h b/src/osd/interface/inputman.h
index 223c9a6926d..da4c1b6b9f5 100644
--- a/src/osd/interface/inputman.h
+++ b/src/osd/interface/inputman.h
@@ -4,7 +4,7 @@
inputman.h
- OSD interface to the input manager.
+ OSD interface to the input manager
***************************************************************************/
#ifndef MAME_OSD_INTERFACE_INPUTMAN_H
@@ -13,6 +13,7 @@
#pragma once
#include "inputcode.h"
+#include "inputfwd.h"
#include <string_view>
@@ -20,50 +21,19 @@
namespace osd {
//**************************************************************************
-// CONSTANTS
-//**************************************************************************
-
-// relative devices return ~512 units per on-screen pixel
-constexpr s32 INPUT_RELATIVE_PER_PIXEL = 512;
-
-// absolute devices return values between -65536 and +65536
-constexpr s32 INPUT_ABSOLUTE_MIN = -65'536;
-constexpr s32 INPUT_ABSOLUTE_MAX = 65'536;
-
-// invalid memory value for axis polling
-constexpr s32 INVALID_AXIS_VALUE = 0x7fff'ffff;
-
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// base for application representation of host input device
-
-class input_device
-{
-public:
- // callback for getting the value of an individual input on a device
- typedef s32 (*item_get_state_func)(void *device_internal, void *item_internal);
-
- virtual ~input_device() = default;
-
- virtual input_item_id add_item(
- std::string_view name,
- input_item_id itemid,
- item_get_state_func getstate,
- void *internal = nullptr) = 0;
-};
-
-
-// base for application input manager
+// interface to application input manager
class input_manager
{
-public:
+protected:
virtual ~input_manager() = default;
+public:
+ virtual bool class_enabled(input_device_class devclass) const = 0;
+
virtual input_device &add_device(
input_device_class devclass,
std::string_view name,
@@ -71,7 +41,6 @@ public:
void *internal = nullptr) = 0;
};
-
} // namespace osd
#endif // MAME_OSD_INTERFACE_INPUTMAN_H
diff --git a/src/osd/modules/input/input_common.h b/src/osd/modules/input/input_common.h
index 8f3c269abc9..46dcf9d486a 100644
--- a/src/osd/modules/input/input_common.h
+++ b/src/osd/modules/input/input_common.h
@@ -14,6 +14,7 @@
#include "input_module.h"
+#include "interface/inputdev.h"
#include "interface/inputman.h"
#include "modules/osdmodule.h"
@@ -562,14 +563,14 @@ inline int32_t normalize_absolute_axis(double raw, double rawmin, double rawmax)
if (raw >= center)
{
// above center
- double const result = (raw - center) * double(osd::INPUT_ABSOLUTE_MAX) / (rawmax - center);
- return int32_t(std::min(result, double(osd::INPUT_ABSOLUTE_MAX)));
+ double const result = (raw - center) * double(osd::input_device::ABSOLUTE_MAX) / (rawmax - center);
+ return int32_t(std::min(result, double(osd::input_device::ABSOLUTE_MAX)));
}
else
{
// below center
- double result = -((center - raw) * double(-osd::INPUT_ABSOLUTE_MIN) / (center - rawmin));
- return int32_t(std::max(result, double(osd::INPUT_ABSOLUTE_MIN)));
+ double result = -((center - raw) * double(-osd::input_device::ABSOLUTE_MIN) / (center - rawmin));
+ return int32_t(std::max(result, double(osd::input_device::ABSOLUTE_MIN)));
}
}
diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp
index 31a36fc841a..2ac7c7458fd 100644
--- a/src/osd/modules/input/input_dinput.cpp
+++ b/src/osd/modules/input/input_dinput.cpp
@@ -323,6 +323,7 @@ void dinput_keyboard_device::configure(input_device &device)
// add the item to the device
device.add_item(
item_name(keynum, defname, nullptr),
+ strmakeupper(defname),
itemid,
generic_button_get_state<std::uint8_t>,
&m_keyboard.state[keynum]);
@@ -355,9 +356,9 @@ void dinput_mouse_device::poll()
if (poll_dinput(&m_mouse) == DI_OK)
{
// scale the axis data
- m_mouse.lX *= INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lY *= INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lZ *= INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lX *= input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lY *= input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lZ *= input_device::RELATIVE_PER_PIXEL;
}
}
@@ -374,6 +375,7 @@ void dinput_mouse_device::configure(input_device &device)
// add to the mouse device and optionally to the gun device as well
device.add_item(
item_name(offsetof(DIMOUSESTATE, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], nullptr),
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_mouse.lX + axisnum);
@@ -387,6 +389,7 @@ void dinput_mouse_device::configure(input_device &device)
// add to the mouse device
device.add_item(
item_name(offset, default_button_name(butnum), nullptr),
+ std::string_view(),
input_item_id(ITEM_ID_BUTTON1 + butnum),
generic_button_get_state<BYTE>,
&m_mouse.rgbButtons[butnum]);
@@ -470,6 +473,7 @@ void dinput_joystick_device::configure(input_device &device)
// populate the item description as well
device.add_item(
item_name(offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], nullptr),
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_joystick.state.lX + axisnum);
@@ -483,6 +487,7 @@ void dinput_joystick_device::configure(input_device &device)
// left
device.add_item(
item_name(offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), "Left"),
+ std::string_view(),
input_item_id(povnum * 4 + ITEM_ID_HAT1LEFT),
&dinput_joystick_device::pov_get_state,
reinterpret_cast<void *>(uintptr_t(povnum * 4 + POVDIR_LEFT)));
@@ -490,6 +495,7 @@ void dinput_joystick_device::configure(input_device &device)
// right
device.add_item(
item_name(offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), "Right"),
+ std::string_view(),
input_item_id(povnum * 4 + ITEM_ID_HAT1RIGHT),
&dinput_joystick_device::pov_get_state,
reinterpret_cast<void *>(uintptr_t(povnum * 4 + POVDIR_RIGHT)));
@@ -497,6 +503,7 @@ void dinput_joystick_device::configure(input_device &device)
// up
device.add_item(
item_name(offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), "Up"),
+ std::string_view(),
input_item_id(povnum * 4 + ITEM_ID_HAT1UP),
&dinput_joystick_device::pov_get_state,
reinterpret_cast<void *>(uintptr_t(povnum * 4 + POVDIR_UP)));
@@ -504,6 +511,7 @@ void dinput_joystick_device::configure(input_device &device)
// down
device.add_item(
item_name(offsetof(DIJOYSTATE2, rgdwPOV) + povnum * sizeof(DWORD), default_pov_name(povnum), "Down"),
+ std::string_view(),
input_item_id(povnum * 4 + ITEM_ID_HAT1DOWN),
&dinput_joystick_device::pov_get_state,
reinterpret_cast<void *>(uintptr_t(povnum * 4 + POVDIR_DOWN)));
@@ -524,6 +532,7 @@ void dinput_joystick_device::configure(input_device &device)
device.add_item(
item_name(offset, default_button_name(butnum), nullptr),
+ std::string_view(),
itemid,
generic_button_get_state<BYTE>,
&m_joystick.state.rgbButtons[butnum]);
diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp
index 910e1873a76..4e4f1811e40 100644
--- a/src/osd/modules/input/input_rawinput.cpp
+++ b/src/osd/modules/input/input_rawinput.cpp
@@ -346,6 +346,7 @@ public:
// add the item to the device
device.add_item(
name,
+ util::string_format("SCAN%03d", keynum),
itemid,
generic_button_get_state<std::uint8_t>,
&m_keyboard.state[keynum]);
@@ -391,6 +392,7 @@ public:
{
device.add_item(
default_axis_name[axisnum],
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_mouse.lX + axisnum);
@@ -401,6 +403,7 @@ public:
{
device.add_item(
default_button_name(butnum),
+ std::string_view(),
input_item_id(ITEM_ID_BUTTON1 + butnum),
generic_button_get_state<BYTE>,
&m_mouse.rgbButtons[butnum]);
@@ -414,12 +417,12 @@ public:
if (rawinput.data.mouse.usFlags == MOUSE_MOVE_RELATIVE)
{
- m_mouse.lX += rawinput.data.mouse.lLastX * INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lY += rawinput.data.mouse.lLastY * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lX += rawinput.data.mouse.lLastX * input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lY += rawinput.data.mouse.lLastY * input_device::RELATIVE_PER_PIXEL;
// update zaxis
if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
- m_mouse.lZ += int16_t(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lZ += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL;
// update the button states; always update the corresponding mouse buttons
if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_mouse.rgbButtons[0] = 0x80;
@@ -472,6 +475,7 @@ public:
{
device.add_item(
default_axis_name[axisnum],
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_lightgun.lX + axisnum);
@@ -480,6 +484,7 @@ public:
// scroll wheel is always relative if present
device.add_item(
default_axis_name[2],
+ std::string_view(),
ITEM_ID_ADD_RELATIVE1,
generic_axis_get_state<LONG>,
&m_lightgun.lZ);
@@ -489,6 +494,7 @@ public:
{
device.add_item(
default_button_name(butnum),
+ std::string_view(),
input_item_id(ITEM_ID_BUTTON1 + butnum),
generic_button_get_state<BYTE>,
&m_lightgun.rgbButtons[butnum]);
@@ -502,12 +508,12 @@ public:
{
// update the X/Y positions
- m_lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, INPUT_ABSOLUTE_MAX);
- m_lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, INPUT_ABSOLUTE_MAX);
+ m_lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, input_device::ABSOLUTE_MAX);
+ m_lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, input_device::ABSOLUTE_MAX);
// update zaxis
if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
- m_lightgun.lZ += int16_t(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL;
+ m_lightgun.lZ += int16_t(rawinput.data.mouse.usButtonData) * input_device::RELATIVE_PER_PIXEL;
// update the button states; always update the corresponding mouse buttons
if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) m_lightgun.rgbButtons[0] = 0x80;
diff --git a/src/osd/modules/input/input_sdl.cpp b/src/osd/modules/input/input_sdl.cpp
index 27d9f3df3f8..6def55c5cc0 100644
--- a/src/osd/modules/input/input_sdl.cpp
+++ b/src/osd/modules/input/input_sdl.cpp
@@ -623,6 +623,7 @@ public:
device.add_item(
defname,
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_keyboard.state[m_trans_table[keynum].sdl_scancode]);
@@ -676,21 +677,25 @@ public:
// add the axes
device.add_item(
"X",
+ std::string_view(),
ITEM_ID_XAXIS,
generic_axis_get_state<s32>,
&m_mouse.lX);
device.add_item(
"Y",
+ std::string_view(),
ITEM_ID_YAXIS,
generic_axis_get_state<s32>,
&m_mouse.lY);
device.add_item(
"Scroll V",
+ std::string_view(),
ITEM_ID_ZAXIS,
generic_axis_get_state<s32>,
&m_mouse.lV);
device.add_item(
"Scroll H",
+ std::string_view(),
ITEM_ID_RZAXIS,
generic_axis_get_state<s32>,
&m_mouse.lH);
@@ -702,6 +707,7 @@ public:
int const offset = button ^ (((1 == button) || (2 == button)) ? 3 : 0);
device.add_item(
default_button_name(button),
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_mouse.buttons[offset]);
@@ -713,8 +719,8 @@ public:
switch (event.type)
{
case SDL_MOUSEMOTION:
- m_mouse.lX += event.motion.xrel * INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lY += event.motion.yrel * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lX += event.motion.xrel * input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lY += event.motion.yrel * input_device::RELATIVE_PER_PIXEL;
break;
case SDL_MOUSEBUTTONDOWN:
@@ -727,11 +733,11 @@ public:
case SDL_MOUSEWHEEL:
#if SDL_VERSION_ATLEAST(2, 0, 18)
- m_mouse.lV += event.wheel.preciseY * INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lH += event.wheel.preciseX * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lV += event.wheel.preciseY * input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lH += event.wheel.preciseX * input_device::RELATIVE_PER_PIXEL;
#else
- m_mouse.lV += event.wheel.y * INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lH += event.wheel.x * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lV += event.wheel.y * input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lH += event.wheel.x * input_device::RELATIVE_PER_PIXEL;
#endif
break;
}
@@ -850,6 +856,7 @@ public:
snprintf(tempname, sizeof(tempname), "A%d", axis + 1);
device.add_item(
tempname,
+ std::string_view(),
itemid,
generic_axis_get_state<s32>,
&m_joystick.axes[axis]);
@@ -871,6 +878,7 @@ public:
device.add_item(
default_button_name(button),
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_joystick.buttons[button]);
@@ -885,6 +893,7 @@ public:
itemid = input_item_id((hat < INPUT_MAX_HATS) ? ITEM_ID_HAT1UP + (4 * hat) : ITEM_ID_OTHER_SWITCH);
device.add_item(
tempname,
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_joystick.hatsU[hat]);
@@ -893,6 +902,7 @@ public:
itemid = input_item_id((hat < INPUT_MAX_HATS) ? ITEM_ID_HAT1DOWN + (4 * hat) : ITEM_ID_OTHER_SWITCH);
device.add_item(
tempname,
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_joystick.hatsD[hat]);
@@ -901,6 +911,7 @@ public:
itemid = input_item_id((hat < INPUT_MAX_HATS) ? ITEM_ID_HAT1LEFT + (4 * hat) : ITEM_ID_OTHER_SWITCH);
device.add_item(
tempname,
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_joystick.hatsL[hat]);
@@ -909,6 +920,7 @@ public:
itemid = input_item_id((hat < INPUT_MAX_HATS) ? ITEM_ID_HAT1RIGHT + (4 * hat) : ITEM_ID_OTHER_SWITCH);
device.add_item(
tempname,
+ std::string_view(),
itemid,
generic_button_get_state<s32>,
&m_joystick.hatsR[hat]);
@@ -927,6 +939,7 @@ public:
snprintf(tempname, sizeof(tempname), "R%d X", ball + 1);
device.add_item(
tempname,
+ std::string_view(),
input_item_id(itemid),
generic_axis_get_state<s32>,
&m_joystick.balls[ball * 2]);
@@ -934,6 +947,7 @@ public:
snprintf(tempname, sizeof(tempname), "R%d Y", ball + 1);
device.add_item(
tempname,
+ std::string_view(),
input_item_id(itemid + 1),
generic_axis_get_state<s32>,
&m_joystick.balls[ball * 2 + 1]);
@@ -972,8 +986,8 @@ public:
//printf("Ball %d %d\n", event.jball.xrel, event.jball.yrel);
if (event.jball.ball < (MAX_AXES / 2))
{
- m_joystick.balls[event.jball.ball * 2] = event.jball.xrel * INPUT_RELATIVE_PER_PIXEL;
- m_joystick.balls[event.jball.ball * 2 + 1] = event.jball.yrel * INPUT_RELATIVE_PER_PIXEL;
+ m_joystick.balls[event.jball.ball * 2] = event.jball.xrel * input_device::RELATIVE_PER_PIXEL;
+ m_joystick.balls[event.jball.ball * 2 + 1] = event.jball.yrel * input_device::RELATIVE_PER_PIXEL;
}
break;
@@ -1225,6 +1239,7 @@ public:
{
device.add_item(
axisnames[axis],
+ std::string_view(),
item,
generic_axis_get_state<s32>,
&m_controller.axes[axis]);
@@ -1280,6 +1295,7 @@ public:
{
device.add_item(
buttonnames[button],
+ std::string_view(),
button_item++,
generic_button_get_state<s32>,
&m_controller.buttons[button]);
@@ -1308,6 +1324,7 @@ public:
{
device.add_item(
axisnames[axis],
+ std::string_view(),
button_item++,
[] (void *device_internal, void *item_internal) -> int
{
@@ -1349,6 +1366,7 @@ public:
{
device.add_item(
buttonnames[button],
+ std::string_view(),
item,
generic_button_get_state<s32>,
&m_controller.buttons[button]);
diff --git a/src/osd/modules/input/input_win32.cpp b/src/osd/modules/input/input_win32.cpp
index 57ea073f863..820650c4b1d 100644
--- a/src/osd/modules/input/input_win32.cpp
+++ b/src/osd/modules/input/input_win32.cpp
@@ -19,7 +19,6 @@
// emu
#include "emu.h"
-#include "inputdev.h"
#include "strconv.h"
@@ -67,6 +66,7 @@ public:
// add the item to the device
device.add_item(
name,
+ util::string_format("SCAN%03d", keynum),
itemid,
generic_button_get_state<std::uint8_t>,
&m_keyboard.state[keynum]);
@@ -150,8 +150,8 @@ public:
if (!(cursor_info.flags & CURSOR_SHOWING))
{
// We measure the position change from the previously set center position
- m_mouse.lX = (cursor_info.ptScreenPos.x - m_win32_mouse.last_point.x) * INPUT_RELATIVE_PER_PIXEL;
- m_mouse.lY = (cursor_info.ptScreenPos.y - m_win32_mouse.last_point.y) * INPUT_RELATIVE_PER_PIXEL;
+ m_mouse.lX = (cursor_info.ptScreenPos.x - m_win32_mouse.last_point.x) * input_device::RELATIVE_PER_PIXEL;
+ m_mouse.lY = (cursor_info.ptScreenPos.y - m_win32_mouse.last_point.y) * input_device::RELATIVE_PER_PIXEL;
RECT window_pos = {0};
GetWindowRect(
@@ -173,6 +173,7 @@ public:
{
device.add_item(
default_axis_name[axisnum],
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_mouse.lX + axisnum);
@@ -183,6 +184,7 @@ public:
{
device.add_item(
default_button_name(butnum),
+ std::string_view(),
input_item_id(ITEM_ID_BUTTON1 + butnum),
generic_button_get_state<BYTE>,
&m_mouse.rgbButtons[butnum]);
@@ -241,8 +243,7 @@ public:
virtual bool handle_input_event(input_event eventid, void *eventdata) override
{
- // TODO: remove need for this downcast
- if (!downcast<::input_manager &>(manager()).device_class(DEVICE_CLASS_MOUSE).enabled() || eventid != INPUT_EVENT_MOUSE_BUTTON)
+ if (!manager().class_enabled(DEVICE_CLASS_MOUSE) || eventid != INPUT_EVENT_MOUSE_BUTTON)
return false;
auto const *const args = static_cast<MouseButtonEventArgs *>(eventdata);
@@ -273,6 +274,7 @@ public:
{
device.add_item(
default_axis_name[axisnum],
+ std::string_view(),
input_item_id(ITEM_ID_XAXIS + axisnum),
generic_axis_get_state<LONG>,
&m_mouse.lX + axisnum);
@@ -283,6 +285,7 @@ public:
{
device.add_item(
default_button_name(butnum),
+ std::string_view(),
input_item_id(ITEM_ID_BUTTON1 + butnum),
generic_button_get_state<BYTE>,
&m_mouse.rgbButtons[butnum]);
@@ -445,8 +448,7 @@ public:
virtual bool handle_input_event(input_event eventid, void *eventdata) override
{
- // TODO: remove need for this downcast
- if (!downcast<::input_manager &>(manager()).device_class(DEVICE_CLASS_LIGHTGUN).enabled() || eventid != INPUT_EVENT_MOUSE_BUTTON)
+ if (!manager().class_enabled(DEVICE_CLASS_LIGHTGUN) || eventid != INPUT_EVENT_MOUSE_BUTTON)
return false;
auto const *const args = static_cast<MouseButtonEventArgs *>(eventdata);
diff --git a/src/osd/modules/input/input_windows.cpp b/src/osd/modules/input/input_windows.cpp
index 39932974b4c..5e42e58e575 100644
--- a/src/osd/modules/input/input_windows.cpp
+++ b/src/osd/modules/input/input_windows.cpp
@@ -12,7 +12,6 @@
// MAME headers
#include "emu.h"
-#include "inputdev.h"
#include "input_windows.h"
@@ -33,8 +32,8 @@ bool windows_osd_interface::should_hide_mouse() const
return false;
// track if mouse/lightgun is enabled, for mouse hiding purposes
- bool const mouse_enabled = machine().input().device_class(DEVICE_CLASS_MOUSE).enabled();
- bool const lightgun_enabled = machine().input().device_class(DEVICE_CLASS_LIGHTGUN).enabled();
+ bool const mouse_enabled = machine().input().class_enabled(DEVICE_CLASS_MOUSE);
+ bool const lightgun_enabled = machine().input().class_enabled(DEVICE_CLASS_LIGHTGUN);
if (!mouse_enabled && !lightgun_enabled)
return false;
diff --git a/src/osd/modules/input/input_x11.cpp b/src/osd/modules/input/input_x11.cpp
index 5009fa85f8d..b1d21d56c86 100644
--- a/src/osd/modules/input/input_x11.cpp
+++ b/src/osd/modules/input/input_x11.cpp
@@ -494,14 +494,14 @@ public:
for (int button = 0; button < m_button_count; button++)
{
input_item_id const itemid = input_item_id(ITEM_ID_BUTTON1 + button);
- device.add_item(default_button_name(button), itemid, generic_button_get_state<std::int32_t>, &m_lightgun.buttons[button]);
+ device.add_item(default_button_name(button), std::string_view(), itemid, generic_button_get_state<std::int32_t>, &m_lightgun.buttons[button]);
}
// Add X and Y axis
if (1 <= m_axis_count)
- device.add_item("X", ITEM_ID_XAXIS, generic_axis_get_state<std::int32_t>, &m_lightgun.lX);
+ device.add_item("X", std::string_view(), ITEM_ID_XAXIS, generic_axis_get_state<std::int32_t>, &m_lightgun.lX);
if (2 <= m_axis_count)
- device.add_item("Y", ITEM_ID_YAXIS, generic_axis_get_state<std::int32_t>, &m_lightgun.lY);
+ device.add_item("Y", std::string_view(), ITEM_ID_YAXIS, generic_axis_get_state<std::int32_t>, &m_lightgun.lY);
}
virtual void process_event(XEvent const &xevent) override
diff --git a/src/osd/modules/input/input_xinput.cpp b/src/osd/modules/input/input_xinput.cpp
index 851a0799817..e8dc0af5e19 100644
--- a/src/osd/modules/input/input_xinput.cpp
+++ b/src/osd/modules/input/input_xinput.cpp
@@ -791,6 +791,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
axis_names[i],
+ std::string_view(),
axis_ids[i],
generic_axis_get_state<s32>,
&m_axes[AXIS_LSX + i]);
@@ -813,6 +814,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
hat_names[i],
+ std::string_view(),
input_item_id(ITEM_ID_HAT1UP + i), // matches up/down/left/right order
generic_button_get_state<u8>,
&m_switches[SWITCH_DPAD_UP + i]);
@@ -839,6 +841,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
button_names[i],
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[offset]);
@@ -850,6 +853,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
"Start",
+ std::string_view(),
ITEM_ID_START,
generic_button_get_state<u8>,
&m_switches[SWITCH_START]);
@@ -858,6 +862,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
"Back",
+ std::string_view(),
ITEM_ID_SELECT,
generic_button_get_state<u8>,
&m_switches[SWITCH_BACK]);
@@ -872,6 +877,7 @@ void xinput_joystick_device::configure(input_device &device)
{
device.add_item(
axis_names[4 + i],
+ std::string_view(),
axis_ids[4 + i],
generic_axis_get_state<s32>,
&m_axes[AXIS_LT + i]);
@@ -1029,6 +1035,7 @@ void xinput_guitar_device::configure(input_device &device)
{
device.add_item(
name,
+ std::string_view(),
item,
generic_axis_get_state<s32>,
&m_axes[AXIS_SLIDER + i]);
@@ -1042,6 +1049,7 @@ void xinput_guitar_device::configure(input_device &device)
{
device.add_item(
HAT_NAMES_GUITAR[i],
+ std::string_view(),
input_item_id(ITEM_ID_HAT1UP + i), // matches up/down/left/right order
generic_button_get_state<u8>,
&m_switches[SWITCH_DPAD_UP + i]);
@@ -1056,6 +1064,7 @@ void xinput_guitar_device::configure(input_device &device)
{
device.add_item(
BUTTON_NAMES_GUITAR[i],
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_FRET1 + i]);
@@ -1067,6 +1076,7 @@ void xinput_guitar_device::configure(input_device &device)
{
device.add_item(
"Start",
+ std::string_view(),
ITEM_ID_START,
generic_button_get_state<u8>,
&m_switches[SWITCH_START]);
@@ -1075,6 +1085,7 @@ void xinput_guitar_device::configure(input_device &device)
{
device.add_item(
"Back",
+ std::string_view(),
ITEM_ID_SELECT,
generic_button_get_state<u8>,
&m_switches[SWITCH_BACK]);
@@ -1219,6 +1230,7 @@ void xinput_drumkit_device::configure(input_device &device)
{
device.add_item(
name,
+ std::string_view(),
item,
generic_axis_get_state<s32>,
&m_axes[AXIS_GREEN + i]);
@@ -1232,6 +1244,7 @@ void xinput_drumkit_device::configure(input_device &device)
{
device.add_item(
HAT_NAMES_GAMEPAD[i],
+ std::string_view(),
input_item_id(ITEM_ID_HAT1UP + i), // matches up/down/left/right order
generic_button_get_state<u8>,
&m_switches[SWITCH_DPAD_UP + i]);
@@ -1246,6 +1259,7 @@ void xinput_drumkit_device::configure(input_device &device)
{
device.add_item(
BUTTON_NAMES_DRUMKIT[i],
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_GREEN + i]);
@@ -1257,6 +1271,7 @@ void xinput_drumkit_device::configure(input_device &device)
{
device.add_item(
"Start",
+ std::string_view(),
ITEM_ID_START,
generic_button_get_state<u8>,
&m_switches[SWITCH_START]);
@@ -1265,6 +1280,7 @@ void xinput_drumkit_device::configure(input_device &device)
{
device.add_item(
"Back",
+ std::string_view(),
ITEM_ID_SELECT,
generic_button_get_state<u8>,
&m_switches[SWITCH_BACK]);
@@ -1382,7 +1398,7 @@ void xinput_turntable_device::poll()
m_switches[SWITCH_GREEN + i] = BIT(trigger_right(), i) ? 0xff : 0x00;
// translate axes
- m_axes[AXIS_TURNTABLE] = s32(thumb_left_y()) * INPUT_RELATIVE_PER_PIXEL * 2;
+ m_axes[AXIS_TURNTABLE] = s32(thumb_left_y()) * input_device::RELATIVE_PER_PIXEL * 2;
m_axes[AXIS_CROSSFADE] = normalize_absolute_axis(thumb_right_y(), XINPUT_AXIS_MINVALUE, XINPUT_AXIS_MAXVALUE);
// convert effect dial value to relative displacement
@@ -1393,7 +1409,7 @@ void xinput_turntable_device::poll()
effect_delta -= 0x1'0000;
else if (-0x8000 > effect_delta)
effect_delta += 0x1'0000;
- m_axes[AXIS_EFFECT] = effect_delta * INPUT_RELATIVE_PER_PIXEL / 128;
+ m_axes[AXIS_EFFECT] = effect_delta * input_device::RELATIVE_PER_PIXEL / 128;
}
m_prev_effect = u16(thumb_right_x());
}
@@ -1419,16 +1435,19 @@ void xinput_turntable_device::configure(input_device &device)
// add axes
device.add_item(
"Turntable",
+ std::string_view(),
ITEM_ID_ADD_RELATIVE1,
generic_axis_get_state<s32>,
&m_axes[AXIS_TURNTABLE]);
device.add_item(
"Effect",
+ std::string_view(),
ITEM_ID_ADD_RELATIVE2,
generic_axis_get_state<s32>,
&m_axes[AXIS_EFFECT]);
device.add_item(
"Crossfade",
+ std::string_view(),
ITEM_ID_XAXIS,
generic_axis_get_state<s32>,
&m_axes[AXIS_CROSSFADE]);
@@ -1440,6 +1459,7 @@ void xinput_turntable_device::configure(input_device &device)
{
device.add_item(
HAT_NAMES_GAMEPAD[i],
+ std::string_view(),
input_item_id(ITEM_ID_HAT1UP + i), // matches up/down/left/right order
generic_button_get_state<u8>,
&m_switches[SWITCH_DPAD_UP + i]);
@@ -1454,6 +1474,7 @@ void xinput_turntable_device::configure(input_device &device)
{
device.add_item(
BUTTON_NAMES_KEYBOARD[i],
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_A + i]);
@@ -1461,16 +1482,19 @@ void xinput_turntable_device::configure(input_device &device)
}
device.add_item(
"Green",
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_GREEN]);
device.add_item(
"Red",
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_RED]);
device.add_item(
"Blue",
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_BLUE]);
@@ -1480,6 +1504,7 @@ void xinput_turntable_device::configure(input_device &device)
{
device.add_item(
"Start",
+ std::string_view(),
ITEM_ID_START,
generic_button_get_state<u8>,
&m_switches[SWITCH_START]);
@@ -1488,6 +1513,7 @@ void xinput_turntable_device::configure(input_device &device)
{
device.add_item(
"Back",
+ std::string_view(),
ITEM_ID_SELECT,
generic_button_get_state<u8>,
&m_switches[SWITCH_BACK]);
@@ -1627,11 +1653,13 @@ void xinput_keyboard_device::configure(input_device &device)
// add axes
device.add_item(
"Velocity",
+ std::string_view(),
ITEM_ID_SLIDER1,
generic_axis_get_state<s32>,
&m_axes[AXIS_VELOCITY]);
device.add_item(
"Pedal",
+ std::string_view(),
ITEM_ID_SLIDER2,
generic_axis_get_state<s32>,
&m_axes[AXIS_PEDAL]);
@@ -1643,6 +1671,7 @@ void xinput_keyboard_device::configure(input_device &device)
{
device.add_item(
HAT_NAMES_GAMEPAD[i],
+ std::string_view(),
input_item_id(ITEM_ID_HAT1UP + i), // matches up/down/left/right order
generic_button_get_state<u8>,
&m_switches[SWITCH_DPAD_UP + i]);
@@ -1657,6 +1686,7 @@ void xinput_keyboard_device::configure(input_device &device)
{
device.add_item(
BUTTON_NAMES_KEYBOARD[i],
+ std::string_view(),
button_id++,
generic_button_get_state<u8>,
&m_switches[SWITCH_A + i]);
@@ -1670,6 +1700,7 @@ void xinput_keyboard_device::configure(input_device &device)
{
device.add_item(
util::string_format(key_formats[i % 12], (i / 12) + 1),
+ std::string_view(),
(ITEM_ID_BUTTON32 >= button_id) ? button_id++ : ITEM_ID_OTHER_SWITCH,
generic_button_get_state<u8>,
&m_switches[SWITCH_C1 + i]);
@@ -1680,6 +1711,7 @@ void xinput_keyboard_device::configure(input_device &device)
{
device.add_item(
"Start",
+ std::string_view(),
ITEM_ID_START,
generic_button_get_state<u8>,
&m_switches[SWITCH_START]);
@@ -1688,6 +1720,7 @@ void xinput_keyboard_device::configure(input_device &device)
{
device.add_item(
"Back",
+ std::string_view(),
ITEM_ID_SELECT,
generic_button_get_state<u8>,
&m_switches[SWITCH_BACK]);
diff --git a/src/osd/modules/render/aviwrite.h b/src/osd/modules/render/aviwrite.h
index 4bf08b769db..a933dc2a3e6 100644
--- a/src/osd/modules/render/aviwrite.h
+++ b/src/osd/modules/render/aviwrite.h
@@ -11,8 +11,6 @@
#pragma once
-#include "eminline.h" // attotime.h needs this - add it to attotime.h on the next emu.h update
-
// emu
#include "attotime.h"
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp
index aa75c4079b1..67870b9673b 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.cpp
+++ b/src/osd/modules/render/d3d/d3dhlsl.cpp
@@ -8,15 +8,18 @@
// MAME headers
#include "emu.h"
+
#include "drivenum.h"
+#include "emuopts.h"
+#include "fileio.h"
+#include "main.h"
#include "render.h"
#include "rendlay.h"
#include "rendutil.h"
-#include "emuopts.h"
-#include "fileio.h"
+#include "screen.h"
+
#include "aviio.h"
#include "png.h"
-#include "screen.h"
// MAMEOS headers
#include "winmain.h"
diff --git a/src/osd/modules/render/drawnone.cpp b/src/osd/modules/render/drawnone.cpp
index 0f9fa36bd7a..55ce1bbed18 100644
--- a/src/osd/modules/render/drawnone.cpp
+++ b/src/osd/modules/render/drawnone.cpp
@@ -12,7 +12,6 @@
#include "modules/osdmodule.h"
#include "modules/osdwindow.h"
-#include "emu.h" // FIXME: only here for main.h, won't be necessary soon
#include "main.h"
#include "render.h"
diff --git a/src/osd/sdl/sdlopts.cpp b/src/osd/sdl/sdlopts.cpp
index d11e3444d86..8e922cb7a4e 100644
--- a/src/osd/sdl/sdlopts.cpp
+++ b/src/osd/sdl/sdlopts.cpp
@@ -4,7 +4,6 @@
#include "sdlopts.h"
// emu
-#include "emu.h"
#include "main.h"
// lib/util