CursorManager: Store cursor pixel data retrieved from X/HC as a copy (#9986)

Instead of storing pointers as refs (which could randomly get invalid very easily) copy the data.
This commit is contained in:
Vaxry 2025-04-07 21:08:16 +02:00 committed by GitHub
parent da86db43d4
commit b15c2bfff6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 9 deletions

View file

@ -18,12 +18,16 @@ static void hcLogger(enum eHyprcursorLogLevel level, char* message) {
Debug::log(NONE, "[hc] {}", message); Debug::log(NONE, "[hc] {}", message);
} }
CCursorBuffer::CCursorBuffer(cairo_surface_t* surf, const Vector2D& size_, const Vector2D& hot_) : hotspot(hot_), surface(surf), stride(cairo_image_surface_get_stride(surf)) { CCursorBuffer::CCursorBuffer(cairo_surface_t* surf, const Vector2D& size_, const Vector2D& hot_) : m_hotspot(hot_), m_stride(cairo_image_surface_get_stride(surf)) {
size = size_; size = size_;
m_data = std::vector<uint8_t>((uint8_t*)cairo_image_surface_get_data(surf), ((uint8_t*)cairo_image_surface_get_data(surf)) + (cairo_image_surface_get_height(surf) * m_stride));
} }
CCursorBuffer::CCursorBuffer(uint8_t* pixelData_, const Vector2D& size_, const Vector2D& hot_) : hotspot(hot_), pixelData(pixelData_), stride(4 * size_.x) { CCursorBuffer::CCursorBuffer(const uint8_t* pixelData, const Vector2D& size_, const Vector2D& hot_) : m_hotspot(hot_), m_stride(4 * size_.x) {
size = size_; size = size_;
m_data = std::vector<uint8_t>(pixelData, pixelData + ((int)size_.y * m_stride));
} }
Aquamarine::eBufferCapability CCursorBuffer::caps() { Aquamarine::eBufferCapability CCursorBuffer::caps() {
@ -51,12 +55,12 @@ Aquamarine::SSHMAttrs CCursorBuffer::shm() {
attrs.success = true; attrs.success = true;
attrs.format = DRM_FORMAT_ARGB8888; attrs.format = DRM_FORMAT_ARGB8888;
attrs.size = size; attrs.size = size;
attrs.stride = stride; attrs.stride = m_stride;
return attrs; return attrs;
} }
std::tuple<uint8_t*, uint32_t, size_t> CCursorBuffer::beginDataPtr(uint32_t flags) { std::tuple<uint8_t*, uint32_t, size_t> CCursorBuffer::beginDataPtr(uint32_t flags) {
return {pixelData ? pixelData : cairo_image_surface_get_data(surface), DRM_FORMAT_ARGB8888, stride}; return {m_data.data(), DRM_FORMAT_ARGB8888, m_stride};
} }
void CCursorBuffer::endDataPtr() { void CCursorBuffer::endDataPtr() {

View file

@ -17,7 +17,7 @@ AQUAMARINE_FORWARD(IBuffer);
class CCursorBuffer : public Aquamarine::IBuffer { class CCursorBuffer : public Aquamarine::IBuffer {
public: public:
CCursorBuffer(cairo_surface_t* surf, const Vector2D& size, const Vector2D& hotspot); CCursorBuffer(cairo_surface_t* surf, const Vector2D& size, const Vector2D& hotspot);
CCursorBuffer(uint8_t* pixelData, const Vector2D& size, const Vector2D& hotspot); CCursorBuffer(const uint8_t* pixelData, const Vector2D& size, const Vector2D& hotspot);
~CCursorBuffer() = default; ~CCursorBuffer() = default;
virtual Aquamarine::eBufferCapability caps(); virtual Aquamarine::eBufferCapability caps();
@ -30,10 +30,9 @@ class CCursorBuffer : public Aquamarine::IBuffer {
virtual void endDataPtr(); virtual void endDataPtr();
private: private:
Vector2D hotspot; Vector2D m_hotspot;
cairo_surface_t* surface = nullptr; std::vector<uint8_t> m_data;
uint8_t* pixelData = nullptr; size_t m_stride = 0;
size_t stride = 0;
}; };
class CCursorManager { class CCursorManager {