[input] Allow button and axis inputs to be named

keyhelp provides the input name if it is known, and in_bind tries to use
the provided input name if not a number. Case sensitivity for name
lookups is dependent on the input driver.
This commit is contained in:
Bill Currie 2021-11-18 12:59:18 +09:00
parent f4c521d51d
commit 84f746dab2
3 changed files with 96 additions and 4 deletions

View file

@ -77,6 +77,12 @@ typedef struct in_driver_s {
int *numaxes);
void (*button_info) (void *data, void *device, in_buttoninfo_t *buttons,
int *numbuttons);
// null means either invalid number or the name is not known
const char *(*get_axis_name) (void *data, void *device, int axis_num);
const char *(*get_button_name) (void *data, void *device, int button_num);
// -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);
} in_driver_t;
typedef struct in_device_s {
@ -111,6 +117,10 @@ void IN_SetDeviceEventData (int devid, void *data);
void *IN_GetDeviceEventData (int devid);
int IN_AxisInfo (int devid, in_axisinfo_t *axes, int *numaxes);
int IN_ButtonInfo (int devid, in_buttoninfo_t *button, int *numbuttons);
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);
void IN_ProcessEvents (void);

View file

@ -283,11 +283,12 @@ in_keyhelp_event_handler (const IE_event_t *ie_event, void *unused)
size_t devid = ie_event->button.devid;
in_devbindings_t *db = ie_event->button.data;
const char *name = db ? db->name : 0;
const char *bind_name = db ? db->name : 0;
const char *type = 0;
int num = -1;
const char *devname = IN_GetDeviceName (devid);
const char *id = IN_GetDeviceId (devid);
const char *name = 0;
if (ie_event->type == ie_axis) {
int axis = ie_event->axis.axis;
@ -317,17 +318,20 @@ in_keyhelp_event_handler (const IE_event_t *ie_event, void *unused)
type = "axis";
}
}
name = IN_GetAxisName (devid, num);
} else if (ie_event->type == ie_button) {
if (ie_event->button.state) {
num = ie_event->button.button;
type = "button";
}
name = IN_GetButtonName (devid, num);
}
if (!type) {
return 0;
}
IE_Set_Focus (in_keyhelp_saved_handler);
Sys_Printf ("%s (%s %s) %s %d\n", name, devname, id, type, num);
Sys_Printf ("%s (%s %s) %s %d (%s)\n", bind_name, devname, id, type, num,
name ? name : "");
return 1;
}
@ -402,7 +406,10 @@ in_bind_f (void)
return;
}
if (*type == 'a') {
if (*end || num < 0 || num >= dev->num_axes) {
if (*end) {
num = IN_GetAxisNumber (dev->devid, number);
}
if (num < 0 || num >= dev->num_axes) {
Sys_Printf ("invalid axis number: %s\n", number);
return;
}
@ -464,7 +471,10 @@ in_bind_f (void)
// the rest of the command line is the binding
const char *binding = Cmd_Args (5);
if (*end || num < 0 || num >= dev->num_buttons) {
if (*end) {
num = IN_GetButtonNumber (dev->devid, number);
}
if (num < 0 || num >= dev->num_buttons) {
Sys_Printf ("invalid button number: %s\n", number);
return;
}

View file

@ -280,6 +280,78 @@ IN_ButtonInfo (int devid, in_buttoninfo_t *buttons, int *numbuttons)
return 0;
}
const char *
IN_GetAxisName (int devid, int axis_num)
{
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_name) {
return 0;
}
return rd->driver.get_axis_name (rd->data, in_devices.a[devid].device,
axis_num);
}
const char *
IN_GetButtonName (int devid, int button_num)
{
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_name) {
return 0;
}
return rd->driver.get_button_name (rd->data, in_devices.a[devid].device,
button_num);
}
int
IN_GetAxisNumber (int devid, const char *axis_name)
{
if ((size_t) devid >= in_devices.size) {
return -1;
}
if (!in_devices.a[devid].device || in_devices.a[devid].driverid == -1) {
return -1;
}
int driver = in_devices.a[devid].driverid;
in_regdriver_t *rd = &in_drivers.a[driver];
if (!rd->driver.get_axis_num) {
return -1;
}
return rd->driver.get_axis_num (rd->data, in_devices.a[devid].device,
axis_name);
}
int
IN_GetButtonNumber (int devid, const char *button_name)
{
if ((size_t) devid >= in_devices.size) {
return -1;
}
if (!in_devices.a[devid].device || in_devices.a[devid].driverid == -1) {
return -1;
}
int driver = in_devices.a[devid].driverid;
in_regdriver_t *rd = &in_drivers.a[driver];
if (!rd->driver.get_button_num) {
return -1;
}
return rd->driver.get_button_num (rd->data, in_devices.a[devid].device,
button_name);
}
void
IN_UpdateGrab (cvar_t *var) // called from context_*.c
{