diff --git a/abstract_output.h b/abstract_output.h --- a/abstract_output.h +++ b/abstract_output.h @@ -109,6 +109,10 @@ protected: void initWaylandOutput(); + void initWaylandOutputDevice(const QString &model, + const QString &manufacturer, + const QByteArray &uuid, + const QVector &modes); QPointer xdgOutput() const { return m_xdgOutput; @@ -118,7 +122,6 @@ QPointer waylandOutputDevice() const { return m_waylandOutputDevice; } - void setWaylandOutputDevice(KWayland::Server::OutputDeviceInterface *set); QPoint globalPos() const { return m_globalPos; diff --git a/abstract_output.cpp b/abstract_output.cpp --- a/abstract_output.cpp +++ b/abstract_output.cpp @@ -152,11 +152,6 @@ m_xdgOutput = waylandServer()->xdgOutputManager()->createXdgOutput(m_waylandOutput, m_waylandOutput); } -void AbstractOutput::setWaylandOutputDevice(KWayland::Server::OutputDeviceInterface *set) -{ - m_waylandOutputDevice = set; -} - void AbstractOutput::initWaylandOutput() { Q_ASSERT(m_waylandOutputDevice); @@ -203,4 +198,33 @@ ); } +void AbstractOutput::initWaylandOutputDevice(const QString &model, + const QString &manufacturer, + const QByteArray &uuid, + const QVector &modes) +{ + if (!m_waylandOutputDevice.isNull()) { + delete m_waylandOutputDevice.data(); + m_waylandOutputDevice.clear(); + } + m_waylandOutputDevice = waylandServer()->display()->createOutputDevice(); + m_waylandOutputDevice->setUuid(uuid); + + if (!manufacturer.isEmpty()) { + m_waylandOutputDevice->setManufacturer(manufacturer); + } else { + m_waylandOutputDevice->setManufacturer(i18n("unknown")); + } + + m_waylandOutputDevice->setModel(model); + m_waylandOutputDevice->setPhysicalSize(m_physicalSize); + + int i = 0; + for (auto mode : modes) { + qCDebug(KWIN_CORE).nospace() << "Adding mode " << ++i << ": " << mode.size << " [" << mode.refreshRate << "]"; + m_waylandOutputDevice->addMode(mode); + } + m_waylandOutputDevice->create(); +} + } diff --git a/plugins/platforms/drm/drm_output.cpp b/plugins/platforms/drm/drm_output.cpp --- a/plugins/platforms/drm/drm_output.cpp +++ b/plugins/platforms/drm/drm_output.cpp @@ -331,41 +331,31 @@ void DrmOutput::initOutputDevice(drmModeConnector *connector) { - auto wlOutputDevice = waylandOutputDevice(); - if (!wlOutputDevice.isNull()) { - delete wlOutputDevice.data(); - wlOutputDevice.clear(); - } - wlOutputDevice = waylandServer()->display()->createOutputDevice(); - wlOutputDevice->setUuid(m_uuid); - + QString manufacturer; if (!m_edid.eisaId.isEmpty()) { - wlOutputDevice->setManufacturer(QString::fromLatin1(m_edid.eisaId)); - } else { - wlOutputDevice->setManufacturer(i18n("unknown")); + manufacturer = QString::fromLatin1(m_edid.eisaId); } QString connectorName = s_connectorNames.value(connector->connector_type, QByteArrayLiteral("Unknown")); QString modelName; if (!m_edid.monitorName.isEmpty()) { - QString model = QString::fromLatin1(m_edid.monitorName); + QString m = QString::fromLatin1(m_edid.monitorName); if (!m_edid.serialNumber.isEmpty()) { - model.append('/'); - model.append(QString::fromLatin1(m_edid.serialNumber)); + m.append('/'); + m.append(QString::fromLatin1(m_edid.serialNumber)); } - modelName = model; + modelName = m; } else if (!m_edid.serialNumber.isEmpty()) { modelName = QString::fromLatin1(m_edid.serialNumber); } else { modelName = i18n("unknown"); } - wlOutputDevice->setModel(connectorName + QStringLiteral("-") + QString::number(connector->connector_type_id) + QStringLiteral("-") + modelName); - - wlOutputDevice->setPhysicalSize(rawPhysicalSize()); + const QString model = connectorName + QStringLiteral("-") + QString::number(connector->connector_type_id) + QStringLiteral("-") + modelName; // read in mode information + QVector modes; for (int i = 0; i < connector->count_modes; ++i) { // TODO: in AMS here we could read and store for later every mode's blob_id // would simplify isCurrentMode(..) and presentAtomically(..) in case of mode set @@ -378,18 +368,15 @@ deviceflags |= KWayland::Server::OutputDeviceInterface::ModeFlag::Preferred; } - const auto refreshRate = refreshRateForMode(m); - KWayland::Server::OutputDeviceInterface::Mode mode; mode.id = i; mode.size = QSize(m->hdisplay, m->vdisplay); mode.flags = deviceflags; - mode.refreshRate = refreshRate; - qCDebug(KWIN_DRM) << "Adding mode: " << i << mode.size; - wlOutputDevice->addMode(mode); + mode.refreshRate = refreshRateForMode(m); + modes << mode; } - wlOutputDevice->create(); - setWaylandOutputDevice(wlOutputDevice.data()); + + AbstractOutput::initWaylandOutputDevice(model, manufacturer, m_uuid, modes); } bool DrmOutput::isCurrentMode(const drmModeModeInfo *mode) const