From 61b1eac5b84291d0671c2458740f2126b92db9d7 Mon Sep 17 00:00:00 2001 From: Xaver Hugl Date: Wed, 22 Jun 2022 12:33:32 +0200 Subject: [PATCH] platform, scenes: use std::unique_ptr for creation functions --- src/backends/drm/drm_backend.cpp | 12 ++++---- src/backends/drm/drm_backend.h | 6 ++-- src/backends/virtual/virtual_backend.cpp | 8 ++--- src/backends/virtual/virtual_backend.h | 4 +-- src/backends/wayland/wayland_backend.cpp | 12 ++++---- src/backends/wayland/wayland_backend.h | 6 ++-- src/backends/x11/standalone/x11_platform.cpp | 6 ++-- src/backends/x11/standalone/x11_platform.h | 2 +- .../x11/windowed/x11windowed_backend.cpp | 12 ++++---- .../x11/windowed/x11windowed_backend.h | 6 ++-- src/composite.cpp | 29 +++++++++---------- src/composite.h | 9 +++--- src/input.cpp | 18 +++++------- src/input.h | 4 +-- src/platform.cpp | 9 ++++-- src/platform.h | 6 ++-- src/scene.cpp | 5 +--- src/scene.h | 2 +- src/scenes/opengl/scene_opengl.cpp | 13 ++++----- src/scenes/opengl/scene_opengl.h | 4 +-- src/scenes/qpainter/scene_qpainter.cpp | 9 +++--- src/scenes/qpainter/scene_qpainter.h | 4 +-- 22 files changed, 90 insertions(+), 96 deletions(-) diff --git a/src/backends/drm/drm_backend.cpp b/src/backends/drm/drm_backend.cpp index 2e475ae2db..767635fbb4 100644 --- a/src/backends/drm/drm_backend.cpp +++ b/src/backends/drm/drm_backend.cpp @@ -549,19 +549,19 @@ void DrmBackend::enableOutput(DrmAbstractOutput *output, bool enable) } } -InputBackend *DrmBackend::createInputBackend() +std::unique_ptr DrmBackend::createInputBackend() { - return new LibinputBackend(); + return std::make_unique(); } -QPainterBackend *DrmBackend::createQPainterBackend() +std::unique_ptr DrmBackend::createQPainterBackend() { - return new DrmQPainterBackend(this); + return std::make_unique(this); } -OpenGLBackend *DrmBackend::createOpenGLBackend() +std::unique_ptr DrmBackend::createOpenGLBackend() { - return new EglGbmBackend(this); + return std::make_unique(this); } void DrmBackend::sceneInitialized() diff --git a/src/backends/drm/drm_backend.h b/src/backends/drm/drm_backend.h index 6db337aefa..f7c0ef7437 100644 --- a/src/backends/drm/drm_backend.h +++ b/src/backends/drm/drm_backend.h @@ -43,9 +43,9 @@ public: explicit DrmBackend(QObject *parent = nullptr); ~DrmBackend() override; - InputBackend *createInputBackend() override; - QPainterBackend *createQPainterBackend() override; - OpenGLBackend *createOpenGLBackend() override; + std::unique_ptr createInputBackend() override; + std::unique_ptr createQPainterBackend() override; + std::unique_ptr createOpenGLBackend() override; std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers) override; std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier) override; diff --git a/src/backends/virtual/virtual_backend.cpp b/src/backends/virtual/virtual_backend.cpp index 3e54dd7cb5..200ed5df30 100644 --- a/src/backends/virtual/virtual_backend.cpp +++ b/src/backends/virtual/virtual_backend.cpp @@ -80,14 +80,14 @@ QString VirtualBackend::screenshotDirPath() const return m_screenshotDir->path(); } -QPainterBackend *VirtualBackend::createQPainterBackend() +std::unique_ptr VirtualBackend::createQPainterBackend() { - return new VirtualQPainterBackend(this); + return std::make_unique(this); } -OpenGLBackend *VirtualBackend::createOpenGLBackend() +std::unique_ptr VirtualBackend::createOpenGLBackend() { - return new VirtualEglBackend(this); + return std::make_unique(this); } Outputs VirtualBackend::outputs() const diff --git a/src/backends/virtual/virtual_backend.h b/src/backends/virtual/virtual_backend.h index 51c89bb786..e3fb3d5a78 100644 --- a/src/backends/virtual/virtual_backend.h +++ b/src/backends/virtual/virtual_backend.h @@ -41,8 +41,8 @@ public: } QString screenshotDirPath() const; - QPainterBackend *createQPainterBackend() override; - OpenGLBackend *createOpenGLBackend() override; + std::unique_ptr createQPainterBackend() override; + std::unique_ptr createOpenGLBackend() override; Q_INVOKABLE void setVirtualOutputs(int count, QVector geometries = QVector(), QVector scales = QVector()); diff --git a/src/backends/wayland/wayland_backend.cpp b/src/backends/wayland/wayland_backend.cpp index c19c3a4e3a..04f8c44ed4 100644 --- a/src/backends/wayland/wayland_backend.cpp +++ b/src/backends/wayland/wayland_backend.cpp @@ -846,23 +846,23 @@ void WaylandBackend::destroyOutputs() } } -InputBackend *WaylandBackend::createInputBackend() +std::unique_ptr WaylandBackend::createInputBackend() { - return new WaylandInputBackend(this); + return std::make_unique(this); } -OpenGLBackend *WaylandBackend::createOpenGLBackend() +std::unique_ptr WaylandBackend::createOpenGLBackend() { #if HAVE_WAYLAND_EGL - return new WaylandEglBackend(this); + return std::make_unique(this); #else return nullptr; #endif } -QPainterBackend *WaylandBackend::createQPainterBackend() +std::unique_ptr WaylandBackend::createQPainterBackend() { - return new WaylandQPainterBackend(this); + return std::make_unique(this); } void WaylandBackend::flush() diff --git a/src/backends/wayland/wayland_backend.h b/src/backends/wayland/wayland_backend.h index 1e8e765fc1..963d51012c 100644 --- a/src/backends/wayland/wayland_backend.h +++ b/src/backends/wayland/wayland_backend.h @@ -259,9 +259,9 @@ public: KWayland::Client::SubCompositor *subCompositor(); KWayland::Client::ShmPool *shmPool(); - InputBackend *createInputBackend() override; - OpenGLBackend *createOpenGLBackend() override; - QPainterBackend *createQPainterBackend() override; + std::unique_ptr createInputBackend() override; + std::unique_ptr createOpenGLBackend() override; + std::unique_ptr createQPainterBackend() override; void flush(); diff --git a/src/backends/x11/standalone/x11_platform.cpp b/src/backends/x11/standalone/x11_platform.cpp index ecaf3b8e45..86fcd0e136 100644 --- a/src/backends/x11/standalone/x11_platform.cpp +++ b/src/backends/x11/standalone/x11_platform.cpp @@ -157,13 +157,13 @@ Session *X11StandalonePlatform::session() const return m_session.get(); } -OpenGLBackend *X11StandalonePlatform::createOpenGLBackend() +std::unique_ptr X11StandalonePlatform::createOpenGLBackend() { switch (options->glPlatformInterface()) { #if HAVE_EPOXY_GLX case GlxPlatformInterface: if (hasGlx()) { - return new GlxBackend(m_x11Display, this); + return std::make_unique(m_x11Display, this); } else { qCWarning(KWIN_X11STANDALONE) << "Glx not available, trying EGL instead."; // no break, needs fall-through @@ -171,7 +171,7 @@ OpenGLBackend *X11StandalonePlatform::createOpenGLBackend() } #endif case EglPlatformInterface: - return new EglBackend(m_x11Display, this); + return std::make_unique(m_x11Display, this); default: // no backend available return nullptr; diff --git a/src/backends/x11/standalone/x11_platform.h b/src/backends/x11/standalone/x11_platform.h index dbd85b5dee..3b230cad23 100644 --- a/src/backends/x11/standalone/x11_platform.h +++ b/src/backends/x11/standalone/x11_platform.h @@ -38,7 +38,7 @@ public: bool initialize() override; Session *session() const override; - OpenGLBackend *createOpenGLBackend() override; + std::unique_ptr createOpenGLBackend() override; Edge *createScreenEdge(ScreenEdges *parent) override; void createPlatformCursor(QObject *parent = nullptr) override; bool requiresCompositing() const override; diff --git a/src/backends/x11/windowed/x11windowed_backend.cpp b/src/backends/x11/windowed/x11windowed_backend.cpp index cb13f20d83..dfcff56519 100644 --- a/src/backends/x11/windowed/x11windowed_backend.cpp +++ b/src/backends/x11/windowed/x11windowed_backend.cpp @@ -662,19 +662,19 @@ X11WindowedInputDevice *X11WindowedBackend::touchDevice() const return m_touchDevice; } -OpenGLBackend *X11WindowedBackend::createOpenGLBackend() +std::unique_ptr X11WindowedBackend::createOpenGLBackend() { - return new X11WindowedEglBackend(this); + return std::make_unique(this); } -QPainterBackend *X11WindowedBackend::createQPainterBackend() +std::unique_ptr X11WindowedBackend::createQPainterBackend() { - return new X11WindowedQPainterBackend(this); + return std::make_unique(this); } -InputBackend *X11WindowedBackend::createInputBackend() +std::unique_ptr X11WindowedBackend::createInputBackend() { - return new X11WindowedInputBackend(this); + return std::make_unique(this); } void X11WindowedBackend::warpPointer(const QPointF &globalPos) diff --git a/src/backends/x11/windowed/x11windowed_backend.h b/src/backends/x11/windowed/x11windowed_backend.h index d0beb1bb4e..906666017a 100644 --- a/src/backends/x11/windowed/x11windowed_backend.h +++ b/src/backends/x11/windowed/x11windowed_backend.h @@ -115,9 +115,9 @@ public: return m_hasXInput; } - OpenGLBackend *createOpenGLBackend() override; - QPainterBackend *createQPainterBackend() override; - InputBackend *createInputBackend() override; + std::unique_ptr createOpenGLBackend() override; + std::unique_ptr createQPainterBackend() override; + std::unique_ptr createInputBackend() override; void warpPointer(const QPointF &globalPos) override; QVector supportedCompositors() const override diff --git a/src/composite.cpp b/src/composite.cpp index 3f7eadb4b3..451cb4575e 100644 --- a/src/composite.cpp +++ b/src/composite.cpp @@ -186,7 +186,7 @@ bool Compositor::attemptOpenGLCompositing() kwinApp()->platform()->createOpenGLSafePoint(Platform::OpenGLSafePoint::PostInit); }); - QScopedPointer backend(kwinApp()->platform()->createOpenGLBackend()); + std::unique_ptr backend = kwinApp()->platform()->createOpenGLBackend(); if (!backend) { return false; } @@ -197,13 +197,13 @@ bool Compositor::attemptOpenGLCompositing() return false; } - QScopedPointer scene(SceneOpenGL::createScene(backend.data(), this)); + std::unique_ptr scene = SceneOpenGL::createScene(backend.get()); if (!scene || scene->initFailed()) { return false; } - m_backend = backend.take(); - m_scene = scene.take(); + m_backend = std::move(backend); + m_scene = std::move(scene); // set strict binding if (options->isGlStrictBindingFollowsDriver()) { @@ -216,18 +216,18 @@ bool Compositor::attemptOpenGLCompositing() bool Compositor::attemptQPainterCompositing() { - QScopedPointer backend(kwinApp()->platform()->createQPainterBackend()); + std::unique_ptr backend(kwinApp()->platform()->createQPainterBackend()); if (!backend || backend->isFailed()) { return false; } - QScopedPointer scene(SceneQPainter::createScene(backend.data(), this)); + std::unique_ptr scene = SceneQPainter::createScene(backend.get()); if (!scene || scene->initFailed()) { return false; } - m_backend = backend.take(); - m_scene = scene.take(); + m_backend = std::move(backend); + m_scene = std::move(scene); qCDebug(KWIN_CORE) << "QPainter compositing has been successfully initialized"; return true; @@ -366,7 +366,7 @@ void Compositor::startupWithWorkspace() const QVector outputs = kwinApp()->platform()->enabledOutputs(); if (kwinApp()->operationMode() == Application::OperationModeX11) { auto workspaceLayer = new RenderLayer(outputs.constFirst()->renderLoop()); - workspaceLayer->setDelegate(new SceneDelegate(m_scene)); + workspaceLayer->setDelegate(new SceneDelegate(m_scene.get())); workspaceLayer->setGeometry(workspace()->geometry()); connect(workspace(), &Workspace::geometryChanged, workspaceLayer, [workspaceLayer]() { workspaceLayer->setGeometry(workspace()->geometry()); @@ -400,7 +400,7 @@ void Compositor::startupWithWorkspace() } // Sets also the 'effects' pointer. - kwinApp()->platform()->createEffectsHandler(this, m_scene); + kwinApp()->platform()->createEffectsHandler(this, m_scene.get()); Q_EMIT compositingToggled(true); @@ -425,7 +425,7 @@ void Compositor::addOutput(Output *output) Q_ASSERT(kwinApp()->operationMode() != Application::OperationModeX11); auto workspaceLayer = new RenderLayer(output->renderLoop()); - workspaceLayer->setDelegate(new SceneDelegate(m_scene, output)); + workspaceLayer->setDelegate(new SceneDelegate(m_scene.get(), output)); workspaceLayer->setGeometry(output->rect()); connect(output, &Output::geometryChanged, workspaceLayer, [output, workspaceLayer]() { workspaceLayer->setGeometry(output->rect()); @@ -531,11 +531,8 @@ void Compositor::stop() disconnect(kwinApp()->platform(), &Platform::outputEnabled, this, &Compositor::addOutput); disconnect(kwinApp()->platform(), &Platform::outputDisabled, this, &Compositor::removeOutput); - delete m_scene; - m_scene = nullptr; - - delete m_backend; - m_backend = nullptr; + m_scene.reset(); + m_backend.reset(); m_state = State::Off; Q_EMIT compositingToggled(false); diff --git a/src/composite.h b/src/composite.h index 34304f2247..badff5523a 100644 --- a/src/composite.h +++ b/src/composite.h @@ -14,6 +14,7 @@ #include #include #include +#include namespace KWin { @@ -70,11 +71,11 @@ public: Scene *scene() const { - return m_scene; + return m_scene.get(); } RenderBackend *backend() const { - return m_backend; + return m_backend.get(); } /** @@ -152,8 +153,8 @@ private: QTimer m_releaseSelectionTimer; QList m_unusedSupportProperties; QTimer m_unusedSupportPropertyTimer; - Scene *m_scene = nullptr; - RenderBackend *m_backend = nullptr; + std::unique_ptr m_scene; + std::unique_ptr m_backend; QHash m_superlayers; }; diff --git a/src/input.cpp b/src/input.cpp index 668ce248b2..6d25c9f4b9 100644 --- a/src/input.cpp +++ b/src/input.cpp @@ -2573,7 +2573,6 @@ InputRedirection::InputRedirection(QObject *parent) InputRedirection::~InputRedirection() { - qDeleteAll(m_inputBackends); m_inputBackends.clear(); m_inputDevices.clear(); @@ -3066,26 +3065,25 @@ void InputRedirection::disableTouchpads() } } -void InputRedirection::addInputBackend(InputBackend *inputBackend) +void InputRedirection::addInputBackend(std::unique_ptr &&inputBackend) { - Q_ASSERT(!m_inputBackends.contains(inputBackend)); - m_inputBackends.append(inputBackend); - - connect(inputBackend, &InputBackend::deviceAdded, this, &InputRedirection::addInputDevice); - connect(inputBackend, &InputBackend::deviceRemoved, this, &InputRedirection::removeInputDevice); + connect(inputBackend.get(), &InputBackend::deviceAdded, this, &InputRedirection::addInputDevice); + connect(inputBackend.get(), &InputBackend::deviceRemoved, this, &InputRedirection::removeInputDevice); inputBackend->setConfig(InputConfig::self()->inputConfig()); inputBackend->initialize(); + + m_inputBackends.push_back(std::move(inputBackend)); } void InputRedirection::setupInputBackends() { - InputBackend *inputBackend = kwinApp()->platform()->createInputBackend(); + std::unique_ptr inputBackend = kwinApp()->platform()->createInputBackend(); if (inputBackend) { - addInputBackend(inputBackend); + addInputBackend(std::move(inputBackend)); } if (waylandServer()) { - addInputBackend(new FakeInputBackend()); + addInputBackend(std::make_unique()); } } diff --git a/src/input.h b/src/input.h index a922399212..64aff0268e 100644 --- a/src/input.h +++ b/src/input.h @@ -322,7 +322,7 @@ private: void installInputEventFilter(InputEventFilter *filter); void updateLeds(LEDs leds); void updateAvailableInputDevices(); - void addInputBackend(InputBackend *inputBackend); + void addInputBackend(std::unique_ptr &&inputBackend); KeyboardInputRedirection *m_keyboard; PointerInputRedirection *m_pointer; TabletInputRedirection *m_tablet; @@ -331,7 +331,7 @@ private: GlobalShortcutsManager *m_shortcuts; - QList m_inputBackends; + std::vector> m_inputBackends; QList m_inputDevices; QList m_idleDetectors; diff --git a/src/platform.cpp b/src/platform.cpp index ca5ebeb88f..8198e1c380 100644 --- a/src/platform.cpp +++ b/src/platform.cpp @@ -15,11 +15,14 @@ #include "cursor.h" #include "dmabuftexture.h" #include "effects.h" +#include "inputbackend.h" +#include "openglbackend.h" #include "outline.h" #include "output.h" #include "outputconfiguration.h" #include "overlaywindow.h" #include "pointer_input.h" +#include "qpainterbackend.h" #include "scene.h" #include "screenedge.h" #include "screens.h" @@ -66,17 +69,17 @@ PlatformCursorImage Platform::cursorImage() const return PlatformCursorImage(cursor->image(), cursor->hotspot()); } -InputBackend *Platform::createInputBackend() +std::unique_ptr Platform::createInputBackend() { return nullptr; } -OpenGLBackend *Platform::createOpenGLBackend() +std::unique_ptr Platform::createOpenGLBackend() { return nullptr; } -QPainterBackend *Platform::createQPainterBackend() +std::unique_ptr Platform::createQPainterBackend() { return nullptr; } diff --git a/src/platform.h b/src/platform.h index a7517e52f9..ac47080ac8 100644 --- a/src/platform.h +++ b/src/platform.h @@ -66,9 +66,9 @@ public: virtual Session *session() const = 0; virtual bool initialize() = 0; - virtual InputBackend *createInputBackend(); - virtual OpenGLBackend *createOpenGLBackend(); - virtual QPainterBackend *createQPainterBackend(); + virtual std::unique_ptr createInputBackend(); + virtual std::unique_ptr createOpenGLBackend(); + virtual std::unique_ptr createQPainterBackend(); virtual std::optional testCreateDmaBuf(const QSize &size, quint32 format, const QVector &modifiers); virtual std::shared_ptr createDmaBufTexture(const QSize &size, quint32 format, const uint64_t modifier); std::shared_ptr createDmaBufTexture(const DmaBufParams &attributes); diff --git a/src/scene.cpp b/src/scene.cpp index 36bed2eae3..f55cef585e 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -131,10 +131,7 @@ QRect SceneDelegate::viewport() const // Scene //**************************************** -Scene::Scene(QObject *parent) - : QObject(parent) -{ -} +Scene::Scene() = default; Scene::~Scene() { diff --git a/src/scene.h b/src/scene.h index 7812d80140..687ce1f3cf 100644 --- a/src/scene.h +++ b/src/scene.h @@ -72,7 +72,7 @@ class KWIN_EXPORT Scene : public QObject Q_OBJECT public: - explicit Scene(QObject *parent = nullptr); + explicit Scene(); ~Scene() override; void initialize(); diff --git a/src/scenes/opengl/scene_opengl.cpp b/src/scenes/opengl/scene_opengl.cpp index 890d33ca43..560096a4ab 100644 --- a/src/scenes/opengl/scene_opengl.cpp +++ b/src/scenes/opengl/scene_opengl.cpp @@ -45,9 +45,8 @@ namespace KWin * SceneOpenGL ***********************************************/ -SceneOpenGL::SceneOpenGL(OpenGLBackend *backend, QObject *parent) - : Scene(parent) - , m_backend(backend) +SceneOpenGL::SceneOpenGL(OpenGLBackend *backend) + : m_backend(backend) { // We only support the OpenGL 2+ shader API, not GL_ARB_shader_objects if (!hasGLVersion(2, 0)) { @@ -70,13 +69,13 @@ SceneOpenGL::~SceneOpenGL() } } -SceneOpenGL *SceneOpenGL::createScene(OpenGLBackend *backend, QObject *parent) +std::unique_ptr SceneOpenGL::createScene(OpenGLBackend *backend) { if (SceneOpenGL::supported(backend)) { - return new SceneOpenGL(backend, parent); + return std::make_unique(backend); + } else { + return nullptr; } - - return nullptr; } bool SceneOpenGL::initFailed() const diff --git a/src/scenes/opengl/scene_opengl.h b/src/scenes/opengl/scene_opengl.h index 31842258e6..ecd146ce6a 100644 --- a/src/scenes/opengl/scene_opengl.h +++ b/src/scenes/opengl/scene_opengl.h @@ -49,7 +49,7 @@ public: const bool hardwareClipping; }; - explicit SceneOpenGL(OpenGLBackend *backend, QObject *parent = nullptr); + explicit SceneOpenGL(OpenGLBackend *backend); ~SceneOpenGL() override; bool initFailed() const override; void paint(RenderTarget *renderTarget, const QRegion ®ion) override; @@ -72,7 +72,7 @@ public: QVector openGLPlatformInterfaceExtensions() const override; std::shared_ptr textureForOutput(Output *output) const override; - static SceneOpenGL *createScene(OpenGLBackend *backend, QObject *parent); + static std::unique_ptr createScene(OpenGLBackend *backend); static bool supported(OpenGLBackend *backend); protected: diff --git a/src/scenes/qpainter/scene_qpainter.cpp b/src/scenes/qpainter/scene_qpainter.cpp index 1c521b3414..502dca6191 100644 --- a/src/scenes/qpainter/scene_qpainter.cpp +++ b/src/scenes/qpainter/scene_qpainter.cpp @@ -30,14 +30,13 @@ namespace KWin //**************************************** // SceneQPainter //**************************************** -SceneQPainter *SceneQPainter::createScene(QPainterBackend *backend, QObject *parent) +std::unique_ptr SceneQPainter::createScene(QPainterBackend *backend) { - return new SceneQPainter(backend, parent); + return std::unique_ptr(new SceneQPainter(backend)); } -SceneQPainter::SceneQPainter(QPainterBackend *backend, QObject *parent) - : Scene(parent) - , m_backend(backend) +SceneQPainter::SceneQPainter(QPainterBackend *backend) + : m_backend(backend) , m_painter(new QPainter()) { } diff --git a/src/scenes/qpainter/scene_qpainter.h b/src/scenes/qpainter/scene_qpainter.h index 692ca5e170..f688b5f8e6 100644 --- a/src/scenes/qpainter/scene_qpainter.h +++ b/src/scenes/qpainter/scene_qpainter.h @@ -44,14 +44,14 @@ public: return m_backend; } - static SceneQPainter *createScene(QPainterBackend *backend, QObject *parent); + static std::unique_ptr createScene(QPainterBackend *backend); protected: void paintBackground(const QRegion ®ion) override; void paintOffscreenQuickView(OffscreenQuickView *w) override; private: - explicit SceneQPainter(QPainterBackend *backend, QObject *parent = nullptr); + explicit SceneQPainter(QPainterBackend *backend); void renderSurfaceItem(QPainter *painter, SurfaceItem *surfaceItem) const; void renderDecorationItem(QPainter *painter, DecorationItem *decorationItem) const;