File indexing completed on 2024-05-19 16:34:45

0001 /*
0002     SPDX-FileCopyrightText: 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "scene/cursorscene.h"
0008 #include "core/rendertarget.h"
0009 #include "scene/cursoritem.h"
0010 #include "scene/itemrenderer.h"
0011 
0012 namespace KWin
0013 {
0014 
0015 CursorScene::CursorScene(std::unique_ptr<ItemRenderer> &&renderer)
0016     : Scene(std::move(renderer))
0017 {
0018 }
0019 
0020 CursorScene::~CursorScene()
0021 {
0022     // Avoid accessing m_rootItem if the boundingRectChanged signal is emitted.
0023     disconnect(m_rootItem.get(), nullptr, this, nullptr);
0024     m_rootItem.reset();
0025 }
0026 
0027 void CursorScene::initialize()
0028 {
0029     m_rootItem = std::make_unique<CursorItem>(this);
0030     setGeometry(m_rootItem->boundingRect().toRect());
0031     connect(m_rootItem.get(), &Item::boundingRectChanged, this, [this]() {
0032         setGeometry(m_rootItem->boundingRect().toRect());
0033     });
0034 }
0035 
0036 static void resetRepaintsHelper(Item *item, SceneDelegate *delegate)
0037 {
0038     item->resetRepaints(delegate);
0039 
0040     const auto childItems = item->childItems();
0041     for (Item *childItem : childItems) {
0042         resetRepaintsHelper(childItem, delegate);
0043     }
0044 }
0045 
0046 void CursorScene::prePaint(SceneDelegate *delegate)
0047 {
0048     resetRepaintsHelper(m_rootItem.get(), delegate);
0049 }
0050 
0051 void CursorScene::postPaint()
0052 {
0053 }
0054 
0055 void CursorScene::paint(RenderTarget *renderTarget, const QRegion &region)
0056 {
0057     m_renderer->setRenderTargetRect(QRect(QPoint(0, 0), renderTarget->size() / renderTarget->devicePixelRatio()));
0058     m_renderer->setRenderTargetScale(renderTarget->devicePixelRatio());
0059 
0060     m_renderer->beginFrame(renderTarget);
0061     m_renderer->renderBackground(region);
0062     m_renderer->renderItem(m_rootItem.get(), 0, region, WindowPaintData(m_renderer->renderTargetProjectionMatrix()));
0063     m_renderer->endFrame();
0064 }
0065 
0066 } // namespace KWin