Fix mouse hover in SDL builds

This commit is contained in:
Henrik Rydgård 2024-11-06 22:09:53 +01:00
parent dff7f5704a
commit f0ae048d21
3 changed files with 16 additions and 11 deletions

View File

@ -195,7 +195,11 @@ static void UpdateScreenDPI(SDL_Window *window) {
SDL_GL_GetDrawableSize(window, &drawable_width, NULL); SDL_GL_GetDrawableSize(window, &drawable_width, NULL);
else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN) else if (g_Config.iGPUBackend == (int)GPUBackend::VULKAN)
SDL_Vulkan_GetDrawableSize(window, &drawable_width, NULL); SDL_Vulkan_GetDrawableSize(window, &drawable_width, NULL);
else {
// If we add SDL support for more platforms, we'll end up here.
g_DesktopDPI = 1.0f;
return;
}
// Round up a little otherwise there would be a gap sometimes // Round up a little otherwise there would be a gap sometimes
// in fractional scaling // in fractional scaling
g_DesktopDPI = ((float) drawable_width + 1.0f) / window_width; g_DesktopDPI = ((float) drawable_width + 1.0f) / window_width;
@ -729,7 +733,7 @@ struct InputStateTracker {
} }
} }
bool mouseDown; int mouseDown; // bitflags
bool mouseCaptured; bool mouseCaptured;
}; };
@ -943,7 +947,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
switch (event.button.button) { switch (event.button.button) {
case SDL_BUTTON_LEFT: case SDL_BUTTON_LEFT:
{ {
inputTracker->mouseDown = true; inputTracker->mouseDown |= 1;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -957,6 +961,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
case SDL_BUTTON_RIGHT: case SDL_BUTTON_RIGHT:
{ {
inputTracker->mouseDown |= 2;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -1018,21 +1023,22 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
} }
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
if (inputTracker->mouseDown) { {
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
input.flags = TOUCH_MOVE | TOUCH_MOUSE; input.flags = TOUCH_MOVE | TOUCH_MOUSE;
input.buttons = inputTracker->mouseDown;
input.id = 0; input.id = 0;
NativeTouch(input); NativeTouch(input);
NativeMouseDelta(event.motion.xrel, event.motion.yrel);
break;
} }
NativeMouseDelta(event.motion.xrel, event.motion.yrel);
break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
switch (event.button.button) { switch (event.button.button) {
case SDL_BUTTON_LEFT: case SDL_BUTTON_LEFT:
{ {
inputTracker->mouseDown = false; inputTracker->mouseDown &= ~1;
TouchInput input{}; TouchInput input{};
input.x = mx; input.x = mx;
input.y = my; input.y = my;
@ -1045,6 +1051,7 @@ static void ProcessSDLEvent(SDL_Window *window, const SDL_Event &event, InputSta
break; break;
case SDL_BUTTON_RIGHT: case SDL_BUTTON_RIGHT:
{ {
inputTracker->mouseDown &= ~2;
// Right button only emits mouse move events. This is weird, // Right button only emits mouse move events. This is weird,
// but consistent with Windows. Needs cleanup. // but consistent with Windows. Needs cleanup.
TouchInput input{}; TouchInput input{};

View File

@ -46,8 +46,6 @@ public:
// This can be called on a thread. // This can be called on a thread.
void LoadSamplesOnThread(); void LoadSamplesOnThread();
private: private:
bool samplesLoaded_ = false;
std::mutex mutex_; std::mutex mutex_;
std::vector<PlayInstance> queue_; std::vector<PlayInstance> queue_;
std::vector<PlayInstance> plays_; std::vector<PlayInstance> plays_;

View File

@ -1149,8 +1149,8 @@ void TouchTestScreen::touch(const TouchInput &touch) {
found = true; found = true;
} }
} }
if (!found) { if (!found && touch.buttons) {
WARN_LOG(Log::System, "Move without touch down: %d", touch.id); WARN_LOG(Log::System, "Move with buttons %d without touch down: %d", touch.buttons, touch.id);
} }
} }
if (touch.flags & TOUCH_UP) { if (touch.flags & TOUCH_UP) {