From 153cc2133e27a14c10973660977825486a25793b Mon Sep 17 00:00:00 2001 From: oznogon Date: Thu, 26 Mar 2026 18:06:57 -0700 Subject: [PATCH 1/2] Release mouse buttons on window focus loss --- src/windowManager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/windowManager.cpp b/src/windowManager.cpp index e8d3f55e..6bac45d8 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -500,6 +500,15 @@ void Window::handleEvent(const SDL_Event& event) render_chain->onPointerLeave(-1); } break; + case SDL_WINDOWEVENT_FOCUS_LOST: + if (mouse_button_down_mask) + { + mouse_button_down_mask = 0; + int mx, my; + SDL_GetMouseState(&mx, &my); + render_chain->onPointerUp(mapPixelToCoords({mx, my}), sp::io::Pointer::mouse); + } + break; case SDL_WINDOWEVENT_CLOSE: //close(); break; From d2a15674b981dcb7ab1da23b2200b3a7beb6e6d2 Mon Sep 17 00:00:00 2001 From: oznogon Date: Thu, 26 Mar 2026 18:07:31 -0700 Subject: [PATCH 2/2] Always release button on SDL_MOUSEBUTTONUP Upon SDL_MOUSEBUTTONUP, WindowManager sends onPointerUp down the render chain only if no buttons are held down. This prevents onPointerUp from being passed if one is released while multiple buttons are held down. For instance, if left and right are held down together, and left is released while right remains down, no mouse-up event is sent for the left mouse button. Always send onPointerUp on any SDL_MOUSEBUTTONUP. --- src/windowManager.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/windowManager.cpp b/src/windowManager.cpp index 6bac45d8..ae164c14 100644 --- a/src/windowManager.cpp +++ b/src/windowManager.cpp @@ -349,11 +349,9 @@ void Window::handleEvent(const SDL_Event& event) break; case SDL_MOUSEBUTTONUP: mouse_button_down_mask &=~(1 << int(event.button.button)); + render_chain->onPointerUp(mapPixelToCoords({event.button.x, event.button.y}), sp::io::Pointer::mouse); if (!mouse_button_down_mask) - { - render_chain->onPointerUp(mapPixelToCoords({event.button.x, event.button.y}), sp::io::Pointer::mouse); render_chain->onPointerMove(mapPixelToCoords({event.button.x, event.button.y}), sp::io::Pointer::mouse); - } break; case SDL_MOUSEWHEEL: render_chain->onMouseWheelScroll(mapPixelToCoords({event.wheel.mouseX, event.wheel.mouseY}), event.wheel.preciseY);