Catch duplicate event registrations

This commit is contained in:
Ingo Ruhnke 2009-01-03 20:24:42 +01:00
parent e8c861aa19
commit ad645e4ded
4 changed files with 63 additions and 20 deletions

View file

@ -34,7 +34,11 @@ LinuxUinput::LinuxUinput()
led_bit(false),
ff_bit(false)
{
// Open the input device
std::fill(abs_lst, abs_lst+ABS_CNT, false);
std::fill(rel_lst, rel_lst+REL_CNT, false);
std::fill(key_lst, key_lst+KEY_CNT, false);
// Open the input device
const char* uinput_filename[] = { "/dev/input/uinput", "/dev/uinput", "/dev/misc/uinput" };
const int uinput_filename_count = (sizeof(uinput_filename)/sizeof(char*));
@ -73,40 +77,55 @@ LinuxUinput::~LinuxUinput()
void
LinuxUinput::add_abs(uint16_t code, int min, int max)
{
if (!abs_bit)
if (!abs_lst[code])
{
ioctl(fd, UI_SET_EVBIT, EV_ABS);
abs_bit = true;
abs_lst[code] = true;
if (!abs_bit)
{
ioctl(fd, UI_SET_EVBIT, EV_ABS);
abs_bit = true;
}
ioctl(fd, UI_SET_ABSBIT, code);
user_dev.absmin[code] = min;
user_dev.absmax[code] = max;
}
ioctl(fd, UI_SET_ABSBIT, code);
user_dev.absmin[code] = min;
user_dev.absmax[code] = max;
}
void
LinuxUinput::add_rel(uint16_t code)
{
if (!rel_bit)
if (!rel_lst[code])
{
ioctl(fd, UI_SET_EVBIT, EV_REL);
rel_bit = true;
}
rel_lst[code] = true;
ioctl(fd, UI_SET_RELBIT, code);
if (!rel_bit)
{
ioctl(fd, UI_SET_EVBIT, EV_REL);
rel_bit = true;
}
ioctl(fd, UI_SET_RELBIT, code);
}
}
void
LinuxUinput::add_key(uint16_t code)
{
if (!key_bit)
if (!key_lst[code])
{
ioctl(fd, UI_SET_EVBIT, EV_KEY);
key_bit = true;
}
key_lst[code] = true;
ioctl(fd, UI_SET_KEYBIT, code);
if (!key_bit)
{
ioctl(fd, UI_SET_EVBIT, EV_KEY);
key_bit = true;
}
ioctl(fd, UI_SET_KEYBIT, code);
}
}
void

View file

@ -34,6 +34,10 @@ private:
bool led_bit;
bool ff_bit;
bool abs_lst[ABS_CNT];
bool rel_lst[REL_CNT];
bool key_lst[KEY_CNT];
public:
LinuxUinput();
~LinuxUinput();

View file

@ -169,7 +169,7 @@ void set_ui_button_map(Event* ui_button_map, const std::string& str)
else
{
throw std::runtime_error("Couldn't convert string \"" + str + "\" to ui-button-mapping, Xbox button name not valid");
}
}
}
}

View file

@ -192,15 +192,20 @@ int get_button(XboxGenericMsg& msg, XboxButton button)
case XBOX_BTN_BACK:
return msg.xbox360.back;
case XBOX_BTN_GREEN:
case XBOX_BTN_A:
return msg.xbox360.a;
case XBOX_BTN_RED:
case XBOX_BTN_B:
return msg.xbox360.b;
case XBOX_BTN_BLUE:
case XBOX_BTN_X:
return msg.xbox360.x;
case XBOX_BTN_YELLOW:
case XBOX_BTN_Y:
return msg.xbox360.y;
case XBOX_BTN_ORANGE:
case XBOX_BTN_LB:
case XBOX_BTN_WHITE:
return msg.xbox360.lb;
@ -244,15 +249,20 @@ int get_button(XboxGenericMsg& msg, XboxButton button)
case XBOX_BTN_BACK:
return msg.xbox.back;
case XBOX_BTN_GREEN:
case XBOX_BTN_A:
return msg.xbox.a;
case XBOX_BTN_RED:
case XBOX_BTN_B:
return msg.xbox.b;
case XBOX_BTN_BLUE:
case XBOX_BTN_X:
return msg.xbox.x;
case XBOX_BTN_YELLOW:
case XBOX_BTN_Y:
return msg.xbox.y;
case XBOX_BTN_ORANGE:
case XBOX_BTN_LB:
case XBOX_BTN_WHITE:
return msg.xbox.white;
@ -307,15 +317,20 @@ void set_button(XboxGenericMsg& msg, XboxButton button, int v)
case XBOX_BTN_BACK:
msg.xbox360.back = v; break;
case XBOX_BTN_GREEN:
case XBOX_BTN_A:
msg.xbox360.a = v; break;
case XBOX_BTN_RED:
case XBOX_BTN_B:
msg.xbox360.b = v; break;
case XBOX_BTN_BLUE:
case XBOX_BTN_X:
msg.xbox360.x = v; break;
case XBOX_BTN_YELLOW:
case XBOX_BTN_Y:
msg.xbox360.y = v; break;
case XBOX_BTN_ORANGE:
case XBOX_BTN_LB:
case XBOX_BTN_WHITE:
msg.xbox360.lb = v; break;
@ -359,15 +374,20 @@ void set_button(XboxGenericMsg& msg, XboxButton button, int v)
case XBOX_BTN_BACK:
msg.xbox.back = v; break;
case XBOX_BTN_GREEN:
case XBOX_BTN_A:
msg.xbox.a = v; break;
case XBOX_BTN_RED:
case XBOX_BTN_B:
msg.xbox.b = v; break;
case XBOX_BTN_BLUE:
case XBOX_BTN_X:
msg.xbox.x = v; break;
case XBOX_BTN_YELLOW:
case XBOX_BTN_Y:
msg.xbox.y = v; break;
case XBOX_BTN_ORANGE:
case XBOX_BTN_LB:
case XBOX_BTN_WHITE:
msg.xbox.white = v; break;