From 1059f7b0225dec924ef18fd5fbef57ae7a00c89e Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 1 Dec 2021 12:46:06 +0000 Subject: [PATCH] DropShadower: Check for deletion after calling isWindowOnCurrentVirtualDesktop() --- modules/juce_gui_basics/misc/juce_DropShadower.cpp | 7 +++++++ modules/juce_gui_basics/misc/juce_DropShadower.h | 1 + 2 files changed, 8 insertions(+) diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.cpp b/modules/juce_gui_basics/misc/juce_DropShadower.cpp index c98c4b7939..cbd05cc7f0 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.cpp +++ b/modules/juce_gui_basics/misc/juce_DropShadower.cpp @@ -157,9 +157,16 @@ private: void timerCallback() override { + WeakReference deletionChecker { static_cast (listener) }; + const auto wasOnVirtualDesktop = std::exchange (isOnVirtualDesktop, isWindowOnCurrentVirtualDesktop (root->getWindowHandle())); + // on Windows, isWindowOnCurrentVirtualDesktop() may cause synchronous messages to be dispatched + // to the HWND so we need to check if the shadower is still valid after calling + if (deletionChecker == nullptr) + return; + if (isOnVirtualDesktop != wasOnVirtualDesktop) listener->componentVisibilityChanged (*root); } diff --git a/modules/juce_gui_basics/misc/juce_DropShadower.h b/modules/juce_gui_basics/misc/juce_DropShadower.h index a142bd3bcd..38babb5a30 100644 --- a/modules/juce_gui_basics/misc/juce_DropShadower.h +++ b/modules/juce_gui_basics/misc/juce_DropShadower.h @@ -79,6 +79,7 @@ private: std::unique_ptr visibilityChangedListener; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DropShadower) + JUCE_DECLARE_WEAK_REFERENCEABLE (DropShadower) }; } // namespace juce