Remove SDL mouse/touch event bug workaround (#606)

* Remove SDL mouse/touch event bug workaround

* Small refactor

* Add include
This commit is contained in:
Christian Semmler 2025-07-14 11:51:11 -07:00 committed by GitHub
parent 996900ae9a
commit 19edb0340e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 41 deletions

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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