mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Windows: Use timer to update VBlank registration for embedded HWNDComponentPeer
This commit is contained in:
parent
b5c775210f
commit
a93d0a7ed0
1 changed files with 42 additions and 9 deletions
|
|
@ -1641,6 +1641,31 @@ private:
|
|||
|
||||
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,
|
||||
private VBlankListener,
|
||||
|
|
@ -1682,8 +1707,10 @@ public:
|
|||
return ModifierKeys::currentModifiers;
|
||||
};
|
||||
|
||||
if (updateCurrentMonitor())
|
||||
VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor);
|
||||
updateCurrentMonitorAndRefreshVBlankDispatcher();
|
||||
|
||||
if (parentToAddTo != nullptr)
|
||||
monitorUpdateTimer.emplace (1000, [this] { updateCurrentMonitorAndRefreshVBlankDispatcher(); });
|
||||
|
||||
suspendResumeRegistration = ScopedSuspendResumeNotificationRegistration { hwnd };
|
||||
}
|
||||
|
|
@ -3675,10 +3702,18 @@ private:
|
|||
return 0;
|
||||
}
|
||||
|
||||
bool updateCurrentMonitor()
|
||||
enum class ForceRefreshDispatcher
|
||||
{
|
||||
no,
|
||||
yes
|
||||
};
|
||||
|
||||
void updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher force = ForceRefreshDispatcher::no)
|
||||
{
|
||||
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()
|
||||
|
|
@ -3697,9 +3732,7 @@ private:
|
|||
}
|
||||
|
||||
handleMovedOrResized();
|
||||
|
||||
if (updateCurrentMonitor())
|
||||
VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor);
|
||||
updateCurrentMonitorAndRefreshVBlankDispatcher();
|
||||
|
||||
return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly.
|
||||
}
|
||||
|
|
@ -3857,8 +3890,7 @@ private:
|
|||
|
||||
auto* dispatcher = VBlankDispatcher::getInstance();
|
||||
dispatcher->reconfigureDisplays();
|
||||
updateCurrentMonitor();
|
||||
dispatcher->updateDisplay (*this, currentMonitor);
|
||||
updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher::yes);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -4625,6 +4657,7 @@ private:
|
|||
|
||||
RectangleList<int> deferredRepaints;
|
||||
ScopedSuspendResumeNotificationRegistration suspendResumeRegistration;
|
||||
std::optional<SimpleTimer> monitorUpdateTimer;
|
||||
|
||||
//==============================================================================
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue