summaryrefslogtreecommitdiff
path: root/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch
diff options
context:
space:
mode:
Diffstat (limited to 'kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch')
-rw-r--r--kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch b/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch
new file mode 100644
index 000000000000..37963c8395c5
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch
@@ -0,0 +1,72 @@
+From 406b70b04e093c13faf763e2d885797ae037d806 Mon Sep 17 00:00:00 2001
+From: Vlad Zagorodniy <vladzzag@gmail.com>
+Date: Mon, 12 Nov 2018 17:45:14 +0200
+Subject: [wayland] Don't crash when resizing windows
+
+Summary:
+If you resize a decorated client by using the resize user action(press
+Alt + F3 > More Actions > Resize), then KWin will crash because it gets
+stuck in an infinite loop (AbstractClient::performMoveResize <->
+ShellClient::setGeometry).
+
+Here's how KWin gets stuck in that loop:
+* when you finish resizing the client, AbstractClient::keyPressEvent
+ will call AbstractClient::finishMoveResize;
+* the first thing that finishMoveResize does is block geometry updates,
+ then it does some clean up (e.g. reset the value of isMoveResize(), etc),
+ updates the geometry of the client and when it's done, it will emit
+ clientFinishUserMoveResized signal;
+* when PointerInputRedirection notices that signal, it will call
+ processDecorationMove on the client, which in its turn will indirectly
+ call AbstractClient::startMoveResize;
+* when it's time to go back to AbstractClient::keyPressEvent, geometry
+ updates are unblocked and if there are any pending geometry updates,
+ then ShellClient::setGeometry will be called;
+* ShellClient::setGeometry will eventually call ShellClient::doSetGeometry;
+* ShellClient::doSetGeometry will call AbstractClient::performMoveResize
+ because AbstractClient::processDecorationMove indirectly called
+ AbstractClient::startMoveResize;
+* AbstractClient::performMoveResize calls ShellClient::setGeometry;
+* (at this point, KWin got stuck in the infinite loop)
+
+This change swaps setMoveResizePointerButtonDown and finishMoveResize,
+so processDecorationMove won't indirectly call startMoveResize.
+
+BUG: 397577
+FIXED-IN: 5.14.4
+
+Reviewers: #kwin, davidedmundson
+
+Reviewed By: #kwin, davidedmundson
+
+Subscribers: kwin
+
+Tags: #kwin
+
+Differential Revision: https://phabricator.kde.org/D16846
+---
+ abstract_client.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/abstract_client.cpp b/abstract_client.cpp
+index b4628f2..ed72b9c 100644
+--- a/abstract_client.cpp
++++ b/abstract_client.cpp
+@@ -1457,13 +1457,13 @@ void AbstractClient::keyPressEvent(uint key_code)
+ case Qt::Key_Space:
+ case Qt::Key_Return:
+ case Qt::Key_Enter:
+- finishMoveResize(false);
+ setMoveResizePointerButtonDown(false);
++ finishMoveResize(false);
+ updateCursor();
+ break;
+ case Qt::Key_Escape:
+- finishMoveResize(true);
+ setMoveResizePointerButtonDown(false);
++ finishMoveResize(true);
+ updateCursor();
+ break;
+ default:
+--
+cgit v0.11.2