summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/natkeyboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/natkeyboard.cpp')
-rw-r--r--src/emu/natkeyboard.cpp64
1 files changed, 35 insertions, 29 deletions
diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp
index 9defa2f0fa1..2c579b6b894 100644
--- a/src/emu/natkeyboard.cpp
+++ b/src/emu/natkeyboard.cpp
@@ -580,11 +580,14 @@ void natural_keyboard::build_codes(ioport_manager &manager)
{
if (field.type() == IPT_KEYBOARD)
{
- char32_t const code = field.keyboard_code(0);
- if ((code >= UCHAR_SHIFT_BEGIN) && (code <= UCHAR_SHIFT_END))
+ std::vector<char32_t> const codes = field.keyboard_codes(0);
+ for (char32_t code : codes)
{
- mask |= 1U << (code - UCHAR_SHIFT_BEGIN);
- shift[code - UCHAR_SHIFT_BEGIN] = &field;
+ if ((code >= UCHAR_SHIFT_BEGIN) && (code <= UCHAR_SHIFT_END))
+ {
+ mask |= 1U << (code - UCHAR_SHIFT_BEGIN);
+ shift[code - UCHAR_SHIFT_BEGIN] = &field;
+ }
}
}
}
@@ -603,35 +606,38 @@ void natural_keyboard::build_codes(ioport_manager &manager)
if (!(curshift & ~mask))
{
// fetch the code, ignoring 0 and shiters
- char32_t const code = field.keyboard_code(curshift);
- if (((code < UCHAR_SHIFT_BEGIN) || (code > UCHAR_SHIFT_END)) && (code != 0))
+ std::vector<char32_t> const codes = field.keyboard_codes(curshift);
+ for (char32_t code : codes)
{
- // prefer lowest shift state
- keycode_map::iterator const found(m_keycode_map.find(code));
- if ((m_keycode_map.end() == found) || (found->second.shift > curshift))
+ if (((code < UCHAR_SHIFT_BEGIN) || (code > UCHAR_SHIFT_END)) && (code != 0))
{
- keycode_map_entry newcode;
- std::fill(std::begin(newcode.field), std::end(newcode.field), nullptr);
- newcode.shift = curshift;
-
- unsigned fieldnum = 0;
- for (unsigned i = 0, bits = curshift; (i < SHIFT_COUNT) && bits; ++i, bits >>= 1)
- {
- if (BIT(bits, 0))
- newcode.field[fieldnum++] = shift[i];
- }
-
- assert(fieldnum < ARRAY_LENGTH(newcode.field));
- newcode.field[fieldnum] = &field;
- if (m_keycode_map.end() == found)
- m_keycode_map.emplace(code, newcode);
- else
- found->second = newcode;
-
- if (LOG_NATURAL_KEYBOARD)
+ // prefer lowest shift state
+ keycode_map::iterator const found(m_keycode_map.find(code));
+ if ((m_keycode_map.end() == found) || (found->second.shift > curshift))
{
- machine().logerror("natural_keyboard: code=%u (%s) port=%p field.name='%s'\n",
+ keycode_map_entry newcode;
+ std::fill(std::begin(newcode.field), std::end(newcode.field), nullptr);
+ newcode.shift = curshift;
+
+ unsigned fieldnum = 0;
+ for (unsigned i = 0, bits = curshift; (i < SHIFT_COUNT) && bits; ++i, bits >>= 1)
+ {
+ if (BIT(bits, 0))
+ newcode.field[fieldnum++] = shift[i];
+ }
+
+ assert(fieldnum < ARRAY_LENGTH(newcode.field));
+ newcode.field[fieldnum] = &field;
+ if (m_keycode_map.end() == found)
+ m_keycode_map.emplace(code, newcode);
+ else
+ found->second = newcode;
+
+ if (LOG_NATURAL_KEYBOARD)
+ {
+ machine().logerror("natural_keyboard: code=%u (%s) port=%p field.name='%s'\n",
code, unicode_to_string(code), (void *)&port, field.name());
+ }
}
}
}