[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwin] /: Move the X11 Decoration Renderer into the X11 standalone platform
From:       Martin_Flöser <null () kde ! org>
Date:       2017-09-01 16:06:13
Message-ID: E1dnoST-0008Ko-V8 () code ! kde ! org
[Download RAW message or body]

Git commit 23ef40e638095a6bcd1eb30dd0bb2756df83be3e by Martin Flöser.
Committed on 01/09/2017 at 15:49.
Pushed by graesslin into branch 'master'.

Move the X11 Decoration Renderer into the X11 standalone platform

Summary:
Not needed except for X11/non-composited usage, so should be in the
plugin instead of core.

Platform API is extended to create a decoration renderer.

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D7444

M  +2    -6    decorations/decoratedclient.cpp
M  +0    -75   decorations/decorationrenderer.cpp
M  +0    -21   decorations/decorationrenderer.h
M  +8    -0    platform.cpp
M  +13   -0    platform.h
M  +1    -0    plugins/platforms/x11/standalone/CMakeLists.txt
C  +2    -49   plugins/platforms/x11/standalone/x11_decoration_renderer.cpp [from: \
decorations/decorationrenderer.cpp - 070% similarity] C  +3    -55   \
plugins/platforms/x11/standalone/x11_decoration_renderer.h [from: \
decorations/decorationrenderer.h - 052% similarity] M  +10   -0    \
plugins/platforms/x11/standalone/x11_platform.cpp M  +1    -0    \
plugins/platforms/x11/standalone/x11_platform.h

https://commits.kde.org/kwin/23ef40e638095a6bcd1eb30dd0bb2756df83be3e

diff --git a/decorations/decoratedclient.cpp b/decorations/decoratedclient.cpp
index 8ba6c6c9a..ff5ce64d4 100644
--- a/decorations/decoratedclient.cpp
+++ b/decorations/decoratedclient.cpp
@@ -24,7 +24,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "composite.h"
 #include "cursor.h"
 #include "options.h"
-#include "scene.h"
+#include "platform.h"
 #include "workspace.h"
 
 #include <KDecoration2/DecoratedClient>
@@ -290,11 +290,7 @@ bool DecoratedClientImpl::isApplicationMenuActive() const
 
 void DecoratedClientImpl::createRenderer()
 {
-    if (Compositor::self()->hasScene()) {
-        m_renderer = Compositor::self()->scene()->createDecorationRenderer(this);
-    } else {
-        m_renderer = new X11Renderer(this);
-    }
+    m_renderer = kwinApp()->platform()->createDecorationRenderer(this);
 }
 
 void DecoratedClientImpl::destroyRenderer()
diff --git a/decorations/decorationrenderer.cpp b/decorations/decorationrenderer.cpp
index 5c281e634..420c2476c 100644
--- a/decorations/decorationrenderer.cpp
+++ b/decorations/decorationrenderer.cpp
@@ -19,17 +19,13 @@ along with this program.  If not, see \
                <http://www.gnu.org/licenses/>.
 *********************************************************************/
 #include "decorationrenderer.h"
 #include "decoratedclient.h"
-#include "client.h"
 #include "deleted.h"
 
-#include <kwinglobals.h>
-
 #include <KDecoration2/Decoration>
 #include <KDecoration2/DecoratedClient>
 
 #include <QDebug>
 #include <QPainter>
-#include <QTimer>
 
 namespace KWin
 {
@@ -81,76 +77,5 @@ void Renderer::reparent(Deleted *deleted)
     m_client = nullptr;
 }
 
-X11Renderer::X11Renderer(DecoratedClientImpl *client)
-    : Renderer(client)
-    , m_scheduleTimer(new QTimer(this))
-    , m_gc(XCB_NONE)
-{
-    // delay any rendering to end of event cycle to catch multiple updates per cycle
-    m_scheduleTimer->setSingleShot(true);
-    m_scheduleTimer->setInterval(0);
-    connect(m_scheduleTimer, &QTimer::timeout, this, &X11Renderer::render);
-    connect(this, &Renderer::renderScheduled, m_scheduleTimer, static_cast<void \
                (QTimer::*)()>(&QTimer::start));
-}
-
-X11Renderer::~X11Renderer()
-{
-    if (m_gc != XCB_NONE) {
-        xcb_free_gc(connection(), m_gc);
-    }
-}
-
-void X11Renderer::reparent(Deleted *deleted)
-{
-    if (m_scheduleTimer->isActive()) {
-        m_scheduleTimer->stop();
-    }
-    disconnect(m_scheduleTimer, &QTimer::timeout, this, &X11Renderer::render);
-    disconnect(this, &Renderer::renderScheduled, m_scheduleTimer, static_cast<void \
                (QTimer::*)()>(&QTimer::start));
-    Renderer::reparent(deleted);
-}
-
-void X11Renderer::render()
-{
-    if (!client()) {
-        return;
-    }
-    const QRegion scheduled = getScheduled();
-    if (scheduled.isEmpty()) {
-        return;
-    }
-    xcb_connection_t *c = connection();
-    if (m_gc == XCB_NONE) {
-        m_gc = xcb_generate_id(c);
-        xcb_create_gc(c, m_gc, client()->client()->frameId(), 0, nullptr);
-    }
-
-    QRect left, top, right, bottom;
-    client()->client()->layoutDecorationRects(left, top, right, bottom);
-
-    const QRect geometry = scheduled.boundingRect();
-    left   = left.intersected(geometry);
-    top    = top.intersected(geometry);
-    right  = right.intersected(geometry);
-    bottom = bottom.intersected(geometry);
-
-    auto renderPart = [this, c](const QRect &geo) {
-        if (geo.isNull()) {
-            return;
-        }
-        QImage image = renderToImage(geo);
-        xcb_put_image(c, XCB_IMAGE_FORMAT_Z_PIXMAP, client()->client()->frameId(), \
                m_gc,
-                      image.width(), image.height(), geo.x(), geo.y(), 0, \
                client()->client()->depth(),
-                      image.byteCount(), image.constBits());
-    };
-    renderPart(left);
-    renderPart(top);
-    renderPart(right);
-    renderPart(bottom);
-
-    xcb_flush(c);
-    resetImageSizesDirty();
-}
-
 }
 }
diff --git a/decorations/decorationrenderer.h b/decorations/decorationrenderer.h
index 17d184bda..417bf849f 100644
--- a/decorations/decorationrenderer.h
+++ b/decorations/decorationrenderer.h
@@ -23,12 +23,8 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include <QObject>
 #include <QRegion>
 
-#include <xcb/xcb.h>
-
 #include <kwin_export.h>
 
-class QTimer;
-
 namespace KWin
 {
 
@@ -84,23 +80,6 @@ private:
     bool m_imageSizesDirty;
 };
 
-class X11Renderer : public Renderer
-{
-    Q_OBJECT
-public:
-    explicit X11Renderer(DecoratedClientImpl *client);
-    virtual ~X11Renderer();
-
-    void reparent(Deleted *deleted) override;
-
-protected:
-    void render() override;
-
-private:
-    QTimer *m_scheduleTimer;
-    xcb_gcontext_t m_gc;
-};
-
 }
 }
 
diff --git a/platform.cpp b/platform.cpp
index d9ac03206..8400d4b09 100644
--- a/platform.cpp
+++ b/platform.cpp
@@ -479,4 +479,12 @@ OutlineVisual *Platform::createOutline(Outline *outline)
     return nullptr;
 }
 
+Decoration::Renderer \
*Platform::createDecorationRenderer(Decoration::DecoratedClientImpl *client) +{
+    if (Compositor::self()->hasScene()) {
+        Compositor::self()->scene()->createDecorationRenderer(client);
+    }
+    return nullptr;
+}
+
 }
diff --git a/platform.h b/platform.h
index 80b5072a1..5c55480c5 100644
--- a/platform.h
+++ b/platform.h
@@ -50,6 +50,12 @@ class ScreenEdges;
 class Toplevel;
 class WaylandCursorTheme;
 
+namespace Decoration
+{
+class Renderer;
+class DecoratedClientImpl;
+}
+
 class KWIN_EXPORT Platform : public QObject
 {
     Q_OBJECT
@@ -325,6 +331,13 @@ public:
      **/
     virtual OutlineVisual *createOutline(Outline *outline);
 
+    /**
+     * Creates the Decoration::Renderer for the given @p client.
+     *
+     * The default implementation creates a Renderer suited for the Compositor, @c \
nullptr if there is no Compositor. +     **/
+    virtual Decoration::Renderer \
*createDecorationRenderer(Decoration::DecoratedClientImpl *client); +
 public Q_SLOTS:
     void pointerMotion(const QPointF &position, quint32 time);
     void pointerButtonPressed(quint32 button, quint32 time);
diff --git a/plugins/platforms/x11/standalone/CMakeLists.txt \
b/plugins/platforms/x11/standalone/CMakeLists.txt index 1f398bc6f..20bab3f5a 100644
--- a/plugins/platforms/x11/standalone/CMakeLists.txt
+++ b/plugins/platforms/x11/standalone/CMakeLists.txt
@@ -8,6 +8,7 @@ set(X11PLATFORM_SOURCES
     overlaywindow_x11.cpp
     screenedges_filter.cpp
     non_composited_outline.cpp
+    x11_decoration_renderer.cpp
 )
 
 if(X11_Xinput_FOUND)
diff --git a/decorations/decorationrenderer.cpp \
b/plugins/platforms/x11/standalone/x11_decoration_renderer.cpp similarity index 70%
copy from decorations/decorationrenderer.cpp
copy to plugins/platforms/x11/standalone/x11_decoration_renderer.cpp
index 5c281e634..d8b49544a 100644
--- a/decorations/decorationrenderer.cpp
+++ b/plugins/platforms/x11/standalone/x11_decoration_renderer.cpp
@@ -17,8 +17,8 @@ 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 <http://www.gnu.org/licenses/>.
 *********************************************************************/
-#include "decorationrenderer.h"
-#include "decoratedclient.h"
+#include "x11_decoration_renderer.h"
+#include "decorations/decoratedclient.h"
 #include "client.h"
 #include "deleted.h"
 
@@ -27,8 +27,6 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include <KDecoration2/Decoration>
 #include <KDecoration2/DecoratedClient>
 
-#include <QDebug>
-#include <QPainter>
 #include <QTimer>
 
 namespace KWin
@@ -36,51 +34,6 @@ namespace KWin
 namespace Decoration
 {
 
-Renderer::Renderer(DecoratedClientImpl *client)
-    : QObject(client)
-    , m_client(client)
-    , m_imageSizesDirty(true)
-{
-    auto markImageSizesDirty = [this]{ m_imageSizesDirty = true; };
-    connect(client->decoration(), &KDecoration2::Decoration::bordersChanged, this, \
                markImageSizesDirty);
-    connect(client->decoratedClient(), &KDecoration2::DecoratedClient::widthChanged, \
                this, markImageSizesDirty);
-    connect(client->decoratedClient(), \
                &KDecoration2::DecoratedClient::heightChanged, this, \
                markImageSizesDirty);
-}
-
-Renderer::~Renderer() = default;
-
-void Renderer::schedule(const QRect &rect)
-{
-    m_scheduled = m_scheduled.united(rect);
-    emit renderScheduled(rect);
-}
-
-QRegion Renderer::getScheduled()
-{
-    QRegion region = m_scheduled;
-    m_scheduled = QRegion();
-    return region;
-}
-
-QImage Renderer::renderToImage(const QRect &geo)
-{
-    Q_ASSERT(m_client);
-    QImage image(geo.width(), geo.height(), QImage::Format_ARGB32_Premultiplied);
-    image.fill(Qt::transparent);
-    QPainter p(&image);
-    p.setRenderHint(QPainter::Antialiasing);
-    p.setWindow(geo);
-    p.setClipRect(geo);
-    client()->decoration()->paint(&p, geo);
-    return image;
-}
-
-void Renderer::reparent(Deleted *deleted)
-{
-    setParent(deleted);
-    m_client = nullptr;
-}
-
 X11Renderer::X11Renderer(DecoratedClientImpl *client)
     : Renderer(client)
     , m_scheduleTimer(new QTimer(this))
diff --git a/decorations/decorationrenderer.h \
b/plugins/platforms/x11/standalone/x11_decoration_renderer.h similarity index 52%
copy from decorations/decorationrenderer.h
copy to plugins/platforms/x11/standalone/x11_decoration_renderer.h
index 17d184bda..bbcda9728 100644
--- a/decorations/decorationrenderer.h
+++ b/plugins/platforms/x11/standalone/x11_decoration_renderer.h
@@ -17,73 +17,21 @@ 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 <http://www.gnu.org/licenses/>.
 *********************************************************************/
-#ifndef KWIN_DECORATION_RENDERER_H
-#define KWIN_DECORATION_RENDERER_H
+#ifndef KWIN_DECORATION_X11_RENDERER_H
+#define KWIN_DECORATION_X11_RENDERER_H
 
-#include <QObject>
-#include <QRegion>
+#include "decorations/decorationrenderer.h"
 
 #include <xcb/xcb.h>
 
-#include <kwin_export.h>
-
 class QTimer;
 
 namespace KWin
 {
 
-class Deleted;
-
 namespace Decoration
 {
 
-class DecoratedClientImpl;
-
-class KWIN_EXPORT Renderer : public QObject
-{
-    Q_OBJECT
-public:
-    virtual ~Renderer();
-
-    void schedule(const QRect &rect);
-
-    /**
-     * Reparents this Renderer to the @p deleted.
-     * After this call the Renderer is no longer able to render
-     * anything, client() returns a nullptr.
-     **/
-    virtual void reparent(Deleted *deleted);
-
-Q_SIGNALS:
-    void renderScheduled(const QRect &geo);
-
-protected:
-    explicit Renderer(DecoratedClientImpl *client);
-    /**
-     * @returns the scheduled paint region and resets
-     **/
-    QRegion getScheduled();
-
-    virtual void render() = 0;
-
-    DecoratedClientImpl *client() {
-        return m_client;
-    }
-
-    bool areImageSizesDirty() const {
-        return m_imageSizesDirty;
-    }
-    void resetImageSizesDirty() {
-        m_imageSizesDirty = false;
-    }
-    QImage renderToImage(const QRect &geo);
-
-private:
-    DecoratedClientImpl *m_client;
-    QRegion m_scheduled;
-    bool m_imageSizesDirty;
-};
-
 class X11Renderer : public Renderer
 {
     Q_OBJECT
diff --git a/plugins/platforms/x11/standalone/x11_platform.cpp \
b/plugins/platforms/x11/standalone/x11_platform.cpp index 59bd8dd90..34cb91cd1 100644
--- a/plugins/platforms/x11/standalone/x11_platform.cpp
+++ b/plugins/platforms/x11/standalone/x11_platform.cpp
@@ -37,6 +37,7 @@ along with this program.  If not, see \
<http://www.gnu.org/licenses/>.  #include "options.h"
 #include "overlaywindow_x11.h"
 #include "non_composited_outline.h"
+#include "x11_decoration_renderer.h"
 
 #include <KConfigGroup>
 #include <KLocalizedString>
@@ -346,4 +347,13 @@ OutlineVisual *X11StandalonePlatform::createOutline(Outline \
*outline)  return ret;
 }
 
+Decoration::Renderer \
*X11StandalonePlatform::createDecorationRenderer(Decoration::DecoratedClientImpl \
*client) +{
+    auto renderer = Platform::createDecorationRenderer(client);
+    if (!renderer) {
+        renderer = new Decoration::X11Renderer(client);
+    }
+    return renderer;
+}
+
 }
diff --git a/plugins/platforms/x11/standalone/x11_platform.h \
b/plugins/platforms/x11/standalone/x11_platform.h index 9fce72a0a..6f0022ffe 100644
--- a/plugins/platforms/x11/standalone/x11_platform.h
+++ b/plugins/platforms/x11/standalone/x11_platform.h
@@ -60,6 +60,7 @@ public:
 
     void updateXTime() override;
     OutlineVisual *createOutline(Outline *outline) override;
+    Decoration::Renderer *createDecorationRenderer(Decoration::DecoratedClientImpl \
*client) override;  
 protected:
     void doHideCursor() override;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic