diff --git a/.gitignore b/.gitignore index e19f73c..53f6155 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/qtwayland-everywhere-src-5.12.5.tar.xz +SOURCES/qtwayland-everywhere-src-5.15.2.tar.xz diff --git a/.qt5-qtwayland.metadata b/.qt5-qtwayland.metadata index a97d8d2..1c7bc39 100644 --- a/.qt5-qtwayland.metadata +++ b/.qt5-qtwayland.metadata @@ -1 +1 @@ -73ba627ea857598e733721a5a74ef1ff01e88d0b SOURCES/qtwayland-everywhere-src-5.12.5.tar.xz +b547a38762ca6ef6d14545b4d51aabbcf06cc17e SOURCES/qtwayland-everywhere-src-5.15.2.tar.xz diff --git a/SOURCES/qtwayland-do-not-redraw-decorations-everytime.patch b/SOURCES/qtwayland-do-not-redraw-decorations-everytime.patch deleted file mode 100644 index b5a684e..0000000 --- a/SOURCES/qtwayland-do-not-redraw-decorations-everytime.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git a/src/client/qwaylandshmbackingstore.cpp b/src/client/qwaylandshmbackingstore.cpp -index 3fe2ce80..6d660e64 100644 ---- a/src/client/qwaylandshmbackingstore.cpp -+++ b/src/client/qwaylandshmbackingstore.cpp -@@ -289,11 +289,13 @@ void QWaylandShmBackingStore::resize(const QSize &size) - buffer = getBuffer(sizeWithMargins); - } - -- qsizetype oldSize = mBackBuffer ? mBackBuffer->image()->sizeInBytes() : 0; -+ qsizetype oldSizeInBytes = mBackBuffer ? mBackBuffer->image()->sizeInBytes() : 0; -+ qsizetype newSizeInBytes = buffer->image()->sizeInBytes(); -+ - // mBackBuffer may have been deleted here but if so it means its size was different so we wouldn't copy it anyway -- if (mBackBuffer != buffer && oldSize == buffer->image()->sizeInBytes()) { -- memcpy(buffer->image()->bits(), mBackBuffer->image()->constBits(), buffer->image()->sizeInBytes()); -- } -+ if (mBackBuffer != buffer && oldSizeInBytes == newSizeInBytes) -+ memcpy(buffer->image()->bits(), mBackBuffer->image()->constBits(), newSizeInBytes); -+ - mBackBuffer = buffer; - // ensure the new buffer is at the beginning of the list so next time getBuffer() will pick - // it if possible -@@ -302,8 +304,9 @@ void QWaylandShmBackingStore::resize(const QSize &size) - mBuffers.prepend(buffer); - } - -- if (windowDecoration() && window()->isVisible()) -+ if (windowDecoration() && window()->isVisible() && oldSizeInBytes != newSizeInBytes) { - windowDecoration()->update(); -+ } - } - - QImage *QWaylandShmBackingStore::entireSurface() const diff --git a/SOURCES/qtwayland-fix-100ms-freeze-when-apps-dont-swap-after-deliverupdaterequest.patch b/SOURCES/qtwayland-fix-100ms-freeze-when-apps-dont-swap-after-deliverupdaterequest.patch deleted file mode 100644 index ff4040f..0000000 --- a/SOURCES/qtwayland-fix-100ms-freeze-when-apps-dont-swap-after-deliverupdaterequest.patch +++ /dev/null @@ -1,127 +0,0 @@ -From 9f5b96225885f927727a57b6123d8550d6c373bb Mon Sep 17 00:00:00 2001 -From: Johan Klokkhammer Helsing -Date: Tue, 15 Oct 2019 09:51:43 +0200 -Subject: [PATCH] Client: Fix 100ms freeze when applications do not swap after deliverUpdateRequest - -[ChangeLog][QPA plugin] Fixed a 100 ms freeze that would occur if applications -did not draw after receiving a deliverUpdateRequest(). - -QtQuick does this at the start of animations. This should get rid of those -backingstore warnings (and also remove a 100ms freeze before animations start -in those instances). - -Fixes: QTBUG-76813 -Change-Id: Id366bf4a14f402fa44530ae46e7b66d9988c14f6 -Reviewed-by: Paul Olav Tvete -Reviewed-by: John Brooks ---- - -diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp -index ae26ba0..8d34afd 100644 ---- a/src/client/qwaylandwindow.cpp -+++ b/src/client/qwaylandwindow.cpp -@@ -1105,25 +1105,6 @@ - - void QWaylandWindow::timerEvent(QTimerEvent *event) - { -- if (event->timerId() == mFallbackUpdateTimerId) { -- killTimer(mFallbackUpdateTimerId); -- mFallbackUpdateTimerId = -1; -- qCDebug(lcWaylandBackingstore) << "mFallbackUpdateTimer timed out"; -- -- if (!isExposed()) { -- qCDebug(lcWaylandBackingstore) << "Fallback update timer: Window not exposed," -- << "not delivering update request."; -- return; -- } -- -- if (mWaitingForUpdate && hasPendingUpdateRequest() && !mWaitingForFrameCallback) { -- qCWarning(lcWaylandBackingstore) << "Delivering update request through fallback timer," -- << "may not be in sync with display"; -- deliverUpdateRequest(); -- } -- } -- -- - if (mFrameCallbackTimerId.testAndSetOrdered(event->timerId(), -1)) { - killTimer(event->timerId()); - qCDebug(lcWaylandBackingstore) << "Didn't receive frame callback in time, window should now be inexposed"; -@@ -1135,6 +1116,7 @@ - - void QWaylandWindow::requestUpdate() - { -+ qCDebug(lcWaylandBackingstore) << "requestUpdate"; - Q_ASSERT(hasPendingUpdateRequest()); // should be set by QPA - - // If we have a frame callback all is good and will be taken care of there -@@ -1142,20 +1124,17 @@ - return; - - // If we've already called deliverUpdateRequest(), but haven't seen any attach+commit/swap yet -- if (mWaitingForUpdate) { -- // Ideally, we should just have returned here, but we're not guaranteed that the client -- // will actually update, so start this timer to deliver another request update after a while -- // *IF* the client doesn't update. -- int fallbackTimeout = 100; -- mFallbackUpdateTimerId = startTimer(fallbackTimeout); -- return; -- } -+ // This is a somewhat redundant behavior and might indicate a bug in the calling code, so log -+ // here so we can get this information when debugging update/frame callback issues. -+ // Continue as nothing happened, though. -+ if (mWaitingForUpdate) -+ qCDebug(lcWaylandBackingstore) << "requestUpdate called twice without committing anything"; - - // Some applications (such as Qt Quick) depend on updates being delivered asynchronously, - // so use invokeMethod to delay the delivery a bit. - QMetaObject::invokeMethod(this, [this] { - // Things might have changed in the meantime -- if (hasPendingUpdateRequest() && !mWaitingForUpdate && !mWaitingForFrameCallback) -+ if (hasPendingUpdateRequest() && !mWaitingForFrameCallback) - deliverUpdateRequest(); - }, Qt::QueuedConnection); - } -@@ -1165,6 +1144,7 @@ - // Can be called from the render thread (without locking anything) so make sure to not make races in this method. - void QWaylandWindow::handleUpdate() - { -+ qCDebug(lcWaylandBackingstore) << "handleUpdate" << QThread::currentThread(); - // TODO: Should sync subsurfaces avoid requesting frame callbacks? - QReadLocker lock(&mSurfaceLock); - if (!isInitialized()) -@@ -1175,15 +1155,6 @@ - mFrameCallback = nullptr; - } - -- if (mFallbackUpdateTimerId != -1) { -- // Ideally, we would stop the fallback timer here, but since we're on another thread, -- // it's not allowed. Instead we set mFallbackUpdateTimer to -1 here, so we'll just -- // ignore it if it times out before it's cleaned up by the invokeMethod call. -- int id = mFallbackUpdateTimerId; -- mFallbackUpdateTimerId = -1; -- QMetaObject::invokeMethod(this, [this, id] { killTimer(id); }, Qt::QueuedConnection); -- } -- - mFrameCallback = frame(); - wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this); - mWaitingForFrameCallback = true; -@@ -1203,6 +1174,7 @@ - - void QWaylandWindow::deliverUpdateRequest() - { -+ qCDebug(lcWaylandBackingstore) << "deliverUpdateRequest"; - mWaitingForUpdate = true; - QPlatformWindow::deliverUpdateRequest(); - } -diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h -index b03d92e..e4a1124 100644 ---- a/src/client/qwaylandwindow_p.h -+++ b/src/client/qwaylandwindow_p.h -@@ -232,7 +232,6 @@ - - // True when we have called deliverRequestUpdate, but the client has not yet attached a new buffer - bool mWaitingForUpdate = false; -- int mFallbackUpdateTimerId = -1; // Started when waiting for app to commit - - QMutex mResizeLock; - bool mWaitingToApplyConfigure = false; diff --git a/SOURCES/qtwayland-fix-issue-with-repeated-window-size-changes.patch b/SOURCES/qtwayland-fix-issue-with-repeated-window-size-changes.patch new file mode 100644 index 0000000..7e6dee7 --- /dev/null +++ b/SOURCES/qtwayland-fix-issue-with-repeated-window-size-changes.patch @@ -0,0 +1,54 @@ +From 14d066c61025e548227ccd8d655e80ffa31fa15e Mon Sep 17 00:00:00 2001 +From: Jaeyoon Jung +Date: Mon, 15 Feb 2021 08:31:06 +0900 +Subject: [PATCH] Fix issue with repeated window size changes + +Check if the new window size is different from the size requested +previously before calling wl_egl_window_resize. It addresses the issue +where repeated setGeometry calls between two sizes might not work as +expected. The problem occurs when wl_egl_window_get_attached_size does +not get the same size that was requested by the previous setGeometry +call. If the returned size happened to match the new size instead, +we would mistakenly skip the resize. + +Change-Id: Iafe4a91cc707f854b9099b6109b6be1423d7bd29 +Reviewed-by: Eskil Abrahamsen Blomfeldt +--- + .../client/wayland-egl/qwaylandeglwindow.cpp | 4 +++- + .../client/wayland-egl/qwaylandeglwindow.h | 1 + + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +index 1e8dc06f7..355aca864 100644 +--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp ++++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +@@ -131,14 +131,16 @@ void QWaylandEglWindow::updateSurface(bool create) + if (!disableResizeCheck) { + wl_egl_window_get_attached_size(m_waylandEglWindow, ¤t_width, ¤t_height); + } +- if (disableResizeCheck || (current_width != sizeWithMargins.width() || current_height != sizeWithMargins.height())) { ++ if (disableResizeCheck || (current_width != sizeWithMargins.width() || current_height != sizeWithMargins.height()) || m_requestedSize != sizeWithMargins) { + wl_egl_window_resize(m_waylandEglWindow, sizeWithMargins.width(), sizeWithMargins.height(), mOffset.x(), mOffset.y()); ++ m_requestedSize = sizeWithMargins; + mOffset = QPoint(); + + m_resize = true; + } + } else if (create && wlSurface()) { + m_waylandEglWindow = wl_egl_window_create(wlSurface(), sizeWithMargins.width(), sizeWithMargins.height()); ++ m_requestedSize = sizeWithMargins; + } + + if (!m_eglSurface && m_waylandEglWindow && create) { +diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h +index 5b1f4d56f..0079dfef8 100644 +--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h ++++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.h +@@ -88,6 +88,7 @@ class QWaylandEglWindow : public QWaylandWindow + mutable QOpenGLFramebufferObject *m_contentFBO = nullptr; + + QSurfaceFormat m_format; ++ QSize m_requestedSize; + }; + + } diff --git a/SOURCES/qtwayland-get-correct-margins-decoration-region.patch b/SOURCES/qtwayland-get-correct-margins-decoration-region.patch new file mode 100644 index 0000000..1f87e2e --- /dev/null +++ b/SOURCES/qtwayland-get-correct-margins-decoration-region.patch @@ -0,0 +1,33 @@ +From 14cf9f0e45c7617d787eba8d81bf9fd1cd66754b Mon Sep 17 00:00:00 2001 +From: Jan Grulich +Date: Thu, 11 Feb 2021 15:12:32 +0100 +Subject: [PATCH] Get correct decoration margins region + +Size we use to calculate margins region already contains size including +margins. This resulted into bigger region and not properly damaging +region we need to update. + +Pick-to: 5.15 +Change-Id: Id1b7f4cd2a7b894b82db09c5af2b2d1f1f43fa2a +--- + +diff --git a/src/client/qwaylandabstractdecoration.cpp b/src/client/qwaylandabstractdecoration.cpp +index 87dd6ce..b6ee43c 100644 +--- a/src/client/qwaylandabstractdecoration.cpp ++++ b/src/client/qwaylandabstractdecoration.cpp +@@ -108,11 +108,11 @@ + static QRegion marginsRegion(const QSize &size, const QMargins &margins) + { + QRegion r; +- const int widthWithMargins = margins.left() + size.width() + margins.right(); +- r += QRect(0, 0, widthWithMargins, margins.top()); // top +- r += QRect(0, size.height()+margins.top(), widthWithMargins, margins.bottom()); //bottom ++ ++ r += QRect(0, 0, size.width(), margins.top()); // top ++ r += QRect(0, size.height()-margins.bottom(), size.width(), margins.bottom()); //bottom + r += QRect(0, margins.top(), margins.left(), size.height()); //left +- r += QRect(size.width()+margins.left(), margins.top(), margins.right(), size.height()); // right ++ r += QRect(size.width()-margins.left(), margins.top(), margins.right(), size.height()-margins.top()); // right + return r; + } + diff --git a/SOURCES/qtwayland-scanner-avoid-accessing-dangling-pointers-in-destroy-func.patch b/SOURCES/qtwayland-scanner-avoid-accessing-dangling-pointers-in-destroy-func.patch new file mode 100644 index 0000000..823f648 --- /dev/null +++ b/SOURCES/qtwayland-scanner-avoid-accessing-dangling-pointers-in-destroy-func.patch @@ -0,0 +1,32 @@ +From e5c272423d1bba2825086b82fd97499237a6fa4b Mon Sep 17 00:00:00 2001 +From: Vlad Zahorodnii +Date: Fri, 30 Oct 2020 16:55:30 +0200 +Subject: [PATCH] Scanner: Avoid accessing dangling pointers in destroy_func() + +Usually, the object associated with the resource gets destroyed in the +destroy_resource() function. + +Therefore, we need to double-check that the object is still alive before +trying to reset its m_resource. + +Change-Id: I26408228f58919db17eb29584a1cbd4a9427d25c +Reviewed-by: Eskil Abrahamsen Blomfeldt +(cherry picked from commit 735164b5c2a2637a8d53a8803a2401e4ef477ff0) +Reviewed-by: Qt Cherry-pick Bot +--- + +diff --git a/src/qtwaylandscanner/qtwaylandscanner.cpp b/src/qtwaylandscanner/qtwaylandscanner.cpp +index 1d635f0..e2f87bb 100644 +--- a/src/qtwaylandscanner/qtwaylandscanner.cpp ++++ b/src/qtwaylandscanner/qtwaylandscanner.cpp +@@ -814,7 +814,9 @@ + printf(" if (Q_LIKELY(that)) {\n"); + printf(" that->m_resource_map.remove(resource->client(), resource);\n"); + printf(" that->%s_destroy_resource(resource);\n", interfaceNameStripped); +- printf(" if (that->m_resource == resource)\n"); ++ printf("\n"); ++ printf(" that = resource->%s_object;\n", interfaceNameStripped); ++ printf(" if (that && that->m_resource == resource)\n"); + printf(" that->m_resource = nullptr;\n"); + printf(" }\n"); + printf(" delete resource;\n"); diff --git a/SOURCES/qtwayland-send-exposeevent-to-parent-on-subsurface-position.patch b/SOURCES/qtwayland-send-exposeevent-to-parent-on-subsurface-position.patch new file mode 100644 index 0000000..980e223 --- /dev/null +++ b/SOURCES/qtwayland-send-exposeevent-to-parent-on-subsurface-position.patch @@ -0,0 +1,94 @@ +From b36a345d727eab37ee4ec4c2dc4674d5971c81d8 Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Mon, 14 Sep 2020 17:08:39 +0100 +Subject: [PATCH] Client: Send exposeEvent to parent on subsurface position + changes + +When a subsurface is moved, we need the parent window to commit to apply +that move. Ideally we want this in sync with any potential rendering on +the parent window. + +Currently the code calls requestUpdate() which acts more like a frame +callback; it will only do something if the main QWindow considers itself +dirty. + +We want to force a repaint, which is semantically more similar to an +ExposeEvent. + +Fixes: QTBUG-86177 +Pick-to: 5.15 +Change-Id: I30bdfa357beee860ce2b00a256eaea6d040dd55c +Reviewed-by: Eskil Abrahamsen Blomfeldt +--- + src/client/qwaylandwindow.cpp | 7 ++++- + tests/auto/client/surface/tst_surface.cpp | 33 +++++++++++++++++++---- + 2 files changed, 34 insertions(+), 6 deletions(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 3e26384..3cf1326 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -339,7 +339,12 @@ void QWaylandWindow::setGeometry_helper(const QRect &rect) + if (mSubSurfaceWindow) { + QMargins m = QPlatformWindow::parent()->frameMargins(); + mSubSurfaceWindow->set_position(rect.x() + m.left(), rect.y() + m.top()); +- mSubSurfaceWindow->parent()->window()->requestUpdate(); ++ ++ QWaylandWindow *parentWindow = mSubSurfaceWindow->parent(); ++ if (parentWindow && parentWindow->isExposed()) { ++ QRect parentExposeGeometry(QPoint(), parentWindow->geometry().size()); ++ parentWindow->sendExposeEvent(parentExposeGeometry); ++ } + } + } + +diff --git a/tests/auto/client/surface/tst_surface.cpp b/tests/auto/client/surface/tst_surface.cpp +index b8a65f1..95e4e60 100644 +--- a/tests/auto/client/surface/tst_surface.cpp ++++ b/tests/auto/client/surface/tst_surface.cpp +@@ -167,17 +167,40 @@ void tst_surface::negotiateShmFormat() + void tst_surface::createSubsurface() + { + QRasterWindow window; +- window.resize(64, 64); +- window.show(); +- QCOMPOSITOR_TRY_VERIFY(xdgToplevel()); +- exec([=] { xdgToplevel()->sendCompleteConfigure(); }); +- QCOMPOSITOR_TRY_VERIFY(xdgSurface()->m_committedConfigureSerial); ++ window.setObjectName("main"); ++ window.resize(200, 200); + + QRasterWindow subWindow; ++ subWindow.setObjectName("subwindow"); + subWindow.setParent(&window); + subWindow.resize(64, 64); ++ ++ window.show(); + subWindow.show(); ++ + QCOMPOSITOR_TRY_VERIFY(subSurface()); ++ QCOMPOSITOR_TRY_VERIFY(xdgToplevel()); ++ exec([=] { xdgToplevel()->sendCompleteConfigure(); }); ++ QCOMPOSITOR_TRY_VERIFY(xdgSurface()->m_committedConfigureSerial); ++ ++ const Surface *mainSurface = exec([=] {return surface(0);}); ++ const Surface *childSurface = exec([=] {return surface(1);}); ++ QSignalSpy mainSurfaceCommitSpy(mainSurface, &Surface::commit); ++ QSignalSpy childSurfaceCommitSpy(childSurface, &Surface::commit); ++ ++ // Move subsurface. The parent should redraw and commit ++ subWindow.setGeometry(100, 100, 64, 64); ++ // the toplevel should commit to indicate the subsurface moved ++ QCOMPOSITOR_TRY_COMPARE(mainSurfaceCommitSpy.count(), 1); ++ mainSurfaceCommitSpy.clear(); ++ childSurfaceCommitSpy.clear(); ++ ++ // Move and resize the subSurface. The parent should redraw and commit ++ // The child should also redraw ++ subWindow.setGeometry(50, 50, 80, 80); ++ QCOMPOSITOR_TRY_COMPARE(mainSurfaceCommitSpy.count(), 1); ++ QCOMPOSITOR_TRY_COMPARE(childSurfaceCommitSpy.count(), 1); ++ + } + + // Used to cause a crash in libwayland (QTBUG-79674) diff --git a/SOURCES/qtwayland-send-set-window-geometry-only-once-configured.patch b/SOURCES/qtwayland-send-set-window-geometry-only-once-configured.patch new file mode 100644 index 0000000..40d32be --- /dev/null +++ b/SOURCES/qtwayland-send-set-window-geometry-only-once-configured.patch @@ -0,0 +1,38 @@ +From 2555663c9f59b93f5fcc5d3ead233bee280e36f8 Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Mon, 16 Nov 2020 14:57:36 +0000 +Subject: [PATCH] Client: Send set_window_geometry only once configured + +The geometry only makes sense when a buffer exists, our currently send +value is somewhat meaningless, but till now harmless. + +A specification clarification implies that it is an error if the +calculated effective window geometry is null, rather than just checking +the sent value. This is the case if set_window_geometry is sent before a +buffer is attached. + +On our first configure call we enter resizeFromApplyConfigure which will +hit this path and send the initial state. + +Pick-to: 5.15 +Pick-to: 6.1 +Pick-to: 6.0 +Change-Id: Ib57ebe8b64210eae86e79dfdd6b5cb8a986b020b +Reviewed-by: Eskil Abrahamsen Blomfeldt +--- + src/client/qwaylandwindow.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 3e26384..80e9ffc 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -362,7 +362,7 @@ void QWaylandWindow::setGeometry(const QRect &rect) + if (isExposed() && !mInResizeFromApplyConfigure && exposeGeometry != mLastExposeGeometry) + sendExposeEvent(exposeGeometry); + +- if (mShellSurface) ++ if (mShellSurface && isExposed()) + mShellSurface->setWindowGeometry(windowContentGeometry()); + + if (isOpaque() && mMask.isEmpty()) diff --git a/SOURCES/qtwayland-tell-compositor-screen-we-are-expecting-to-fill.patch b/SOURCES/qtwayland-tell-compositor-screen-we-are-expecting-to-fill.patch new file mode 100644 index 0000000..5a6f1e2 --- /dev/null +++ b/SOURCES/qtwayland-tell-compositor-screen-we-are-expecting-to-fill.patch @@ -0,0 +1,38 @@ +From f915e53eaa596654ee1b9726a4767a1cba11336f Mon Sep 17 00:00:00 2001 +From: Aleix Pol +Date: Mon, 23 Nov 2020 20:07:02 +0100 +Subject: [PATCH] xdgshell: Tell the compositor the screen we're expecting to + fill + +The xdgshell protocol allows us to tell the output to fill. This makes +it possible to use fullscreen confidently on systems with multiple +screens knowing that our windows won't be overlapping one another by +calling setScreen accordingly before QWindow::showFullScreen. + +Pick-to: 6.1 6.0 5.15 +Change-Id: I757854c3698639472f3a25ef298ddcca031e1ed5 +Reviewed-by: David Edmundson +--- + .../shellintegration/xdg-shell/qwaylandxdgshell.cpp | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +index b7253de2b..af8bd9264 100644 +--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp ++++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp +@@ -178,9 +178,12 @@ void QWaylandXdgSurface::Toplevel::requestWindowStates(Qt::WindowStates states) + } + + if (changedStates & Qt::WindowFullScreen) { +- if (states & Qt::WindowFullScreen) +- set_fullscreen(nullptr); +- else ++ if (states & Qt::WindowFullScreen) { ++ auto screen = m_xdgSurface->window()->waylandScreen(); ++ if (screen) { ++ set_fullscreen(screen->output()); ++ } ++ } else + unset_fullscreen(); + } + diff --git a/SOURCES/qtwayland-translate-opaque-area-for-decorations.patch b/SOURCES/qtwayland-translate-opaque-area-for-decorations.patch new file mode 100644 index 0000000..b897b55 --- /dev/null +++ b/SOURCES/qtwayland-translate-opaque-area-for-decorations.patch @@ -0,0 +1,34 @@ +From 1e0862acdc2e6ccf77bf3a1436b877d3af5e5fe7 Mon Sep 17 00:00:00 2001 +From: Jan Grulich +Date: Wed, 10 Feb 2021 17:11:27 +0100 +Subject: [PATCH] Translate opaque area with frame margins + +The opaque area doesn't take window decorations into account, which may +result into possible graphical artefacts. + +Pick-to: 5.15 +Change-Id: I1606e8256e7e204dad927931eb1221b576e227fd +--- + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index 04c2dbd..b29edfa 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -1242,12 +1242,14 @@ + + void QWaylandWindow::setOpaqueArea(const QRegion &opaqueArea) + { +- if (opaqueArea == mOpaqueArea || !mSurface) ++ const QRegion translatedOpaqueArea = opaqueArea.translated(frameMargins().left(), frameMargins().top()); ++ ++ if (translatedOpaqueArea == mOpaqueArea || !mSurface) + return; + +- mOpaqueArea = opaqueArea; ++ mOpaqueArea = translatedOpaqueArea; + +- struct ::wl_region *region = mDisplay->createRegion(opaqueArea); ++ struct ::wl_region *region = mDisplay->createRegion(translatedOpaqueArea); + mSurface->set_opaque_region(region); + wl_region_destroy(region); + } diff --git a/SOURCES/qtwayland-use-gnome-platform-theme-on-gnome-based-desktops.patch b/SOURCES/qtwayland-use-gnome-platform-theme-on-gnome-based-desktops.patch deleted file mode 100644 index d4463bf..0000000 --- a/SOURCES/qtwayland-use-gnome-platform-theme-on-gnome-based-desktops.patch +++ /dev/null @@ -1,39 +0,0 @@ -diff --git a/src/client/qwaylandintegration.cpp b/src/client/qwaylandintegration.cpp -index 97e0203c..5bee160a 100644 ---- a/src/client/qwaylandintegration.cpp -+++ b/src/client/qwaylandintegration.cpp -@@ -99,20 +99,26 @@ public: - - if (QGuiApplication::desktopSettingsAware()) { - const QByteArray desktopEnvironment = QGuiApplicationPrivate::platformIntegration()->services()->desktopEnvironment(); -- -+ QList gtkBasedEnvironments; -+ gtkBasedEnvironments << "GNOME" -+ << "X-CINNAMON" -+ << "UNITY" -+ << "MATE" -+ << "XFCE" -+ << "LXDE"; - if (desktopEnvironment == QByteArrayLiteral("KDE")) { - #if QT_CONFIG(settings) - result.push_back(QStringLiteral("kde")); - #endif -- } else if (!desktopEnvironment.isEmpty() && -- desktopEnvironment != QByteArrayLiteral("UNKNOWN") && -- desktopEnvironment != QByteArrayLiteral("GNOME") && -- desktopEnvironment != QByteArrayLiteral("UNITY") && -- desktopEnvironment != QByteArrayLiteral("MATE") && -- desktopEnvironment != QByteArrayLiteral("XFCE") && -- desktopEnvironment != QByteArrayLiteral("LXDE")) -+ } else if (gtkBasedEnvironments.contains(desktopEnvironment)) { -+ // prefer the GTK3 theme implementation with native dialogs etc. -+ result.push_back(QStringLiteral("gtk3")); -+ // fallback to the generic Gnome theme if loading the GTK3 theme fails -+ result.push_back(QLatin1String(QGnomeTheme::name)); -+ } else if (!desktopEnvironment.isEmpty() && desktopEnvironment != QByteArrayLiteral("UNKNOWN")) { - // Ignore X11 desktop environments - result.push_back(QString::fromLocal8Bit(desktopEnvironment.toLower())); -+ } - } - - if (result.isEmpty()) diff --git a/SPECS/qt5-qtwayland.spec b/SPECS/qt5-qtwayland.spec index 32277d2..b58590a 100644 --- a/SPECS/qt5-qtwayland.spec +++ b/SPECS/qt5-qtwayland.spec @@ -4,21 +4,21 @@ Summary: Qt5 - Wayland platform support and QtCompositor module Name: qt5-%{qt_module} -Version: 5.12.5 -Release: 1%{?dist} +Version: 5.15.2 +Release: 2%{?dist} License: LGPLv3 Url: http://www.qt.io %global majmin %(echo %{version} | cut -d. -f1-2) Source0: https://download.qt.io/official_releases/qt/%{majmin}/%{version}/submodules/%{qt_module}-everywhere-src-%{version}.tar.xz -Patch0: qtwayland-do-not-redraw-decorations-everytime.patch -Patch1: qtwayland-fix-100ms-freeze-when-apps-dont-swap-after-deliverupdaterequest.patch - -# Upstreamable patches -# https://fedoraproject.org/wiki/Changes/Qt_Wayland_By_Default_On_Gnome -# https://bugzilla.redhat.com/show_bug.cgi?id=1732129 -Patch50: qtwayland-use-gnome-platform-theme-on-gnome-based-desktops.patch +Patch0: qtwayland-scanner-avoid-accessing-dangling-pointers-in-destroy-func.patch +Patch1: qtwayland-fix-issue-with-repeated-window-size-changes.patch +Patch2: qtwayland-get-correct-margins-decoration-region.patch +Patch3: qtwayland-send-exposeevent-to-parent-on-subsurface-position.patch +Patch4: qtwayland-send-set-window-geometry-only-once-configured.patch +Patch5: qtwayland-tell-compositor-screen-we-are-expecting-to-fill.patch +Patch6: qtwayland-translate-opaque-area-for-decorations.patch # filter qml provides %global __provides_exclude_from ^%{_qt5_archdatadir}/qml/.*\\.so$ @@ -28,7 +28,6 @@ BuildRequires: qt5-qtbase-static BuildRequires: qt5-qtbase-private-devel %{?_qt5:Requires: %{_qt5}%{?_isa} = %{_qt5_version}} BuildRequires: qt5-qtdeclarative-devel -BuildRequires: libXext-devel BuildRequires: pkgconfig(xkbcommon) BuildRequires: pkgconfig(wayland-scanner) @@ -42,6 +41,8 @@ BuildRequires: pkgconfig(xcomposite) BuildRequires: pkgconfig(xrender) BuildRequires: pkgconfig(libudev) BuildRequires: pkgconfig(libinput) +BuildRequires: libXext-devel +BuildRequires: tree %description %{summary}. @@ -150,6 +151,14 @@ popd %endif %changelog +* Wed Apr 28 2021 Jan Grulich - 5.15.2-2 +- Rebuild (binutils) + Resolves: bz#1930058 + +* Tue Apr 06 2021 Jan Grulich - 5.15.2-1 +- 5.15.2 + Resolves: bz#1930058 + * Mon Nov 18 2019 Jan Grulich - 5.12.5-1 - 5.12.5 Resolves: bz#1733154