Accepting request 883510 from home:Vogtinator:qt5.15

- Add commits from upstream's 5.15 branch:
  * 0002-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch (QTBUG-87762)
  * 0003-Do-not-try-to-eglMakeCurrent-for-unintended-case.patch (QTBUG-88277)
  * 0004-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch (QTBUG-87762, QTBUG-88064)
  * 0005-Ensure-that-grabbing-is-performed-in-correct-context.patch (QTBUG-87597)
  * 0006-Fix-leaked-subsurface-wayland-items.patch (QTBUG-88782)
- Add commit from KDE's 5.15 branch:
  * 0007-Use-qWarning-and-_exit-instead-of-qFatal-for-wayland.patch

OBS-URL: https://build.opensuse.org/request/show/883510
OBS-URL: https://build.opensuse.org/package/show/KDE:Qt:5.15/libqt5-qtwayland?expand=0&rev=14
This commit is contained in:
Luca Beltrame 2021-04-07 07:20:26 +00:00 committed by Git OBS Bridge
parent 1f6697db25
commit be48647d50
8 changed files with 340 additions and 1 deletions

View File

@ -0,0 +1,38 @@
From a825fb5f714fd79d16cc3ebbdd327e7961b07d0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@qt.io>
Date: Mon, 16 Nov 2020 19:37:33 +0100
Subject: [PATCH 2/7] Make setting QT_SCALE_FACTOR work on Wayland
Follow-up to 8cb1b07aea12d50b4fecc45c903705dfd368022a,
fixes one additional case (Use of minimum/maximum size).
Fixes: QTBUG-87762
Change-Id: I73e0df2529b0cadf25ad50ea7459cdbb92caf424
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
(cherry picked from commit 6ed363e3665f17d935f8636d9c958154c898f5c5)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/client/qwaylandwindow.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index bc031ed5..eb053406 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -332,9 +332,11 @@ void QWaylandWindow::setWindowIcon(const QIcon &icon)
void QWaylandWindow::setGeometry_helper(const QRect &rect)
{
+ QSize minimum = windowMinimumSize();
+ QSize maximum = windowMaximumSize();
QPlatformWindow::setGeometry(QRect(rect.x(), rect.y(),
- qBound(window()->minimumWidth(), rect.width(), window()->maximumWidth()),
- qBound(window()->minimumHeight(), rect.height(), window()->maximumHeight())));
+ qBound(minimum.width(), rect.width(), maximum.width()),
+ qBound(minimum.height(), rect.height(), maximum.height())));
if (mSubSurfaceWindow) {
QMargins m = QPlatformWindow::parent()->frameMargins();
--
2.25.1

View File

@ -0,0 +1,62 @@
From 2c0a03e9aea13831d05ac03996949f888afd5085 Mon Sep 17 00:00:00 2001
From: Jaehak Lee <jaehak.lee@mobis.co.kr>
Date: Sun, 8 Nov 2020 11:40:06 +0900
Subject: [PATCH 3/7] Do not try to eglMakeCurrent for unintended case
The QSGThreadedRenderLoop::hide can be called at twice,
when the QWindowPrivate::setVisible(false) is called.
The eglSurface is EGL_NO_SURFACE when the second QSGThreadedRenderLoop::hide is
called. And if EGL_KHR_surfaceless_context is supported, the eglMakeCurrent
don't return the false.
But this case is not intended. So, add the defence code for above case.
Fixes: QTBUG-88277
Change-Id: Ia9e5990303e98f0eedc48531e5af62ff9961f419
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
---
.../client/wayland-egl/qwaylandglcontext.cpp | 6 ++++++
.../client/wayland-egl/qwaylandglcontext.h | 1 +
2 files changed, 7 insertions(+)
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
index ccebf43d..681f82f4 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
@@ -336,6 +336,8 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, QWaylandDisplay *dis
<< "It may also cause the event loop to freeze in some situations";
}
+ m_supportSurfaceLessContext = q_hasEglExtension(m_eglDisplay, "EGL_KHR_surfaceless_context");
+
updateGLFormat();
}
@@ -439,6 +441,10 @@ bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface)
eglSurface = window->eglSurface();
}
+ if (eglSurface == EGL_NO_SURFACE && m_supportSurfaceLessContext) {
+ return false;
+ }
+
if (!eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_context)) {
qWarning("QWaylandGLContext::makeCurrent: eglError: %x, this: %p \n", eglGetError(), this);
window->setCanResize(true);
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h
index 46c7bb76..93edaec0 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h
@@ -93,6 +93,7 @@ private:
DecorationsBlitter *m_blitter = nullptr;
uint m_api;
bool m_supportNonBlockingSwap = true;
+ bool m_supportSurfaceLessContext = false;
};
}
--
2.25.1

View File

@ -0,0 +1,112 @@
From 10005185e06857ce119c50fe710f9eedde06ec5e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= <morten.sorvig@qt.io>
Date: Fri, 13 Nov 2020 11:21:50 +0100
Subject: [PATCH 4/7] Make setting QT_SCALE_FACTOR work on Wayland
QWindow geometry accessors return geometry in device
independent pixels. Normally this coordinate system
is equivalent to the Wayland native coordinate system,
but this is not the case when QT_SCALE_FACTOR is set.
Replace QWindow geometry calls with the helpers from
QPlatformWindow which return geometry in the native
coordinate system:
QWindow::geometry() -> QPlatformWindow::windowGeometry()
QWindow::frameGeometry() -> QPlatformWindow::windowFrameGeometry()
Task-number: QTBUG-87762
Fixes: QTBUG-88064
(cherry-picked from commit 8cb1b07aea12d50b4fecc45c903705dfd368022a)
Change-Id: I6e2029bc6210f12441ae7c9d8b678271e9922dde
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
---
src/client/qwaylandwindow.cpp | 7 ++++---
.../shellintegration/wl-shell/qwaylandwlshellsurface.cpp | 2 +-
.../shellintegration/xdg-shell-v5/qwaylandxdgsurfacev5.cpp | 2 +-
.../shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp | 2 +-
.../shellintegration/xdg-shell/qwaylandxdgshell.cpp | 2 +-
5 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index eb053406..9b343702 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -194,10 +194,11 @@ void QWaylandWindow::initWindow()
if (QScreen *s = window()->screen())
setOrientationMask(s->orientationUpdateMask());
setWindowFlags(window()->flags());
- if (window()->geometry().isEmpty())
+ QRect geometry = windowGeometry();
+ if (geometry.isEmpty())
setGeometry_helper(QRect(QPoint(), QSize(500,500)));
else
- setGeometry_helper(window()->geometry());
+ setGeometry_helper(geometry);
setMask(window()->mask());
if (mShellSurface)
mShellSurface->requestWindowStates(window()->windowStates());
@@ -431,7 +432,7 @@ void QWaylandWindow::setVisible(bool visible)
initWindow();
mDisplay->flushRequests();
- setGeometry(window()->geometry());
+ setGeometry(windowGeometry());
// Don't flush the events here, or else the newly visible window may start drawing, but since
// there was no frame before it will be stuck at the waitForFrameSync() in
// QWaylandShmBackingStore::beginPaint().
diff --git a/src/plugins/shellintegration/wl-shell/qwaylandwlshellsurface.cpp b/src/plugins/shellintegration/wl-shell/qwaylandwlshellsurface.cpp
index 245fec19..8f41118d 100644
--- a/src/plugins/shellintegration/wl-shell/qwaylandwlshellsurface.cpp
+++ b/src/plugins/shellintegration/wl-shell/qwaylandwlshellsurface.cpp
@@ -134,7 +134,7 @@ void QWaylandWlShellSurface::applyConfigure()
{
if ((m_pending.states & (Qt::WindowMaximized|Qt::WindowFullScreen))
&& !(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen))) {
- m_normalSize = m_window->window()->frameGeometry().size();
+ m_normalSize = m_window->windowFrameGeometry().size();
}
if (m_pending.states != m_applied.states)
diff --git a/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurfacev5.cpp b/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurfacev5.cpp
index 770fad7e..73aba1ee 100644
--- a/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurfacev5.cpp
+++ b/src/plugins/shellintegration/xdg-shell-v5/qwaylandxdgsurfacev5.cpp
@@ -157,7 +157,7 @@ void QWaylandXdgSurfaceV5::applyConfigure()
if (m_pending.isResizing)
m_normalSize = m_pending.size;
else if (!(m_acked.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
- m_normalSize = m_window->window()->frameGeometry().size();
+ m_normalSize = m_window->windowFrameGeometry().size();
if ((m_pending.states & Qt::WindowActive) && !(m_acked.states & Qt::WindowActive))
m_window->display()->handleWindowActivated(m_window);
diff --git a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
index c137b308..8c371661 100644
--- a/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
+++ b/src/plugins/shellintegration/xdg-shell-v6/qwaylandxdgshellv6.cpp
@@ -72,7 +72,7 @@ QWaylandXdgSurfaceV6::Toplevel::~Toplevel()
void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
{
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
- m_normalSize = m_xdgSurface->m_window->window()->frameGeometry().size();
+ m_normalSize = m_xdgSurface->m_window->windowFrameGeometry().size();
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);
diff --git a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
index b6d23ac1..1c762944 100644
--- a/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
+++ b/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp
@@ -83,7 +83,7 @@ QWaylandXdgSurface::Toplevel::~Toplevel()
void QWaylandXdgSurface::Toplevel::applyConfigure()
{
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
- m_normalSize = m_xdgSurface->m_window->window()->frameGeometry().size();
+ m_normalSize = m_xdgSurface->m_window->windowFrameGeometry().size();
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);
--
2.25.1

View File

@ -0,0 +1,35 @@
From dba4bc4f1d6dfee9fe9433c55b15653d703bed4f Mon Sep 17 00:00:00 2001
From: Andreas Cord-Landwehr <cordlandwehr@kde.org>
Date: Wed, 2 Dec 2020 20:55:52 +0100
Subject: [PATCH 5/7] Ensure that grabbing is performed in correct context
For multi-display rendering on EGL, it is mandatory that the grabbing of
the surface happens in the same EGL context as the surface belongs to.
By adding the grabbing to the rendering stage of the image, this
relation is forced.
Task-number: QTBUG-87597
Change-Id: I50f40df1215aa771d714065e942c5a738ba6269f
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
(cherry picked from commit ab3a1a07f3d1e0d5a9e9d97b6b3b587180e2f4c8)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/compositor/compositor_api/qwaylandquickcompositor.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.cpp b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
index 49f0860e..db1cf00f 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
@@ -161,7 +161,7 @@ void QWaylandQuickCompositor::grabSurface(QWaylandSurfaceGrabber *grabber, const
GrabState *state = new GrabState;
state->grabber = grabber;
state->buffer = buffer;
- static_cast<QQuickWindow *>(output->window())->scheduleRenderJob(state, QQuickWindow::NoStage);
+ static_cast<QQuickWindow *>(output->window())->scheduleRenderJob(state, QQuickWindow::AfterRenderingStage);
#else
emit grabber->failed(QWaylandSurfaceGrabber::UnknownBufferType);
#endif
--
2.25.1

View File

@ -0,0 +1,36 @@
From a8d35b3c18bdb05a0da3ed50a554a7b7bd4ebed3 Mon Sep 17 00:00:00 2001
From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Date: Mon, 30 Nov 2020 13:13:18 +0100
Subject: [PATCH 6/7] Fix leaked subsurface wayland items
Whenever a subsurface was added we would create a QWaylandQuickItem,
but this was never deleted. It is one-to-one with the surface, so it
should be deleted at the same time.
[ChangeLog][QtWaylandCompositor] Fixed a memory leak when creating
subsurfaces.
Task-number: QTBUG-88782
Change-Id: If4b3f15200ce3bd123ff73847d3593d174a39229
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
(cherry picked from commit 38fc568b30bf916165324c2cd2db127d2a9aa68c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
---
src/compositor/compositor_api/qwaylandquickitem.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp
index 15f0195c..2218f43a 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.cpp
+++ b/src/compositor/compositor_api/qwaylandquickitem.cpp
@@ -737,6 +737,7 @@ void QWaylandQuickItem::handleSubsurfaceAdded(QWaylandSurface *childSurface)
childItem->setVisible(true);
childItem->setParentItem(this);
connect(childSurface, &QWaylandSurface::subsurfacePositionChanged, childItem, &QWaylandQuickItem::handleSubsurfacePosition);
+ connect(childSurface, &QWaylandSurface::destroyed, childItem, &QObject::deleteLater);
} else {
bool success = QMetaObject::invokeMethod(d->subsurfaceHandler, "handleSubsurfaceAdded", Q_ARG(QWaylandSurface *, childSurface));
if (!success)
--
2.25.1

View File

@ -0,0 +1,38 @@
From 9ee2ea141adc7765f6c212e63839ef23a4494b30 Mon Sep 17 00:00:00 2001
From: Weng Xuetian <wengxt@gmail.com>
Date: Tue, 9 Mar 2021 10:43:59 -0800
Subject: [PATCH 7/7] Use qWarning and _exit() instead of qFatal for wayland
error
This type of error is likely to happen upon system logout. qFatal would
trigger sigabrt and leave unnecessary coredump on the system. Using
qWarning here would make it consistent with xcb's io error.
Pick-to: 5.15 6.0 6.1
Change-Id: I571ba007bf2453486b81837cccdbefa5f181b63d
Reviewed-by: David Edmundson <davidedmundson@kde.org>
---
src/client/qwaylanddisplay.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp
index fe094f6f..f10c1f79 100644
--- a/src/client/qwaylanddisplay.cpp
+++ b/src/client/qwaylanddisplay.cpp
@@ -206,10 +206,11 @@ void QWaylandDisplay::checkError() const
int ecode = wl_display_get_error(mDisplay);
if ((ecode == EPIPE || ecode == ECONNRESET)) {
// special case this to provide a nicer error
- qFatal("The Wayland connection broke. Did the Wayland compositor die?");
+ qWarning("The Wayland connection broke. Did the Wayland compositor die?");
} else {
- qFatal("The Wayland connection experienced a fatal error: %s", strerror(ecode));
+ qWarning("The Wayland connection experienced a fatal error: %s", strerror(ecode));
}
+ _exit(1);
}
void QWaylandDisplay::flushRequests()
--
2.25.1

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
Wed Apr 7 06:55:22 UTC 2021 - Fabian Vogt <fabian@ritter-vogt.de>
- Add commits from upstream's 5.15 branch:
* 0002-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch (QTBUG-87762)
* 0003-Do-not-try-to-eglMakeCurrent-for-unintended-case.patch (QTBUG-88277)
* 0004-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch (QTBUG-87762, QTBUG-88064)
* 0005-Ensure-that-grabbing-is-performed-in-correct-context.patch (QTBUG-87597)
* 0006-Fix-leaked-subsurface-wayland-items.patch (QTBUG-88782)
- Add commit from KDE's 5.15 branch:
* 0007-Use-qWarning-and-_exit-instead-of-qFatal-for-wayland.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Sat Jan 16 16:25:39 UTC 2021 - Fabian Vogt <fabian@ritter-vogt.de> Sat Jan 16 16:25:39 UTC 2021 - Fabian Vogt <fabian@ritter-vogt.de>

View File

@ -36,7 +36,13 @@ URL: https://www.qt.io
Source: https://download.qt.io/official_releases/qt/5.15/%{real_version}/submodules/%{tar_version}.tar.xz Source: https://download.qt.io/official_releases/qt/5.15/%{real_version}/submodules/%{tar_version}.tar.xz
Source1: baselibs.conf Source1: baselibs.conf
# PATCH-FIX-UPSTREAM # PATCH-FIX-UPSTREAM
Patch0: 0001-Scanner-Avoid-accessing-dangling-pointers-in-destroy.patch Patch1: 0001-Scanner-Avoid-accessing-dangling-pointers-in-destroy.patch
Patch2: 0002-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch
Patch3: 0003-Do-not-try-to-eglMakeCurrent-for-unintended-case.patch
Patch4: 0004-Make-setting-QT_SCALE_FACTOR-work-on-Wayland.patch
Patch5: 0005-Ensure-that-grabbing-is-performed-in-correct-context.patch
Patch6: 0006-Fix-leaked-subsurface-wayland-items.patch
Patch7: 0007-Use-qWarning-and-_exit-instead-of-qFatal-for-wayland.patch
BuildRequires: fdupes BuildRequires: fdupes
BuildRequires: libqt5-qtbase-private-headers-devel >= %{version} BuildRequires: libqt5-qtbase-private-headers-devel >= %{version}
BuildRequires: libqt5-qtdeclarative-private-headers-devel >= %{version} BuildRequires: libqt5-qtdeclarative-private-headers-devel >= %{version}