diff options
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.patch | 72 |
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 |