kwin/src/surfaceitem_wayland.h
Vlad Zahorodnii 964c487d4f wayland: Switch to ClientBuffer
The main motivation behind the split is to simplify client buffer code
and allow adding new features easier, for example referencing the shm
pool when a shm buffer is destroyed, or monitoring for readable linux
dmabuf file descriptors, etc.

Also, a referenced ClientBuffer cannot be destroyed, unlike the old
BufferInterface.
2021-07-23 15:33:38 +00:00

92 lines
2.2 KiB
C++

/*
SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#pragma once
#include "surfaceitem.h"
namespace KWaylandServer
{
class ClientBuffer;
class SubSurfaceInterface;
class SurfaceInterface;
}
namespace KWin
{
/**
* The SurfaceItemWayland class represents a Wayland surface in the scene.
*/
class KWIN_EXPORT SurfaceItemWayland : public SurfaceItem
{
Q_OBJECT
public:
explicit SurfaceItemWayland(KWaylandServer::SurfaceInterface *surface,
Scene::Window *window, Item *parent = nullptr);
QRegion shape() const override;
QRegion opaque() const override;
KWaylandServer::SurfaceInterface *surface() const;
private Q_SLOTS:
void handleSurfaceToBufferMatrixChanged();
void handleSurfaceCommitted();
void handleSurfaceSizeChanged();
void handleChildSubSurfaceRemoved(KWaylandServer::SubSurfaceInterface *child);
void handleChildSubSurfacesChanged();
void handleSubSurfacePositionChanged();
protected:
SurfacePixmap *createPixmap() override;
private:
SurfaceItemWayland *getOrCreateSubSurfaceItem(KWaylandServer::SubSurfaceInterface *s);
QPointer<KWaylandServer::SurfaceInterface> m_surface;
QHash<KWaylandServer::SubSurfaceInterface *, SurfaceItemWayland *> m_subsurfaces;
};
class KWIN_EXPORT SurfacePixmapWayland final : public SurfacePixmap
{
Q_OBJECT
public:
explicit SurfacePixmapWayland(SurfaceItemWayland *item, QObject *parent = nullptr);
~SurfacePixmapWayland() override;
SurfaceItemWayland *item() const;
KWaylandServer::SurfaceInterface *surface() const;
KWaylandServer::ClientBuffer *buffer() const;
void create() override;
void update() override;
bool isValid() const override;
private:
void setBuffer(KWaylandServer::ClientBuffer *buffer);
SurfaceItemWayland *m_item;
KWaylandServer::ClientBuffer *m_buffer = nullptr;
};
/**
* The SurfaceItemXwayland class represents an Xwayland surface in the scene.
*/
class KWIN_EXPORT SurfaceItemXwayland : public SurfaceItemWayland
{
Q_OBJECT
public:
explicit SurfaceItemXwayland(Scene::Window *window, Item *parent = nullptr);
QRegion shape() const override;
};
} // namespace KWin