Browse Source

Trigger deactivate event for virtual gamepad

pull/7794/head
staphen 1 year ago committed by Anders Jenbo
parent
commit
e21efc26aa
  1. 48
      Source/controls/touch/event_handlers.cpp
  2. 1
      Source/controls/touch/event_handlers.h
  3. 2
      Source/controls/touch/gamepad.cpp

48
Source/controls/touch/event_handlers.cpp

@ -19,6 +19,12 @@ namespace devilution {
namespace {
#if SDL_VERSION_ATLEAST(2, 0, 0)
using SdlEventType = uint16_t;
#else
using SdlEventType = uint8_t;
#endif
VirtualGamepadEventHandler Handler(&VirtualGamepadState);
Point ScaleToScreenCoordinates(float x, float y)
@ -130,6 +136,17 @@ void HandleStashPanelInteraction(const SDL_Event &event)
}
}
SdlEventType GetDeactivateEventType()
{
static SdlEventType customEventType = SDL_RegisterEvents(1);
return customEventType;
}
bool IsDeactivateEvent(const SDL_Event &event)
{
return event.type == GetDeactivateEventType();
}
} // namespace
void HandleTouchEvent(const SDL_Event &event)
@ -161,14 +178,23 @@ void HandleTouchEvent(const SDL_Event &event)
HandleStashPanelInteraction(event);
}
void DeactivateTouchEventHandlers()
{
SDL_Event event;
event.type = GetDeactivateEventType();
HandleTouchEvent(event);
}
bool VirtualGamepadEventHandler::Handle(const SDL_Event &event)
{
if (!VirtualGamepadState.isActive || !IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) {
VirtualGamepadState.primaryActionButton.didStateChange = false;
VirtualGamepadState.secondaryActionButton.didStateChange = false;
VirtualGamepadState.spellActionButton.didStateChange = false;
VirtualGamepadState.cancelButton.didStateChange = false;
return false;
if (!IsDeactivateEvent(event)) {
if (!VirtualGamepadState.isActive || !IsAnyOf(event.type, SDL_FINGERDOWN, SDL_FINGERUP, SDL_FINGERMOTION)) {
VirtualGamepadState.primaryActionButton.didStateChange = false;
VirtualGamepadState.secondaryActionButton.didStateChange = false;
VirtualGamepadState.spellActionButton.didStateChange = false;
VirtualGamepadState.cancelButton.didStateChange = false;
return false;
}
}
if (charMenuButtonEventHandler.Handle(event))
@ -212,6 +238,11 @@ bool VirtualGamepadEventHandler::Handle(const SDL_Event &event)
bool VirtualDirectionPadEventHandler::Handle(const SDL_Event &event)
{
if (IsDeactivateEvent(event)) {
isActive = false;
return false;
}
switch (event.type) {
case SDL_FINGERDOWN:
return HandleFingerDown(event.tfinger);
@ -271,6 +302,11 @@ bool VirtualDirectionPadEventHandler::HandleFingerMotion(const SDL_TouchFingerEv
bool VirtualButtonEventHandler::Handle(const SDL_Event &event)
{
if (IsDeactivateEvent(event)) {
isActive = false;
return false;
}
if (!virtualButton->isUsable()) {
virtualButton->didStateChange = virtualButton->isHeld;
virtualButton->isHeld = false;

1
Source/controls/touch/event_handlers.h

@ -89,5 +89,6 @@ private:
};
void HandleTouchEvent(const SDL_Event &event);
void DeactivateTouchEventHandlers();
} // namespace devilution

2
Source/controls/touch/gamepad.cpp

@ -3,6 +3,7 @@
#include <SDL.h>
#include "control.h"
#include "controls/touch/event_handlers.h"
#include "controls/touch/gamepad.h"
#include "quests.h"
#include "utils/display.h"
@ -188,6 +189,7 @@ void ActivateVirtualGamepad()
void DeactivateVirtualGamepad()
{
VirtualGamepadState.Deactivate();
DeactivateTouchEventHandlers();
}
void VirtualGamepad::Deactivate()

Loading…
Cancel
Save