mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-06 05:47:13 +02:00
community/qt6-qtwayland: backport fixes to prevent Plasma from crashing
To be released in Qt 6.7.3 but KDE requested us to ship it earlier
This commit is contained in:
parent
6b860eab3c
commit
40b6961c18
@ -0,0 +1,43 @@
|
|||||||
|
From 406995207eae8d644b6e5262aa716a48c7e471a8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Edmundson <davidedmundson@kde.org>
|
||||||
|
Date: Wed, 10 Jul 2024 09:00:33 +0100
|
||||||
|
Subject: [PATCH] client: Guard against windows being on a null screen
|
||||||
|
|
||||||
|
calculateScreenFromSurfaceEvents uses the screen information from our
|
||||||
|
surface enter events. If this is not set yet, or refers to outputs not
|
||||||
|
yet complete we fall back to the QWindow::screen. This was introduced in
|
||||||
|
e03613524fc9f6be5c4cd7e9bdb00bc09c7f1e0b.
|
||||||
|
|
||||||
|
It was assumed that this would always be a valid value as QtBase keeps
|
||||||
|
it updated, but there are apparently paths for it to still be null.
|
||||||
|
|
||||||
|
It will be evaluated again when the surface receives a wl_enter event or
|
||||||
|
the output that we have entered is finally initialised and we will then
|
||||||
|
be marked as on the correct screen.
|
||||||
|
|
||||||
|
Change-Id: I33b4a5112c3426a8ea523d39a0658ba7ffee5298
|
||||||
|
Reviewed-by: Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||||
|
Reviewed-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||||
|
(cherry picked from commit c4f91b479303dda2e49499de249018d7c66c5f99)
|
||||||
|
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||||
|
(cherry picked from commit ec07c90cd647fd7a647f3f10dcae4d18699263df)
|
||||||
|
---
|
||||||
|
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 c3725ffc9..192373184 100644
|
||||||
|
--- a/src/client/qwaylandwindow.cpp
|
||||||
|
+++ b/src/client/qwaylandwindow.cpp
|
||||||
|
@@ -1407,7 +1407,7 @@ void QWaylandWindow::handleScreensChanged()
|
||||||
|
{
|
||||||
|
QPlatformScreen *newScreen = calculateScreenFromSurfaceEvents();
|
||||||
|
|
||||||
|
- if (newScreen->screen() == window()->screen())
|
||||||
|
+ if (!newScreen || newScreen->screen() == window()->screen())
|
||||||
|
return;
|
||||||
|
|
||||||
|
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -0,0 +1,87 @@
|
|||||||
|
From 632127d7f1d86cba4dd17361f24f9fd70a0ae44c Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Edmundson <davidedmundson@kde.org>
|
||||||
|
Date: Fri, 5 Jul 2024 16:13:40 +0100
|
||||||
|
Subject: [PATCH] Client: Improve thread safety determining window size on the
|
||||||
|
render thread
|
||||||
|
|
||||||
|
updateSurface is called from both the render and GUI thread. We
|
||||||
|
therefore need every property referenced to be thread safe.
|
||||||
|
|
||||||
|
Rather than guarding each property we cache the buffer size whenever the
|
||||||
|
window geometry or scale changes and put a mutex round this one
|
||||||
|
variable.
|
||||||
|
|
||||||
|
Change-Id: I4168ced27556e0e4558bbdbd1daa275d7523c33d
|
||||||
|
Reviewed-by: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||||
|
(cherry picked from commit 83da29c62f8fb918df8d91826d16b5d5ceb2c704)
|
||||||
|
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
|
||||||
|
(cherry picked from commit f817608c7152487f489d0f3a227c1d0ceb7b0c2c)
|
||||||
|
Reviewed-by: David Edmundson <davidedmundson@kde.org>
|
||||||
|
---
|
||||||
|
.../client/wayland-egl/qwaylandeglwindow.cpp | 20 +++++++++++++++----
|
||||||
|
.../client/wayland-egl/qwaylandeglwindow_p.h | 6 ++++++
|
||||||
|
2 files changed, 22 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||||
|
index 652a65630..44f1038c3 100644
|
||||||
|
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||||
|
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp
|
||||||
|
@@ -50,6 +50,15 @@ QWaylandWindow::WindowType QWaylandEglWindow::windowType() const
|
||||||
|
|
||||||
|
void QWaylandEglWindow::ensureSize()
|
||||||
|
{
|
||||||
|
+ // this is always called on the main thread
|
||||||
|
+ QMargins margins = mWindowDecoration ? frameMargins() : QMargins{};
|
||||||
|
+ QRect rect = geometry();
|
||||||
|
+ QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale();
|
||||||
|
+ {
|
||||||
|
+ QWriteLocker lock(&m_bufferSizeLock);
|
||||||
|
+ m_bufferSize = sizeWithMargins;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
updateSurface(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -60,14 +69,17 @@ void QWaylandEglWindow::setGeometry(const QRect &rect)
|
||||||
|
// we're now getting a resize we don't want to create it again.
|
||||||
|
// Just resize the wl_egl_window, the EGLSurface will be created
|
||||||
|
// the next time makeCurrent is called.
|
||||||
|
- updateSurface(false);
|
||||||
|
+ ensureSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWaylandEglWindow::updateSurface(bool create)
|
||||||
|
{
|
||||||
|
- QMargins margins = mWindowDecoration ? frameMargins() : QMargins{};
|
||||||
|
- QRect rect = geometry();
|
||||||
|
- QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale();
|
||||||
|
+
|
||||||
|
+ QSize sizeWithMargins;
|
||||||
|
+ {
|
||||||
|
+ QReadLocker lock(&m_bufferSizeLock);
|
||||||
|
+ sizeWithMargins = m_bufferSize;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
// wl_egl_windows must have both width and height > 0
|
||||||
|
// mesa's egl returns NULL if we try to create a, invalid wl_egl_window, however not all EGL
|
||||||
|
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
|
||||||
|
index 5b9aa9874..048f0b610 100644
|
||||||
|
--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
|
||||||
|
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h
|
||||||
|
@@ -60,7 +60,13 @@ private:
|
||||||
|
mutable QOpenGLFramebufferObject *m_contentFBO = nullptr;
|
||||||
|
|
||||||
|
QSurfaceFormat m_format;
|
||||||
|
+ // Size used in the last call to wl_egl_window_resize
|
||||||
|
QSize m_requestedSize;
|
||||||
|
+
|
||||||
|
+ // Size of the buffer used by QWaylandWindow
|
||||||
|
+ // This is always written to from the main thread, potentially read from the rendering thread
|
||||||
|
+ QReadWriteLock m_bufferSizeLock;
|
||||||
|
+ QSize m_bufferSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
--
|
||||||
|
GitLab
|
||||||
|
|
@ -34,6 +34,8 @@ esac
|
|||||||
|
|
||||||
source="https://download.qt.io/$_rel/qt/${pkgver%.*}/${pkgver/_/-}/submodules/qtwayland-everywhere-src-${pkgver/_/-}.tar.xz
|
source="https://download.qt.io/$_rel/qt/${pkgver%.*}/${pkgver/_/-}/submodules/qtwayland-everywhere-src-${pkgver/_/-}.tar.xz
|
||||||
0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch
|
0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch
|
||||||
|
0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch
|
||||||
|
0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch
|
||||||
"
|
"
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
@ -52,4 +54,6 @@ package() {
|
|||||||
sha512sums="
|
sha512sums="
|
||||||
2cd4f45f05ae60bc7f82b94f2e9c217ee4b8322f60381e1b079b90e0687e51cfbeb10b5dd724e1cca7e422b1b101d2b91c0ee47b1a732411cef330fb052c97c2 qtwayland-everywhere-src-6.7.2.tar.xz
|
2cd4f45f05ae60bc7f82b94f2e9c217ee4b8322f60381e1b079b90e0687e51cfbeb10b5dd724e1cca7e422b1b101d2b91c0ee47b1a732411cef330fb052c97c2 qtwayland-everywhere-src-6.7.2.tar.xz
|
||||||
a278bb8c0652999b1187620a7ded28c19cffdbdd42834cbb9ab948598c59a827d22d6a59c4cfd8886702b215694d96f14e868286719f49b99031fbfc308216a0 0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch
|
a278bb8c0652999b1187620a7ded28c19cffdbdd42834cbb9ab948598c59a827d22d6a59c4cfd8886702b215694d96f14e868286719f49b99031fbfc308216a0 0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch
|
||||||
|
ad8f8840ddefb932e46e4080430afa5dadb8f801d38b941bcc1af9f7a5512d249d51d5fc42346ef3c5eafd48c0f70018286ba252ec259a826d44a4bec91ceeca 0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch
|
||||||
|
c109a7a74be3f0314a8caa82f0263f87464a3bc7e4fb00e2657e682422b1e9bad04be3e1888fc3b1a481ce5e61c3eb87a85d8803fcc69c8f4d42cfbdceba3027 0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch
|
||||||
"
|
"
|
||||||
|
Loading…
Reference in New Issue
Block a user