From 197c94ceacbc05a8fc9785592a6ccfbb7f585047 Mon Sep 17 00:00:00 2001 From: AJR Date: Fri, 10 Jan 2020 12:06:08 -0500 Subject: input_sdl: Process control characters so that the natural keyboard can see them (SDL normally strips these out) Don't strip linefeed characters (Ctrl-J) from natural keyboard input except when pasting strings --- src/emu/natkeyboard.cpp | 37 ++++++++++++++++++++----------------- src/emu/natkeyboard.h | 2 +- src/frontend/mame/ui/ui.cpp | 4 ++-- src/osd/modules/input/input_sdl.cpp | 13 +++++++++++++ 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() : ""); + 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() : ""); } // 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: -- cgit v1.2.3