Moved some parsing code from UinputOptions to CommandLineOptions

This commit is contained in:
Ingo Ruhnke 2011-04-12 18:18:36 +02:00
parent bef8044664
commit a6d577c8a4
5 changed files with 165 additions and 133 deletions

31
examples/calibrate.macro Normal file
View file

@ -0,0 +1,31 @@
# Simple Macro that automate calibration in old DOS games
send ABS_X 0
send ABS_Y 0
wait 500
send JS_0 1
wait 200
send JS_0 0
send ABS_X -32768
send ABS_Y -32768
wait 500
send JS_0 1
wait 200
send JS_0 0
send ABS_X 32767
send ABS_Y 32767
wait 500
send JS_0 1
wait 200
send JS_0 0
send ABS_X 0
send ABS_Y 0
wait 500
send JS_0 1
wait 500
send JS_0 0
# EOF #

View file

@ -712,13 +712,11 @@ CommandLineParser::parse_args(int argc, char** argv, Options* options)
break;
case OPTION_UI_AXISMAP:
process_name_value_string(opt.argument, boost::bind(&UInputOptions::set_ui_axismap,
boost::ref(opts.get_controller_options().uinput), _1, _2));
process_name_value_string(opt.argument, boost::bind(&CommandLineParser::set_ui_axismap, this, _1, _2));
break;
case OPTION_UI_BUTTONMAP:
process_name_value_string(opt.argument, boost::bind(&UInputOptions::set_ui_buttonmap,
boost::ref(opts.get_controller_options().uinput), _1, _2));
process_name_value_string(opt.argument, boost::bind(&CommandLineParser::set_ui_buttonmap, this, _1, _2));
break;
case OPTION_MOUSE:
@ -1022,13 +1020,135 @@ CommandLineParser::set_device_name(const std::string& name, const std::string& v
void
CommandLineParser::set_ui_buttonmap(const std::string& name, const std::string& value)
{
m_options->get_controller_options().uinput.set_ui_buttonmap(name, value);
set_ui_buttonmap(m_options->get_controller_options().uinput.get_btn_map(),
name, value);
}
void
CommandLineParser::set_ui_buttonmap(ButtonMap& btn_map, const std::string& name, const std::string& value)
{
ButtonEventPtr event;
XboxButton shift = XBOX_BTN_UNKNOWN;
XboxButton btn = XBOX_BTN_UNKNOWN;
std::vector<ButtonFilterPtr> filters;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
tokenizer tokens(name, boost::char_separator<char>("^", "", boost::keep_empty_tokens));
int idx = 0;
for(tokenizer::iterator t = tokens.begin(); t != tokens.end(); ++t, ++idx)
{
switch(idx)
{
case 0: // shift+key portion
{
std::string::size_type j = t->find('+');
if (j == std::string::npos)
{
shift = XBOX_BTN_UNKNOWN;
btn = string2btn(*t);
}
else
{
shift = string2btn(t->substr(0, j));
btn = string2btn(t->substr(j+1));
}
if (value.empty())
{ // if no rhs value is given, add filters to the current binding
event = btn_map.lookup(shift, btn);
}
else
{
event = ButtonEvent::from_string(value);
if (event)
{
btn_map.bind(shift, btn, event);
}
}
}
break;
default:
{ // filter
if (event)
{
event->add_filter(ButtonFilter::from_string(*t));
}
}
break;
}
}
}
void
CommandLineParser::set_ui_axismap(const std::string& name, const std::string& value)
{
m_options->get_controller_options().uinput.set_ui_axismap(name, value);
set_ui_axismap(m_options->get_controller_options().uinput.get_axis_map(),
name, value);
}
void
CommandLineParser::set_ui_axismap(AxisMap& axis_map, const std::string& name, const std::string& value)
{
AxisEventPtr event;
XboxButton shift = XBOX_BTN_UNKNOWN;
XboxAxis axis = XBOX_AXIS_UNKNOWN;
std::vector<AxisFilterPtr> filters;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
tokenizer tokens(name, boost::char_separator<char>("^", "", boost::keep_empty_tokens));
int idx = 0;
for(tokenizer::iterator t = tokens.begin(); t != tokens.end(); ++t, ++idx)
{
switch(idx)
{
case 0: // shift+key portion
{
std::string::size_type j = t->find('+');
if (j == std::string::npos)
{
shift = XBOX_BTN_UNKNOWN;
axis = string2axis(*t);
}
else
{
shift = string2btn(t->substr(0, j));
axis = string2axis(t->substr(j+1));
}
if (value.empty())
{ // if no rhs value is given, add filters to the current binding
event = axis_map.lookup(shift, axis);
}
else
{
event = AxisEvent::from_string(value);
if (event)
{
if (axis != XBOX_AXIS_UNKNOWN)
{
event->set_axis_range(get_axis_min(axis),
get_axis_max(axis));
}
axis_map.bind(shift, axis, event);
}
}
}
break;
default:
{ // filter
if (event)
{
event->add_filter(AxisFilter::from_string(*t));
}
}
break;
}
}
}
void
@ -1193,15 +1313,15 @@ CommandLineParser::read_alt_config_file(const std::string& filename)
void
CommandLineParser::set_ui_buttonmap_n(int controller, int config, const std::string& name, const std::string& value)
{
m_options->controller_slots[controller].get_options(config)
.uinput.set_ui_buttonmap(name, value);
set_ui_buttonmap(m_options->controller_slots[controller].get_options(config).uinput.get_btn_map(),
name, value);
}
void
CommandLineParser::set_ui_axismap_n(int controller, int config, const std::string& name, const std::string& value)
{
m_options->controller_slots[controller].get_options(config)
.uinput.set_ui_axismap(name, value);
set_ui_axismap(m_options->controller_slots[controller].get_options(config).uinput.get_axis_map(),
name, value);
}
void

View file

@ -25,6 +25,8 @@
class Options;
class Xboxdrv;
class ButtonMap;
class AxisMap;
class CommandLineParser
{
@ -47,7 +49,9 @@ private:
void set_device_name(const std::string& name, const std::string& value);
void set_device_usbid(const std::string& name, const std::string& value);
void set_ui_buttonmap(ButtonMap& btn_map, const std::string& name, const std::string& value);
void set_ui_buttonmap(const std::string& name, const std::string& value);
void set_ui_axismap(AxisMap& axis_map, const std::string& name, const std::string& value);
void set_ui_axismap(const std::string& name, const std::string& value);
void set_modifier(const std::string& name, const std::string& value);

View file

@ -209,126 +209,6 @@ UInputOptions::dpad_only()
get_axis_map().bind(XBOX_AXIS_DPAD_Y, AxisEvent::create_abs(DEVICEID_AUTO, ABS_Y, -1, 1, 0, 0));
}
void
UInputOptions::set_ui_axismap(const std::string& name, const std::string& value)
{
AxisEventPtr event;
XboxButton shift = XBOX_BTN_UNKNOWN;
XboxAxis axis = XBOX_AXIS_UNKNOWN;
std::vector<AxisFilterPtr> filters;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
tokenizer tokens(name, boost::char_separator<char>("^", "", boost::keep_empty_tokens));
int idx = 0;
for(tokenizer::iterator t = tokens.begin(); t != tokens.end(); ++t, ++idx)
{
switch(idx)
{
case 0: // shift+key portion
{
std::string::size_type j = t->find('+');
if (j == std::string::npos)
{
shift = XBOX_BTN_UNKNOWN;
axis = string2axis(*t);
}
else
{
shift = string2btn(t->substr(0, j));
axis = string2axis(t->substr(j+1));
}
if (value.empty())
{ // if no rhs value is given, add filters to the current binding
event = get_axis_map().lookup(shift, axis);
}
else
{
event = AxisEvent::from_string(value);
if (event)
{
if (axis != XBOX_AXIS_UNKNOWN)
{
event->set_axis_range(get_axis_min(axis),
get_axis_max(axis));
}
get_axis_map().bind(shift, axis, event);
}
}
}
break;
default:
{ // filter
if (event)
{
event->add_filter(AxisFilter::from_string(*t));
}
}
break;
}
}
}
void
UInputOptions::set_ui_buttonmap(const std::string& name, const std::string& value)
{
ButtonEventPtr event;
XboxButton shift = XBOX_BTN_UNKNOWN;
XboxButton btn = XBOX_BTN_UNKNOWN;
std::vector<ButtonFilterPtr> filters;
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
tokenizer tokens(name, boost::char_separator<char>("^", "", boost::keep_empty_tokens));
int idx = 0;
for(tokenizer::iterator t = tokens.begin(); t != tokens.end(); ++t, ++idx)
{
switch(idx)
{
case 0: // shift+key portion
{
std::string::size_type j = t->find('+');
if (j == std::string::npos)
{
shift = XBOX_BTN_UNKNOWN;
btn = string2btn(*t);
}
else
{
shift = string2btn(t->substr(0, j));
btn = string2btn(t->substr(j+1));
}
if (value.empty())
{ // if no rhs value is given, add filters to the current binding
event = get_btn_map().lookup(shift, btn);
}
else
{
event = ButtonEvent::from_string(value);
if (event)
{
get_btn_map().bind(shift, btn, event);
}
}
}
break;
default:
{ // filter
if (event)
{
event->add_filter(ButtonFilter::from_string(*t));
}
}
break;
}
}
}
void
UInputOptions::guitar()
{

View file

@ -44,9 +44,6 @@ public:
void dpad_as_button();
void dpad_only();
void set_ui_buttonmap(const std::string& name, const std::string& value);
void set_ui_axismap(const std::string& name, const std::string& value);
/** @}*/
/** \addtogroup access Access Functions