From cfd05db689adacb5fef884fed6fa0eab325996d5 Mon Sep 17 00:00:00 2001 From: hendricks266 Date: Wed, 14 Aug 2019 05:25:22 +0000 Subject: [PATCH] Track whether keyboard or gamepad input was last received git-svn-id: https://svn.eduke32.com/eduke32@7992 1a8010ca-5511-0410-912e-c29ae57300e0 --- source/mact/include/control.h | 8 +++++ source/mact/src/control.cpp | 66 ++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/source/mact/include/control.h b/source/mact/include/control.h index f90e006b7..4feb28826 100644 --- a/source/mact/include/control.h +++ b/source/mact/include/control.h @@ -159,6 +159,12 @@ enum GameControllerAxis : int GAMECONTROLLER_AXIS_MAX }; +enum class LastSeenInput : unsigned char +{ + Keyboard, + Joystick, +}; + //*************************************************************************** // // GLOBALS @@ -174,6 +180,8 @@ extern bool CONTROL_JoystickEnabled; extern uint64_t CONTROL_ButtonState; extern uint64_t CONTROL_ButtonHeldState; +extern LastSeenInput CONTROL_LastSeenInput; + //*************************************************************************** // diff --git a/source/mact/src/control.cpp b/source/mact/src/control.cpp index e2e30ddda..9abcd6281 100644 --- a/source/mact/src/control.cpp +++ b/source/mact/src/control.cpp @@ -29,6 +29,8 @@ bool CONTROL_JoystickEnabled = false; uint64_t CONTROL_ButtonState = 0; uint64_t CONTROL_ButtonHeldState = 0; +LastSeenInput CONTROL_LastSeenInput; + float CONTROL_MouseSensitivity = DEFAULTMOUSESENSITIVITY; static int32_t CONTROL_NumMouseButtons = 0; static int32_t CONTROL_NumMouseAxes = 0; @@ -476,7 +478,7 @@ void CONTROL_ClearAssignments(void) i = NORMALAXISSCALE; } -static void DoGetDeviceButtons( +static int DoGetDeviceButtons( int32_t buttons, int32_t tm, int32_t NumButtons, int32_t *DeviceButtonState, @@ -487,6 +489,7 @@ static void DoGetDeviceButtons( ) { int32_t i=NumButtons-1; + int retval = 0; for (; i>=0; i--) { @@ -497,6 +500,8 @@ static void DoGetDeviceButtons( if (bs) { + retval = 1; + if (ButtonClicked[i] == FALSE) { ButtonClicked[i] = TRUE; @@ -526,6 +531,8 @@ static void DoGetDeviceButtons( ButtonClicked[i] = FALSE; } + + return retval; } static void CONTROL_GetDeviceButtons(void) @@ -547,7 +554,7 @@ static void CONTROL_GetDeviceButtons(void) if (CONTROL_JoystickEnabled) { - DoGetDeviceButtons( + int retval = DoGetDeviceButtons( JOYSTICK_GetButtons(), t, CONTROL_NumJoyButtons, CONTROL_JoyButtonState, @@ -556,10 +563,12 @@ static void CONTROL_GetDeviceButtons(void) CONTROL_JoyButtonClicked, CONTROL_JoyButtonClickedCount ); + if (retval) + CONTROL_LastSeenInput = LastSeenInput::Joystick; } } -static void CONTROL_DigitizeAxis(int axis, controldevice device) +static int CONTROL_DigitizeAxis(int axis, controldevice device) { controlaxistype *set, *lastset; @@ -575,7 +584,7 @@ static void CONTROL_DigitizeAxis(int axis, controldevice device) lastset = CONTROL_LastJoyAxes; break; - default: return; + default: return 0; } set[axis].digitalClearedN = lastset[axis].digitalClearedN; @@ -589,6 +598,8 @@ static void CONTROL_DigitizeAxis(int axis, controldevice device) set[axis].digital = 1; else set[axis].digitalClearedP = 0; + + return 1; } else if (set[axis].analog < 0) { @@ -598,12 +609,16 @@ static void CONTROL_DigitizeAxis(int axis, controldevice device) set[axis].digital = -1; else set[axis].digitalClearedN = 0; + + return 1; } else { set[axis].digitalClearedN = 0; set[axis].digitalClearedP = 0; } + + return 0; } static void CONTROL_ScaleAxis(int axis, controldevice device) @@ -697,7 +712,8 @@ static void CONTROL_PollDevices(ControlInfo *info) { CONTROL_JoyAxes[i].analog = joystick.pAxis[i]; - CONTROL_DigitizeAxis(i, controldevice_joystick); + if (CONTROL_DigitizeAxis(i, controldevice_joystick)) + CONTROL_LastSeenInput = LastSeenInput::Joystick; CONTROL_ScaleAxis(i, controldevice_joystick); LIMITCONTROL(&CONTROL_JoyAxes[i].analog); CONTROL_ApplyAxis(i, info, controldevice_joystick); @@ -707,9 +723,10 @@ static void CONTROL_PollDevices(ControlInfo *info) CONTROL_GetDeviceButtons(); } -static void CONTROL_HandleAxisFunction(int32_t *p1, controlaxistype *axes, controlaxismaptype *axismap, int numAxes) +static int CONTROL_HandleAxisFunction(int32_t *p1, controlaxistype *axes, controlaxismaptype *axismap, int numAxes) { int axis = numAxes - 1; + int retval = 0; do { @@ -719,9 +736,14 @@ static void CONTROL_HandleAxisFunction(int32_t *p1, controlaxistype *axes, contr int const j = (axes[axis].digital < 0) ? axismap[axis].minmap : axismap[axis].maxmap; if (j != AXISUNDEFINED) + { p1[j] = 1; + retval = 1; + } } while (axis--); + + return retval; } static void CONTROL_AxisFunctionState(int32_t *p1) @@ -730,7 +752,10 @@ static void CONTROL_AxisFunctionState(int32_t *p1) CONTROL_HandleAxisFunction(p1, CONTROL_MouseAxes, CONTROL_MouseAxesMap, CONTROL_NumMouseAxes); if (CONTROL_NumJoyAxes) - CONTROL_HandleAxisFunction(p1, CONTROL_JoyAxes, CONTROL_JoyAxesMap, CONTROL_NumJoyAxes); + { + if (CONTROL_HandleAxisFunction(p1, CONTROL_JoyAxes, CONTROL_JoyAxesMap, CONTROL_NumJoyAxes)) + CONTROL_LastSeenInput = LastSeenInput::Joystick; + } } static void CONTROL_ButtonFunctionState(int32_t *p1) @@ -768,18 +793,30 @@ static void CONTROL_ButtonFunctionState(int32_t *p1) if (CONTROL_NumJoyButtons) { int i=CONTROL_NumJoyButtons-1, j; + int retval = 0; do { j = CONTROL_JoyButtonMapping[i].doubleclicked; if (j != KEYUNDEFINED) - p1[j] |= CONTROL_JoyButtonClickedState[i]; + { + auto const state = CONTROL_JoyButtonClickedState[i]; + p1[j] |= state; + retval |= state; + } j = CONTROL_JoyButtonMapping[i].singleclicked; if (j != KEYUNDEFINED) - p1[j] |= CONTROL_JoyButtonState[i]; + { + auto const state = CONTROL_JoyButtonState[i]; + p1[j] |= state; + retval |= state; + } } while (i--); + + if (retval) + CONTROL_LastSeenInput = LastSeenInput::Joystick; } } @@ -845,10 +882,15 @@ void CONTROL_ProcessBinds(void) { if (CONTROL_KeyBinds[i].cmdstr) { - if (KB_KeyPressed(i) && (CONTROL_KeyBinds[i].repeat || (CONTROL_KeyBinds[i].laststate == 0))) - OSD_Dispatch(CONTROL_KeyBinds[i].cmdstr); + auto const keyPressed = KB_KeyPressed(i); - CONTROL_KeyBinds[i].laststate = KB_KeyPressed(i); + if (keyPressed && (CONTROL_KeyBinds[i].repeat || (CONTROL_KeyBinds[i].laststate == 0))) + { + CONTROL_LastSeenInput = LastSeenInput::Keyboard; + OSD_Dispatch(CONTROL_KeyBinds[i].cmdstr); + } + + CONTROL_KeyBinds[i].laststate = keyPressed; } } while (i--);