diff options
author | Jungi Byun <jungi.byun@lge.com> | 2022-03-24 12:09:39 +0900 |
---|---|---|
committer | Elvis Lee <kwangwoong.lee@lge.com> | 2022-03-31 07:44:20 +0000 |
commit | 156674e10278ac218bdb766be90109b74e584760 (patch) | |
tree | e0ddbec34b0b3e8a9b731b1718a65f4131b5ab80 /src | |
parent | d607f2ac5760044aba3c9ee5e77f76ebe8420a86 (diff) | |
download | qtwayland-156674e10278ac218bdb766be90109b74e584760.tar.gz |
Fix to have presentation feedback sequence timely
In the case connections in PresentationFeedback are QueuedConnection,
there are sometimes a signal to be connected is emitted before creating
another connection on the signal from the connection's slot method, and
this makes wrong feedbacks.
In order to send proper feedbacks to clients, create related connection
earlier and make to work properly by checking some conditions.
Pick-to: 6.3
Change-Id: Ic8f02139ca08713c419b0341b9a1e8add6f5a095
Reviewed-by: Elvis Lee <kwangwoong.lee@lge.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/compositor/extensions/qwaylandpresentationtime.cpp | 9 | ||||
-rw-r--r-- | src/compositor/extensions/qwaylandpresentationtime_p_p.h | 1 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/compositor/extensions/qwaylandpresentationtime.cpp b/src/compositor/extensions/qwaylandpresentationtime.cpp index 81bed5e8..b17fb597 100644 --- a/src/compositor/extensions/qwaylandpresentationtime.cpp +++ b/src/compositor/extensions/qwaylandpresentationtime.cpp @@ -266,6 +266,7 @@ void PresentationFeedback::connectToWindow(QQuickWindow *window) m_connectedWindow = window; connect(window, &QQuickWindow::beforeSynchronizing, this, &PresentationFeedback::onSync); + connect(window, &QQuickWindow::afterFrameEnd, this, &PresentationFeedback::onSwapped); } void PresentationFeedback::onSync() @@ -275,7 +276,7 @@ void PresentationFeedback::onSync() if (m_committed) { disconnect(m_surface, &QWaylandSurface::damaged, this, &PresentationFeedback::onSurfaceCommit); disconnect(window, &QQuickWindow::beforeSynchronizing, this, &PresentationFeedback::onSync); - connect(window, &QQuickWindow::afterFrameEnd, this, &PresentationFeedback::onSwapped); + m_sync = true; } } @@ -283,8 +284,10 @@ void PresentationFeedback::onSwapped() { QQuickWindow *window = qobject_cast<QQuickWindow *>(sender()); - disconnect(window, &QQuickWindow::afterFrameEnd, this, &PresentationFeedback::onSwapped); - connect(m_presentationTime, &QWaylandPresentationTime::presented, this, &PresentationFeedback::sendPresented); + if (m_sync) { + disconnect(window, &QQuickWindow::afterFrameEnd, this, &PresentationFeedback::onSwapped); + connect(m_presentationTime, &QWaylandPresentationTime::presented, this, &PresentationFeedback::sendPresented); + } } void PresentationFeedback::discard() diff --git a/src/compositor/extensions/qwaylandpresentationtime_p_p.h b/src/compositor/extensions/qwaylandpresentationtime_p_p.h index 7f984958..fc56a048 100644 --- a/src/compositor/extensions/qwaylandpresentationtime_p_p.h +++ b/src/compositor/extensions/qwaylandpresentationtime_p_p.h @@ -89,6 +89,7 @@ public: QQuickWindow *m_connectedWindow = nullptr; bool m_committed = false; + bool m_sync = false; }; class QWaylandPresentationTimePrivate : public QWaylandCompositorExtensionPrivate, public QtWaylandServer::wp_presentation |