aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorVaxry <[email protected]>2024-07-29 19:02:58 +0200
committerVaxry <[email protected]>2024-07-29 19:29:08 +0200
commite67322034037fef22079c8e480be38c1d04b5a4a (patch)
tree40778b615ecb56680825ba3e268081dae4e3f854
parent9c38b0fdbe32dc2cb81d53c9be90113d114f1cd2 (diff)
downloadHyprland-e67322034037fef22079c8e480be38c1d04b5a4a.tar.gz
Hyprland-e67322034037fef22079c8e480be38c1d04b5a4a.zip
core/surface: fixup a few pointer handling edge cases
-rw-r--r--src/managers/PointerManager.cpp4
-rw-r--r--src/protocols/core/Compositor.cpp10
-rw-r--r--src/protocols/core/Compositor.hpp1
3 files changed, 13 insertions, 2 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
index a09992a2..a405e2eb 100644
--- a/src/managers/PointerManager.cpp
+++ b/src/managers/PointerManager.cpp
@@ -151,6 +151,8 @@ void CPointerManager::setCursorSurface(SP<CWLSurface> surf, const Vector2D& hots
currentCursorImage.surface = surf;
currentCursorImage.scale = surf->resource()->current.scale;
+ surf->resource()->map();
+
currentCursorImage.destroySurface = surf->events.destroy.registerListener([this](std::any data) { resetCursorImage(); });
currentCursorImage.commitSurface = surf->resource()->events.commit.registerListener([this](std::any data) {
damageIfSoftware();
@@ -222,6 +224,8 @@ void CPointerManager::resetCursorImage(bool apply) {
currentCursorImage.surface->resource()->leave(m);
}
+ currentCursorImage.surface->resource()->unmap();
+
currentCursorImage.destroySurface.reset();
currentCursorImage.commitSurface.reset();
currentCursorImage.surface.reset();
diff --git a/src/protocols/core/Compositor.cpp b/src/protocols/core/Compositor.cpp
index 6352b7e6..43d3059b 100644
--- a/src/protocols/core/Compositor.cpp
+++ b/src/protocols/core/Compositor.cpp
@@ -156,6 +156,7 @@ void CWLSurfaceResource::destroy() {
unmap();
}
events.destroy.emit();
+ releaseBuffers(false);
PROTO::compositor->destroyResource(this);
}
@@ -338,13 +339,18 @@ void CWLSurfaceResource::unmap() {
// release the buffers.
// this is necessary for XWayland to function correctly,
// as it does not unmap via the traditional commit(null buffer) method, but via the X11 protocol.
+ releaseBuffers();
+}
+
+void CWLSurfaceResource::releaseBuffers(bool onlyCurrent) {
if (current.buffer && !current.buffer->resource->released)
current.buffer->sendRelease();
- if (pending.buffer && !pending.buffer->resource->released)
+ if (pending.buffer && !pending.buffer->resource->released && !onlyCurrent)
pending.buffer->sendRelease();
pending.buffer.reset();
- current.buffer.reset();
+ if (!onlyCurrent)
+ current.buffer.reset();
}
void CWLSurfaceResource::error(int code, const std::string& str) {
diff --git a/src/protocols/core/Compositor.hpp b/src/protocols/core/Compositor.hpp
index 1fa6926a..79cd1de6 100644
--- a/src/protocols/core/Compositor.hpp
+++ b/src/protocols/core/Compositor.hpp
@@ -137,6 +137,7 @@ class CWLSurfaceResource {
int stateLocks = 0;
void destroy();
+ void releaseBuffers(bool onlyCurrent = true);
void commitPendingState();
void bfHelper(std::vector<SP<CWLSurfaceResource>> nodes, std::function<void(SP<CWLSurfaceResource>, const Vector2D&, void*)> fn, void* data);
};