summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/natkeyboard.cpp37
-rw-r--r--src/emu/natkeyboard.h2
-rw-r--r--src/frontend/mame/ui/ui.cpp4
-rw-r--r--src/osd/modules/input/input_sdl.cpp13
4 files changed, 36 insertions, 20 deletions
diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp
index 7d154787c0c..5f6ede1edf3 100644
--- a/src/emu/natkeyboard.cpp
+++ b/src/emu/natkeyboard.cpp
@@ -17,7 +17,7 @@
// DEBUGGING
//**************************************************************************
-#define LOG_NATURAL_KEYBOARD 0
+#define LOG_NATURAL_KEYBOARD 1
@@ -385,29 +385,32 @@ void natural_keyboard::set_in_use(bool usage)
//-------------------------------------------------
-// post - post a single character
+// post_char - post a single character
//-------------------------------------------------
-void natural_keyboard::post(char32_t ch)
+void natural_keyboard::post_char(char32_t ch, bool normalize_crlf)
{
- // ignore any \n that are preceded by \r
- if (m_last_cr && ch == '\n')
+ if (normalize_crlf)
{
- m_last_cr = false;
- return;
- }
+ // ignore any \n that are preceded by \r
+ if (m_last_cr && ch == '\n')
+ {
+ m_last_cr = false;
+ return;
+ }
- // change all eolns to '\r'
- if (ch == '\n')
- ch = '\r';
- else
- m_last_cr = (ch == '\r');
+ // change all eolns to '\r'
+ if (ch == '\n')
+ ch = '\r';
+ else
+ m_last_cr = (ch == '\r');
+ }
// logging
if (LOG_NATURAL_KEYBOARD)
{
const keycode_map_entry *code = find_code(ch);
- machine().logerror("natural_keyboard::post(): code=%i (%s) field.name='%s'\n", int(ch), unicode_to_string(ch).c_str(), (code != nullptr && code->field[0] != nullptr) ? code->field[0]->name() : "<null>");
+ machine().logerror("natural_keyboard::post_char(): code=%i (%s) field.name='%s'\n", int(ch), unicode_to_string(ch).c_str(), (code != nullptr && code->field[0] != nullptr) ? code->field[0]->name() : "<null>");
}
// can we post this key in the queue directly?
@@ -447,7 +450,7 @@ void natural_keyboard::post(const char32_t *text, size_t length, const attotime
while (length > 0 && !full())
{
// fetch next character
- post(*text++);
+ post_char(*text++, true);
length--;
}
}
@@ -479,7 +482,7 @@ void natural_keyboard::post_utf8(const char *text, size_t length, const attotime
}
// append to the buffer
- post(uc);
+ post_char(uc, true);
text += count;
length -= count;
}
@@ -565,7 +568,7 @@ void natural_keyboard::post_coded(const char *text, size_t length, const attotim
// if we got a code, post it
if (ch != 0)
- post(ch);
+ post_char(ch);
curpos += increment;
}
}
diff --git a/src/emu/natkeyboard.h b/src/emu/natkeyboard.h
index 41b33ace105..23abd9ac437 100644
--- a/src/emu/natkeyboard.h
+++ b/src/emu/natkeyboard.h
@@ -50,7 +50,7 @@ public:
void set_in_use(bool usage);
// posting
- void post(char32_t ch);
+ void post_char(char32_t ch, bool normalize_crlf = false);
void post(const char32_t *text, size_t length = 0, const attotime &rate = attotime::zero);
void post_utf8(const char *text, size_t length = 0, const attotime &rate = attotime::zero);
void post_utf8(const std::string &text, const attotime &rate = attotime::zero);
diff --git a/src/frontend/mame/ui/ui.cpp b/src/frontend/mame/ui/ui.cpp
index baca4dd1bc7..b5b37a3450f 100644
--- a/src/frontend/mame/ui/ui.cpp
+++ b/src/frontend/mame/ui/ui.cpp
@@ -843,7 +843,7 @@ void mame_ui_manager::process_natural_keyboard()
{
// if this was a UI_EVENT_CHAR event, post it
if (event.event_type == ui_event::IME_CHAR)
- machine().ioport().natkeyboard().post(event.ch);
+ machine().ioport().natkeyboard().post_char(event.ch);
}
// process natural keyboard keys that don't get UI_EVENT_CHARs
@@ -866,7 +866,7 @@ void mame_ui_manager::process_natural_keyboard()
*key_down_ptr |= key_down_mask;
// post the key
- machine().ioport().natkeyboard().post(UCHAR_MAMEKEY_BEGIN + code.item_id());
+ machine().ioport().natkeyboard().post_char(UCHAR_MAMEKEY_BEGIN + code.item_id());
}
else if (!pressed && (*key_down_ptr & key_down_mask))
{
diff --git a/src/osd/modules/input/input_sdl.cpp b/src/osd/modules/input/input_sdl.cpp
index 596895e9e39..4d09441b24e 100644
--- a/src/osd/modules/input/input_sdl.cpp
+++ b/src/osd/modules/input/input_sdl.cpp
@@ -386,6 +386,19 @@ public:
keyboard.state[sdlevent.key.keysym.scancode] = 0x80;
if (sdlevent.key.keysym.sym < 0x20)
machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), sdlevent.key.keysym.sym);
+ else if (keyboard.state[SDL_SCANCODE_LCTRL] == 0x80 || keyboard.state[SDL_SCANCODE_RCTRL] == 0x80)
+ {
+ // SDL filters out control characters for text input, so they are decoded here
+ if (sdlevent.key.keysym.sym >= 0x40 && sdlevent.key.keysym.sym < 0x7f)
+ machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), sdlevent.key.keysym.sym & 0x1f);
+ else if (keyboard.state[SDL_SCANCODE_LSHIFT] == 0x80 || keyboard.state[SDL_SCANCODE_RSHIFT] == 0x80)
+ {
+ if (sdlevent.key.keysym.sym == SDLK_6) // Ctrl-^ (RS)
+ machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), 0x1e);
+ else if (sdlevent.key.keysym.sym == SDLK_MINUS) // Ctrl-_ (US)
+ machine().ui_input().push_char_event(osd_common_t::s_window_list.front()->target(), 0x1f);
+ }
+ }
break;
case SDL_KEYUP: