mirror of
https://github.com/holub/mame
synced 2025-06-07 05:13:46 +03:00
Merge pull request #5520 from npwoods/lua_seq_clean
Extracting input sequence cleaning logic into an seq_clean() function and exposing to LUA
This commit is contained in:
commit
4d77a8ea0d
@ -1464,14 +1464,12 @@ bool input_manager::seq_poll()
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// seq_name - generate the friendly name of a
|
||||
// sequence
|
||||
// seq_clean - clean the sequence, removing
|
||||
// any invalid bits
|
||||
//-------------------------------------------------
|
||||
|
||||
std::string input_manager::seq_name(const input_seq &seq) const
|
||||
input_seq input_manager::seq_clean(const input_seq &seq) const
|
||||
{
|
||||
// make a copy of our sequence, removing any invalid bits
|
||||
input_code clean_codes[sizeof(seq) / sizeof(input_code)];
|
||||
int clean_index = 0;
|
||||
for (int codenum = 0; seq[codenum] != input_seq::end_code; codenum++)
|
||||
{
|
||||
@ -1479,29 +1477,46 @@ std::string input_manager::seq_name(const input_seq &seq) const
|
||||
input_code code = seq[codenum];
|
||||
if (!code.internal() && code_name(code).empty())
|
||||
{
|
||||
while (clean_index > 0 && clean_codes[clean_index - 1].internal())
|
||||
while (clean_index > 0 && seq[clean_index - 1].internal())
|
||||
clean_index--;
|
||||
}
|
||||
else if (clean_index > 0 || !code.internal())
|
||||
clean_codes[clean_index++] = code;
|
||||
clean_index++;
|
||||
}
|
||||
|
||||
input_seq cleaned_seq;
|
||||
for (int i = 0; i < clean_index; i++)
|
||||
cleaned_seq += seq[i];
|
||||
return cleaned_seq;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// seq_name - generate the friendly name of a
|
||||
// sequence
|
||||
//-------------------------------------------------
|
||||
|
||||
std::string input_manager::seq_name(const input_seq &seq) const
|
||||
{
|
||||
// make a copy of our sequence, removing any invalid bits
|
||||
input_seq cleaned_seq = seq_clean(seq);
|
||||
|
||||
// special case: empty
|
||||
if (clean_index == 0)
|
||||
if (cleaned_seq[0] == input_seq::end_code)
|
||||
return std::string((seq.length() == 0) ? "None" : "n/a");
|
||||
|
||||
// start with an empty buffer
|
||||
std::string str;
|
||||
|
||||
// loop until we hit the end
|
||||
for (int codenum = 0; codenum < clean_index; codenum++)
|
||||
for (int codenum = 0; cleaned_seq[codenum] != input_seq::end_code; codenum++)
|
||||
{
|
||||
// append a space if not the first code
|
||||
if (codenum != 0)
|
||||
str.append(" ");
|
||||
|
||||
// handle OR/NOT codes here
|
||||
input_code code = clean_codes[codenum];
|
||||
input_code code = cleaned_seq[codenum];
|
||||
if (code == input_seq::or_code)
|
||||
str.append("or");
|
||||
else if (code == input_seq::not_code)
|
||||
|
@ -484,6 +484,7 @@ public:
|
||||
const input_seq &seq_poll_final() const { return m_poll_seq; }
|
||||
|
||||
// input sequence helpers
|
||||
input_seq seq_clean(const input_seq &seq) const;
|
||||
std::string seq_name(const input_seq &seq) const;
|
||||
std::string seq_to_tokens(const input_seq &seq) const;
|
||||
void seq_from_tokens(input_seq &seq, const char *_token);
|
||||
|
@ -2027,6 +2027,7 @@ void lua_engine::initialize()
|
||||
* input:seq_pressed(seq) - get pressed state for input_seq
|
||||
* input:seq_to_tokens(seq) - get KEYCODE_* string tokens for seq
|
||||
* input:seq_name(seq) - get seq friendly name
|
||||
* input:seq_clean(seq) - clean the seq and remove invalid elements
|
||||
* input:seq_poll_start(class, [opt] start_seq) - start polling for input_item_class passed as string
|
||||
* (switch/abs[olute]/rel[ative]/max[imum])
|
||||
* input:seq_poll() - poll once, returns true if input was fetched
|
||||
@ -2043,6 +2044,7 @@ void lua_engine::initialize()
|
||||
"seq_pressed", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_pressed(seq); },
|
||||
"seq_to_tokens", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_to_tokens(seq); },
|
||||
"seq_name", [](input_manager &input, sol::user<input_seq> seq) { return input.seq_name(seq); },
|
||||
"seq_clean", [](input_manager &input, sol::user<input_seq> seq) { input_seq cleaned_seq = input.seq_clean(seq); return sol::make_user(cleaned_seq); },
|
||||
"seq_poll_start", [](input_manager &input, const char *cls_string, sol::object seq) {
|
||||
input_item_class cls;
|
||||
if (!strcmp(cls_string, "switch"))
|
||||
|
Loading…
Reference in New Issue
Block a user