import qt5-qtwayland-5.15.2-1.el8
This commit is contained in:
parent
8d1c44cf04
commit
67b89ec584
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/qtwayland-everywhere-src-5.12.5.tar.xz
|
SOURCES/qtwayland-everywhere-src-5.15.2.tar.xz
|
||||||
|
@ -1 +1 @@
|
|||||||
73ba627ea857598e733721a5a74ef1ff01e88d0b SOURCES/qtwayland-everywhere-src-5.12.5.tar.xz
|
b547a38762ca6ef6d14545b4d51aabbcf06cc17e SOURCES/qtwayland-everywhere-src-5.15.2.tar.xz
|
||||||
|
@ -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
|
|
@ -1,127 +0,0 @@
|
|||||||
From 9f5b96225885f927727a57b6123d8550d6c373bb Mon Sep 17 00:00:00 2001
|
|
||||||
From: Johan Klokkhammer Helsing <johan.helsing@qt.io>
|
|
||||||
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 <paul.tvete@qt.io>
|
|
||||||
Reviewed-by: John Brooks <john.brooks@qt.io>
|
|
||||||
---
|
|
||||||
|
|
||||||
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;
|
|
@ -0,0 +1,54 @@
|
|||||||
|
From 14d066c61025e548227ccd8d655e80ffa31fa15e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jaeyoon Jung <jaeyoon.jung@lge.com>
|
||||||
|
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 <eskil.abrahamsen-blomfeldt@qt.io>
|
||||||
|
---
|
||||||
|
.../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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
From 14cf9f0e45c7617d787eba8d81bf9fd1cd66754b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Grulich <jgrulich@redhat.com>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
From e5c272423d1bba2825086b82fd97499237a6fa4b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||||
|
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 <eskil.abrahamsen-blomfeldt@qt.io>
|
||||||
|
(cherry picked from commit 735164b5c2a2637a8d53a8803a2401e4ef477ff0)
|
||||||
|
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||||
|
---
|
||||||
|
|
||||||
|
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");
|
@ -0,0 +1,94 @@
|
|||||||
|
From b36a345d727eab37ee4ec4c2dc4674d5971c81d8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Edmundson <davidedmundson@kde.org>
|
||||||
|
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 <eskil.abrahamsen-blomfeldt@qt.io>
|
||||||
|
---
|
||||||
|
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)
|
@ -0,0 +1,38 @@
|
|||||||
|
From 2555663c9f59b93f5fcc5d3ead233bee280e36f8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Edmundson <davidedmundson@kde.org>
|
||||||
|
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 <eskil.abrahamsen-blomfeldt@qt.io>
|
||||||
|
---
|
||||||
|
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())
|
@ -0,0 +1,38 @@
|
|||||||
|
From f915e53eaa596654ee1b9726a4767a1cba11336f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Aleix Pol <aleixpol@kde.org>
|
||||||
|
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 <davidedmundson@kde.org>
|
||||||
|
---
|
||||||
|
.../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();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
|||||||
|
From 1e0862acdc2e6ccf77bf3a1436b877d3af5e5fe7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jan Grulich <jgrulich@redhat.com>
|
||||||
|
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);
|
||||||
|
}
|
@ -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<QByteArray> 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())
|
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Summary: Qt5 - Wayland platform support and QtCompositor module
|
Summary: Qt5 - Wayland platform support and QtCompositor module
|
||||||
Name: qt5-%{qt_module}
|
Name: qt5-%{qt_module}
|
||||||
Version: 5.12.5
|
Version: 5.15.2
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
|
|
||||||
License: LGPLv3
|
License: LGPLv3
|
||||||
@ -12,13 +12,13 @@ Url: http://www.qt.io
|
|||||||
%global majmin %(echo %{version} | cut -d. -f1-2)
|
%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
|
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
|
Patch0: qtwayland-scanner-avoid-accessing-dangling-pointers-in-destroy-func.patch
|
||||||
Patch1: qtwayland-fix-100ms-freeze-when-apps-dont-swap-after-deliverupdaterequest.patch
|
Patch1: qtwayland-fix-issue-with-repeated-window-size-changes.patch
|
||||||
|
Patch2: qtwayland-get-correct-margins-decoration-region.patch
|
||||||
# Upstreamable patches
|
Patch3: qtwayland-send-exposeevent-to-parent-on-subsurface-position.patch
|
||||||
# https://fedoraproject.org/wiki/Changes/Qt_Wayland_By_Default_On_Gnome
|
Patch4: qtwayland-send-set-window-geometry-only-once-configured.patch
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1732129
|
Patch5: qtwayland-tell-compositor-screen-we-are-expecting-to-fill.patch
|
||||||
Patch50: qtwayland-use-gnome-platform-theme-on-gnome-based-desktops.patch
|
Patch6: qtwayland-translate-opaque-area-for-decorations.patch
|
||||||
|
|
||||||
# filter qml provides
|
# filter qml provides
|
||||||
%global __provides_exclude_from ^%{_qt5_archdatadir}/qml/.*\\.so$
|
%global __provides_exclude_from ^%{_qt5_archdatadir}/qml/.*\\.so$
|
||||||
@ -41,6 +41,8 @@ BuildRequires: pkgconfig(xcomposite)
|
|||||||
BuildRequires: pkgconfig(xrender)
|
BuildRequires: pkgconfig(xrender)
|
||||||
BuildRequires: pkgconfig(libudev)
|
BuildRequires: pkgconfig(libudev)
|
||||||
BuildRequires: pkgconfig(libinput)
|
BuildRequires: pkgconfig(libinput)
|
||||||
|
BuildRequires: libXext-devel
|
||||||
|
BuildRequires: tree
|
||||||
|
|
||||||
%description
|
%description
|
||||||
%{summary}.
|
%{summary}.
|
||||||
@ -149,6 +151,10 @@ popd
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Apr 06 2021 Jan Grulich <jgrulich@redhat.com> - 5.15.2-1
|
||||||
|
- 5.15.2
|
||||||
|
Resolves: bz#1930058
|
||||||
|
|
||||||
* Mon Nov 18 2019 Jan Grulich <jgrulich@redhat.com> - 5.12.5-1
|
* Mon Nov 18 2019 Jan Grulich <jgrulich@redhat.com> - 5.12.5-1
|
||||||
- 5.12.5
|
- 5.12.5
|
||||||
Resolves: bz#1733154
|
Resolves: bz#1733154
|
||||||
|
Loading…
Reference in New Issue
Block a user