summaryrefslogtreecommitdiff
path: root/kde-plasma/kwin/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2022-06-29 12:04:12 +0100
committerV3n3RiX <venerix@koprulu.sector>2022-06-29 12:04:12 +0100
commit0f558761aa2dee1017b4751e4017205e015a9560 (patch)
tree037df795519468a25d9362b4e95cdaeb84eb1cf9 /kde-plasma/kwin/files
parent752d6256e5204b958b0ef7905675a940b5e9172f (diff)
gentoo resync : 29.12.2022
Diffstat (limited to 'kde-plasma/kwin/files')
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-backends-drm-dont-perm-disable-vrr.patch32
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-backends-drm-fetch-immutable-blobs.patch214
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-dont-send-geom-to-text-input.patch26
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-dont-use-xcb-in-wayland.patch41
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-fix-current-VD-always-added.patch50
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-fix-unlocking-wayland-sessions.patch44
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-waylandserver-lockScreenShown.patch93
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-waylandserver-move-LockScreenPresentationWatcher.patch36
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.4-xdgactivation-demand-attention.patch32
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-effects-overview-hide-panels.patch65
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-fix-multi-gpu-double-copy.patch59
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-fix-nvidia-render-glitches.patch42
-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-tabbox-dont-dismiss-popups.patch32
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-update-device-outputName.patch32
16 files changed, 572 insertions, 568 deletions
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-dont-perm-disable-vrr.patch b/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-dont-perm-disable-vrr.patch
deleted file mode 100644
index 38d4771c2345..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-dont-perm-disable-vrr.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From a5404234dbd26e170acb97789599fbcd705cf6cb Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Fri, 8 Apr 2022 17:47:09 +0200
-Subject: [PATCH] backends/drm: don't permanently disable VRR when the test
- commit fails
-
-In 5.24, the same code path is used for testing direct scanout, so that
-causes false negatives. Generally though, the user setting shouldn't be
-touched, it's not really proper feedback for the driver or KWin having
-problems.
-
-
-(cherry picked from commit 2ef6215a517e4220f147f5327e7ecdad02762b64)
----
- src/backends/drm/drm_output.cpp | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp
-index bd08631cf7..048803883b 100644
---- a/src/backends/drm/drm_output.cpp
-+++ b/src/backends/drm/drm_output.cpp
-@@ -337,7 +337,6 @@ bool DrmOutput::present(const QSharedPointer<DrmBuffer> &buffer, QRegion damaged
- m_pipeline->applyPendingChanges();
- } else {
- m_pipeline->revertPendingChanges();
-- setVrrPolicy(RenderLoop::VrrPolicy::Never);
- }
- }
- if (m_pipeline->present(buffer)) {
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-fetch-immutable-blobs.patch b/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-fetch-immutable-blobs.patch
deleted file mode 100644
index 16c7756d33e2..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-backends-drm-fetch-immutable-blobs.patch
+++ /dev/null
@@ -1,214 +0,0 @@
-From 82c2324b5675ea2d5e3b962f270bda1d186e7326 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Mon, 4 Apr 2022 20:19:05 +0200
-Subject: [PATCH] backends/drm: fetch immutable blobs in DrmProperty
-
-If the blob is fetched while there is no kernel-visible reference to it,
-the driver may re-use the blob ID. When DrmProperty is created or updated,
-KWin holds a reference on the blob via drmModeObjectProperties, so this
-should prevent any possible issues.
-
-CCBUG: 449285
----
- src/backends/drm/drm_object_connector.cpp | 13 +++-----
- src/backends/drm/drm_object_plane.cpp | 39 +++++++++++------------
- src/backends/drm/drm_property.cpp | 27 +++++++++++++++-
- src/backends/drm/drm_property.h | 7 +++-
- 4 files changed, 54 insertions(+), 32 deletions(-)
-
-diff --git a/src/backends/drm/drm_object_connector.cpp b/src/backends/drm/drm_object_connector.cpp
-index a0045290df..0cdbd70b4f 100644
---- a/src/backends/drm/drm_object_connector.cpp
-+++ b/src/backends/drm/drm_object_connector.cpp
-@@ -337,16 +337,11 @@ bool DrmConnector::updateProperties()
- }
-
- // parse edid
-- auto edidProp = getProp(PropertyIndex::Edid);
-- if (edidProp) {
-- DrmScopedPointer<drmModePropertyBlobRes> blob(drmModeGetPropertyBlob(gpu()->fd(), edidProp->current()));
-- if (blob && blob->data) {
-- m_edid = Edid(blob->data, blob->length);
-- if (!m_edid.isValid()) {
-- qCWarning(KWIN_DRM) << "Couldn't parse EDID for connector" << this;
-- }
-+ if (const auto edidProp = getProp(PropertyIndex::Edid); edidProp && edidProp->immutableBlob()) {
-+ m_edid = Edid(edidProp->immutableBlob()->data, edidProp->immutableBlob()->length);
-+ if (!m_edid.isValid()) {
-+ qCWarning(KWIN_DRM) << "Couldn't parse EDID for connector" << this;
- }
-- deleteProp(PropertyIndex::Edid);
- } else {
- qCDebug(KWIN_DRM) << "Could not find edid for connector" << this;
- }
-diff --git a/src/backends/drm/drm_object_plane.cpp b/src/backends/drm/drm_object_plane.cpp
-index 6967fdd50d..c4dcca96d4 100644
---- a/src/backends/drm/drm_object_plane.cpp
-+++ b/src/backends/drm/drm_object_plane.cpp
-@@ -73,29 +73,26 @@ bool DrmPlane::init()
- checkSupport(5, Transformation::ReflectY);
-
- // read formats from blob if available and if modifiers are supported, and from the plane object if not
-- if (auto formatProp = getProp(PropertyIndex::In_Formats); formatProp && gpu()->addFB2ModifiersSupported()) {
-- DrmScopedPointer<drmModePropertyBlobRes> propertyBlob(drmModeGetPropertyBlob(gpu()->fd(), formatProp->current()));
-- if (propertyBlob && propertyBlob->data) {
-- auto blob = static_cast<drm_format_modifier_blob*>(propertyBlob->data);
-- auto modifiers = reinterpret_cast<drm_format_modifier*>(reinterpret_cast<uint8_t*>(blob) + blob->modifiers_offset);
-- uint32_t *formatarr = reinterpret_cast<uint32_t*>(reinterpret_cast<uint8_t*>(blob) + blob->formats_offset);
--
-- for (uint32_t f = 0; f < blob->count_formats; f++) {
-- auto format = formatarr[f];
-- QVector<uint64_t> mods;
-- for (uint32_t m = 0; m < blob->count_modifiers; m++) {
-- auto modifier = &modifiers[m];
-- // The modifier advertisement blob is partitioned into groups of 64 formats
-- if (m < modifier->offset || m > modifier->offset + 63) {
-- continue;
-- }
-- if (!(modifier->formats & (1 << (f - modifier->offset)))) {
-- continue;
-- }
-- mods << modifier->modifier;
-+ if (const auto formatProp = getProp(PropertyIndex::In_Formats); formatProp && formatProp->immutableBlob() && gpu()->addFB2ModifiersSupported()) {
-+ auto blob = static_cast<drm_format_modifier_blob *>(formatProp->immutableBlob()->data);
-+ auto modifiers = reinterpret_cast<drm_format_modifier *>(reinterpret_cast<uint8_t *>(blob) + blob->modifiers_offset);
-+ uint32_t *formatarr = reinterpret_cast<uint32_t *>(reinterpret_cast<uint8_t *>(blob) + blob->formats_offset);
-+
-+ for (uint32_t f = 0; f < blob->count_formats; f++) {
-+ auto format = formatarr[f];
-+ QVector<uint64_t> mods;
-+ for (uint32_t m = 0; m < blob->count_modifiers; m++) {
-+ auto modifier = &modifiers[m];
-+ // The modifier advertisement blob is partitioned into groups of 64 formats
-+ if (m < modifier->offset || m > modifier->offset + 63) {
-+ continue;
- }
-- m_supportedFormats.insert(format, mods);
-+ if (!(modifier->formats & (1 << (f - modifier->offset)))) {
-+ continue;
-+ }
-+ mods << modifier->modifier;
- }
-+ m_supportedFormats.insert(format, mods);
- }
- } else {
- for (uint32_t i = 0; i < p->count_formats; i++) {
-diff --git a/src/backends/drm/drm_property.cpp b/src/backends/drm/drm_property.cpp
-index 28af8ec07f..8ab0dc0e5a 100644
---- a/src/backends/drm/drm_property.cpp
-+++ b/src/backends/drm/drm_property.cpp
-@@ -24,6 +24,7 @@ DrmProperty::DrmProperty(DrmObject *obj, drmModePropertyRes *prop, uint64_t val,
- , m_next(val)
- , m_current(val)
- , m_immutable(prop->flags & DRM_MODE_PROP_IMMUTABLE)
-+ , m_isBlob(prop->flags & DRM_MODE_PROP_BLOB)
- , m_obj(obj)
- {
- if (!enumNames.isEmpty()) {
-@@ -35,6 +36,7 @@ DrmProperty::DrmProperty(DrmObject *obj, drmModePropertyRes *prop, uint64_t val,
- m_minValue = prop->values[0];
- m_maxValue = prop->values[1];
- }
-+ updateBlob();
- }
-
- DrmProperty::~DrmProperty() = default;
-@@ -110,7 +112,10 @@ bool DrmProperty::needsCommit() const
-
- void DrmProperty::setCurrent(uint64_t value)
- {
-- m_current = value;
-+ if (m_current != value) {
-+ updateBlob();
-+ m_current = value;
-+ }
- }
-
- uint64_t DrmProperty::current() const
-@@ -122,10 +127,12 @@ QVector<QByteArray> DrmProperty::enumNames() const
- {
- return m_enumNames;
- }
-+
- bool DrmProperty::hasEnum(uint64_t value) const
- {
- return m_enumMap.contains(value);
- }
-+
- bool DrmProperty::hasAllEnums() const
- {
- return m_enumMap.count() == m_enumNames.count();
-@@ -166,4 +173,22 @@ uint64_t DrmProperty::maxValue() const
- return m_maxValue;
- }
-
-+void DrmProperty::updateBlob()
-+{
-+ if (m_immutable && m_isBlob) {
-+ if (m_current != 0) {
-+ m_immutableBlob.reset(drmModeGetPropertyBlob(m_obj->gpu()->fd(), m_current));
-+ if (m_immutableBlob && (!m_immutableBlob->data || !m_immutableBlob->length)) {
-+ m_immutableBlob.reset();
-+ }
-+ } else {
-+ m_immutableBlob.reset();
-+ }
-+ }
-+}
-+
-+drmModePropertyBlobRes *DrmProperty::immutableBlob() const
-+{
-+ return m_immutableBlob.get();
-+}
- }
-diff --git a/src/backends/drm/drm_property.h b/src/backends/drm/drm_property.h
-index 48bdeafdc2..1ae547f41e 100644
---- a/src/backends/drm/drm_property.h
-+++ b/src/backends/drm/drm_property.h
-@@ -9,9 +9,9 @@
- */
-
- #pragma once
-+#include "drm_pointer.h"
-
- #include <xf86drmMode.h>
--
- #include <QVector>
- #include <QMap>
- #include <QByteArray>
-@@ -59,6 +59,7 @@ public:
-
- void setCurrent(uint64_t value);
- uint64_t current() const;
-+ drmModePropertyBlobRes *immutableBlob() const;
-
- uint64_t minValue() const;
- uint64_t maxValue() const;
-@@ -78,6 +79,8 @@ public:
- }
-
- private:
-+ void updateBlob();
-+
- uint32_t m_propId = 0;
- QByteArray m_propName;
-
-@@ -89,6 +92,7 @@ private:
- uint64_t m_next = 0;
- // the value currently set for or by the kernel
- uint64_t m_current = 0;
-+ DrmScopedPointer<drmModePropertyBlobRes> m_immutableBlob;
-
- uint64_t m_minValue = -1;
- uint64_t m_maxValue = -1;
-@@ -96,6 +100,7 @@ private:
- QMap<uint32_t, uint64_t> m_enumMap;
- QVector<QByteArray> m_enumNames;
- const bool m_immutable;
-+ const bool m_isBlob;
- bool m_legacy = false;
- const DrmObject *m_obj;
- };
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-dont-send-geom-to-text-input.patch b/kde-plasma/kwin/files/kwin-5.24.4-dont-send-geom-to-text-input.patch
deleted file mode 100644
index acd7bf4149ab..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-dont-send-geom-to-text-input.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-From a35e3075a7aa4616c8930ccd3869dc4cca5d287e Mon Sep 17 00:00:00 2001
-From: Weng Xuetian <wengxt@gmail.com>
-Date: Sat, 9 Apr 2022 07:25:44 -0700
-Subject: [PATCH] Do not send overlay geometry to text input.
-
-(cherry picked from commit 374e94918238f3ddb9d00c542f281d3d8a309efb)
----
- src/inputmethod.cpp | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/inputmethod.cpp b/src/inputmethod.cpp
-index e7951d9580..5b8e54efbc 100644
---- a/src/inputmethod.cpp
-+++ b/src/inputmethod.cpp
-@@ -615,7 +615,7 @@ void InputMethod::updateInputPanelState()
- const bool bottomKeyboard = m_inputClient && m_inputClient->mode() != InputPanelV1Client::Overlay && m_inputClient->isShown();
- m_trackedClient->setVirtualKeyboardGeometry(bottomKeyboard ? m_inputClient->inputGeometry() : QRect());
-
-- if (m_inputClient) {
-+ if (m_inputClient && m_inputClient->mode() != InputPanelV1Client::Overlay) {
- overlap = m_trackedClient->frameGeometry() & m_inputClient->inputGeometry();
- overlap.moveTo(m_trackedClient->mapToLocal(overlap.topLeft()));
- }
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-dont-use-xcb-in-wayland.patch b/kde-plasma/kwin/files/kwin-5.24.4-dont-use-xcb-in-wayland.patch
deleted file mode 100644
index 667b91b8dc5c..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-dont-use-xcb-in-wayland.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 7a26f93cb579cf6b1cbc1e32790f93be70013157 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Tue, 12 Apr 2022 15:45:52 +0200
-Subject: [PATCH] effects/kscreen: don't use xcb on Wayland
-
-BUG: 450564
-FIXED-IN: 5.24.5
-(cherry picked from commit db3f27336f2172fd70be3411874d9bbeb3db6a24)
----
- src/effects/kscreen/kscreen.cpp | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/src/effects/kscreen/kscreen.cpp b/src/effects/kscreen/kscreen.cpp
-index 9484399756..0673915aad 100644
---- a/src/effects/kscreen/kscreen.cpp
-+++ b/src/effects/kscreen/kscreen.cpp
-@@ -44,15 +44,15 @@ namespace KWin
-
- KscreenEffect::KscreenEffect()
- : Effect()
-- , m_atom(effects->announceSupportProperty("_KDE_KWIN_KSCREEN_SUPPORT", this))
-+ , m_atom(effects->waylandDisplay() ? XCB_ATOM_NONE : effects->announceSupportProperty("_KDE_KWIN_KSCREEN_SUPPORT", this))
- {
- initConfig<KscreenConfig>();
-- connect(effects, &EffectsHandler::propertyNotify, this, &KscreenEffect::propertyNotify);
-- connect(effects, &EffectsHandler::xcbConnectionChanged, this,
-- [this] {
-+ if (!effects->waylandDisplay()) {
-+ connect(effects, &EffectsHandler::propertyNotify, this, &KscreenEffect::propertyNotify);
-+ connect(effects, &EffectsHandler::xcbConnectionChanged, this, [this]() {
- m_atom = effects->announceSupportProperty(QByteArrayLiteral("_KDE_KWIN_KSCREEN_SUPPORT"), this);
-- }
-- );
-+ });
-+ }
- reconfigure(ReconfigureAll);
-
- const QList<EffectScreen *> screens = effects->screens();
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-fix-current-VD-always-added.patch b/kde-plasma/kwin/files/kwin-5.24.4-fix-current-VD-always-added.patch
deleted file mode 100644
index 195d33b1f3a2..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-fix-current-VD-always-added.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From c1d7919ad7cc8a7e55f5b93ec84de63547bc53b9 Mon Sep 17 00:00:00 2001
-From: Ismael Asensio <isma.af@gmail.com>
-Date: Fri, 8 Apr 2022 22:53:08 +0200
-Subject: [PATCH] AbstractClient: Fix the current VD being always added to the
- plasma interface
-
-When setting-up the plasma window interface we need to call
-`setOnAllDesktops()` after the actual virtual desktops have
-been set.
-
-Otherwise, the current desktop would be always added to the
-interface (as if the user were unsetting the "onAllDesktops"
-flag) and the plasma interface and KWin can get un-synced,
-specially if there are specific window rules.
-
-BUG: 452171
-FIXED-IN: 5.24.5
-
-
-(cherry picked from commit 4c8711f121430caa658f9848070e4e25c4a12208)
----
- src/abstract_client.cpp | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/src/abstract_client.cpp b/src/abstract_client.cpp
-index 7e8a7eec04..0714b9ac3f 100644
---- a/src/abstract_client.cpp
-+++ b/src/abstract_client.cpp
-@@ -1488,7 +1488,6 @@ void AbstractClient::setupWindowManagementInterface()
- w->setKeepBelow(keepBelow());
- w->setMaximized(maximizeMode() == KWin::MaximizeFull);
- w->setMinimized(isMinimized());
-- w->setOnAllDesktops(isOnAllDesktops());
- w->setDemandsAttention(isDemandingAttention());
- w->setCloseable(isCloseable());
- w->setMaximizeable(isMaximizable());
-@@ -1620,6 +1619,10 @@ void AbstractClient::setupWindowManagementInterface()
- for (const auto vd : qAsConst(m_desktops)) {
- w->addPlasmaVirtualDesktop(vd->id());
- }
-+ // We need to set `OnAllDesktops` after the actual VD list has been added.
-+ // Otherwise it will unconditionally add the current desktop to the interface
-+ // which may not be the case, for example, when using rules
-+ w->setOnAllDesktops(isOnAllDesktops());
-
- //Plasma Virtual desktop management
- //show/hide when the window enters/exits from desktop
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-fix-unlocking-wayland-sessions.patch b/kde-plasma/kwin/files/kwin-5.24.4-fix-unlocking-wayland-sessions.patch
deleted file mode 100644
index 9e9a4dabc998..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-fix-unlocking-wayland-sessions.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From ee625b2d8acad2ba81693107740a12d8a03863c0 Mon Sep 17 00:00:00 2001
-From: Aleix Pol <aleixpol@kde.org>
-Date: Mon, 28 Mar 2022 03:40:12 +0200
-Subject: [PATCH] Fix unlocking wayland sessions
-
-We were never issuing a repaint which confused thoroughly the
-compositor.
-
-BUG: 447705
----
- src/wayland_server.cpp | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/src/wayland_server.cpp b/src/wayland_server.cpp
-index eb3600f824..9e60787465 100644
---- a/src/wayland_server.cpp
-+++ b/src/wayland_server.cpp
-@@ -15,6 +15,7 @@
- #include "inputpanelv1integration.h"
- #include "keyboard_input.h"
- #include "screens.h"
-+#include "scene.h"
- #include "layershellv1integration.h"
- #include "main.h"
- #include "xdgshellintegration.h"
-@@ -610,6 +611,7 @@ void WaylandServer::initScreenLocker()
- connect(seat, &KWaylandServer::SeatInterface::timestampChanged,
- screenLockerApp, &ScreenLocker::KSldApp::userActivity);
- }
-+ Compositor::self()->scene()->addRepaintFull();
- }
- );
-
-@@ -627,6 +629,7 @@ void WaylandServer::initScreenLocker()
- screenLockerApp, &ScreenLocker::KSldApp::userActivity);
- }
- ScreenLocker::KSldApp::self()->setWaylandFd(-1);
-+ Compositor::self()->scene()->addRepaintFull();
- }
- );
-
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-lockScreenShown.patch b/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-lockScreenShown.patch
deleted file mode 100644
index 4defd5ae5945..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-lockScreenShown.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 9d38f57d84fb9a6f2c4e60f7051f685842f34e0f Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Mon, 28 Mar 2022 18:08:59 +0200
-Subject: [PATCH] waylandserver: only signal lockScreenShown once it has
- actually been shown
-
-When the system goes to suspend and screen locking for suspend is enabled,
-suspend is inhibited until ScreenLocker::KSldApp::self()->lockScreenShown()
-gets called, in order to make sure that the lockscreen is shown before the
-system goes to standby, and thus also when the system wakes (instead of
-potentially sensitive user information).
-However, signalling that when the lockscreen gets mapped can't work reliably,
-as it's then a matter of timing whether or not KWin actually presents an
-image with the lockscreen before suspending. To fix that, this commit replaces
-that logic with only calling lockScreenShown once every output actually got a
-lockscreen presented.
----
- src/wayland_server.cpp | 25 +++++++++++++++++++++----
- src/wayland_server.h | 10 ++++++++++
- 2 files changed, 31 insertions(+), 4 deletions(-)
-
-diff --git a/src/wayland_server.cpp b/src/wayland_server.cpp
-index c850a1b697..6d5e1206a5 100644
---- a/src/wayland_server.cpp
-+++ b/src/wayland_server.cpp
-@@ -213,10 +213,6 @@ KWaylandServer::ClientConnection *WaylandServer::inputMethodConnection() const
-
- void WaylandServer::registerShellClient(AbstractClient *client)
- {
-- if (client->isLockScreen()) {
-- ScreenLocker::KSldApp::self()->lockScreenShown();
-- }
--
- if (client->readyForPainting()) {
- Q_EMIT shellClientAdded(client);
- } else {
-@@ -623,6 +619,8 @@ void WaylandServer::initScreenLocker()
- m_screenLockerClientConnection = nullptr;
- }
-
-+ new LockScreenPresentationWatcher(this);
-+
- const QVector<SeatInterface *> seatIfaces = m_display->seats();
- for (auto *seat : seatIfaces) {
- disconnect(seat, &KWaylandServer::SeatInterface::timestampChanged,
-@@ -797,4 +795,23 @@ QString WaylandServer::socketName() const
- return QString();
- }
-
-+WaylandServer::LockScreenPresentationWatcher::LockScreenPresentationWatcher(WaylandServer *server)
-+{
-+ connect(server, &WaylandServer::shellClientAdded, this, [this](AbstractClient *client) {
-+ if (client->isLockScreen()) {
-+ connect(client->output()->renderLoop(), &RenderLoop::framePresented, this, [this, client]() {
-+ // only signal lockScreenShown once all outputs have been presented at least once
-+ m_signaledOutputs << client->output();
-+ if (m_signaledOutputs.size() == kwinApp()->platform()->enabledOutputs().size()) {
-+ ScreenLocker::KSldApp::self()->lockScreenShown();
-+ delete this;
-+ }
-+ });
-+ }
-+ });
-+ QTimer::singleShot(1000, this, [this]() {
-+ ScreenLocker::KSldApp::self()->lockScreenShown();
-+ delete this;
-+ });
-+}
- }
-diff --git a/src/wayland_server.h b/src/wayland_server.h
-index bf1ba6eee5..58dda9a7a2 100644
---- a/src/wayland_server.h
-+++ b/src/wayland_server.h
-@@ -243,6 +243,16 @@ private:
- void handleOutputRemoved(AbstractOutput *output);
- void handleOutputEnabled(AbstractOutput *output);
- void handleOutputDisabled(AbstractOutput *output);
-+
-+ class LockScreenPresentationWatcher : public QObject
-+ {
-+ public:
-+ LockScreenPresentationWatcher(WaylandServer *server);
-+
-+ private:
-+ QSet<AbstractOutput *> m_signaledOutputs;
-+ };
-+
- KWaylandServer::Display *m_display = nullptr;
- KWaylandServer::CompositorInterface *m_compositor = nullptr;
- KWaylandServer::SeatInterface *m_seat = nullptr;
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-move-LockScreenPresentationWatcher.patch b/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-move-LockScreenPresentationWatcher.patch
deleted file mode 100644
index 0607e2ff3030..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-waylandserver-move-LockScreenPresentationWatcher.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 388402c3b1b37d9f72597aae8d6670e8c0edeb14 Mon Sep 17 00:00:00 2001
-From: Xaver Hugl <xaver.hugl@gmail.com>
-Date: Wed, 6 Apr 2022 21:08:25 +0200
-Subject: [PATCH] waylandserver: move LockScreenPresentationWatcher to the
- correct place
-
-CCBUG: 452334
----
- src/wayland_server.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/wayland_server.cpp b/src/wayland_server.cpp
-index 6d5e1206a5..eb3600f824 100644
---- a/src/wayland_server.cpp
-+++ b/src/wayland_server.cpp
-@@ -603,6 +603,8 @@ void WaylandServer::initScreenLocker()
- }
- ScreenLocker::KSldApp::self()->setWaylandFd(clientFd);
-
-+ new LockScreenPresentationWatcher(this);
-+
- const QVector<SeatInterface *> seatIfaces = m_display->seats();
- for (auto *seat : seatIfaces) {
- connect(seat, &KWaylandServer::SeatInterface::timestampChanged,
-@@ -619,8 +621,6 @@ void WaylandServer::initScreenLocker()
- m_screenLockerClientConnection = nullptr;
- }
-
-- new LockScreenPresentationWatcher(this);
--
- const QVector<SeatInterface *> seatIfaces = m_display->seats();
- for (auto *seat : seatIfaces) {
- disconnect(seat, &KWaylandServer::SeatInterface::timestampChanged,
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.4-xdgactivation-demand-attention.patch b/kde-plasma/kwin/files/kwin-5.24.4-xdgactivation-demand-attention.patch
deleted file mode 100644
index 8efa6b637222..000000000000
--- a/kde-plasma/kwin/files/kwin-5.24.4-xdgactivation-demand-attention.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 5390a4978f3a3903ede15ecd94a750b37931fbd2 Mon Sep 17 00:00:00 2001
-From: Aleix Pol <aleixpol@kde.org>
-Date: Wed, 6 Apr 2022 00:33:21 +0200
-Subject: [PATCH] xdgactivation: Demand attention when a process fails to
- resolve its token
-
-In xdg_activation_v1, if a process fails to negotiate activation, at
-least decorate it as demanding attention.
-This will give apps ways to indicate attention is required. It can can also
-help detect clients doing weird things.
-
-
-(cherry picked from commit 52035f43b90738e2efb4fd7b482719c1ea458578)
----
- src/xdgactivationv1.cpp | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/src/xdgactivationv1.cpp b/src/xdgactivationv1.cpp
-index e2270a3393..97f8575c29 100644
---- a/src/xdgactivationv1.cpp
-+++ b/src/xdgactivationv1.cpp
-@@ -76,6 +76,7 @@ void XdgActivationV1Integration::activateSurface(SurfaceInterface *surface, cons
-
- if (!m_currentActivationToken || m_currentActivationToken->token != token) {
- qCDebug(KWIN_CORE) << "Refusing to activate " << client << " (provided token: " << token << ", current token:" << (m_currentActivationToken ? m_currentActivationToken->token : QStringLiteral("null")) << ")";
-+ client->demandAttention();
- return;
- }
-
---
-GitLab
-
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-effects-overview-hide-panels.patch b/kde-plasma/kwin/files/kwin-5.24.5-effects-overview-hide-panels.patch
new file mode 100644
index 000000000000..d5b1f8c3864e
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-effects-overview-hide-panels.patch
@@ -0,0 +1,65 @@
+From 7fcf36d636f62f101397d88ad6c448f54da79e46 Mon Sep 17 00:00:00 2001
+From: Marco Martin <notmart@gmail.com>
+Date: Fri, 13 May 2022 15:37:13 +0000
+Subject: [PATCH] effects/overview: hide panels
+
+This makes it consistent with WindowView (and the panel window doesn't respond
+to input anyways even if shown, which is misleading).
+
+BUG: 444274
+FIXED-IN: 5.24.6
+
+
+(cherry picked from commit db2af5500f964f3eefde60183b69f21125aeb194)
+---
+ src/effects/overview/qml/ScreenView.qml | 20 ++++++++------------
+ 1 file changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/src/effects/overview/qml/ScreenView.qml b/src/effects/overview/qml/ScreenView.qml
+index 40cc29f4c7..39119e40b9 100644
+--- a/src/effects/overview/qml/ScreenView.qml
++++ b/src/effects/overview/qml/ScreenView.qml
+@@ -70,16 +70,8 @@ FocusScope {
+ }
+ }
+
+- ExpoArea {
+- id: heapArea
+- screen: targetScreen
+- }
+-
+ Column {
+- x: heapArea.x
+- y: heapArea.y
+- width: heapArea.width
+- height: heapArea.height
++ anchors.fill: parent
+
+ Item {
+ id: topBar
+@@ -176,15 +168,19 @@ FocusScope {
+
+ KWinComponents.WindowThumbnailItem {
+ id: windowThumbnail
+- visible: !model.client.hidden
++ visible: !model.client.hidden && opacity > 0
+ wId: model.client.internalId
+ x: model.client.x - targetScreen.geometry.x
+ y: model.client.y - targetScreen.geometry.y
+ width: model.client.width
+ height: model.client.height
++ opacity: container.effect.gestureInProgress
++ ? 1 - container.effect.partialActivationFactor
++ : (model.client.hidden || container.organized) ? 0 : 1
+
+- TapHandler {
+- onTapped: effect.deactivate();
++ Behavior on opacity {
++ enabled: !container.effect.gestureInProgress
++ NumberAnimation { duration: animationDuration; easing.type: Easing.OutCubic }
+ }
+ }
+ }
+--
+GitLab
+
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-multi-gpu-double-copy.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-multi-gpu-double-copy.patch
new file mode 100644
index 000000000000..53c05da522ec
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-multi-gpu-double-copy.patch
@@ -0,0 +1,59 @@
+From 3b58fe4bde0722b352e4114adb992a2ed2c96423 Mon Sep 17 00:00:00 2001
+From: Xaver Hugl <xaver.hugl@gmail.com>
+Date: Sat, 7 May 2022 21:23:17 +0200
+Subject: [PATCH] backends/drm: consider escaped separators KWIN_DRM_DEVICES
+
+':' conflicts with the file names in /dev/dri/by-path, so allow it to be
+escaped with '\'
+
+CCBUG: 453386
+
+
+(cherry picked from commit a110aabbccf56019bdc324b3c751112f35ec3f6c)
+---
+ src/backends/drm/drm_backend.cpp | 24 +++++++++++++++++++++++-
+ 1 file changed, 23 insertions(+), 1 deletion(-)
+
+diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp
+index 272dba702c..567ea3f696 100644
+--- a/src/backends/drm/drm_backend.cpp
++++ b/src/backends/drm/drm_backend.cpp
+@@ -57,12 +57,34 @@
+ namespace KWin
+ {
+
++static QStringList splitPathList(const QString &input, const QChar delimiter)
++{
++ QStringList ret;
++ QString tmp;
++ for (int i = 0; i < input.size(); i++) {
++ if (input[i] == delimiter) {
++ if (i > 0 && input[i - 1] == '\\') {
++ tmp[tmp.size() - 1] = delimiter;
++ } else if (!tmp.isEmpty()) {
++ ret.append(tmp);
++ tmp = QString();
++ }
++ } else {
++ tmp.append(input[i]);
++ }
++ }
++ if (!tmp.isEmpty()) {
++ ret.append(tmp);
++ }
++ return ret;
++}
++
+ DrmBackend::DrmBackend(QObject *parent)
+ : Platform(parent)
+ , m_udev(new Udev)
+ , m_udevMonitor(m_udev->monitor())
+ , m_session(Session::create(this))
+- , m_explicitGpus(qEnvironmentVariable("KWIN_DRM_DEVICES").split(':', Qt::SkipEmptyParts))
++ , m_explicitGpus(splitPathList(qEnvironmentVariable("KWIN_DRM_DEVICES"), ':'))
+ , m_dpmsFilter()
+ {
+ setSupportsPointerWarping(true);
+--
+GitLab
+
diff --git a/kde-plasma/kwin/files/kwin-5.24.5-fix-nvidia-render-glitches.patch b/kde-plasma/kwin/files/kwin-5.24.5-fix-nvidia-render-glitches.patch
new file mode 100644
index 000000000000..d38e11375bbe
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-fix-nvidia-render-glitches.patch
@@ -0,0 +1,42 @@
+From e2d271b6365188a86755af82745ad37535ceb4d7 Mon Sep 17 00:00:00 2001
+From: Erik Kurzinger <ekurzinger@nvidia.com>
+Date: Sun, 8 May 2022 12:16:20 -0700
+Subject: [PATCH] platforms/drm: set read buffer in
+ GbmSurface::makeContextCurrent
+
+The first time the GBM backend's EGL context is made current after
+creation, both the read and draw surfaces are set to EGL_NO_SURFACE.
+This will set the GL read and draw buffers to GL_NONE in accordance with
+the EGL spec.
+
+When a real surface is later made current, however, the spec is arguably
+unclear on whether the read and draw buffers should remain set to
+GL_NONE or whether they should be restored to the default GL_BACK. The
+Mesa driver does the latter, the NVIDIA driver does the former.
+
+To work around this difference, Kwin has an explicit call to
+glDrawBuffer in GbmSurface::makeContextCurrent. It does not have a
+corresponding call to glReadBuffer, though, which can cause some desktop
+effects such as background contrast to render incorrectly with the
+NVIDIA driver. This change adds that missing call.
+
+(cherry picked from commit e6d2bc153f499d1ec3510c02badca38d4c42c340)
+---
+ src/backends/drm/egl_gbm_backend.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/backends/drm/egl_gbm_backend.cpp b/src/backends/drm/egl_gbm_backend.cpp
+index 5a0be7ccaf..b34fa1320b 100644
+--- a/src/backends/drm/egl_gbm_backend.cpp
++++ b/src/backends/drm/egl_gbm_backend.cpp
+@@ -377,6 +377,7 @@ bool EglGbmBackend::makeContextCurrent(const Output::RenderData &render) const
+ }
+ if (!GLPlatform::instance()->isGLES()) {
+ glDrawBuffer(GL_BACK);
++ glReadBuffer(GL_BACK);
+ }
+ return true;
+ }
+--
+GitLab
+
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-tabbox-dont-dismiss-popups.patch b/kde-plasma/kwin/files/kwin-5.24.5-tabbox-dont-dismiss-popups.patch
new file mode 100644
index 000000000000..f79d4bba71ce
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.24.5-tabbox-dont-dismiss-popups.patch
@@ -0,0 +1,32 @@
+From f7b1edc79e9526fe6bad69a8ad475a5d77e5aead Mon Sep 17 00:00:00 2001
+From: Xaver Hugl <xaver.hugl@gmail.com>
+Date: Tue, 10 May 2022 13:07:03 +0200
+Subject: [PATCH] tabbox: don't dismiss popups
+
+The glitches that dismissing popups was supposed to prevent are apparently
+no longer present.
+
+BUG: 446318
+(cherry picked from commit 94b0ca814688bf3622aa53f4d4d26f97d8de7306)
+---
+ src/tabbox/tabbox.cpp | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/src/tabbox/tabbox.cpp b/src/tabbox/tabbox.cpp
+index a1c50b27fc..76a50795ad 100644
+--- a/src/tabbox/tabbox.cpp
++++ b/src/tabbox/tabbox.cpp
+@@ -1020,10 +1020,6 @@ void TabBox::navigatingThroughWindows(bool forward, const QKeySequence &shortcut
+ // CDE style raise / lower
+ CDEWalkThroughWindows(forward);
+ } else {
+- workspace()->forEachAbstractClient([](Toplevel *toplevel) {
+- if (toplevel->isPopupWindow())
+- toplevel->popupDone();
+- });
+ if (areModKeysDepressed(shortcut)) {
+ if (startKDEWalkThroughWindows(mode))
+ KDEWalkThroughWindows(forward);
+--
+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
+