Sync from SUSE:SLFO:Main qt6-wayland revision 94cc202f518737316538dedaffa33a25

This commit is contained in:
Adrian Schröter 2024-09-11 10:26:29 +02:00
parent 6362ad9209
commit 9f521fde93
7 changed files with 213 additions and 9 deletions

View File

@ -0,0 +1,37 @@
From 92bcb8f6b7a852c7a5d662fc34de561692a7a454 Mon Sep 17 00:00:00 2001
From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
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 <davidedmundson@kde.org>
(cherry picked from commit 52c406cec149634680489faeeaf06bb1258cd12f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(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

View File

@ -0,0 +1,44 @@
From 8811c62a0c31443ee888a67df2e960bc040f3dcc Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
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 <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)
(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

View File

@ -0,0 +1,86 @@
From be646fd42892d6e59a573a0a188c5ae193d2be83 Mon Sep 17 00:00:00 2001
From: David Edmundson <davidedmundson@kde.org>
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 <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)
---
.../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

View File

@ -1,3 +1,35 @@
-------------------------------------------------------------------
Tue Jul 16 09:02:13 UTC 2024 - Fabian Vogt <fvogt@suse.com>
- 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 <fabian@ritter-vogt.de>
- 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 <christophe@krop.fr>
- 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 <christophe@krop.fr>
- 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 <christophe@krop.fr>
- Update to 6.7.0:
* https://www.qt.io/blog/qt-6.7-released
-------------------------------------------------------------------
Tue Mar 26 14:27:07 UTC 2024 - Christophe Marin <christophe@krop.fr>

View File

@ -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

BIN
qtwayland-everywhere-src-6.6.3.tar.xz (Stored with Git LFS)

Binary file not shown.

BIN
qtwayland-everywhere-src-6.7.2.tar.xz (Stored with Git LFS) Normal file

Binary file not shown.