| @@ -1641,6 +1641,31 @@ private: | |||||
| JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher) | JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher) | ||||
| //============================================================================== | |||||
| class SimpleTimer : private Timer | |||||
| { | |||||
| public: | |||||
| SimpleTimer (int intervalMs, std::function<void()> callbackIn) | |||||
| : callback (std::move (callbackIn)) | |||||
| { | |||||
| jassert (callback); | |||||
| startTimer (intervalMs); | |||||
| } | |||||
| ~SimpleTimer() override | |||||
| { | |||||
| stopTimer(); | |||||
| } | |||||
| private: | |||||
| void timerCallback() override | |||||
| { | |||||
| callback(); | |||||
| } | |||||
| std::function<void()> callback; | |||||
| }; | |||||
| //============================================================================== | //============================================================================== | ||||
| class HWNDComponentPeer : public ComponentPeer, | class HWNDComponentPeer : public ComponentPeer, | ||||
| private VBlankListener, | private VBlankListener, | ||||
| @@ -1682,8 +1707,10 @@ public: | |||||
| return ModifierKeys::currentModifiers; | return ModifierKeys::currentModifiers; | ||||
| }; | }; | ||||
| if (updateCurrentMonitor()) | |||||
| VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); | |||||
| updateCurrentMonitorAndRefreshVBlankDispatcher(); | |||||
| if (parentToAddTo != nullptr) | |||||
| monitorUpdateTimer.emplace (1000, [this] { updateCurrentMonitorAndRefreshVBlankDispatcher(); }); | |||||
| suspendResumeRegistration = ScopedSuspendResumeNotificationRegistration { hwnd }; | suspendResumeRegistration = ScopedSuspendResumeNotificationRegistration { hwnd }; | ||||
| } | } | ||||
| @@ -3675,10 +3702,18 @@ private: | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| bool updateCurrentMonitor() | |||||
| enum class ForceRefreshDispatcher | |||||
| { | |||||
| no, | |||||
| yes | |||||
| }; | |||||
| void updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher force = ForceRefreshDispatcher::no) | |||||
| { | { | ||||
| auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL); | auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL); | ||||
| return std::exchange (currentMonitor, monitor) != monitor; | |||||
| if (std::exchange (currentMonitor, monitor) != monitor || force == ForceRefreshDispatcher::yes) | |||||
| VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); | |||||
| } | } | ||||
| bool handlePositionChanged() | bool handlePositionChanged() | ||||
| @@ -3697,9 +3732,7 @@ private: | |||||
| } | } | ||||
| handleMovedOrResized(); | handleMovedOrResized(); | ||||
| if (updateCurrentMonitor()) | |||||
| VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); | |||||
| updateCurrentMonitorAndRefreshVBlankDispatcher(); | |||||
| return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly. | return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly. | ||||
| } | } | ||||
| @@ -3857,8 +3890,7 @@ private: | |||||
| auto* dispatcher = VBlankDispatcher::getInstance(); | auto* dispatcher = VBlankDispatcher::getInstance(); | ||||
| dispatcher->reconfigureDisplays(); | dispatcher->reconfigureDisplays(); | ||||
| updateCurrentMonitor(); | |||||
| dispatcher->updateDisplay (*this, currentMonitor); | |||||
| updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher::yes); | |||||
| } | } | ||||
| //============================================================================== | //============================================================================== | ||||
| @@ -4625,6 +4657,7 @@ private: | |||||
| RectangleList<int> deferredRepaints; | RectangleList<int> deferredRepaints; | ||||
| ScopedSuspendResumeNotificationRegistration suspendResumeRegistration; | ScopedSuspendResumeNotificationRegistration suspendResumeRegistration; | ||||
| std::optional<SimpleTimer> monitorUpdateTimer; | |||||
| //============================================================================== | //============================================================================== | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer) | ||||