diff options
Diffstat (limited to 'src/emu/ioport.cpp')
-rw-r--r-- | src/emu/ioport.cpp | 88 |
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; |