summaryrefslogtreecommitdiff
blob: 37963c8395c53a617edef6699d76bd9f7b9aebba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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