summaryrefslogtreecommitdiff
path: root/kde-plasma/kwayland-server/files/kwayland-server-5.24.4-fix-layer-shell-reset.patch
blob: a3a0b2067f5dbdb7c9a7a9442c21484c451ccebd (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
From 97df88c6c8af925382bb1f59b7c6ad75f28142a0 Mon Sep 17 00:00:00 2001
From: David Edmundson <kde@davidedmundson.co.uk>
Date: Tue, 5 Apr 2022 13:26:26 +0100
Subject: [PATCH] Fix layer shell reset

In the current form any client committing multiple times without
attaching a buffer would unset the cached state and trigger an error.

It's legal (though weird) to commit multiple times before attaching a
buffer.

We should only reset the state if we commit an empty buffer after having
committed an existing buffer. This brings us in line with XdgShell.


(cherry picked from commit a5c55b68589a8771cde0bf4ce552702da6fca41c)
---
 src/server/layershell_v1_interface.cpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/server/layershell_v1_interface.cpp b/src/server/layershell_v1_interface.cpp
index 17086334..19fcd68e 100644
--- a/src/server/layershell_v1_interface.cpp
+++ b/src/server/layershell_v1_interface.cpp
@@ -69,6 +69,7 @@ public:
     bool isClosed = false;
     bool isConfigured = false;
     bool isCommitted = false;
+    bool firstBufferAttached = false;
 
 protected:
     void zwlr_layer_surface_v1_destroy_resource(Resource *resource) override;
@@ -290,8 +291,10 @@ void LayerSurfaceV1InterfacePrivate::commit()
         return;
     }
 
-    if (!surface->isMapped() && isCommitted) {
+    // detect reset
+    if (!surface->isMapped() && firstBufferAttached) {
         isCommitted = false;
+        firstBufferAttached = false;
         isConfigured = false;
 
         current = LayerSurfaceV1State();
@@ -303,6 +306,9 @@ void LayerSurfaceV1InterfacePrivate::commit()
     const LayerSurfaceV1State previous = std::exchange(current, pending);
 
     isCommitted = true; // Must set the committed state before emitting any signals.
+    if (surface->isMapped()) {
+        firstBufferAttached = true;
+    }
 
     if (previous.acceptsFocus != current.acceptsFocus) {
         Q_EMIT q->acceptsFocusChanged();
-- 
GitLab