commit 8c0cb844952eb6f7ffdef3c445c256b1b3c1f7ac
Author: Michael Day <contact@michaelcday.com>
AuthorDate: Sun Jul 30 23:48:36 2023 -0400
Commit: Turo Lamminen <turol@users.noreply.github.com>
CommitDate: Wed Aug 23 11:42:50 2023 +0300
Allow gamepad axis inversion
---
src/setup/txt_joyaxis.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 95 insertions(+), 1 deletion(-)
diff --git a/src/setup/txt_joyaxis.c b/src/setup/txt_joyaxis.c
index a863704d..3e4a1858 100644
--- a/src/setup/txt_joyaxis.c
+++ b/src/setup/txt_joyaxis.c
@@ -413,6 +413,25 @@ void TXT_ConfigureJoystickAxis(txt_joystick_axis_t *joystick_axis,
joystick_axis->callback = callback;
}
+void TXT_ConfigureGamepadAxis(txt_joystick_axis_t *joystick_axis,
+ int using_button,
+ txt_joystick_axis_callback_t callback)
+{
+ // Build the prompt window.
+
+ joystick_axis->config_window = TXT_NewWindow("Configure axis");
+ TXT_SetColumnWidths(joystick_axis->config_window, 14);
+ TXT_AddWidgets(joystick_axis->config_window, TXT_NewStrut(0, 1),
+ TXT_NewCheckBox("Invert", joystick_axis->invert),
+ TXT_NewStrut(0, 1), NULL);
+
+ TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_LEFT, NULL);
+ TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_CENTER,
+ TXT_NewWindowAbortAction(joystick_axis->config_window));
+ TXT_SetWindowAction(joystick_axis->config_window, TXT_HORIZ_RIGHT, NULL);
+ TXT_SetWidgetAlign(joystick_axis->config_window, TXT_HORIZ_CENTER);
+}
+
static void TXT_JoystickAxisSizeCalc(TXT_UNCAST_ARG(joystick_axis))
{
TXT_CAST_ARG(txt_joystick_axis_t, joystick_axis);
@@ -467,6 +486,32 @@ static void TXT_JoystickAxisDrawer(TXT_UNCAST_ARG(joystick_axis))
}
}
+static void TXT_GamepadAxisDrawer(TXT_UNCAST_ARG(joystick_axis))
+{
+ TXT_CAST_ARG(txt_joystick_axis_t, joystick_axis);
+ char buf[JOYSTICK_AXIS_WIDTH + 1];
+ int i;
+
+ if (*joystick_axis->axis < 0)
+ {
+ M_StringCopy(buf, "(none)", sizeof(buf));
+ }
+ else
+ {
+ M_snprintf(buf, sizeof(buf), "AXIS #%i", *joystick_axis->axis);
+ }
+
+ TXT_SetWidgetBG(joystick_axis);
+ TXT_FGColor(TXT_COLOR_BRIGHT_WHITE);
+
+ TXT_DrawString(buf);
+
+ for (i = TXT_UTF8_Strlen(buf); i < joystick_axis->widget.w; ++i)
+ {
+ TXT_DrawString(" ");
+ }
+}
+
static void TXT_JoystickAxisDestructor(TXT_UNCAST_ARG(joystick_axis))
{
}
@@ -489,6 +534,24 @@ static int TXT_JoystickAxisKeyPress(TXT_UNCAST_ARG(joystick_axis), int key)
return 0;
}
+static int TXT_GamepadAxisKeyPress(TXT_UNCAST_ARG(joystick_axis), int key)
+{
+ TXT_CAST_ARG(txt_joystick_axis_t, joystick_axis);
+
+ if (key == KEY_ENTER)
+ {
+ TXT_ConfigureGamepadAxis(joystick_axis, -1, NULL);
+ return 1;
+ }
+
+ if (key == KEY_BACKSPACE || key == KEY_DEL)
+ {
+ *joystick_axis->axis = -1;
+ }
+
+ return 0;
+}
+
static void TXT_JoystickAxisMousePress(TXT_UNCAST_ARG(widget),
int x, int y, int b)
{
@@ -502,6 +565,19 @@ static void TXT_JoystickAxisMousePress(TXT_UNCAST_ARG(widget),
}
}
+static void TXT_GamepadAxisMousePress(TXT_UNCAST_ARG(widget), int x, int y,
+ int b)
+{
+ TXT_CAST_ARG(txt_joystick_axis_t, widget);
+
+ // Clicking is like pressing enter
+
+ if (b == TXT_MOUSE_LEFT)
+ {
+ TXT_GamepadAxisKeyPress(widget, KEY_ENTER);
+ }
+}
+
txt_widget_class_t txt_joystick_axis_class =
{
TXT_AlwaysSelectable,
@@ -513,6 +589,17 @@ txt_widget_class_t txt_joystick_axis_class =
NULL,
};
+txt_widget_class_t txt_gamepad_axis_class =
+{
+ TXT_AlwaysSelectable,
+ TXT_JoystickAxisSizeCalc,
+ TXT_GamepadAxisDrawer,
+ TXT_GamepadAxisKeyPress,
+ TXT_JoystickAxisDestructor,
+ TXT_GamepadAxisMousePress,
+ NULL,
+};
+
txt_joystick_axis_t *TXT_NewJoystickAxis(int *axis, int *invert,
txt_joystick_axis_direction_t dir)
{
@@ -520,7 +607,14 @@ txt_joystick_axis_t *TXT_NewJoystickAxis(int *axis, int *invert,
joystick_axis = malloc(sizeof(txt_joystick_axis_t));
- TXT_InitWidget(joystick_axis, &txt_joystick_axis_class);
+ if (use_gamepad)
+ {
+ TXT_InitWidget(joystick_axis, &txt_gamepad_axis_class);
+ }
+ else
+ {
+ TXT_InitWidget(joystick_axis, &txt_joystick_axis_class);
+ }
joystick_axis->axis = axis;
joystick_axis->invert = invert;
joystick_axis->dir = dir;