plugins/outputlocator: Manage OffscreenQuickView with smart pointers

master
Vlad Zahorodnii 11 months ago
parent 98eecafe29
commit 5d925799d7

@ -76,7 +76,7 @@ void OutputLocatorEffect::show()
const auto screens = effects->screens(); const auto screens = effects->screens();
for (const auto screen : screens) { for (const auto screen : screens) {
auto scene = new OffscreenQuickScene(this); auto scene = new OffscreenQuickScene();
scene->setSource(m_qmlUrl, {{QStringLiteral("outputName"), outputName(screen)}, {QStringLiteral("resolution"), screen->geometry().size()}, {QStringLiteral("scale"), screen->devicePixelRatio()}}); scene->setSource(m_qmlUrl, {{QStringLiteral("outputName"), outputName(screen)}, {QStringLiteral("resolution"), screen->geometry().size()}, {QStringLiteral("scale"), screen->devicePixelRatio()}});
QRectF geometry(0, 0, scene->rootItem()->implicitWidth(), scene->rootItem()->implicitHeight()); QRectF geometry(0, 0, scene->rootItem()->implicitWidth(), scene->rootItem()->implicitHeight());
geometry.moveCenter(screen->geometry().center()); geometry.moveCenter(screen->geometry().center());
@ -84,7 +84,7 @@ void OutputLocatorEffect::show()
connect(scene, &OffscreenQuickView::repaintNeeded, this, [scene] { connect(scene, &OffscreenQuickView::repaintNeeded, this, [scene] {
effects->addRepaint(scene->geometry()); effects->addRepaint(scene->geometry());
}); });
m_scenesByScreens.insert(screen, scene); m_scenesByScreens[screen].reset(scene);
} }
m_showTimer.start(std::chrono::milliseconds(2500)); m_showTimer.start(std::chrono::milliseconds(2500));
@ -93,10 +93,12 @@ void OutputLocatorEffect::show()
void OutputLocatorEffect::hide() void OutputLocatorEffect::hide()
{ {
m_showTimer.stop(); m_showTimer.stop();
const QRegion repaintRegion = std::accumulate(m_scenesByScreens.cbegin(), m_scenesByScreens.cend(), QRegion(), [](QRegion region, OffscreenQuickScene *scene) {
return region |= scene->geometry(); QRegion repaintRegion;
}); for (const auto &[screen, scene] : m_scenesByScreens) {
qDeleteAll(m_scenesByScreens); repaintRegion |= scene->geometry();
}
m_scenesByScreens.clear(); m_scenesByScreens.clear();
effects->addRepaint(repaintRegion); effects->addRepaint(repaintRegion);
} }
@ -106,12 +108,12 @@ void OutputLocatorEffect::paintScreen(const RenderTarget &renderTarget, const Re
effects->paintScreen(renderTarget, viewport, mask, region, screen); effects->paintScreen(renderTarget, viewport, mask, region, screen);
// On X11 all screens are painted at once // On X11 all screens are painted at once
if (effects->waylandDisplay()) { if (effects->waylandDisplay()) {
if (auto scene = m_scenesByScreens.value(screen)) { if (auto it = m_scenesByScreens.find(screen); it != m_scenesByScreens.end()) {
effects->renderOffscreenQuickView(renderTarget, viewport, scene); effects->renderOffscreenQuickView(renderTarget, viewport, it->second.get());
} }
} else { } else {
for (auto scene : m_scenesByScreens) { for (const auto &[screen, scene] : m_scenesByScreens) {
effects->renderOffscreenQuickView(renderTarget, viewport, scene); effects->renderOffscreenQuickView(renderTarget, viewport, scene.get());
} }
} }
} }

@ -10,6 +10,8 @@
#include <QTimer> #include <QTimer>
#include <unordered_map>
namespace KWin namespace KWin
{ {
class OffscreenQuickScene; class OffscreenQuickScene;
@ -30,6 +32,6 @@ public Q_SLOTS:
private: private:
QUrl m_qmlUrl; QUrl m_qmlUrl;
QTimer m_showTimer; QTimer m_showTimer;
QMap<EffectScreen *, OffscreenQuickScene *> m_scenesByScreens; std::unordered_map<EffectScreen *, std::unique_ptr<OffscreenQuickScene>> m_scenesByScreens;
}; };
} }

Loading…
Cancel
Save