Extended btn_map to a 2D array to allow shifting

This commit is contained in:
Ingo Ruhnke 2010-05-19 18:29:18 +02:00
parent fe81b31ee1
commit 715d23f9bd
4 changed files with 106 additions and 98 deletions

View file

@ -367,7 +367,8 @@ CommandLineOptions::parse_args(int argc, char** argv)
case OPTION_UI_CLEAR:
std::fill_n(opts.uinput_config.axis_map, static_cast<int>(XBOX_AXIS_MAX), AxisEvent::invalid());
std::fill_n(opts.uinput_config.btn_map, static_cast<int>(XBOX_BTN_MAX), ButtonEvent::invalid());
for(int i = 0; i < XBOX_BTN_MAX; ++i)
std::fill_n(opts.uinput_config.btn_map[i], static_cast<int>(XBOX_BTN_MAX), ButtonEvent::invalid());
break;
case OPTION_UI_AXISMAP:
@ -375,7 +376,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
break;
case OPTION_UI_BUTTONMAP:
arg2apply(opt.argument, boost::bind(&set_ui_button_map, opts.uinput_config.btn_map, _1));
arg2apply(opt.argument, boost::bind(&set_ui_button_map, opts.uinput_config.btn_map[XBOX_BTN_UNKNOWN], _1));
break;
case OPTION_ID:

View file

@ -36,24 +36,27 @@
bool
uInput::need_keyboard_device()
{
for(int i = 0; i < XBOX_BTN_MAX; ++i)
for(int j = 0; j < XBOX_BTN_MAX; ++j)
{
for(int i = 0; i < XBOX_BTN_MAX; ++i)
{
if (cfg.btn_map[i].type == EV_KEY &&
is_keyboard_button(cfg.btn_map[i].code))
{
return true;
}
if (cfg.btn_map[j][i].type == EV_KEY &&
is_keyboard_button(cfg.btn_map[j][i].code))
{
return true;
}
}
}
for(int i = 0; i < XBOX_AXIS_MAX; ++i)
{
if (cfg.axis_map[i].type == EV_KEY &&
(is_keyboard_button(cfg.axis_map[i].code) ||
is_keyboard_button(cfg.axis_map[i].key.secondary_code)))
{
if (cfg.axis_map[i].type == EV_KEY &&
(is_keyboard_button(cfg.axis_map[i].code) ||
is_keyboard_button(cfg.axis_map[i].key.secondary_code)))
{
return true;
}
return true;
}
}
return false;
}
@ -61,32 +64,35 @@ uInput::need_keyboard_device()
bool
uInput::need_mouse_device()
{
for(int i = 0; i < XBOX_BTN_MAX; ++i)
for(int j = 0; j < XBOX_BTN_MAX; ++j)
{
for(int i = 0; i < XBOX_BTN_MAX; ++i)
{
if (cfg.btn_map[i].type == EV_KEY &&
is_mouse_button(cfg.btn_map[i].code))
{
return true;
}
else if (cfg.btn_map[i].type == EV_REL)
{
return true;
}
if (cfg.btn_map[j][i].type == EV_KEY &&
is_mouse_button(cfg.btn_map[j][i].code))
{
return true;
}
else if (cfg.btn_map[j][i].type == EV_REL)
{
return true;
}
}
}
for(int i = 0; i < XBOX_AXIS_MAX; ++i)
{
if (cfg.axis_map[i].type == EV_KEY &&
(is_mouse_button(cfg.axis_map[i].code) ||
is_mouse_button(cfg.axis_map[i].key.secondary_code)))
{
if (cfg.axis_map[i].type == EV_KEY &&
(is_mouse_button(cfg.axis_map[i].code) ||
is_mouse_button(cfg.axis_map[i].key.secondary_code)))
{
return true;
}
else if (cfg.axis_map[i].type == EV_REL)
{
return true;
}
return true;
}
else if (cfg.axis_map[i].type == EV_REL)
{
return true;
}
}
return false;
}
@ -125,9 +131,12 @@ uInput::uInput(const XPadDevice& dev, uInputCfg config_) :
create_uinput_device(0);
}
for(int i = 0; i < XBOX_BTN_MAX; ++i)
for(int j = 0; j < XBOX_BTN_MAX; ++j)
{
cfg.btn_map[i].device_id = create_uinput_device(cfg.btn_map[i]);
for(int i = 0; i < XBOX_BTN_MAX; ++i)
{
cfg.btn_map[j][i].device_id = create_uinput_device(cfg.btn_map[j][i]);
}
}
for(int i = 0; i < XBOX_AXIS_MAX; ++i)
@ -648,16 +657,9 @@ uInput::update(int msec_delta)
if (i->time >= i->next_time)
{
if (0)
std::cout << i->button
<< " " << cfg.btn_map[i->button].type
<< " " << cfg.btn_map[i->button].code
<< " " << cfg.btn_map[i->button].rel.value
<< " " << cfg.btn_map[i->button].rel.repeat << std::endl;
get_mouse_uinput()->send(EV_REL, cfg.btn_map[i->button].code,
static_cast<int>(cfg.btn_map[i->button].rel.value * button_state[i->button]));
i->next_time += cfg.btn_map[i->button].rel.repeat;
get_mouse_uinput()->send(EV_REL, cfg.btn_map[XBOX_BTN_UNKNOWN][i->button].code,
static_cast<int>(cfg.btn_map[XBOX_BTN_UNKNOWN][i->button].rel.value * button_state[i->button]));
i->next_time += cfg.btn_map[XBOX_BTN_UNKNOWN][i->button].rel.repeat;
needs_syncronization = true;
}
}
@ -678,7 +680,7 @@ uInput::send_button(int code, bool value)
{
button_state[code] = value;
const ButtonEvent& event = cfg.btn_map[code];
const ButtonEvent& event = cfg.btn_map[XBOX_BTN_UNKNOWN][code];
send_key(event.device_id, event.code, value);
}
@ -801,7 +803,7 @@ uInput::add_axis(int code, int min, int max)
void
uInput::add_button(int code)
{
const ButtonEvent& event = cfg.btn_map[code];
const ButtonEvent& event = cfg.btn_map[XBOX_BTN_UNKNOWN][code];
if (event.type == EV_KEY)
{

View file

@ -29,41 +29,44 @@ uInputCfg::uInputCfg() :
force_feedback(false),
extra_devices(true)
{
std::fill_n(btn_map, static_cast<int>(XBOX_BTN_MAX), ButtonEvent::invalid());
for(int i = 0; i < XBOX_BTN_MAX; ++i)
std::fill_n(btn_map[i], static_cast<int>(XBOX_BTN_MAX), ButtonEvent::invalid());
std::fill_n(axis_map, static_cast<int>(XBOX_AXIS_MAX), AxisEvent::invalid());
ButtonEvent* bmap = btn_map[XBOX_BTN_UNKNOWN]; // FIXME: little hacky to abuse XBOX_BTN_UNKNOWN
// Button Mapping
btn_map[XBOX_BTN_START] = ButtonEvent::create(EV_KEY, BTN_START);
btn_map[XBOX_BTN_GUIDE] = ButtonEvent::create(EV_KEY, BTN_MODE);
btn_map[XBOX_BTN_BACK] = ButtonEvent::create(EV_KEY, BTN_SELECT);
bmap[XBOX_BTN_START] = ButtonEvent::create(EV_KEY, BTN_START);
bmap[XBOX_BTN_GUIDE] = ButtonEvent::create(EV_KEY, BTN_MODE);
bmap[XBOX_BTN_BACK] = ButtonEvent::create(EV_KEY, BTN_SELECT);
btn_map[XBOX_BTN_A] = ButtonEvent::create(EV_KEY, BTN_A);
btn_map[XBOX_BTN_B] = ButtonEvent::create(EV_KEY, BTN_B);
btn_map[XBOX_BTN_X] = ButtonEvent::create(EV_KEY, BTN_X);
btn_map[XBOX_BTN_Y] = ButtonEvent::create(EV_KEY, BTN_Y);
bmap[XBOX_BTN_A] = ButtonEvent::create(EV_KEY, BTN_A);
bmap[XBOX_BTN_B] = ButtonEvent::create(EV_KEY, BTN_B);
bmap[XBOX_BTN_X] = ButtonEvent::create(EV_KEY, BTN_X);
bmap[XBOX_BTN_Y] = ButtonEvent::create(EV_KEY, BTN_Y);
btn_map[XBOX_BTN_GREEN] = ButtonEvent::create(EV_KEY, BTN_0);
btn_map[XBOX_BTN_RED] = ButtonEvent::create(EV_KEY, BTN_1);
btn_map[XBOX_BTN_YELLOW] = ButtonEvent::create(EV_KEY, BTN_2);
btn_map[XBOX_BTN_BLUE] = ButtonEvent::create(EV_KEY, BTN_3);
btn_map[XBOX_BTN_ORANGE] = ButtonEvent::create(EV_KEY, BTN_4);
bmap[XBOX_BTN_GREEN] = ButtonEvent::create(EV_KEY, BTN_0);
bmap[XBOX_BTN_RED] = ButtonEvent::create(EV_KEY, BTN_1);
bmap[XBOX_BTN_YELLOW] = ButtonEvent::create(EV_KEY, BTN_2);
bmap[XBOX_BTN_BLUE] = ButtonEvent::create(EV_KEY, BTN_3);
bmap[XBOX_BTN_ORANGE] = ButtonEvent::create(EV_KEY, BTN_4);
btn_map[XBOX_BTN_WHITE] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_BLACK] = ButtonEvent::create(EV_KEY, BTN_TR);
bmap[XBOX_BTN_WHITE] = ButtonEvent::create(EV_KEY, BTN_TL);
bmap[XBOX_BTN_BLACK] = ButtonEvent::create(EV_KEY, BTN_TR);
btn_map[XBOX_BTN_LB] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_RB] = ButtonEvent::create(EV_KEY, BTN_TR);
bmap[XBOX_BTN_LB] = ButtonEvent::create(EV_KEY, BTN_TL);
bmap[XBOX_BTN_RB] = ButtonEvent::create(EV_KEY, BTN_TR);
btn_map[XBOX_BTN_LT] = ButtonEvent::create(EV_KEY, BTN_TL2);
btn_map[XBOX_BTN_RT] = ButtonEvent::create(EV_KEY, BTN_TR2);
bmap[XBOX_BTN_LT] = ButtonEvent::create(EV_KEY, BTN_TL2);
bmap[XBOX_BTN_RT] = ButtonEvent::create(EV_KEY, BTN_TR2);
btn_map[XBOX_BTN_THUMB_L] = ButtonEvent::create(EV_KEY, BTN_THUMBL);
btn_map[XBOX_BTN_THUMB_R] = ButtonEvent::create(EV_KEY, BTN_THUMBR);
bmap[XBOX_BTN_THUMB_L] = ButtonEvent::create(EV_KEY, BTN_THUMBL);
bmap[XBOX_BTN_THUMB_R] = ButtonEvent::create(EV_KEY, BTN_THUMBR);
btn_map[XBOX_DPAD_UP] = ButtonEvent::create(EV_KEY, BTN_BASE);
btn_map[XBOX_DPAD_DOWN] = ButtonEvent::create(EV_KEY, BTN_BASE2);
btn_map[XBOX_DPAD_LEFT] = ButtonEvent::create(EV_KEY, BTN_BASE3);
btn_map[XBOX_DPAD_RIGHT] = ButtonEvent::create(EV_KEY, BTN_BASE4);
bmap[XBOX_DPAD_UP] = ButtonEvent::create(EV_KEY, BTN_BASE);
bmap[XBOX_DPAD_DOWN] = ButtonEvent::create(EV_KEY, BTN_BASE2);
bmap[XBOX_DPAD_LEFT] = ButtonEvent::create(EV_KEY, BTN_BASE3);
bmap[XBOX_DPAD_RIGHT] = ButtonEvent::create(EV_KEY, BTN_BASE4);
// Axis Mapping
axis_map[XBOX_AXIS_X1] = AxisEvent::create(EV_ABS, ABS_X);
@ -84,37 +87,39 @@ uInputCfg::mimic_xpad()
extra_devices = false;
btn_map[XBOX_BTN_START] = ButtonEvent::create(EV_KEY, BTN_START);
btn_map[XBOX_BTN_GUIDE] = ButtonEvent::create(EV_KEY, BTN_MODE);
btn_map[XBOX_BTN_BACK] = ButtonEvent::create(EV_KEY, BTN_BACK);
ButtonEvent* bmap = btn_map[XBOX_BTN_UNKNOWN]; // FIXME: little hacky to abuse XBOX_BTN_UNKNOWN
btn_map[XBOX_BTN_A] = ButtonEvent::create(EV_KEY, BTN_A);
btn_map[XBOX_BTN_B] = ButtonEvent::create(EV_KEY, BTN_B);
btn_map[XBOX_BTN_X] = ButtonEvent::create(EV_KEY, BTN_X);
btn_map[XBOX_BTN_Y] = ButtonEvent::create(EV_KEY, BTN_Y);
bmap[XBOX_BTN_START] = ButtonEvent::create(EV_KEY, BTN_START);
bmap[XBOX_BTN_GUIDE] = ButtonEvent::create(EV_KEY, BTN_MODE);
bmap[XBOX_BTN_BACK] = ButtonEvent::create(EV_KEY, BTN_BACK);
btn_map[XBOX_BTN_GREEN] = ButtonEvent::create(EV_KEY, BTN_0);
btn_map[XBOX_BTN_RED] = ButtonEvent::create(EV_KEY, BTN_1);
btn_map[XBOX_BTN_YELLOW] = ButtonEvent::create(EV_KEY, BTN_2);
btn_map[XBOX_BTN_BLUE] = ButtonEvent::create(EV_KEY, BTN_3);
btn_map[XBOX_BTN_ORANGE] = ButtonEvent::create(EV_KEY, BTN_4);
bmap[XBOX_BTN_A] = ButtonEvent::create(EV_KEY, BTN_A);
bmap[XBOX_BTN_B] = ButtonEvent::create(EV_KEY, BTN_B);
bmap[XBOX_BTN_X] = ButtonEvent::create(EV_KEY, BTN_X);
bmap[XBOX_BTN_Y] = ButtonEvent::create(EV_KEY, BTN_Y);
btn_map[XBOX_BTN_WHITE] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_BLACK] = ButtonEvent::create(EV_KEY, BTN_TR);
bmap[XBOX_BTN_GREEN] = ButtonEvent::create(EV_KEY, BTN_0);
bmap[XBOX_BTN_RED] = ButtonEvent::create(EV_KEY, BTN_1);
bmap[XBOX_BTN_YELLOW] = ButtonEvent::create(EV_KEY, BTN_2);
bmap[XBOX_BTN_BLUE] = ButtonEvent::create(EV_KEY, BTN_3);
bmap[XBOX_BTN_ORANGE] = ButtonEvent::create(EV_KEY, BTN_4);
btn_map[XBOX_BTN_LB] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_RB] = ButtonEvent::create(EV_KEY, BTN_TR);
bmap[XBOX_BTN_WHITE] = ButtonEvent::create(EV_KEY, BTN_TL);
bmap[XBOX_BTN_BLACK] = ButtonEvent::create(EV_KEY, BTN_TR);
bmap[XBOX_BTN_LB] = ButtonEvent::create(EV_KEY, BTN_TL);
bmap[XBOX_BTN_RB] = ButtonEvent::create(EV_KEY, BTN_TR);
btn_map[XBOX_BTN_LT] = ButtonEvent::create(EV_KEY, BTN_TL2);
btn_map[XBOX_BTN_RT] = ButtonEvent::create(EV_KEY, BTN_TR2);
bmap[XBOX_BTN_LT] = ButtonEvent::create(EV_KEY, BTN_TL2);
bmap[XBOX_BTN_RT] = ButtonEvent::create(EV_KEY, BTN_TR2);
btn_map[XBOX_BTN_THUMB_L] = ButtonEvent::create(EV_KEY, BTN_THUMBL);
btn_map[XBOX_BTN_THUMB_R] = ButtonEvent::create(EV_KEY, BTN_THUMBR);
bmap[XBOX_BTN_THUMB_L] = ButtonEvent::create(EV_KEY, BTN_THUMBL);
bmap[XBOX_BTN_THUMB_R] = ButtonEvent::create(EV_KEY, BTN_THUMBR);
btn_map[XBOX_DPAD_UP] = ButtonEvent::create(EV_KEY, BTN_BASE);
btn_map[XBOX_DPAD_DOWN] = ButtonEvent::create(EV_KEY, BTN_BASE2);
btn_map[XBOX_DPAD_LEFT] = ButtonEvent::create(EV_KEY, BTN_BASE3);
btn_map[XBOX_DPAD_RIGHT] = ButtonEvent::create(EV_KEY, BTN_BASE4);
bmap[XBOX_DPAD_UP] = ButtonEvent::create(EV_KEY, BTN_BASE);
bmap[XBOX_DPAD_DOWN] = ButtonEvent::create(EV_KEY, BTN_BASE2);
bmap[XBOX_DPAD_LEFT] = ButtonEvent::create(EV_KEY, BTN_BASE3);
bmap[XBOX_DPAD_RIGHT] = ButtonEvent::create(EV_KEY, BTN_BASE4);
// Axis Mapping
axis_map[XBOX_AXIS_X1] = AxisEvent::create(EV_ABS, ABS_X, 16, 128);

View file

@ -34,7 +34,7 @@ public:
bool force_feedback;
bool extra_devices;
ButtonEvent btn_map[XBOX_BTN_MAX];
ButtonEvent btn_map[XBOX_BTN_MAX][XBOX_BTN_MAX];
AxisEvent axis_map[XBOX_AXIS_MAX];
uInputCfg();