Qt: Respond to QScreen refresh rate changes

pull/3706/head
Stenzek 4 months ago
parent 7485d7ce8c
commit 125c3ec70f
No known key found for this signature in database

@ -51,7 +51,7 @@ DisplayWidget::DisplayWidget(QWidget* parent) : QWidget(parent)
DisplayWidget::~DisplayWidget() = default;
void DisplayWidget::registerScreenChangeEvent()
void DisplayWidget::connectScreenChangedEvent()
{
DebugAssert(!m_screen_change_registered);
@ -60,9 +60,36 @@ void DisplayWidget::registerScreenChangeEvent()
parent_widget = this;
QWindow* parent_window_handle = parent_widget->windowHandle();
if (parent_window_handle)
connect(parent_window_handle, &QWindow::screenChanged, this, [this]() { checkForSizeChange(true); });
connect(parent_window_handle, &QWindow::screenChanged, this, &DisplayWidget::onScreenChanged);
m_screen_change_registered = true;
connectScreenRefreshRateChangedEvent();
}
void DisplayWidget::connectScreenRefreshRateChangedEvent()
{
if (m_screen_refresh_rate_changed_connection)
{
disconnect(m_screen_refresh_rate_changed_connection);
m_screen_refresh_rate_changed_connection = {};
}
if (QScreen* const widget_screen = screen())
{
m_screen_refresh_rate_changed_connection =
connect(widget_screen, &QScreen::refreshRateChanged, this, &DisplayWidget::onScreenRefreshRateChanged);
}
}
void DisplayWidget::onScreenChanged()
{
connectScreenRefreshRateChangedEvent();
checkForSizeChange(true);
}
void DisplayWidget::onScreenRefreshRateChanged()
{
checkForSizeChange(true);
}
const std::optional<WindowInfo>& DisplayWidget::getWindowInfo(RenderAPI render_api, Error* error)
@ -72,7 +99,7 @@ const std::optional<WindowInfo>& DisplayWidget::getWindowInfo(RenderAPI render_a
m_window_info = QtUtils::GetWindowInfoForWidget(this, render_api, error);
if (m_window_info.has_value() && !m_screen_change_registered)
registerScreenChangeEvent();
connectScreenChangedEvent();
}
m_render_api = m_window_info.has_value() ? render_api : RenderAPI::None;

@ -56,7 +56,10 @@ protected:
bool event(QEvent* event) override;
private:
void registerScreenChangeEvent();
void connectScreenChangedEvent();
void connectScreenRefreshRateChangedEvent();
void onScreenChanged();
void onScreenRefreshRateChanged();
bool isActuallyFullscreen() const;
void updateCenterPos();
@ -76,6 +79,7 @@ private:
RenderAPI m_render_api = RenderAPI::None;
std::optional<WindowInfo> m_window_info;
QMetaObject::Connection m_screen_refresh_rate_changed_connection;
const char* m_window_position_key = nullptr;
};

Loading…
Cancel
Save