summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sturmlechner <asturm@gentoo.org>2022-05-25 21:30:12 +0200
committerAndreas Sturmlechner <asturm@gentoo.org>2022-05-25 23:10:11 +0200
commit854fdba3048965bfa65fdb9d0d827c3cf86283e7 (patch)
tree73172a79b82dc41efdf5630cbbb0082a5446c795 /kde-plasma/kwin
parentkde-plasma/libksysguard: Drop 5.24.5 (r0) (diff)
downloadgentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.tar.gz
gentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.tar.bz2
gentoo-854fdba3048965bfa65fdb9d0d827c3cf86283e7.zip
kde-plasma/kwin: Backport several 5.24.6 fixes
Package-Manager: Portage-3.0.30, Repoman-3.0.3 Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
Diffstat (limited to 'kde-plasma/kwin')
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch307
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch35
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch32
-rw-r--r--kde-plasma/kwin/kwin-5.24.5-r2.ebuild142
4 files changed, 516 insertions, 0 deletions
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch
new file mode 100644
index 000000000000..46b6f0ad9c71
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch
@@ -0,0 +1,307 @@
+From 4c3195270d6c8e1da8c3e2e3abe5aae75d5bf3c2 Mon Sep 17 00:00:00 2001
+From: Vlad Zahorodnii <vlad.zahorodnii@kde.org>
+Date: Fri, 26 Nov 2021 12:03:14 +0200
+Subject: [PATCH] Ensure that Toplevel::output() stays always in sync with
+ geometry
+
+Currently, if geometry updates are blocked, the Toplevel.output property
+won't be updated. On the other hand, it's reasonable to use the output
+property instead of manually looking up the output in window management
+code, e.g. Workspace::clientArea().
+
+In other words, using the Toplevel.output property is like walking on a
+mine field, things can blow up. You can't use Toplevel.output even if it
+makes perfect sense.
+
+This change ensures that Toplevel.output property is always kept in sync
+with the frame geometry. Unfortunately, this means that the output
+property no longer can be updated when the frameGeometryChanged() signal
+is emitted. It has to be done in moveResizeInternal() method.
+
+BUG: 448064
+
+(cherry picked from 510a41eeb89f51843405fa0258c852ab06d05bb8)
+
+Part-of: <https://invent.kde.org/plasma/kwin/-/merge_requests/2448>
+---
+ src/abstract_client.cpp | 3 ---
+ src/events.cpp | 1 +
+ src/internal_client.cpp | 6 ++++++
+ src/toplevel.cpp | 17 -----------------
+ src/toplevel.h | 10 ++--------
+ src/unmanaged.cpp | 6 ++++++
+ src/unmanaged.h | 1 +
+ src/waylandclient.cpp | 6 ++++++
+ src/x11client.cpp | 7 +++++++
+ src/x11client.h | 1 +
+ 10 files changed, 30 insertions(+), 28 deletions(-)
+
+diff --git a/src/abstract_client.cpp b/src/abstract_client.cpp
+index 0714b9ac3f..ddff11e53c 100644
+--- a/src/abstract_client.cpp
++++ b/src/abstract_client.cpp
+@@ -63,8 +63,6 @@ AbstractClient::AbstractClient()
+ {
+ connect(this, &AbstractClient::clientStartUserMovedResized, this, &AbstractClient::moveResizedChanged);
+ connect(this, &AbstractClient::clientFinishUserMovedResized, this, &AbstractClient::moveResizedChanged);
+- connect(this, &AbstractClient::clientStartUserMovedResized, this, &AbstractClient::removeCheckOutputConnection);
+- connect(this, &AbstractClient::clientFinishUserMovedResized, this, &AbstractClient::setupCheckOutputConnection);
+
+ connect(this, &AbstractClient::windowShown, this, &AbstractClient::hiddenChanged);
+ connect(this, &AbstractClient::windowHidden, this, &AbstractClient::hiddenChanged);
+@@ -1011,7 +1009,6 @@ void AbstractClient::finishInteractiveMoveResize(bool cancel)
+ if (cancel) {
+ moveResize(initialInteractiveMoveResizeGeometry());
+ }
+- checkOutput(); // needs to be done because clientFinishUserMovedResized has not yet re-activated online alignment
+ if (output() != interactiveMoveResizeStartOutput()) {
+ workspace()->sendClientToOutput(this, output()); // checks rule validity
+ if (isFullScreen() || maximizeMode() != MaximizeRestore) {
+diff --git a/src/events.cpp b/src/events.cpp
+index b9bb9bbd36..a22960f0d0 100644
+--- a/src/events.cpp
++++ b/src/events.cpp
+@@ -1261,6 +1261,7 @@ void Unmanaged::configureNotifyEvent(xcb_configure_notify_event_t *e)
+ m_clientGeometry = newgeom;
+ m_frameGeometry = newgeom;
+ m_bufferGeometry = newgeom;
++ checkOutput();
+ Q_EMIT bufferGeometryChanged(this, old);
+ Q_EMIT clientGeometryChanged(this, old);
+ Q_EMIT frameGeometryChanged(this, old);
+diff --git a/src/internal_client.cpp b/src/internal_client.cpp
+index 3be51ff27b..b4c9250fd3 100644
+--- a/src/internal_client.cpp
++++ b/src/internal_client.cpp
+@@ -10,6 +10,7 @@
+ #include "internal_client.h"
+ #include "decorations/decorationbridge.h"
+ #include "deleted.h"
++#include "platform.h"
+ #include "surfaceitem.h"
+ #include "workspace.h"
+
+@@ -477,6 +478,7 @@ void InternalClient::commitGeometry(const QRect &rect)
+ // The client geometry and the buffer geometry are the same.
+ const QRect oldClientGeometry = m_clientGeometry;
+ const QRect oldFrameGeometry = m_frameGeometry;
++ const AbstractOutput *oldOutput = m_output;
+
+ m_clientGeometry = frameRectToClientRect(rect);
+ m_frameGeometry = rect;
+@@ -486,6 +488,7 @@ void InternalClient::commitGeometry(const QRect &rect)
+ return;
+ }
+
++ m_output = kwinApp()->platform()->outputAt(rect.center());
+ syncGeometryToInternalWindow();
+
+ if (oldClientGeometry != m_clientGeometry) {
+@@ -495,6 +498,9 @@ void InternalClient::commitGeometry(const QRect &rect)
+ if (oldFrameGeometry != m_frameGeometry) {
+ Q_EMIT frameGeometryChanged(this, oldFrameGeometry);
+ }
++ if (oldOutput != m_output) {
++ Q_EMIT screenChanged();
++ }
+ Q_EMIT geometryShapeChanged(this, oldFrameGeometry);
+ }
+
+diff --git a/src/toplevel.cpp b/src/toplevel.cpp
+index 698f6998e5..ff216835c4 100644
+--- a/src/toplevel.cpp
++++ b/src/toplevel.cpp
+@@ -47,7 +47,6 @@ Toplevel::Toplevel()
+ , m_skipCloseAnimation(false)
+ {
+ connect(screens(), &Screens::changed, this, &Toplevel::screenChanged);
+- setupCheckOutputConnection();
+ connect(this, &Toplevel::bufferGeometryChanged, this, &Toplevel::inputTransformationChanged);
+
+ // Only for compatibility reasons, drop in the next major release.
+@@ -379,22 +378,6 @@ void Toplevel::deleteEffectWindow()
+ effect_window = nullptr;
+ }
+
+-void Toplevel::checkOutput()
+-{
+- setOutput(kwinApp()->platform()->outputAt(frameGeometry().center()));
+-}
+-
+-void Toplevel::setupCheckOutputConnection()
+-{
+- connect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::checkOutput);
+- checkOutput();
+-}
+-
+-void Toplevel::removeCheckOutputConnection()
+-{
+- disconnect(this, &Toplevel::frameGeometryChanged, this, &Toplevel::checkOutput);
+-}
+-
+ int Toplevel::screen() const
+ {
+ return kwinApp()->platform()->enabledOutputs().indexOf(m_output);
+diff --git a/src/toplevel.h b/src/toplevel.h
+index f6b5dd4e61..3309647eb4 100644
+--- a/src/toplevel.h
++++ b/src/toplevel.h
+@@ -636,13 +636,6 @@ Q_SIGNALS:
+ void visibleGeometryChanged();
+
+ protected Q_SLOTS:
+- /**
+- * Checks whether the screen number for this Toplevel changed and updates if needed.
+- * Any method changing the geometry of the Toplevel should call this method.
+- */
+- void checkOutput();
+- void setupCheckOutputConnection();
+- void removeCheckOutputConnection();
+ void setReadyForPainting();
+
+ protected:
+@@ -673,6 +666,8 @@ protected:
+ void deleteShadow();
+ void deleteEffectWindow();
+ void setDepth(int depth);
++
++ AbstractOutput *m_output = nullptr;
+ QRect m_frameGeometry;
+ QRect m_clientGeometry;
+ QRect m_bufferGeometry;
+@@ -700,7 +695,6 @@ private:
+ QRegion opaque_region;
+ mutable QRegion m_shapeRegion;
+ mutable bool m_shapeRegionIsValid = false;
+- AbstractOutput *m_output = nullptr;
+ bool m_skipCloseAnimation;
+ quint32 m_pendingSurfaceId = 0;
+ QPointer<KWaylandServer::SurfaceInterface> m_surface;
+diff --git a/src/unmanaged.cpp b/src/unmanaged.cpp
+index de3caa303d..3164813a75 100644
+--- a/src/unmanaged.cpp
++++ b/src/unmanaged.cpp
+@@ -12,6 +12,7 @@
+ #include "workspace.h"
+ #include "effects.h"
+ #include "deleted.h"
++#include "platform.h"
+ #include "surfaceitem_x11.h"
+ #include "utils/common.h"
+
+@@ -206,6 +207,11 @@ QWindow *Unmanaged::findInternalWindow() const
+ return nullptr;
+ }
+
++void Unmanaged::checkOutput()
++{
++ setOutput(kwinApp()->platform()->outputAt(frameGeometry().center()));
++}
++
+ void Unmanaged::damageNotifyEvent()
+ {
+ Q_ASSERT(kwinApp()->operationMode() == Application::OperationModeX11);
+diff --git a/src/unmanaged.h b/src/unmanaged.h
+index e874fc1724..fa543eb0b8 100644
+--- a/src/unmanaged.h
++++ b/src/unmanaged.h
+@@ -45,6 +45,7 @@ private:
+ void configureNotifyEvent(xcb_configure_notify_event_t *e);
+ void damageNotifyEvent();
+ QWindow *findInternalWindow() const;
++ void checkOutput();
+ void associate();
+ void initialize();
+ bool m_outline = false;
+diff --git a/src/waylandclient.cpp b/src/waylandclient.cpp
+index 39d6ea22bc..9d8070c7f8 100644
+--- a/src/waylandclient.cpp
++++ b/src/waylandclient.cpp
+@@ -7,6 +7,7 @@
+ */
+
+ #include "waylandclient.h"
++#include "platform.h"
+ #include "screens.h"
+ #include "wayland_server.h"
+ #include "workspace.h"
+@@ -289,6 +290,7 @@ void WaylandClient::updateGeometry(const QRect &rect)
+ const QRect oldClientGeometry = m_clientGeometry;
+ const QRect oldFrameGeometry = m_frameGeometry;
+ const QRect oldBufferGeometry = m_bufferGeometry;
++ const AbstractOutput *oldOutput = m_output;
+
+ m_clientGeometry = frameRectToClientRect(rect);
+ m_frameGeometry = rect;
+@@ -310,6 +312,7 @@ void WaylandClient::updateGeometry(const QRect &rect)
+ return;
+ }
+
++ m_output = kwinApp()->platform()->outputAt(rect.center());
+ updateWindowRules(Rules::Position | Rules::Size);
+
+ if (changedGeometries & WaylandGeometryBuffer) {
+@@ -321,6 +324,9 @@ void WaylandClient::updateGeometry(const QRect &rect)
+ if (changedGeometries & WaylandGeometryFrame) {
+ Q_EMIT frameGeometryChanged(this, oldFrameGeometry);
+ }
++ if (oldOutput != m_output) {
++ Q_EMIT screenChanged();
++ }
+ Q_EMIT geometryShapeChanged(this, oldFrameGeometry);
+ }
+
+diff --git a/src/x11client.cpp b/src/x11client.cpp
+index ce275fff1b..d7ed823128 100644
+--- a/src/x11client.cpp
++++ b/src/x11client.cpp
+@@ -4062,6 +4062,8 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode)
+ m_lastClientGeometry == m_clientGeometry) {
+ return;
+ }
++
++ m_output = kwinApp()->platform()->outputAt(frameGeometry.center());
+ if (areGeometryUpdatesBlocked()) {
+ setPendingMoveResizeMode(mode);
+ return;
+@@ -4070,6 +4072,7 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode)
+ const QRect oldBufferGeometry = m_lastBufferGeometry;
+ const QRect oldFrameGeometry = m_lastFrameGeometry;
+ const QRect oldClientGeometry = m_lastClientGeometry;
++ const AbstractOutput *oldOutput = m_lastOutput;
+
+ updateServerGeometry();
+ updateWindowRules(Rules::Position|Rules::Size);
+@@ -4077,6 +4080,7 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode)
+ m_lastBufferGeometry = m_bufferGeometry;
+ m_lastFrameGeometry = m_frameGeometry;
+ m_lastClientGeometry = m_clientGeometry;
++ m_lastOutput = m_output;
+
+ if (isActive()) {
+ workspace()->setActiveOutput(output());
+@@ -4092,6 +4096,9 @@ void X11Client::moveResizeInternal(const QRect &rect, MoveResizeMode mode)
+ if (oldFrameGeometry != m_frameGeometry) {
+ Q_EMIT frameGeometryChanged(this, oldFrameGeometry);
+ }
++ if (oldOutput != m_output) {
++ Q_EMIT screenChanged();
++ }
+ Q_EMIT geometryShapeChanged(this, oldFrameGeometry);
+ }
+
+diff --git a/src/x11client.h b/src/x11client.h
+index b523044d3d..adb8b0e8df 100644
+--- a/src/x11client.h
++++ b/src/x11client.h
+@@ -524,6 +524,7 @@ private:
+ QMetaObject::Connection m_edgeGeometryTrackingConnection;
+
+ QMargins m_clientFrameExtents;
++ AbstractOutput *m_lastOutput = nullptr;
+ QRect m_lastBufferGeometry;
+ QRect m_lastFrameGeometry;
+ QRect m_lastClientGeometry;
+--
+GitLab
+
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch
new file mode 100644
index 000000000000..026efdf9465b
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-2.patch
@@ -0,0 +1,35 @@
+From a8477c1cf7acbf3358c85e53b236150dd43b4640 Mon Sep 17 00:00:00 2001
+From: Xaver Hugl <xaver.hugl@gmail.com>
+Date: Thu, 14 Apr 2022 18:48:56 +0200
+Subject: [PATCH] toplevel: set valid output in the constructor
+
+This makes it less easy to cause crashes and fixes some segfaults.
+
+BUG: 452433
+BUG: 448064
+
+(cherry picked from commit e48a5c0535f01dc380449ba8481c869ff23e5558)
+
+Tested-by: Merge Service <https://invent.kde.org/plasma/kwin/-/merge_requests/2448>
+Part-of: <https://invent.kde.org/plasma/kwin/-/merge_requests/2448>
+---
+ src/toplevel.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/toplevel.cpp b/src/toplevel.cpp
+index ff216835c4..5d3d7a5dde 100644
+--- a/src/toplevel.cpp
++++ b/src/toplevel.cpp
+@@ -34,7 +34,8 @@ namespace KWin
+ {
+
+ Toplevel::Toplevel()
+- : m_visual(XCB_NONE)
++ : m_output(workspace()->activeOutput())
++ , m_visual(XCB_NONE)
+ , bit_depth(24)
+ , info(nullptr)
+ , ready_for_painting(false)
+--
+GitLab
+
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch b/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch
new file mode 100644
index 000000000000..d1dbb3fb9bb8
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch
@@ -0,0 +1,32 @@
+From 1b96d21507a3b6b0a9ac6eac424d4e4db5602839 Mon Sep 17 00:00:00 2001
+From: David Redondo <kde@david-redondo.de>
+Date: Wed, 18 May 2022 13:34:45 +0200
+Subject: [PATCH] Update device outputName when setting output
+
+BUG:451279
+FIXED-IN:5.25.0
+
+
+(cherry picked from commit d3a37aa9aef58fbaedcef77d2797c22a015dc9c0)
+---
+ src/backends/libinput/device.cpp | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/backends/libinput/device.cpp b/src/backends/libinput/device.cpp
+index f247b66d74..30f51aca3c 100644
+--- a/src/backends/libinput/device.cpp
++++ b/src/backends/libinput/device.cpp
+@@ -668,8 +668,10 @@ void Device::setOutput(AbstractOutput *output)
+ {
+ m_output = output;
+ if (m_output) {
++ m_outputName = output->name();
+ writeEntry(ConfigKey::OutputName, output->name());
+ } else {
++ m_outputName = QString();
+ writeEntry(ConfigKey::OutputName, QString());
+ }
+ Q_EMIT outputNameChanged();
+--
+GitLab
+
diff --git a/kde-plasma/kwin/kwin-5.24.5-r2.ebuild b/kde-plasma/kwin/kwin-5.24.5-r2.ebuild
new file mode 100644
index 000000000000..c4afd02c8fc6
--- /dev/null
+++ b/kde-plasma/kwin/kwin-5.24.5-r2.ebuild
@@ -0,0 +1,142 @@
+# Copyright 1999-2022 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+ECM_HANDBOOK="optional"
+ECM_TEST="optional"
+KFMIN=5.90.0
+PVCUT=$(ver_cut 1-3)
+QTMIN=5.15.2
+VIRTUALX_REQUIRED="test"
+inherit ecm kde.org optfeature
+
+DESCRIPTION="Flexible, composited Window Manager for windowing systems on Linux"
+
+LICENSE="GPL-2+"
+SLOT="5"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~riscv ~x86"
+IUSE="accessibility caps gles2-only multimedia plasma screencast"
+
+RESTRICT="test"
+
+COMMON_DEPEND="
+ >=dev-libs/libinput-1.19
+ >=dev-libs/wayland-1.2
+ >=dev-qt/qtdbus-${QTMIN}:5
+ >=dev-qt/qtdeclarative-${QTMIN}:5
+ >=dev-qt/qtgui-${QTMIN}:5=[gles2-only=,libinput]
+ >=dev-qt/qtwidgets-${QTMIN}:5
+ >=dev-qt/qtx11extras-${QTMIN}:5
+ >=kde-frameworks/kactivities-${KFMIN}:5
+ >=kde-frameworks/kauth-${KFMIN}:5
+ >=kde-frameworks/kcmutils-${KFMIN}:5
+ >=kde-frameworks/kcompletion-${KFMIN}:5
+ >=kde-frameworks/kconfig-${KFMIN}:5
+ >=kde-frameworks/kconfigwidgets-${KFMIN}:5
+ >=kde-frameworks/kcoreaddons-${KFMIN}:5
+ >=kde-frameworks/kcrash-${KFMIN}:5
+ >=kde-frameworks/kdbusaddons-${KFMIN}:5
+ >=kde-frameworks/kdeclarative-${KFMIN}:5
+ >=kde-frameworks/kglobalaccel-${KFMIN}:5=
+ >=kde-frameworks/ki18n-${KFMIN}:5
+ >=kde-frameworks/kiconthemes-${KFMIN}:5
+ >=kde-frameworks/kidletime-${KFMIN}:5=
+ >=kde-frameworks/knewstuff-${KFMIN}:5
+ >=kde-frameworks/knotifications-${KFMIN}:5
+ >=kde-frameworks/kpackage-${KFMIN}:5
+ >=kde-frameworks/kservice-${KFMIN}:5
+ >=kde-frameworks/ktextwidgets-${KFMIN}:5
+ >=kde-frameworks/kwayland-${KFMIN}:5
+ >=kde-frameworks/kwidgetsaddons-${KFMIN}:5
+ >=kde-frameworks/kwindowsystem-${KFMIN}:5=[X]
+ >=kde-frameworks/kxmlgui-${KFMIN}:5
+ >=kde-frameworks/plasma-${KFMIN}:5
+ >=kde-plasma/breeze-${PVCUT}:5
+ >=kde-plasma/kdecoration-${PVCUT}:5
+ >=kde-plasma/kscreenlocker-${PVCUT}:5
+ >=kde-plasma/kwayland-server-${PVCUT}:5
+ media-libs/fontconfig
+ media-libs/freetype
+ media-libs/lcms:2
+ media-libs/libepoxy
+ >=media-libs/mesa-21.1[egl(+),gbm(+),wayland,X]
+ virtual/libudev:=
+ x11-libs/libX11
+ x11-libs/libXi
+ x11-libs/libdrm
+ >=x11-libs/libxcb-1.10
+ >=x11-libs/libxkbcommon-0.7.0
+ x11-libs/xcb-util-cursor
+ x11-libs/xcb-util-image
+ x11-libs/xcb-util-keysyms
+ x11-libs/xcb-util-wm
+ accessibility? ( media-libs/libqaccessibilityclient:5 )
+ caps? ( sys-libs/libcap )
+ gles2-only? ( media-libs/mesa[gles2] )
+ plasma? ( >=kde-frameworks/krunner-${KFMIN}:5 )
+ screencast? ( >=media-video/pipewire-0.3:= )
+"
+RDEPEND="${COMMON_DEPEND}
+ >=dev-qt/qtquickcontrols-${QTMIN}:5
+ >=dev-qt/qtquickcontrols2-${QTMIN}:5
+ >=dev-qt/qtvirtualkeyboard-${QTMIN}:5
+ >=kde-frameworks/kirigami-${KFMIN}:5
+ >=kde-frameworks/kitemmodels-${KFMIN}:5[qml]
+ sys-apps/hwdata
+ x11-base/xwayland
+ multimedia? ( >=dev-qt/qtmultimedia-${QTMIN}:5[gstreamer,qml] )
+"
+DEPEND="${COMMON_DEPEND}
+ >=dev-qt/designer-${QTMIN}:5
+ >=dev-qt/qtconcurrent-${QTMIN}:5
+ x11-base/xorg-proto
+ test? (
+ dev-libs/plasma-wayland-protocols
+ >=dev-libs/wayland-protocols-1.19
+ )
+"
+BDEPEND="test? ( >=dev-qt/qtwaylandscanner-${QTMIN}:5 )"
+PDEPEND=">=kde-plasma/kde-cli-tools-${PVCUT}:5"
+
+PATCHES=(
+ "${FILESDIR}"/${P}-fix-multi-gpu-double-copy.patch # KDE-bug 453386
+ "${FILESDIR}"/${P}-tabbox-dont-dismiss-popups.patch # KDE-bug 446318
+ "${FILESDIR}"/${P}-effects-overview-hide-panels.patch # KDE-bug 444274
+ "${FILESDIR}"/${P}-fix-nvidia-render-glitches.patch
+ "${FILESDIR}"/${P}-update-device-outputName.patch # KDE-bug 451279
+ "${FILESDIR}"/${P}-fix-plasmashell-crash-{1,2}.patch # KDE-bugs 448064, 452433
+)
+
+src_prepare() {
+ ecm_src_prepare
+ use multimedia || eapply "${FILESDIR}/${PN}-5.21.80-gstreamer-optional.patch"
+
+ # TODO: try to get a build switch upstreamed
+ if ! use screencast; then
+ sed -e "s/^pkg_check_modules.*PipeWire/#&/" -i CMakeLists.txt || die
+ fi
+}
+
+src_configure() {
+ local mycmakeargs=(
+ $(cmake_use_find_package accessibility QAccessibilityClient)
+ $(cmake_use_find_package caps Libcap)
+ $(cmake_use_find_package plasma KF5Runner)
+ )
+
+ ecm_src_configure
+}
+
+pkg_postinst() {
+ ecm_pkg_postinst
+ optfeature "color management support" x11-misc/colord
+ elog
+ elog "In Plasma 5.20, default behavior of the Task Switcher to move minimised"
+ elog "windows to the end of the list was changed so that it remains in the"
+ elog "original order. To revert to the well established behavior:"
+ elog
+ elog " - Edit ~/.config/kwinrc"
+ elog " - Find [TabBox] section"
+ elog " - Add \"MoveMinimizedWindowsToEndOfTabBoxFocusChain=true\""
+}