From 70da7e89bb205aaac9680802e07d9be06fa62f38 Mon Sep 17 00:00:00 2001 From: HanifKoh <76276251+HanifKoh@users.noreply.github.com> Date: Sun, 11 Oct 2026 15:49:04 +0800 Subject: [PATCH] Release the Slice Button's Mouse Capture When a Press Loses Its Release (#16358) --- src/slic3r/GUI/Widgets/SideButton.cpp | 15 +++++++++++++-- src/slic3r/GUI/Widgets/SideButton.hpp | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Widgets/SideButton.cpp b/src/slic3r/GUI/Widgets/SideButton.cpp index 7e0d2f2472..0426fe2255 100644 --- a/src/slic3r/GUI/Widgets/SideButton.cpp +++ b/src/slic3r/GUI/Widgets/SideButton.cpp @@ -17,6 +17,7 @@ BEGIN_EVENT_TABLE(SideButton, wxWindow) EVT_LEFT_DOWN(SideButton::mouseDown) EVT_LEFT_UP(SideButton::mouseReleased) +EVT_MOUSE_CAPTURE_LOST(SideButton::mouseCaptureLost) EVT_PAINT(SideButton::paintEvent) END_EVENT_TABLE() @@ -331,20 +332,30 @@ void SideButton::mouseDown(wxMouseEvent& event) event.Skip(); pressedDown = true; SetFocus(); - CaptureMouse(); + // Capturing twice pushes this button onto the capture stack twice, and the + // release would then hand the capture straight back to it. + if (!HasCapture()) + CaptureMouse(); } void SideButton::mouseReleased(wxMouseEvent& event) { event.Skip(); + // A press whose release went elsewhere still holds the capture. + if (HasCapture()) + ReleaseMouse(); if (pressedDown) { pressedDown = false; - ReleaseMouse(); if (wxRect({0, 0}, GetSize()).Contains(event.GetPosition())) sendButtonEvent(); } } +void SideButton::mouseCaptureLost(wxMouseCaptureLostEvent&) +{ + pressedDown = false; +} + void SideButton::sendButtonEvent() { wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); diff --git a/src/slic3r/GUI/Widgets/SideButton.hpp b/src/slic3r/GUI/Widgets/SideButton.hpp index fb202df7fa..db0ffa16a1 100644 --- a/src/slic3r/GUI/Widgets/SideButton.hpp +++ b/src/slic3r/GUI/Widgets/SideButton.hpp @@ -94,6 +94,7 @@ private: void mouseDown(wxMouseEvent& event); void mouseReleased(wxMouseEvent& event); + void mouseCaptureLost(wxMouseCaptureLostEvent& event); void sendButtonEvent();