diff options
-rw-r--r-- | src/emu/ioport.cpp | 40 | ||||
-rw-r--r-- | src/emu/natkeyboard.cpp | 1 | ||||
-rw-r--r-- | src/emu/natkeyboard.h | 5 | ||||
-rw-r--r-- | src/frontend/mame/ui/keyboard.cpp | 2 |
4 files changed, 44 insertions, 4 deletions
diff --git a/src/emu/ioport.cpp b/src/emu/ioport.cpp index 49fd548dad7..e9fd8d7b6d7 100644 --- a/src/emu/ioport.cpp +++ b/src/emu/ioport.cpp @@ -2125,20 +2125,58 @@ void ioport_manager::load_config(config_type cfg_type, util::xml::data_node cons // 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)) { - for (size_t i = 0; natkeyboard().keyboard_count() > i; ++i) + 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; } } } diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp index 05ce1f9d685..3a7451a023e 100644 --- a/src/emu/natkeyboard.cpp +++ b/src/emu/natkeyboard.cpp @@ -323,6 +323,7 @@ natural_keyboard::natural_keyboard(running_machine &machine) , m_in_use(false) , m_bufbegin(0) , m_bufend(0) + , m_current_code(nullptr) , m_fieldnum(0) , m_status_keydown(false) , m_last_cr(false) diff --git a/src/emu/natkeyboard.h b/src/emu/natkeyboard.h index e324205a088..c3454ee8dd4 100644 --- a/src/emu/natkeyboard.h +++ b/src/emu/natkeyboard.h @@ -53,8 +53,9 @@ public: void configure(ioport_queue_chars_delegate queue_chars, ioport_accept_char_delegate accept_char, ioport_charqueue_empty_delegate charqueue_empty); void set_in_use(bool usage); size_t keyboard_count() const { return m_keyboards.size(); } - device_t &keyboard_device(size_t n) { return m_keyboards[n].device; } - bool keyboard_enabled(size_t n) { return m_keyboards[n].enabled; } + device_t &keyboard_device(size_t n) const { return m_keyboards[n].device; } + bool keyboard_is_keypad(size_t n) const { return !m_keyboards[n].keyboard; } + bool keyboard_enabled(size_t n) const { return m_keyboards[n].enabled; } void enable_keyboard(size_t n) { set_keyboard_enabled(n, true); } void disable_keyboard(size_t n) { set_keyboard_enabled(n, false); } diff --git a/src/frontend/mame/ui/keyboard.cpp b/src/frontend/mame/ui/keyboard.cpp index 5d48f23cafe..3d58d28d2d9 100644 --- a/src/frontend/mame/ui/keyboard.cpp +++ b/src/frontend/mame/ui/keyboard.cpp @@ -50,7 +50,7 @@ void menu_keyboard_mode::populate(float &customtop, float &custombottom) bool const enabled(natkbd.keyboard_enabled(i)); item_append( util::string_format( - kbddev.owner() ? _("%1$s [root%2$s]") : _("[root%2$s"), + kbddev.owner() ? _("%1$s [root%2$s]") : _("[root%2$s]"), kbddev.type().fullname(), kbddev.tag()), enabled ? _("Enabled") : _("Disabled"), |