mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-11 10:31:16 +00:00
Remove SDL mouse/touch event bug workaround (#606)
* Remove SDL mouse/touch event bug workaround * Small refactor * Add include
This commit is contained in:
parent
996900ae9a
commit
19edb0340e
@ -526,6 +526,9 @@ if (ISLE_BUILD_APP)
|
|||||||
# Allow unconditional include of miniwin/miniwindevice.h
|
# Allow unconditional include of miniwin/miniwindevice.h
|
||||||
target_link_libraries(isle PRIVATE miniwin-headers)
|
target_link_libraries(isle PRIVATE miniwin-headers)
|
||||||
|
|
||||||
|
# Vector math
|
||||||
|
target_link_libraries(isle PRIVATE Vec::Vec)
|
||||||
|
|
||||||
# Link DSOUND and WINMM
|
# Link DSOUND and WINMM
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
target_link_libraries(isle PRIVATE winmm)
|
target_link_libraries(isle PRIVATE winmm)
|
||||||
|
|||||||
@ -37,8 +37,10 @@
|
|||||||
#include "tgl/d3drm/impl.h"
|
#include "tgl/d3drm/impl.h"
|
||||||
#include "viewmanager/viewmanager.h"
|
#include "viewmanager/viewmanager.h"
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <extensions/extensions.h>
|
#include <extensions/extensions.h>
|
||||||
#include <miniwin/miniwindevice.h>
|
#include <miniwin/miniwindevice.h>
|
||||||
|
#include <vec.h>
|
||||||
|
|
||||||
#define SDL_MAIN_USE_CALLBACKS
|
#define SDL_MAIN_USE_CALLBACKS
|
||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
@ -421,17 +423,6 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
return SDL_APP_CONTINUE;
|
return SDL_APP_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// [library:window]
|
|
||||||
// Remaining functionality to be implemented:
|
|
||||||
// WM_TIMER - use SDL_Timer functionality instead
|
|
||||||
|
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
// Workaround for the fact we are getting both mouse & touch events on mobile devices running Emscripten.
|
|
||||||
// On desktops, we are only getting mouse events, but a touch device (pen_input) may also be present...
|
|
||||||
// See: https://github.com/libsdl-org/SDL/issues/13161
|
|
||||||
static bool detectedTouchEvents = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
|
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED:
|
||||||
case SDL_EVENT_MOUSE_MOTION:
|
case SDL_EVENT_MOUSE_MOTION:
|
||||||
@ -616,11 +607,7 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
g_mouseWarped = FALSE;
|
g_mouseWarped = FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
if (detectedTouchEvents) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
g_mousemoved = TRUE;
|
g_mousemoved = TRUE;
|
||||||
|
|
||||||
if (InputManager()) {
|
if (InputManager()) {
|
||||||
@ -643,9 +630,6 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_EVENT_FINGER_MOTION: {
|
case SDL_EVENT_FINGER_MOTION: {
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
detectedTouchEvents = true;
|
|
||||||
#endif
|
|
||||||
g_mousemoved = TRUE;
|
g_mousemoved = TRUE;
|
||||||
|
|
||||||
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
||||||
@ -671,11 +655,6 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SDL_EVENT_MOUSE_BUTTON_DOWN:
|
case SDL_EVENT_MOUSE_BUTTON_DOWN:
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
if (detectedTouchEvents) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
g_mousedown = TRUE;
|
g_mousedown = TRUE;
|
||||||
|
|
||||||
if (InputManager()) {
|
if (InputManager()) {
|
||||||
@ -689,9 +668,6 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_EVENT_FINGER_DOWN: {
|
case SDL_EVENT_FINGER_DOWN: {
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
detectedTouchEvents = true;
|
|
||||||
#endif
|
|
||||||
g_mousedown = TRUE;
|
g_mousedown = TRUE;
|
||||||
|
|
||||||
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
||||||
@ -713,17 +689,6 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SDL_EVENT_MOUSE_BUTTON_UP:
|
case SDL_EVENT_MOUSE_BUTTON_UP:
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
if (detectedTouchEvents) {
|
|
||||||
// Abusing the fact (bug?) that we are always getting mouse events on Emscripten.
|
|
||||||
// This functionality should be enabled in a more general way with touch events,
|
|
||||||
// but SDL touch event's don't have a "double tap" indicator right now.
|
|
||||||
if (event->button.clicks == 2) {
|
|
||||||
InputManager()->QueueEvent(c_notificationKeyPress, SDLK_SPACE, 0, 0, SDLK_SPACE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
g_mousedown = FALSE;
|
g_mousedown = FALSE;
|
||||||
|
|
||||||
if (InputManager()) {
|
if (InputManager()) {
|
||||||
@ -737,14 +702,13 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_EVENT_FINGER_UP: {
|
case SDL_EVENT_FINGER_UP: {
|
||||||
#ifdef __EMSCRIPTEN__
|
|
||||||
detectedTouchEvents = true;
|
|
||||||
#endif
|
|
||||||
g_mousedown = FALSE;
|
g_mousedown = FALSE;
|
||||||
|
|
||||||
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
float x = SDL_clamp(event->tfinger.x, 0, 1) * g_targetWidth;
|
||||||
float y = SDL_clamp(event->tfinger.y, 0, 1) * g_targetHeight;
|
float y = SDL_clamp(event->tfinger.y, 0, 1) * g_targetHeight;
|
||||||
|
|
||||||
|
g_isle->DetectDoubleTap(event->tfinger);
|
||||||
|
|
||||||
if (InputManager()) {
|
if (InputManager()) {
|
||||||
InputManager()->HandleTouchEvent(event, g_isle->GetTouchScheme());
|
InputManager()->HandleTouchEvent(event, g_isle->GetTouchScheme());
|
||||||
InputManager()->QueueEvent(c_notificationButtonUp, 0, x, y, 0);
|
InputManager()->QueueEvent(c_notificationButtonUp, 0, x, y, 0);
|
||||||
@ -1475,3 +1439,26 @@ void IsleApp::MoveVirtualMouseViaJoystick()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IsleApp::DetectDoubleTap(const SDL_TouchFingerEvent& p_event)
|
||||||
|
{
|
||||||
|
typedef std::pair<Uint64, std::array<float, 2>> LastTap;
|
||||||
|
|
||||||
|
const MxU32 doubleTapMs = 500;
|
||||||
|
const float doubleTapDist = 0.001;
|
||||||
|
static LastTap lastTap = {0, {0, 0}};
|
||||||
|
|
||||||
|
LastTap currentTap = {p_event.timestamp, {p_event.x, p_event.y}};
|
||||||
|
if (SDL_NS_TO_MS(currentTap.first - lastTap.first) < doubleTapMs &&
|
||||||
|
DISTSQRD2(currentTap.second, lastTap.second) < doubleTapDist) {
|
||||||
|
|
||||||
|
if (InputManager()) {
|
||||||
|
InputManager()->QueueEvent(c_notificationKeyPress, SDLK_SPACE, 0, 0, SDLK_SPACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastTap = {0, {0, 0}};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lastTap = currentTap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -65,6 +65,7 @@ class IsleApp {
|
|||||||
MxResult VerifyFilesystem();
|
MxResult VerifyFilesystem();
|
||||||
void DetectGameVersion();
|
void DetectGameVersion();
|
||||||
void MoveVirtualMouseViaJoystick();
|
void MoveVirtualMouseViaJoystick();
|
||||||
|
void DetectDoubleTap(const SDL_TouchFingerEvent& p_event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char* m_hdPath; // 0x00
|
char* m_hdPath; // 0x00
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user