summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ioport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ioport.cpp')
-rw-r--r--src/emu/ioport.cpp88
1 files changed, 79 insertions, 9 deletions
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp
index f406ee6420b..e9fd8d7b6d7 100644
--- a/src/emu/ioport.cpp
+++ b/src/emu/ioport.cpp
@@ -1282,7 +1282,7 @@ void ioport_field::expand_diplocation(const char *location, std::string &errorbu
errorbuf.append(string_format("Switch location '%s' has invalid format!\n", location));
// allocate a new entry
- m_diploclist.append(*global_alloc(ioport_diplocation(name.c_str(), swnum, invert)));
+ m_diploclist.append(*new ioport_diplocation(name.c_str(), swnum, invert));
entries++;
// advance to the next item
@@ -1618,15 +1618,15 @@ ioport_port_live::ioport_port_live(ioport_port &port)
// allocate analog state if it's analog
analog_field *analog = nullptr;
if (field.is_analog())
- analog = &analoglist.append(*global_alloc(analog_field(field)));
+ analog = &analoglist.append(*new analog_field(field));
// allocate a dynamic field for reading
if (field.has_dynamic_read())
- readlist.append(*global_alloc(dynamic_field(field)));
+ readlist.append(*new dynamic_field(field));
// allocate a dynamic field for writing
if (field.has_dynamic_write())
- writelist.append(*global_alloc(dynamic_field(field)));
+ writelist.append(*new dynamic_field(field));
// let the field initialize its live state
field.init_live_state(analog);
@@ -1694,9 +1694,10 @@ time_t ioport_manager::initialize()
if (&port.second->device() == &device)
{
for (ioport_field &field : port.second->fields())
- if (field.type_class()==INPUT_CLASS_CONTROLLER)
+ if (field.type_class() == INPUT_CLASS_CONTROLLER)
{
- if (players < field.player() + 1) players = field.player() + 1;
+ if (players < field.player() + 1)
+ players = field.player() + 1;
field.set_player(field.player() + player_offset);
}
}
@@ -1956,7 +1957,7 @@ digital_joystick &ioport_manager::digjoystick(int player, int number)
return joystick;
// create a new one
- return m_joystick_list.append(*global_alloc(digital_joystick(player, number)));
+ return m_joystick_list.append(*new digital_joystick(player, number));
}
@@ -2120,6 +2121,67 @@ void ioport_manager::load_config(config_type cfg_type, util::xml::data_node cons
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::GAME)
+ {
+ std::vector<bool> kbd_enable_set;
+ bool keyboard_enabled = false, missing_enabled = false;
+ for (util::xml::data_node const *kbdnode = parentnode->get_child("keyboard"); kbdnode; kbdnode = kbdnode->get_next_sibling("keyboard"))
+ {
+ char const *const tag = kbdnode->get_attribute_string("tag", nullptr);
+ int const enabled = kbdnode->get_attribute_int("enabled", -1);
+ if (tag && (0 <= enabled))
+ {
+ size_t i;
+ for (i = 0; natkeyboard().keyboard_count() > i; ++i)
+ {
+ if (!strcmp(natkeyboard().keyboard_device(i).tag(), tag))
+ {
+ if (kbd_enable_set.empty())
+ kbd_enable_set.resize(natkeyboard().keyboard_count(), false);
+ kbd_enable_set[i] = true;
+ if (enabled)
+ {
+ if (!natkeyboard().keyboard_is_keypad(i))
+ keyboard_enabled = true;
+ natkeyboard().enable_keyboard(i);
+ }
+ else
+ {
+ natkeyboard().disable_keyboard(i);
+ }
+ break;
+ }
+ }
+ missing_enabled = missing_enabled || (enabled && (natkeyboard().keyboard_count() <= i));
+ }
+ }
+
+ // if keyboard enable configuration was loaded, patch it up for principle of least surprise
+ if (!kbd_enable_set.empty())
+ {
+ for (size_t i = 0; natkeyboard().keyboard_count() > i; ++i)
+ {
+ if (!natkeyboard().keyboard_is_keypad(i))
+ {
+ if (!keyboard_enabled && missing_enabled)
+ {
+ natkeyboard().enable_keyboard(i);
+ keyboard_enabled = true;
+ }
+ else if (!kbd_enable_set[i])
+ {
+ if (keyboard_enabled)
+ natkeyboard().disable_keyboard(i);
+ else
+ natkeyboard().enable_keyboard(i);
+ keyboard_enabled = true;
+ }
+ }
+ }
+ }
+ }
}
@@ -2358,6 +2420,14 @@ void ioport_manager::save_default_inputs(util::xml::data_node &parentnode)
void ioport_manager::save_game_inputs(util::xml::data_node &parentnode)
{
+ // save keyboard enable/disable state
+ for (size_t i = 0; natkeyboard().keyboard_count() > i; ++i)
+ {
+ util::xml::data_node *const kbdnode = parentnode.add_child("keyboard", nullptr);
+ kbdnode->set_attribute("tag", natkeyboard().keyboard_device(i).tag());
+ kbdnode->set_attribute_int("enabled", natkeyboard().keyboard_enabled(i));
+ }
+
// iterate over ports
for (auto &port : m_portlist)
for (ioport_field &field : port.second->fields())
@@ -3011,7 +3081,7 @@ ioport_configurer& ioport_configurer::field_alloc(ioport_type type, ioport_value
// append the field
if (type != IPT_UNKNOWN && type != IPT_UNUSED)
m_curport->m_active |= mask;
- m_curfield = &m_curport->m_fieldlist.append(*global_alloc(ioport_field(*m_curport, type, defval, mask, string_from_token(name))));
+ m_curfield = &m_curport->m_fieldlist.append(*new ioport_field(*m_curport, type, defval, mask, string_from_token(name)));
// reset the current setting
m_cursetting = nullptr;
@@ -3068,7 +3138,7 @@ ioport_configurer& ioport_configurer::setting_alloc(ioport_value value, const ch
if (m_curfield == nullptr)
throw emu_fatalerror("alloc_setting called with no active field (value=%X name=%s)\n", value, name);
- m_cursetting = global_alloc(ioport_setting(*m_curfield, value & m_curfield->mask(), string_from_token(name)));
+ m_cursetting = new ioport_setting(*m_curfield, value & m_curfield->mask(), string_from_token(name));
// append a new setting
m_curfield->m_settinglist.append(*m_cursetting);
return *this;