From c19cd733067213516928b0584a7204a2cc3d9f88 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 14 May 2021 15:44:27 +0100 Subject: [PATCH] HWNDComponentPeer: Avoid dismissing modals from peer-initiated messages --- .../native/juce_win32_Windowing.cpp | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 016da69dc2..bcb425d28f 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -1427,6 +1427,8 @@ public: void setVisible (bool shouldBeVisible) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + ShowWindow (hwnd, shouldBeVisible ? SW_SHOWNA : SW_HIDE); if (shouldBeVisible) @@ -1468,6 +1470,8 @@ public: void setBounds (const Rectangle& bounds, bool isNowFullScreen) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + fullScreen = isNowFullScreen; auto newBounds = windowBorder.addedTo (bounds); @@ -1534,6 +1538,8 @@ public: void setAlpha (float newAlpha) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + auto intAlpha = (uint8) jlimit (0, 255, (int) (newAlpha * 255.0f)); if (component.isOpaque()) @@ -1558,6 +1564,8 @@ public: void setMinimised (bool shouldBeMinimised) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + if (shouldBeMinimised != isMinimised()) ShowWindow (hwnd, shouldBeMinimised ? SW_MINIMIZE : SW_SHOWNORMAL); } @@ -1573,6 +1581,8 @@ public: void setFullScreen (bool shouldBeFullScreen) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + setMinimised (false); if (isFullScreen() != shouldBeFullScreen) @@ -1656,6 +1666,8 @@ public: void toFront (bool makeActive) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + setMinimised (false); const bool oldDeactivate = shouldDeactivateTitleBar; @@ -1674,6 +1686,8 @@ public: void toBehind (ComponentPeer* other) override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + if (auto* otherPeer = dynamic_cast (other)) { setMinimised (false); @@ -1698,6 +1712,8 @@ public: void grabFocus() override { + const ScopedValueSetter scope (shouldIgnoreModalDismiss, true); + const bool oldDeactivate = shouldDeactivateTitleBar; shouldDeactivateTitleBar = ((styleFlags & windowIsTemporary) == 0); @@ -4181,7 +4197,10 @@ private: void windowShouldDismissModals (HWND originator) { - if (component.isShowing() && isAncestor (originator, hwnd)) + if (shouldIgnoreModalDismiss) + return; + + if (isAncestor (originator, hwnd)) sendInputAttemptWhenModalMessage(); } @@ -4249,6 +4268,7 @@ private: SharedResourcePointer modalDismissBroadcaster; IMEHandler imeHandler; + bool shouldIgnoreModalDismiss = false; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer)