mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
Cleaned natural keyboard implementation (no credits)
This commit is contained in:
parent
fbbf48d668
commit
61e28b93b7
@ -1910,6 +1910,70 @@ static unicode_char get_keyboard_code(const input_field_config *field, int i)
|
|||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
MISCELLANEOUS
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
find_charinfo - looks up information about a
|
||||||
|
particular character
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
static const char_info *find_charinfo(unicode_char target_char)
|
||||||
|
{
|
||||||
|
int low = 0;
|
||||||
|
int high = ARRAY_LENGTH(charinfo);
|
||||||
|
int i;
|
||||||
|
unicode_char ch;
|
||||||
|
|
||||||
|
/* perform a simple binary search to find the proper alternate */
|
||||||
|
while(high > low)
|
||||||
|
{
|
||||||
|
i = (high + low) / 2;
|
||||||
|
ch = charinfo[i].ch;
|
||||||
|
if (ch < target_char)
|
||||||
|
low = i + 1;
|
||||||
|
else if (ch > target_char)
|
||||||
|
high = i;
|
||||||
|
else
|
||||||
|
return &charinfo[i];
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
inputx_key_name - returns the name of a
|
||||||
|
specific key
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
static const char *inputx_key_name(unicode_char ch)
|
||||||
|
{
|
||||||
|
static char buf[UTF8_CHAR_MAX + 1];
|
||||||
|
const char_info *ci;
|
||||||
|
const char *result;
|
||||||
|
int pos;
|
||||||
|
|
||||||
|
ci = find_charinfo(ch);
|
||||||
|
result = ci ? ci->name : NULL;
|
||||||
|
|
||||||
|
if (ci && ci->name)
|
||||||
|
{
|
||||||
|
result = ci->name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((ch > 0x7F) || isprint(ch))
|
||||||
|
{
|
||||||
|
pos = utf8_from_uchar(buf, ARRAY_LENGTH(buf), ch);
|
||||||
|
buf[pos] = '\0';
|
||||||
|
result = buf;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = "???";
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
get_keyboard_key_name - builds the name of
|
get_keyboard_key_name - builds the name of
|
||||||
a key based on natural keyboard characters
|
a key based on natural keyboard characters
|
||||||
@ -4655,39 +4719,6 @@ int input_machine_has_keyboard(running_machine *machine)
|
|||||||
return have_keyboard;
|
return have_keyboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
|
||||||
MISCELLANEOUS
|
|
||||||
***************************************************************************/
|
|
||||||
|
|
||||||
/*-------------------------------------------------
|
|
||||||
find_charinfo - looks up information about a
|
|
||||||
particular character
|
|
||||||
-------------------------------------------------*/
|
|
||||||
|
|
||||||
static const char_info *find_charinfo(unicode_char target_char)
|
|
||||||
{
|
|
||||||
int low = 0;
|
|
||||||
int high = ARRAY_LENGTH(charinfo);
|
|
||||||
int i;
|
|
||||||
unicode_char ch;
|
|
||||||
|
|
||||||
/* perform a simple binary search to find the proper alternate */
|
|
||||||
while(high > low)
|
|
||||||
{
|
|
||||||
i = (high + low) / 2;
|
|
||||||
ch = charinfo[i].ch;
|
|
||||||
if (ch < target_char)
|
|
||||||
low = i + 1;
|
|
||||||
else if (ch > target_char)
|
|
||||||
high = i;
|
|
||||||
else
|
|
||||||
return &charinfo[i];
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
CODE ASSEMBLING
|
CODE ASSEMBLING
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -4977,15 +5008,6 @@ static int can_post_key_alternate(unicode_char ch)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int inputx_can_post_key(running_machine *machine, unicode_char ch)
|
|
||||||
{
|
|
||||||
return inputx_can_post(machine) && (can_post_key_directly(ch) || can_post_key_alternate(ch));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static attotime choose_delay(unicode_char ch)
|
static attotime choose_delay(unicode_char ch)
|
||||||
{
|
{
|
||||||
attoseconds_t delay = 0;
|
attoseconds_t delay = 0;
|
||||||
@ -5043,7 +5065,7 @@ static int buffer_full(running_machine *machine)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postn_rate(running_machine *machine, const unicode_char *text, size_t text_len, attotime rate)
|
static void inputx_postn_rate(running_machine *machine, const unicode_char *text, size_t text_len, attotime rate)
|
||||||
{
|
{
|
||||||
int last_cr = 0;
|
int last_cr = 0;
|
||||||
unicode_char ch;
|
unicode_char ch;
|
||||||
@ -5144,43 +5166,6 @@ static TIMER_CALLBACK(inputx_timerproc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
|
||||||
inputx_key_name - returns the name of a
|
|
||||||
specific key
|
|
||||||
-------------------------------------------------*/
|
|
||||||
|
|
||||||
const char *inputx_key_name(unicode_char ch)
|
|
||||||
{
|
|
||||||
static char buf[UTF8_CHAR_MAX + 1];
|
|
||||||
const char_info *ci;
|
|
||||||
const char *result;
|
|
||||||
int pos;
|
|
||||||
|
|
||||||
ci = find_charinfo(ch);
|
|
||||||
result = ci ? ci->name : NULL;
|
|
||||||
|
|
||||||
if (ci && ci->name)
|
|
||||||
{
|
|
||||||
result = ci->name;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((ch > 0x7F) || isprint(ch))
|
|
||||||
{
|
|
||||||
pos = utf8_from_uchar(buf, ARRAY_LENGTH(buf), ch);
|
|
||||||
buf[pos] = '\0';
|
|
||||||
result = buf;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
result = "???";
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
int inputx_is_posting(running_machine *machine)
|
int inputx_is_posting(running_machine *machine)
|
||||||
{
|
{
|
||||||
const key_buffer *keybuf;
|
const key_buffer *keybuf;
|
||||||
@ -5188,15 +5173,14 @@ int inputx_is_posting(running_machine *machine)
|
|||||||
return (keybuf->begin_pos != keybuf->end_pos) || (charqueue_empty && !charqueue_empty());
|
return (keybuf->begin_pos != keybuf->end_pos) || (charqueue_empty && !charqueue_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Coded input
|
Coded input
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
static void inputx_postc_rate(running_machine *machine, unicode_char ch, attotime rate);
|
||||||
|
|
||||||
void inputx_postn_coded_rate(running_machine *machine, const char *text, size_t text_len, attotime rate)
|
static void inputx_postn_coded_rate(running_machine *machine, const char *text, size_t text_len, attotime rate)
|
||||||
{
|
{
|
||||||
size_t i, j, key_len, increment;
|
size_t i, j, key_len, increment;
|
||||||
unicode_char ch;
|
unicode_char ch;
|
||||||
@ -5273,124 +5257,17 @@ void inputx_postn_coded_rate(running_machine *machine, const char *text, size_t
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
void inputx_postn(running_machine *machine, const unicode_char *text, size_t text_len)
|
static void inputx_postc_rate(running_machine *machine, unicode_char ch, attotime rate)
|
||||||
{
|
|
||||||
inputx_postn_rate(machine, text, text_len, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_rate(running_machine *machine, const unicode_char *text, attotime rate)
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
while(text[len])
|
|
||||||
len++;
|
|
||||||
inputx_postn_rate(machine, text, len, rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post(running_machine *machine, const unicode_char *text)
|
|
||||||
{
|
|
||||||
inputx_post_rate(machine, text, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postc_rate(running_machine *machine, unicode_char ch, attotime rate)
|
|
||||||
{
|
{
|
||||||
inputx_postn_rate(machine, &ch, 1, rate);
|
inputx_postn_rate(machine, &ch, 1, rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postc(running_machine *machine, unicode_char ch)
|
void inputx_postc(running_machine *machine, unicode_char ch)
|
||||||
{
|
{
|
||||||
inputx_postc_rate(machine, ch, attotime_make(0, 0));
|
inputx_postc_rate(machine, ch, attotime_make(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void inputx_postn_utf8_rate(running_machine *machine, const char *text, size_t text_len, attotime rate)
|
||||||
|
|
||||||
void inputx_postn_utf16_rate(running_machine *machine, const utf16_char *text, size_t text_len, attotime rate)
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
unicode_char c;
|
|
||||||
utf16_char w1, w2;
|
|
||||||
unicode_char buf[256];
|
|
||||||
|
|
||||||
while(text_len > 0)
|
|
||||||
{
|
|
||||||
if (len == ARRAY_LENGTH(buf))
|
|
||||||
{
|
|
||||||
inputx_postn(machine, buf, len);
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
w1 = *(text++);
|
|
||||||
text_len--;
|
|
||||||
|
|
||||||
if ((w1 >= 0xd800) && (w1 <= 0xdfff))
|
|
||||||
{
|
|
||||||
if (w1 <= 0xDBFF)
|
|
||||||
{
|
|
||||||
w2 = 0;
|
|
||||||
if (text_len > 0)
|
|
||||||
{
|
|
||||||
w2 = *(text++);
|
|
||||||
text_len--;
|
|
||||||
}
|
|
||||||
if ((w2 >= 0xdc00) && (w2 <= 0xdfff))
|
|
||||||
{
|
|
||||||
c = w1 & 0x03ff;
|
|
||||||
c <<= 10;
|
|
||||||
c |= w2 & 0x03ff;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c = INVALID_CHAR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c = INVALID_CHAR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
c = w1;
|
|
||||||
}
|
|
||||||
buf[len++] = c;
|
|
||||||
}
|
|
||||||
inputx_postn_rate(machine, buf, len, rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postn_utf16(running_machine *machine, const utf16_char *text, size_t text_len)
|
|
||||||
{
|
|
||||||
inputx_postn_utf16_rate(machine, text, text_len, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_utf16_rate(running_machine *machine, const utf16_char *text, attotime rate)
|
|
||||||
{
|
|
||||||
size_t len = 0;
|
|
||||||
while(text[len])
|
|
||||||
len++;
|
|
||||||
inputx_postn_utf16_rate(machine, text, len, rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_utf16(running_machine *machine, const utf16_char *text)
|
|
||||||
{
|
|
||||||
inputx_post_utf16_rate(machine, text, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postn_utf8_rate(running_machine *machine, const char *text, size_t text_len, attotime rate)
|
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
unicode_char buf[256];
|
unicode_char buf[256];
|
||||||
@ -5401,7 +5278,7 @@ void inputx_postn_utf8_rate(running_machine *machine, const char *text, size_t t
|
|||||||
{
|
{
|
||||||
if (len == ARRAY_LENGTH(buf))
|
if (len == ARRAY_LENGTH(buf))
|
||||||
{
|
{
|
||||||
inputx_postn(machine, buf, len);
|
inputx_postn_rate(machine, buf, len, attotime_make(0, 0));
|
||||||
len = 0;
|
len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5418,49 +5295,15 @@ void inputx_postn_utf8_rate(running_machine *machine, const char *text, size_t t
|
|||||||
inputx_postn_rate(machine, buf, len, rate);
|
inputx_postn_rate(machine, buf, len, rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void inputx_post_utf8(running_machine *machine, const char *text)
|
||||||
|
|
||||||
void inputx_postn_utf8(running_machine *machine, const char *text, size_t text_len)
|
|
||||||
{
|
{
|
||||||
inputx_postn_utf8_rate(machine, text, text_len, attotime_make(0, 0));
|
inputx_postn_utf8_rate(machine, text, strlen(text), attotime_make(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_utf8_rate(running_machine *machine, const char *text, attotime rate)
|
void inputx_post_utf8_rate(running_machine *machine, const char *text, attotime rate)
|
||||||
{
|
{
|
||||||
inputx_postn_utf8_rate(machine, text, strlen(text), rate);
|
inputx_postn_utf8_rate(machine, text, strlen(text), rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_utf8(running_machine *machine, const char *text)
|
|
||||||
{
|
|
||||||
inputx_post_utf8_rate(machine, text, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_coded(running_machine *machine, const char *text)
|
|
||||||
{
|
|
||||||
inputx_postn_coded(machine, text, strlen(text));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_post_coded_rate(running_machine *machine, const char *text, attotime rate)
|
|
||||||
{
|
|
||||||
inputx_postn_coded_rate(machine, text, strlen(text), rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void inputx_postn_coded(running_machine *machine, const char *text, size_t text_len)
|
|
||||||
{
|
|
||||||
inputx_postn_coded_rate(machine, text, text_len, attotime_make(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
@ -5650,7 +5493,7 @@ int input_category_active(running_machine *machine, int category)
|
|||||||
|
|
||||||
static void execute_input(running_machine *machine, int ref, int params, const char *param[])
|
static void execute_input(running_machine *machine, int ref, int params, const char *param[])
|
||||||
{
|
{
|
||||||
inputx_post_coded(machine, param[0]);
|
inputx_postn_coded_rate(machine, param[0], strlen(param[0]), attotime_make(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1172,29 +1172,12 @@ int validate_natural_keyboard_statics(void);
|
|||||||
|
|
||||||
/* these can be called from FEs */
|
/* these can be called from FEs */
|
||||||
int inputx_can_post(running_machine *machine);
|
int inputx_can_post(running_machine *machine);
|
||||||
int inputx_can_post_key(running_machine *machine, unicode_char ch);
|
|
||||||
int inputx_is_posting(running_machine *machine);
|
|
||||||
const char *inputx_key_name(unicode_char ch);
|
|
||||||
|
|
||||||
/* various posting functions; can be called from FEs */
|
/* various posting functions; can be called from FEs */
|
||||||
void inputx_post(running_machine *machine, const unicode_char *text);
|
|
||||||
void inputx_post_rate(running_machine *machine, const unicode_char *text, attotime rate);
|
|
||||||
void inputx_postc(running_machine *machine, unicode_char ch);
|
void inputx_postc(running_machine *machine, unicode_char ch);
|
||||||
void inputx_postc_rate(running_machine *machine, unicode_char ch, attotime rate);
|
|
||||||
void inputx_postn(running_machine *machine, const unicode_char *text, size_t text_len);
|
|
||||||
void inputx_postn_rate(running_machine *machine, const unicode_char *text, size_t text_len, attotime rate);
|
|
||||||
void inputx_post_utf16(running_machine *machine, const utf16_char *text);
|
|
||||||
void inputx_post_utf16_rate(running_machine *machine, const utf16_char *text, attotime rate);
|
|
||||||
void inputx_postn_utf16(running_machine *machine, const utf16_char *text, size_t text_len);
|
|
||||||
void inputx_postn_utf16_rate(running_machine *machine, const utf16_char *text, size_t text_len, attotime rate);
|
|
||||||
void inputx_post_utf8(running_machine *machine, const char *text);
|
void inputx_post_utf8(running_machine *machine, const char *text);
|
||||||
void inputx_post_utf8_rate(running_machine *machine, const char *text, attotime rate);
|
void inputx_post_utf8_rate(running_machine *machine, const char *text, attotime rate);
|
||||||
void inputx_postn_utf8(running_machine *machine, const char *text, size_t text_len);
|
int inputx_is_posting(running_machine *machine);
|
||||||
void inputx_postn_utf8_rate(running_machine *machine, const char *text, size_t text_len, attotime rate);
|
|
||||||
void inputx_post_coded(running_machine *machine, const char *text);
|
|
||||||
void inputx_post_coded_rate(running_machine *machine, const char *text, attotime rate);
|
|
||||||
void inputx_postn_coded(running_machine *machine, const char *text, size_t text_len);
|
|
||||||
void inputx_postn_coded_rate(running_machine *machine, const char *text, size_t text_len, attotime rate);
|
|
||||||
|
|
||||||
/* miscellaneous functions */
|
/* miscellaneous functions */
|
||||||
int input_classify_port(const input_field_config *field);
|
int input_classify_port(const input_field_config *field);
|
||||||
|
Loading…
Reference in New Issue
Block a user