mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
[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:
parent
803c9defae
commit
3cb93d4cbe
4 changed files with 105 additions and 1 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue