#include "OutputTracker.hpp" #include #include #include #include OutputTracker::OutputTracker(QObject *parent) : QObject(parent) { if (auto *app = qobject_cast(QCoreApplication::instance())) { connect(app, &QGuiApplication::primaryScreenChanged, this, [this](QScreen *screen) { bindScreen(screen); }); connect(app, &QGuiApplication::screenAdded, this, [this](QScreen *) { if (!m_screen) bindScreen(QGuiApplication::primaryScreen()); }); connect(app, &QGuiApplication::screenRemoved, this, [this](QScreen *screen) { if (m_screen == screen) bindScreen(QGuiApplication::primaryScreen()); }); bindScreen(app->primaryScreen()); } } OutputTracker *OutputTracker::create(QQmlEngine *engine, QJSEngine *) { auto *tracker = new OutputTracker(engine); QQmlEngine::setObjectOwnership(tracker, QQmlEngine::CppOwnership); return tracker; } void OutputTracker::bindScreen(QScreen *screen) { if (m_screen == screen) return; if (m_screen) { disconnect(m_screen, nullptr, this, nullptr); } m_screen = screen; if (m_screen) { connect(m_screen, &QScreen::geometryChanged, this, [this](const QRect &) { logGeometry(); emit geometryChanged(); }); connect(m_screen, &QScreen::physicalDotsPerInchChanged, this, &OutputTracker::geometryChanged); } logGeometry(); emit geometryChanged(); } void OutputTracker::logGeometry() const { if (!m_screen) { qWarning("nebula-shell: no Wayland output is available yet"); return; } const QRect geo = m_screen->geometry(); qInfo("nebula-shell: output %s %dx%d+%d+%d scale %g", qPrintable(m_screen->name()), geo.width(), geo.height(), geo.x(), geo.y(), m_screen->devicePixelRatio()); } int OutputTracker::width() const { return m_screen ? m_screen->geometry().width() : 0; } int OutputTracker::height() const { return m_screen ? m_screen->geometry().height() : 0; } qreal OutputTracker::devicePixelRatio() const { return m_screen ? m_screen->devicePixelRatio() : 1.0; } QString OutputTracker::name() const { return m_screen ? m_screen->name() : QString(); }