From b89d0837a679a05a3ac0e75a4dec8fd2de556d82 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sun, 5 Jun 2022 01:11:54 +1000 Subject: [PATCH] Qt: Avoid spamming resize events on paint This caused long freezes on Windows when you dragged the window around, because it was sending a paint event for every movement. --- pcsx2-qt/DisplayWidget.cpp | 28 ++++++++++++++++++---------- pcsx2-qt/DisplayWidget.h | 6 +++++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/pcsx2-qt/DisplayWidget.cpp b/pcsx2-qt/DisplayWidget.cpp index e2e06731cb..90a93fe524 100644 --- a/pcsx2-qt/DisplayWidget.cpp +++ b/pcsx2-qt/DisplayWidget.cpp @@ -63,15 +63,15 @@ qreal DisplayWidget::devicePixelRatioFromScreen() const int DisplayWidget::scaledWindowWidth() const { - return static_cast(std::ceil(static_cast(width()) * devicePixelRatioFromScreen())); + return std::max(static_cast(std::ceil(static_cast(width()) * devicePixelRatioFromScreen())), 1); } int DisplayWidget::scaledWindowHeight() const { - return static_cast(std::ceil(static_cast(height()) * devicePixelRatioFromScreen())); + return std::max(static_cast(std::ceil(static_cast(height()) * devicePixelRatioFromScreen())), 1); } -std::optional DisplayWidget::getWindowInfo() const +std::optional DisplayWidget::getWindowInfo() { WindowInfo wi; @@ -104,9 +104,9 @@ std::optional DisplayWidget::getWindowInfo() const } #endif - wi.surface_width = scaledWindowWidth(); - wi.surface_height = scaledWindowHeight(); - wi.surface_scale = devicePixelRatioFromScreen(); + m_last_window_width = wi.surface_width = static_cast(scaledWindowWidth()); + m_last_window_height = wi.surface_height = static_cast(scaledWindowHeight()); + m_last_window_scale = wi.surface_scale = static_cast(devicePixelRatioFromScreen()); return wi; } @@ -236,11 +236,19 @@ bool DisplayWidget::event(QEvent* event) { QWidget::event(event); - const qreal dpr = devicePixelRatioFromScreen(); - const int scaled_width = static_cast(std::ceil(static_cast(width()) * devicePixelRatioFromScreen())); - const int scaled_height = static_cast(std::ceil(static_cast(height()) * devicePixelRatioFromScreen())); + const float dpr = devicePixelRatioFromScreen(); + const u32 scaled_width = static_cast(std::max(static_cast(std::ceil(static_cast(width()) * dpr)), 1)); + const u32 scaled_height = static_cast(std::max(static_cast(std::ceil(static_cast(height()) * dpr)), 1)); + + // avoid spamming resize events for paint events (sent on move on windows) + if (m_last_window_width != scaled_width || m_last_window_height != scaled_height || m_last_window_scale != dpr) + { + m_last_window_width = scaled_width; + m_last_window_height = scaled_height; + m_last_window_scale = dpr; + emit windowResizedEvent(scaled_width, scaled_height, dpr); + } - emit windowResizedEvent(scaled_width, scaled_height, dpr); return true; } diff --git a/pcsx2-qt/DisplayWidget.h b/pcsx2-qt/DisplayWidget.h index 1df5577551..74106879c0 100644 --- a/pcsx2-qt/DisplayWidget.h +++ b/pcsx2-qt/DisplayWidget.h @@ -34,7 +34,7 @@ public: int scaledWindowHeight() const; qreal devicePixelRatioFromScreen() const; - std::optional getWindowInfo() const; + std::optional getWindowInfo(); void setRelativeMode(bool enabled); @@ -55,6 +55,10 @@ private: QPoint m_relative_mouse_last_position{}; bool m_relative_mouse_enabled = false; std::vector m_keys_pressed_with_modifiers; + + u32 m_last_window_width = 0; + u32 m_last_window_height = 0; + float m_last_window_scale = 1.0f; }; class DisplayContainer final : public QStackedWidget