Skip to content

Commit 125c3ec

Browse files
committed
Qt: Respond to QScreen refresh rate changes
1 parent 7485d7c commit 125c3ec

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/duckstation-qt/displaywidget.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ DisplayWidget::DisplayWidget(QWidget* parent) : QWidget(parent)
5151

5252
DisplayWidget::~DisplayWidget() = default;
5353

54-
void DisplayWidget::registerScreenChangeEvent()
54+
void DisplayWidget::connectScreenChangedEvent()
5555
{
5656
DebugAssert(!m_screen_change_registered);
5757

@@ -60,9 +60,36 @@ void DisplayWidget::registerScreenChangeEvent()
6060
parent_widget = this;
6161
QWindow* parent_window_handle = parent_widget->windowHandle();
6262
if (parent_window_handle)
63-
connect(parent_window_handle, &QWindow::screenChanged, this, [this]() { checkForSizeChange(true); });
63+
connect(parent_window_handle, &QWindow::screenChanged, this, &DisplayWidget::onScreenChanged);
6464

6565
m_screen_change_registered = true;
66+
connectScreenRefreshRateChangedEvent();
67+
}
68+
69+
void DisplayWidget::connectScreenRefreshRateChangedEvent()
70+
{
71+
if (m_screen_refresh_rate_changed_connection)
72+
{
73+
disconnect(m_screen_refresh_rate_changed_connection);
74+
m_screen_refresh_rate_changed_connection = {};
75+
}
76+
77+
if (QScreen* const widget_screen = screen())
78+
{
79+
m_screen_refresh_rate_changed_connection =
80+
connect(widget_screen, &QScreen::refreshRateChanged, this, &DisplayWidget::onScreenRefreshRateChanged);
81+
}
82+
}
83+
84+
void DisplayWidget::onScreenChanged()
85+
{
86+
connectScreenRefreshRateChangedEvent();
87+
checkForSizeChange(true);
88+
}
89+
90+
void DisplayWidget::onScreenRefreshRateChanged()
91+
{
92+
checkForSizeChange(true);
6693
}
6794

6895
const std::optional<WindowInfo>& DisplayWidget::getWindowInfo(RenderAPI render_api, Error* error)
@@ -72,7 +99,7 @@ const std::optional<WindowInfo>& DisplayWidget::getWindowInfo(RenderAPI render_a
7299
m_window_info = QtUtils::GetWindowInfoForWidget(this, render_api, error);
73100

74101
if (m_window_info.has_value() && !m_screen_change_registered)
75-
registerScreenChangeEvent();
102+
connectScreenChangedEvent();
76103
}
77104

78105
m_render_api = m_window_info.has_value() ? render_api : RenderAPI::None;

src/duckstation-qt/displaywidget.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ class DisplayWidget final : public QWidget
5656
bool event(QEvent* event) override;
5757

5858
private:
59-
void registerScreenChangeEvent();
59+
void connectScreenChangedEvent();
60+
void connectScreenRefreshRateChangedEvent();
61+
void onScreenChanged();
62+
void onScreenRefreshRateChanged();
6063
bool isActuallyFullscreen() const;
6164
void updateCenterPos();
6265

@@ -76,6 +79,7 @@ class DisplayWidget final : public QWidget
7679
RenderAPI m_render_api = RenderAPI::None;
7780
std::optional<WindowInfo> m_window_info;
7881

82+
QMetaObject::Connection m_screen_refresh_rate_changed_connection;
7983
const char* m_window_position_key = nullptr;
8084
};
8185

0 commit comments

Comments
 (0)