diff --git a/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch b/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch new file mode 100644 index 0000000..59bf71e --- /dev/null +++ b/0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch @@ -0,0 +1,37 @@ +From 92bcb8f6b7a852c7a5d662fc34de561692a7a454 Mon Sep 17 00:00:00 2001 +From: Vlad Zahorodnii +Date: Thu, 20 Jun 2024 11:25:06 +0300 +Subject: [PATCH] Client: Ensure that guessed popup parent has a shell surface + +The last input window may not have a shell surface if it is a subsurface +or that window has been just made invisible. + +Change-Id: Iad11c68659579429ddc5d9ba0038975b25da8e0d +Reviewed-by: David Edmundson +(cherry picked from commit 52c406cec149634680489faeeaf06bb1258cd12f) +Reviewed-by: Qt Cherry-pick Bot +(cherry picked from commit 7d04c18531276c94bfdf2f9a955d6f02554b28b2) +--- + 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 22aeba10..c3725ffc 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -1157,8 +1157,10 @@ QWaylandWindow *QWaylandWindow::guessTransientParent() const + return mTopPopup; + } + +- if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup) +- return display()->lastInputWindow(); ++ if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup) { ++ if (auto lastInputWindow = display()->lastInputWindow()) ++ return closestShellSurfaceWindow(lastInputWindow->window()); ++ } + + return nullptr; + } +-- +2.45.2 + diff --git a/0001-client-Guard-against-windows-being-on-a-null-screen.patch b/0001-client-Guard-against-windows-being-on-a-null-screen.patch new file mode 100644 index 0000000..537eab9 --- /dev/null +++ b/0001-client-Guard-against-windows-being-on-a-null-screen.patch @@ -0,0 +1,44 @@ +From 8811c62a0c31443ee888a67df2e960bc040f3dcc Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Wed, 10 Jul 2024 09:00:33 +0100 +Subject: [PATCH 1/2] 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 +Reviewed-by: Vlad Zahorodnii +(cherry picked from commit c4f91b479303dda2e49499de249018d7c66c5f99) +Reviewed-by: Qt Cherry-pick Bot +(cherry picked from commit ec07c90cd647fd7a647f3f10dcae4d18699263df) +(cherry picked from commit 406995207eae8d644b6e5262aa716a48c7e471a8) +--- + 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 22aeba10..c64f3326 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -1405,7 +1405,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()); +-- +2.45.2 + diff --git a/0002-Client-Improve-thread-safety-determining-window-size.patch b/0002-Client-Improve-thread-safety-determining-window-size.patch new file mode 100644 index 0000000..f20d0ed --- /dev/null +++ b/0002-Client-Improve-thread-safety-determining-window-size.patch @@ -0,0 +1,86 @@ +From be646fd42892d6e59a573a0a188c5ae193d2be83 Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Fri, 5 Jul 2024 16:13:40 +0100 +Subject: [PATCH 2/2] 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 +(cherry picked from commit 83da29c62f8fb918df8d91826d16b5d5ceb2c704) +Reviewed-by: Qt Cherry-pick Bot +(cherry picked from commit f817608c7152487f489d0f3a227c1d0ceb7b0c2c) +--- + .../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 e6258893..d020f4db 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 5b9aa987..048f0b61 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; + }; + + } +-- +2.45.2 + diff --git a/qt6-wayland.changes b/qt6-wayland.changes index 723feec..d5f1403 100644 --- a/qt6-wayland.changes +++ b/qt6-wayland.changes @@ -1,3 +1,35 @@ +------------------------------------------------------------------- +Tue Jul 16 09:02:13 UTC 2024 - Fabian Vogt + +- Add patches to fix crashes on screens disappearing + (kde#489072, kde#489180): + * 0001-client-Guard-against-windows-being-on-a-null-screen.patch + * 0002-Client-Improve-thread-safety-determining-window-size.patch + +------------------------------------------------------------------- +Tue Jul 9 09:20:12 UTC 2024 - Fabian Vogt + +- Add patch to fix certain wayland protocol errors (kde#489259): + * 0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch + +------------------------------------------------------------------- +Wed Jun 19 07:26:06 UTC 2024 - Christophe Marin + +- Update to 6.7.2: + * https://www.qt.io/blog/qt-6.7.2-released + +------------------------------------------------------------------- +Tue May 21 08:31:51 UTC 2024 - Christophe Marin + +- Update to 6.7.1: + * https://www.qt.io/blog/qt-6.7.1-released + +------------------------------------------------------------------- +Tue Apr 2 13:40:03 UTC 2024 - Christophe Marin + +- Update to 6.7.0: + * https://www.qt.io/blog/qt-6.7-released + ------------------------------------------------------------------- Tue Mar 26 14:27:07 UTC 2024 - Christophe Marin diff --git a/qt6-wayland.spec b/qt6-wayland.spec index 012ad81..45d088d 100644 --- a/qt6-wayland.spec +++ b/qt6-wayland.spec @@ -1,7 +1,7 @@ # # spec file for package qt6-wayland # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,8 +16,8 @@ # -%define real_version 6.6.3 -%define short_version 6.6 +%define real_version 6.7.2 +%define short_version 6.7 %define tar_name qtwayland-everywhere-src %define tar_suffix %{nil} # @@ -30,14 +30,19 @@ %global with_opengl 1 %endif Name: qt6-wayland%{?pkg_suffix} -Version: 6.6.3 +Version: 6.7.2 Release: 0 Summary: Qt 6 Wayland libraries and tools # The wayland compositor files are GPL-3.0-or-later -License: GPL-3.0-or-later AND (LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-or-later) +License: GPL-3.0-or-later AND (GPL-2.0-only OR LGPL-3.0-only OR GPL-3.0-or-later) URL: https://www.qt.io -Source: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz +Source0: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz Source99: qt6-wayland-rpmlintrc +# PATCH-FIX-UPSTREAM +Patch1: 0001-Client-Ensure-that-guessed-popup-parent-has-a-shell-.patch +Patch2: 0001-client-Guard-against-windows-being-on-a-null-screen.patch +# https://codereview.qt-project.org/c/qt/qtwayland/+/574983 +Patch3: 0002-Client-Improve-thread-safety-determining-window-size.patch BuildRequires: pkgconfig BuildRequires: qt6-core-private-devel BuildRequires: qt6-gui-private-devel diff --git a/qtwayland-everywhere-src-6.6.3.tar.xz b/qtwayland-everywhere-src-6.6.3.tar.xz deleted file mode 100644 index db9bba9..0000000 --- a/qtwayland-everywhere-src-6.6.3.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a96ecc0fecc05f9e18cfb7806fe5ebd7416be94e8f51ebeca75c80412f66553d -size 1120056 diff --git a/qtwayland-everywhere-src-6.7.2.tar.xz b/qtwayland-everywhere-src-6.7.2.tar.xz new file mode 100644 index 0000000..f884242 --- /dev/null +++ b/qtwayland-everywhere-src-6.7.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2a057e1dd644bd44abb9990fecc194b2e25c2e0f39e81aa9fee4c1e5e2a8a5b +size 1123220