private void HandleInputHoverAndHold(Vector2 _cursorPosition, Vector3 _clickPosition, float _distanceFromScreen, Vector2 _hoverPosition)
    {
        if (!clickHeld && !hoverTriggered && _hoverPosition == previousHoverPosScreen)
        {
            if (!hoverTriggerTimer.IsRunning)
            {
                hoverTriggerTimer.Restart();
            }
            else if (hoverTriggerTimer.ElapsedMilliseconds > hoverTriggerTime)
            {
                hoverTriggered = true;
                hoverTriggerTimer.Stop();
                hoverTriggeredDeadzoneRadius = positioningModule.Stabiliser.GetCurrentDeadzoneRadius();
                previousScreenPos            = _cursorPosition; // To prevent instant-abandonment of hover
            }
        }

        bool sendHoverAction = true;

        if (hoverTriggered)
        {
            if (_cursorPosition == previousScreenPos)
            {
                if (!clickHeld)
                {
                    if (!progressTimer.IsRunning && progressTimer.Progress == 0f)
                    {
                        progressTimer.StartTimer();
                    }
                    else if (progressTimer.IsRunning && progressTimer.Progress == 1f)
                    {
                        positioningModule.Stabiliser.SetCurrentDeadzoneRadius(timerDeadzoneEnlargementDistance + positioningModule.Stabiliser.defaultDeadzoneRadius);
                        progressTimer.StopTimer();
                        clickHeld = true;
                        clickingTimer.Restart();
                        SendInputAction(InputType.DOWN, _cursorPosition, _clickPosition, _distanceFromScreen);
                        sendHoverAction = false;
                    }
                    else
                    {
                        float maxDeadzoneRadius = timerDeadzoneEnlargementDistance + positioningModule.Stabiliser.defaultDeadzoneRadius;
                        float deadzoneRadius    = Mathf.Lerp(hoverTriggeredDeadzoneRadius, maxDeadzoneRadius, progressTimer.Progress);
                        positioningModule.Stabiliser.SetCurrentDeadzoneRadius(deadzoneRadius);
                    }
                }
                else
                {
                    if (!clickAlreadySent && clickingTimer.ElapsedMilliseconds > clickHoldTime)
                    {
                        SendInputAction(InputType.UP, _cursorPosition, _clickPosition, _distanceFromScreen);
                        sendHoverAction  = false;
                        clickAlreadySent = true;
                    }
                    else if (!clickAlreadySent)
                    {
                        SendInputAction(InputType.HOLD, _cursorPosition, _clickPosition, _distanceFromScreen);
                        sendHoverAction = false;
                    }
                }
            }
            else
            {
                if (clickHeld && !clickAlreadySent)
                {
                    // Handle unclick if move before timer's up
                    SendInputAction(InputType.UP, _cursorPosition, _clickPosition, _distanceFromScreen);
                    sendHoverAction = false;
                }

                progressTimer.ResetTimer();

                hoverTriggered = false;
                hoverTriggerTimer.Stop();

                clickHeld        = false;
                clickAlreadySent = false;
                clickingTimer.Stop();

                positioningModule.Stabiliser.StartShrinkingDeadzone(ShrinkType.MOTION_BASED, deadzoneShrinkSpeed);
            }
        }

        if (sendHoverAction && allowHover)
        {
            SendInputAction(InputType.HOVER, _cursorPosition, _clickPosition, _distanceFromScreen);
        }

        previousHoverPosScreen = _hoverPosition;
        previousScreenPos      = _cursorPosition;
    }