summaryrefslogtreecommitdiff
path: root/kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch
diff options
context:
space:
mode:
Diffstat (limited to 'kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch')
-rw-r--r--kde-plasma/kwin/files/kwin-5.24.5-fix-plasmashell-crash-1.patch307
1 files changed, 307 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
+