summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/ioport.cpp40
-rw-r--r--src/emu/natkeyboard.cpp1
-rw-r--r--src/emu/natkeyboard.h5
-rw-r--r--src/frontend/mame/ui/keyboard.cpp2
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"),