/* KWin - the KDE window manager This file is part of the KDE project. SPDX-FileCopyrightText: 2019 Roman Gilg SPDX-FileCopyrightText: 2013, 2015 Martin Gräßlin SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef KWIN_SCENE_QPAINTER_WAYLAND_BACKEND_H #define KWIN_SCENE_QPAINTER_WAYLAND_BACKEND_H #include #include #include #include namespace KWayland { namespace Client { class ShmPool; class Buffer; } } namespace KWin { class AbstractOutput; namespace Wayland { class WaylandBackend; class WaylandOutput; class WaylandQPainterBackend; class WaylandQPainterOutput : public QObject { Q_OBJECT public: WaylandQPainterOutput(WaylandOutput *output, QObject *parent = nullptr); ~WaylandQPainterOutput() override; bool init(KWayland::Client::ShmPool *pool); void updateSize(const QSize &size); void remapBuffer(); void prepareRenderingFrame(); void present(const QRegion &damage); bool needsFullRepaint() const; void setNeedsFullRepaint(bool set); QRegion mapToLocal(const QRegion ®ion) const; private: WaylandOutput *m_waylandOutput; KWayland::Client::ShmPool *m_pool; QWeakPointer m_buffer; QImage m_backBuffer; bool m_needsFullRepaint = true; friend class WaylandQPainterBackend; }; class WaylandQPainterBackend : public QObject, public QPainterBackend { Q_OBJECT public: explicit WaylandQPainterBackend(WaylandBackend *b); ~WaylandQPainterBackend() override; QImage *bufferForScreen(int screenId) override; void endFrame(int screenId, int mask, const QRegion& damage) override; void beginFrame(int screenId) override; bool needsFullRepaint(int screenId) const override; bool perScreenRendering() const override; private: void createOutput(AbstractOutput *waylandOutput); void frameRendered(); WaylandBackend *m_backend; QVector m_outputs; }; } } #endif