diff --git a/CMakeLists.txt b/CMakeLists.txt index 6377a15e54..802da3fd93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -437,6 +437,7 @@ if(HAVE_WAYLAND) ${kwin_KDEINIT_SRCS} abstract_backend.cpp backends/fbdev/fb_backend.cpp + backends/fbdev/scene_qpainter_fb_backend.cpp backends/fbdev/screens_fb.cpp backends/wayland/screens_wayland.cpp backends/x11/screens_x11windowed.cpp diff --git a/backends/fbdev/fb_backend.cpp b/backends/fbdev/fb_backend.cpp index ce4fb4e5b1..4cbbb8d33b 100644 --- a/backends/fbdev/fb_backend.cpp +++ b/backends/fbdev/fb_backend.cpp @@ -20,7 +20,7 @@ along with this program. If not, see . #include "fb_backend.h" #include "composite.h" #include "logind.h" -#include "scene_qpainter.h" +#include "scene_qpainter_fb_backend.h" #include "screens_fb.h" #include "virtual_terminal.h" // Qt diff --git a/backends/fbdev/scene_qpainter_fb_backend.cpp b/backends/fbdev/scene_qpainter_fb_backend.cpp new file mode 100644 index 0000000000..7399bad34c --- /dev/null +++ b/backends/fbdev/scene_qpainter_fb_backend.cpp @@ -0,0 +1,105 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2015 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "scene_qpainter_fb_backend.h" +#include "fb_backend.h" +#include "composite.h" +#include "cursor.h" +#include "virtual_terminal.h" +// Qt +#include + +namespace KWin +{ +FramebufferQPainterBackend::FramebufferQPainterBackend(FramebufferBackend *backend) + : QObject() + , QPainterBackend() + , m_renderBuffer(backend->size(), QImage::Format_RGB32) + , m_backend(backend) +{ + m_renderBuffer.fill(Qt::black); + + m_backend->map(); + + m_backBuffer = QImage((uchar*)backend->mappedMemory(), + backend->bytesPerLine() / (backend->bitsPerPixel() / 8), + backend->bufferSize() / backend->bytesPerLine(), + backend->bytesPerLine(), backend->imageFormat()); + + m_backBuffer.fill(Qt::black); + connect(VirtualTerminal::self(), &VirtualTerminal::activeChanged, this, + [this] (bool active) { + if (active) { + Compositor::self()->bufferSwapComplete(); + Compositor::self()->addRepaintFull(); + } else { + Compositor::self()->aboutToSwapBuffers(); + } + } + ); +} + +FramebufferQPainterBackend::~FramebufferQPainterBackend() = default; + +QImage *FramebufferQPainterBackend::buffer() +{ + return &m_renderBuffer; +} + +bool FramebufferQPainterBackend::needsFullRepaint() const +{ + return false; +} + +void FramebufferQPainterBackend::prepareRenderingFrame() +{ +} + +void FramebufferQPainterBackend::present(int mask, const QRegion &damage) +{ + Q_UNUSED(mask) + Q_UNUSED(damage) + if (!VirtualTerminal::self()->isActive()) { + return; + } + QPainter p(&m_backBuffer); + p.drawImage(QPoint(0, 0), m_renderBuffer); +} + +bool FramebufferQPainterBackend::usesOverlayWindow() const +{ + return false; +} + +void FramebufferQPainterBackend::renderCursor(QPainter *painter) +{ + if (!m_backend->usesSoftwareCursor()) { + return; + } + const QImage img = m_backend->softwareCursor(); + if (img.isNull()) { + return; + } + const QPoint cursorPos = Cursor::pos(); + const QPoint hotspot = m_backend->softwareCursorHotspot(); + painter->drawImage(cursorPos - hotspot, img); + m_backend->markCursorAsRendered(); +} + +} diff --git a/backends/fbdev/scene_qpainter_fb_backend.h b/backends/fbdev/scene_qpainter_fb_backend.h new file mode 100644 index 0000000000..f089533956 --- /dev/null +++ b/backends/fbdev/scene_qpainter_fb_backend.h @@ -0,0 +1,52 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 2015 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#ifndef KWIN_SCENE_QPAINTER_FB_BACKEND_H +#define KWIN_SCENE_QPAINTER_FB_BACKEND_H +#include "scene_qpainter.h" + +#include + +namespace KWin +{ +class FramebufferBackend; + +class FramebufferQPainterBackend : public QObject, public QPainterBackend +{ + Q_OBJECT +public: + FramebufferQPainterBackend(FramebufferBackend *backend); + virtual ~FramebufferQPainterBackend(); + + QImage *buffer() override; + bool needsFullRepaint() const override; + bool usesOverlayWindow() const override; + void prepareRenderingFrame() override; + void present(int mask, const QRegion &damage) override; + void renderCursor(QPainter *painter) override; + +private: + QImage m_renderBuffer; + QImage m_backBuffer; + FramebufferBackend *m_backend; +}; + +} + +#endif diff --git a/scene_qpainter.cpp b/scene_qpainter.cpp index dc13b42447..f9e01e08e0 100644 --- a/scene_qpainter.cpp +++ b/scene_qpainter.cpp @@ -28,8 +28,6 @@ along with this program. If not, see . #include "screens.h" #include "toplevel.h" #if HAVE_WAYLAND -#include "backends/fbdev/fb_backend.h" -#include "virtual_terminal.h" #include "backends/wayland/wayland_backend.h" #include "wayland_server.h" #include "backends/x11/x11windowed_backend.h" @@ -266,84 +264,6 @@ bool X11WindowedQPainterBackend::usesOverlayWindow() const return false; } -//**************************************** -// FramebufferBackend -//**************************************** -FramebufferQPainterBackend::FramebufferQPainterBackend(FramebufferBackend *backend) - : QObject() - , QPainterBackend() - , m_renderBuffer(backend->size(), QImage::Format_RGB32) - , m_backend(backend) -{ - m_renderBuffer.fill(Qt::black); - - m_backend->map(); - - m_backBuffer = QImage((uchar*)backend->mappedMemory(), - backend->bytesPerLine() / (backend->bitsPerPixel() / 8), - backend->bufferSize() / backend->bytesPerLine(), - backend->bytesPerLine(), backend->imageFormat()); - - m_backBuffer.fill(Qt::black); - connect(VirtualTerminal::self(), &VirtualTerminal::activeChanged, this, - [this] (bool active) { - if (active) { - Compositor::self()->bufferSwapComplete(); - Compositor::self()->addRepaintFull(); - } else { - Compositor::self()->aboutToSwapBuffers(); - } - } - ); -} - -FramebufferQPainterBackend::~FramebufferQPainterBackend() = default; - -QImage *FramebufferQPainterBackend::buffer() -{ - return &m_renderBuffer; -} - -bool FramebufferQPainterBackend::needsFullRepaint() const -{ - return false; -} - -void FramebufferQPainterBackend::prepareRenderingFrame() -{ -} - -void FramebufferQPainterBackend::present(int mask, const QRegion &damage) -{ - Q_UNUSED(mask) - Q_UNUSED(damage) - if (!VirtualTerminal::self()->isActive()) { - return; - } - QPainter p(&m_backBuffer); - p.drawImage(QPoint(0, 0), m_renderBuffer); -} - -bool FramebufferQPainterBackend::usesOverlayWindow() const -{ - return false; -} - -void FramebufferQPainterBackend::renderCursor(QPainter *painter) -{ - if (!m_backend->usesSoftwareCursor()) { - return; - } - const QImage img = m_backend->softwareCursor(); - if (img.isNull()) { - return; - } - const QPoint cursorPos = Cursor::pos(); - const QPoint hotspot = m_backend->softwareCursorHotspot(); - painter->drawImage(cursorPos - hotspot, img); - m_backend->markCursorAsRendered(); -} - #endif //**************************************** diff --git a/scene_qpainter.h b/scene_qpainter.h index d0d762e48b..2908907842 100644 --- a/scene_qpainter.h +++ b/scene_qpainter.h @@ -44,7 +44,6 @@ namespace Wayland { class WaylandBackend; } -class FramebufferBackend; class X11WindowedBackend; class QPainterBackend @@ -167,26 +166,6 @@ private: X11WindowedBackend *m_backend; }; -class FramebufferQPainterBackend : public QObject, public QPainterBackend -{ - Q_OBJECT -public: - FramebufferQPainterBackend(FramebufferBackend *backend); - virtual ~FramebufferQPainterBackend(); - - QImage *buffer() override; - bool needsFullRepaint() const override; - bool usesOverlayWindow() const override; - void prepareRenderingFrame() override; - void present(int mask, const QRegion &damage) override; - void renderCursor(QPainter *painter) override; - -private: - QImage m_renderBuffer; - QImage m_backBuffer; - FramebufferBackend *m_backend; -}; - #endif class SceneQPainter : public Scene