From 0cbd8842342050cb321c5864292579800a3fac05 Mon Sep 17 00:00:00 2001 From: GovanifY Date: Sun, 30 Nov 2025 00:17:05 +0100 Subject: [PATCH] Qt: delay resize events using a timer (#13614) --- pcsx2-qt/DisplayWidget.cpp | 19 ++++++++++++++++++- pcsx2-qt/DisplayWidget.h | 9 +++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pcsx2-qt/DisplayWidget.cpp b/pcsx2-qt/DisplayWidget.cpp index 6186af87ee..7cffdffcd8 100644 --- a/pcsx2-qt/DisplayWidget.cpp +++ b/pcsx2-qt/DisplayWidget.cpp @@ -13,6 +13,7 @@ #include "common/Console.h" #include +#include #include #include #include @@ -32,6 +33,10 @@ DisplaySurface::DisplaySurface() : QWindow() { + m_resize_debounce_timer = new QTimer(this); + m_resize_debounce_timer->setSingleShot(true); + m_resize_debounce_timer->setTimerType(Qt::PreciseTimer); + connect(m_resize_debounce_timer, &QTimer::timeout, this, &DisplaySurface::onResizeDebounceTimer); } DisplaySurface::~DisplaySurface() @@ -245,6 +250,11 @@ void DisplaySurface::handleKeyInputEvent(QEvent* event) } } +void DisplaySurface::onResizeDebounceTimer() +{ + emit windowResizedEvent(m_pending_window_width, m_pending_window_height, m_pending_window_scale); +} + bool DisplaySurface::event(QEvent* event) { switch (event->type()) @@ -355,10 +365,17 @@ bool DisplaySurface::event(QEvent* event) // 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_pending_window_width = scaled_width; + m_pending_window_height = scaled_height; + m_pending_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); + // qt spams resize events, sometimes several time per ms. + // since a vulkan resize swap chain event takes between 15 to 25ms this is, + // need less to say, unwanted. + m_resize_debounce_timer->start(100); } updateCenterPos(); diff --git a/pcsx2-qt/DisplayWidget.h b/pcsx2-qt/DisplayWidget.h index 2dc1149957..00ec2789b6 100644 --- a/pcsx2-qt/DisplayWidget.h +++ b/pcsx2-qt/DisplayWidget.h @@ -3,6 +3,7 @@ #pragma once #include "common/WindowInfo.h" +#include #include #include #include @@ -42,6 +43,9 @@ protected: bool event(QEvent* event) override; bool eventFilter(QObject* object, QEvent* event) override; +private Q_SLOTS: + void onResizeDebounceTimer(); + private: bool isActuallyFullscreen() const; void updateCenterPos(); @@ -60,5 +64,10 @@ private: u32 m_last_window_height = 0; float m_last_window_scale = 1.0f; + QTimer* m_resize_debounce_timer = nullptr; + u32 m_pending_window_width = 0; + u32 m_pending_window_height = 0; + float m_pending_window_scale = 1.0f; + QWidget* m_container = nullptr; };