input: support for 2 buttons sets.

This commit is contained in:
sorgelig
2019-04-21 20:21:26 +08:00
parent 9740549327
commit 04518562cc
3 changed files with 104 additions and 62 deletions

133
input.cpp
View File

@@ -1142,6 +1142,7 @@ static int mapping_button;
static int mapping_dev;
static int mapping_type;
static int mapping_count;
static int mapping_clear;
static uint32_t tmp_axis[4];
static int tmp_axis_n = 0;
@@ -1153,6 +1154,7 @@ void start_map_setting(int cnt)
mapping_dev = -1;
mapping_type = (cnt<0) ? 3 : cnt ? 1 : 2;
mapping_count = cnt;
mapping_clear = 0;
tmp_axis_n = 0;
if (mapping_type <= 1 && is_menu_core()) mapping_button = -6;
@@ -1169,6 +1171,11 @@ int get_map_type()
return mapping_type;
}
int get_map_clear()
{
return mapping_clear;
}
static char *get_map_name(int dev, int def)
{
static char name[128];
@@ -1536,9 +1543,16 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
memset(input[dev].map, 0, sizeof(input[dev].map));
input[dev].has_map++;
}
//remove system controls from default map
for (uint i = 8; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++) input[dev].map[i] = 0;
else
{
//copy alternative directional buttons, remove system buttons
for (uint i = 0; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++)
{
if(i < 4) input[dev].map[i] = (input[dev].map[i] << 16) | (input[dev].map[i + 8] & 0xFFFF);
else if(i < 8) input[dev].map[i] = input[dev].map[i] << 16;
else input[dev].map[i] = 0;
}
}
input[dev].has_map++;
}
input[dev].has_map++;
@@ -1601,30 +1615,69 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
}
return;
}
else if ((mapping_dev < 0) || ((ev->code >= 256) ? mapping_type : !mapping_type))
else
{
if (mapping_dev < 0)
int clear = ev->code == KEY_F12 || ev->code == KEY_MENU || ev->code == KEY_HOMEPAGE;
if (mapping_dev < 0 && !clear)
{
mapping_dev = dev;
mapping_type = (ev->code >= 256) ? 1 : 0;
}
if (mapping_dev == dev && mapping_button < (is_menu_core() ? 17 : mapping_count))
mapping_clear = 0;
if (mapping_dev >= 0 && (mapping_dev == dev || clear) && mapping_button < (is_menu_core() ? 17 : mapping_count))
{
if (ev->value == 1)
{
if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map));
int found = 0;
for (int i = (is_menu_core() && mapping_button >= 8) ? 8 : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1;
if (!found)
if (is_menu_core())
{
input[dev].map[(mapping_button == 16 && is_menu_core()) ? 16 + mapping_type : mapping_button] = ev->code;
key_mapped = ev->code;
if (mapping_dev == dev)
{
if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map));
int found = 0;
for (int i = (mapping_button >= 8) ? 8 : 0; i < mapping_button; i++) if (input[dev].map[i] == ev->code) found = 1;
if (!found)
{
input[dev].map[(mapping_button == 16) ? 16 + mapping_type : mapping_button] = ev->code;
key_mapped = ev->code;
}
}
}
else
{
if ((mapping_type && (input[dev].mmap[17] == ev->code)) || clear)
{
memset(input[mapping_dev].map, 0, sizeof(input[mapping_dev].map));
mapping_button = 0;
mapping_clear = 1;
}
else
{
if (!mapping_button)
{
for (uint i = 0; i < sizeof(input[0].map) / sizeof(input[0].map[0]); i++)
{
input[dev].map[i] = mapping_type ? input[dev].map[i] << 16 : 0;
}
}
int found = 0;
for (int i = 0; i < mapping_button; i++)
{
if ((input[dev].map[i] & 0xFFFF) == ev->code) found = 1;
}
if (!found)
{
input[dev].map[mapping_button] = input[dev].map[mapping_button] | (ev->code & 0xFFFF);
key_mapped = ev->code;
}
}
}
}
else if(ev->value == 0 && key_mapped == ev->code)
else if(mapping_dev == dev && ev->value == 0 && key_mapped == ev->code)
{
mapping_button++;
key_mapped = 0;
@@ -1745,7 +1798,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
{
if (ev->value == 1)
{
if (idx && mapping_dev >= 0) input[mapping_dev].map[idx] = 0;
if (idx && mapping_dev >= 0) input[mapping_dev].map[idx] = is_menu_core() ? 0 : (input[mapping_dev].map[idx] & 0xFFFF0000);
mapping_button++;
if (mapping_button < 0 && (mapping_button&1)) mapping_button++;
}
@@ -1848,48 +1901,22 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int
return;
}
}
for (uint i = 0; i < BTN_NUM; i++)
{
if (ev->code == input[dev].map[i])
{
if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, 0, ev->value, i);
return;
}
}
}
else
if (input[dev].has_map >= 2)
{
if (input[dev].has_map == 2)
{
Info("This joystick is not defined\n Using default map");
input[dev].has_map = 1;
}
Info((input[dev].has_map == 3) ? "This joystick is not defined" : "This joystick is not defined\n Using default map");
input[dev].has_map = 1;
}
if (input[dev].has_map == 3)
for (uint i = 0; i < BTN_NUM; i++)
{
if (ev->code == (input[dev].map[i] & 0xFFFF) || ev->code == (input[dev].map[i] >> 16))
{
Info("This joystick is not defined");
input[dev].has_map = 1;
}
if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad
if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, origcode, ev->value, i);
for (uint i = 0; i < BTN_NUM; i++)
{
if (ev->code == input[dev].map[i])
{
if (i <= 3 && origcode == ev->code) origcode = 0; // prevent autofire for original dpad
if (ev->value <= 1) joy_digital(input[dev].num, 1 << i, origcode, ev->value, i);
return;
}
}
for (int i = 8; i <= 11; i++)
{
if (ev->code == input[dev].mmap[i])
{
if (origcode == ev->code) origcode = 0; // prevent autofire for original dpad
if (ev->value <= 1) joy_digital(input[dev].num, 1 << (i - 8), origcode, ev->value, i - 8);
return;
}
// support 2 simultaneous functions for 1 button if defined in 2 sets. No return.
}
}