[input] Add functions to get single axis/button info

Handy for retrieving the current state (raw) of a single axis or button.
This commit is contained in:
Bill Currie 2021-12-21 17:42:38 +09:00
parent 803c9defae
commit 3cb93d4cbe
4 changed files with 105 additions and 1 deletions

View file

@ -77,6 +77,11 @@ typedef struct in_driver_s {
// -1 for invalid name
int (*get_axis_num) (void *data, void *device, const char *axis_name);
int (*get_button_num) (void *data, void *device, const char *button_name);
// null means invalid number
int (*get_axis_info) (void *data, void *device, int axis_num,
in_axisinfo_t *info);
int (*get_button_info) (void *data, void *device, int button_num,
in_buttoninfo_t *info);
} in_driver_t;
typedef struct in_device_s {
@ -114,6 +119,8 @@ const char *IN_GetAxisName (int devid, int axis_num);
const char *IN_GetButtonName (int devid, int button_num);
int IN_GetAxisNumber (int devid, const char *axis_name);
int IN_GetButtonNumber (int devid, const char *button_name);
int IN_GetAxisInfo (int devid, int axis_num, in_axisinfo_t *info);
int IN_GetButtonInfo (int devid, int button_num, in_buttoninfo_t *info);
void IN_ProcessEvents (void);

View file

@ -356,6 +356,44 @@ IN_GetButtonNumber (int devid, const char *button_name)
button_name);
}
int
IN_GetAxisInfo (int devid, int axis_num, in_axisinfo_t *info)
{
if ((size_t) devid >= in_devices.size) {
return 0;
}
if (!in_devices.a[devid].device || in_devices.a[devid].driverid == -1) {
return 0;
}
int driver = in_devices.a[devid].driverid;
in_regdriver_t *rd = &in_drivers.a[driver];
if (rd->driver.get_axis_info (rd->data, in_devices.a[devid].device,
axis_num, info)) {
info->deviceid = devid;
return 1;
}
return 0;
}
int
IN_GetButtonInfo (int devid, int button_num, in_buttoninfo_t *info)
{
if ((size_t) devid >= in_devices.size) {
return 0;
}
if (!in_devices.a[devid].device || in_devices.a[devid].driverid == -1) {
return 0;
}
int driver = in_devices.a[devid].driverid;
in_regdriver_t *rd = &in_drivers.a[driver];
if (rd->driver.get_button_info (rd->data, in_devices.a[devid].device,
button_num, info)) {
info->deviceid = devid;
return 1;
}
return 0;
}
void
IN_UpdateGrab (cvar_t *var) // called from context_*.c
{

View file

@ -232,7 +232,7 @@ in_evdev_axis_info (void *data, void *device, in_axisinfo_t *axes,
static void
in_evdev_button_info (void *data, void *device, in_buttoninfo_t *buttons,
int *numbuttons)
int *numbuttons)
{
device_t *dev = device;
if (!buttons) {
@ -248,6 +248,34 @@ in_evdev_button_info (void *data, void *device, in_buttoninfo_t *buttons,
}
}
static int
in_evdev_get_axis_info (void *data, void *device, int axis_num,
in_axisinfo_t *info)
{
device_t *dev = device;
if (axis_num < 0 || axis_num > dev->num_axes) {
return 0;
}
info->axis = dev->axes[axis_num].num;
info->value = dev->axes[axis_num].value;
info->min = dev->axes[axis_num].min;
info->max = dev->axes[axis_num].max;
return 1;
}
static int
in_evdev_get_button_info (void *data, void *device, int button_num,
in_buttoninfo_t *info)
{
device_t *dev = device;
if (button_num < 0 || button_num > dev->num_buttons) {
return 0;
}
info->button = dev->buttons[button_num].num;
info->state = dev->buttons[button_num].state;
return 1;
}
static in_driver_t in_evdev_driver = {
.init = in_evdev_init,
.shutdown = in_evdev_shutdown,
@ -259,6 +287,9 @@ static in_driver_t in_evdev_driver = {
.axis_info = in_evdev_axis_info,
.button_info = in_evdev_button_info,
.get_axis_info = in_evdev_get_axis_info,
.get_button_info = in_evdev_get_button_info,
};
static int

View file

@ -1260,6 +1260,30 @@ in_x11_get_button_name (void *data, void *device, int button_num)
return name;
}
static int
in_x11_get_axis_info (void *data, void *device, int axis_num,
in_axisinfo_t *info)
{
x11_device_t *dev = device;
if (axis_num < 0 || axis_num > dev->num_axes) {
return 0;
}
*info = dev->axes[axis_num];
return 1;
}
static int
in_x11_get_button_info (void *data, void *device, int button_num,
in_buttoninfo_t *info)
{
x11_device_t *dev = device;
if (button_num < 0 || button_num > dev->num_buttons) {
return 0;
}
*info = dev->buttons[button_num];
return 1;
}
static int
in_x11_get_axis_num (void *data, void *device, const char *axis_name)
{
@ -1568,8 +1592,12 @@ static in_driver_t in_x11_driver = {
.get_axis_name = in_x11_get_axis_name,
.get_button_name = in_x11_get_button_name,
.get_axis_num = in_x11_get_axis_num,
.get_button_num = in_x11_get_button_num,
.get_axis_info = in_x11_get_axis_info,
.get_button_info = in_x11_get_button_info,
};
static void __attribute__((constructor))