Catch duplicate event registrations
This commit is contained in:
parent
e8c861aa19
commit
ad645e4ded
4 changed files with 63 additions and 20 deletions
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue