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
This commit is contained in:
AJR 2020-01-10 12:06:08 -05:00
parent 2b4c203d88
commit 197c94ceac
4 changed files with 36 additions and 20 deletions

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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))
{

View File

@ -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: