diff --git a/abstract_wayland_output.h b/abstract_wayland_output.h --- a/abstract_wayland_output.h +++ b/abstract_wayland_output.h @@ -61,9 +61,6 @@ QString name() const override; QByteArray uuid() const override; - bool isEnabled() const { - return !m_waylandOutput.isNull(); - } QSize pixelSize() const; qreal scale() const override; @@ -107,11 +104,9 @@ void modeChanged(); protected: - void initWaylandOutputDevice(const QString &model, - const QString &manufacturer, - const QByteArray &uuid, - const QSize &physicalSize, - const QVector &modes); + void initInterfaces(const QString &model, const QString &manufacturer, + const QByteArray &uuid, const QSize &physicalSize, + const QVector &modes); QPointer xdgOutput() const { return m_xdgOutput; @@ -152,6 +147,7 @@ private: void createWaylandOutput(); void createXdgOutput(); + bool isEnabled() const; QPointer m_waylandOutput; QPointer m_xdgOutput; diff --git a/abstract_wayland_output.cpp b/abstract_wayland_output.cpp --- a/abstract_wayland_output.cpp +++ b/abstract_wayland_output.cpp @@ -79,10 +79,8 @@ { m_waylandOutputDevice->setGlobalPosition(pos); - if (m_waylandOutput) { + if (isEnabled()) { m_waylandOutput->setGlobalPosition(pos); - } - if (m_xdgOutput) { m_xdgOutput->setLogicalPosition(pos); m_xdgOutput->done(); } @@ -102,16 +100,14 @@ { m_waylandOutputDevice->setScaleF(scale); - if (m_waylandOutput) { + if (isEnabled()) { // this is the scale that clients will ideally use for their buffers // this has to be an int which is fine // I don't know whether we want to round or ceil // or maybe even set this to 3 when we're scaling to 1.5 // don't treat this like it's chosen deliberately m_waylandOutput->setScale(std::ceil(scale)); - } - if (m_xdgOutput) { m_xdgOutput->setLogicalSize(pixelSize() / scale); m_xdgOutput->done(); } @@ -150,6 +146,13 @@ } } +using DeviceInterface = KWayland::Server::OutputDeviceInterface; + +bool AbstractWaylandOutput::isEnabled() const +{ + return m_waylandOutputDevice->enabled() == DeviceInterface::Enablement::Enabled; +} + void AbstractWaylandOutput::setEnabled(bool enable) { if (enable == isEnabled()) { @@ -162,20 +165,18 @@ updateDpms(KWayland::Server::OutputInterface::DpmsMode::Off); delete waylandOutput().data(); } - waylandOutputDevice()->setEnabled(enable ? KWayland::Server::OutputDeviceInterface::Enablement::Enabled : - KWayland::Server::OutputDeviceInterface::Enablement::Disabled); + waylandOutputDevice()->setEnabled(enable ? DeviceInterface::Enablement::Enabled : + DeviceInterface::Enablement::Disabled); } void AbstractWaylandOutput::setWaylandMode(const QSize &size, int refreshRate) { - if (m_waylandOutput.isNull()) { + if (!isEnabled()) { return; } m_waylandOutput->setCurrentMode(size, refreshRate); - if (m_xdgOutput) { - m_xdgOutput->setLogicalSize(pixelSize() / scale()); - m_xdgOutput->done(); - } + m_xdgOutput->setLogicalSize(pixelSize() / scale()); + m_xdgOutput->done(); } void AbstractWaylandOutput::createXdgOutput() @@ -207,10 +208,10 @@ */ for(const auto &mode: m_waylandOutputDevice->modes()) { KWayland::Server::OutputInterface::ModeFlags flags; - if (mode.flags & KWayland::Server::OutputDeviceInterface::ModeFlag::Current) { + if (mode.flags & DeviceInterface::ModeFlag::Current) { flags |= KWayland::Server::OutputInterface::ModeFlag::Current; } - if (mode.flags & KWayland::Server::OutputDeviceInterface::ModeFlag::Preferred) { + if (mode.flags & DeviceInterface::ModeFlag::Preferred) { flags |= KWayland::Server::OutputInterface::ModeFlag::Preferred; } m_waylandOutput->addMode(mode.size, flags, mode.refreshRate); @@ -230,11 +231,9 @@ ); } -void AbstractWaylandOutput::initWaylandOutputDevice(const QString &model, - const QString &manufacturer, - const QByteArray &uuid, - const QSize &physicalSize, - const QVector &modes) +void AbstractWaylandOutput::initInterfaces(const QString &model, const QString &manufacturer, + const QByteArray &uuid, const QSize &physicalSize, + const QVector &modes) { Q_ASSERT(m_waylandOutputDevice.isNull()); m_waylandOutputDevice = waylandServer()->display()->createOutputDevice(); @@ -254,7 +253,9 @@ qCDebug(KWIN_CORE).nospace() << "Adding mode " << ++i << ": " << mode.size << " [" << mode.refreshRate << "]"; m_waylandOutputDevice->addMode(mode); } + m_waylandOutputDevice->create(); + createWaylandOutput(); } QSize AbstractWaylandOutput::orientateSize(const QSize &size) const 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 @@ -268,8 +268,7 @@ } initOutputDevice(connector); - - setEnabled(true); + updateDpms(KWayland::Server::OutputInterface::DpmsMode::On); return true; } @@ -343,7 +342,7 @@ physicalSize = overwriteSize; } - initWaylandOutputDevice(model, manufacturer, m_uuid, physicalSize, modes); + initInterfaces(model, manufacturer, m_uuid, physicalSize, modes); } bool DrmOutput::isCurrentMode(const drmModeModeInfo *mode) const diff --git a/plugins/platforms/fbdev/fb_backend.cpp b/plugins/platforms/fbdev/fb_backend.cpp --- a/plugins/platforms/fbdev/fb_backend.cpp +++ b/plugins/platforms/fbdev/fb_backend.cpp @@ -44,8 +44,7 @@ mode.size = pixelSize; mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO: get actual refresh rate of fb device? - AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", physicalSize, { mode }); + initInterfaces("model_TODO", "manufacturer_TODO", "UUID_TODO", physicalSize, { mode }); } FramebufferBackend::FramebufferBackend(QObject *parent) @@ -149,7 +148,6 @@ auto *output = new FramebufferOutput(this); output->init(QSize(varinfo.xres, varinfo.yres), QSize(varinfo.width, varinfo.height)); - output->setEnabled(true); m_outputs << output; m_id = QByteArray(fixinfo.id); diff --git a/plugins/platforms/hwcomposer/hwcomposer_backend.cpp b/plugins/platforms/hwcomposer/hwcomposer_backend.cpp --- a/plugins/platforms/hwcomposer/hwcomposer_backend.cpp +++ b/plugins/platforms/hwcomposer/hwcomposer_backend.cpp @@ -522,9 +522,8 @@ mode.flags = OutputDeviceInterface::ModeFlag::Current | OutputDeviceInterface::ModeFlag::Preferred; mode.refreshRate = (attr_values[4] == 0) ? 60000 : 10E11/attr_values[4]; - initWaylandOutputDevice(QString(), QString(), QByteArray(), physicalSize.toSize(), {mode}); + initInterfaces(QString(), QString(), QByteArray(), physicalSize.toSize(), {mode}); setInternal(true); - setEnabled(true); setDpmsSupported(true); const auto outputGroup = kwinApp()->config()->group("HWComposerOutputs").group("0"); diff --git a/plugins/platforms/virtual/virtual_output.cpp b/plugins/platforms/virtual/virtual_output.cpp --- a/plugins/platforms/virtual/virtual_output.cpp +++ b/plugins/platforms/virtual/virtual_output.cpp @@ -39,11 +39,8 @@ mode.size = pixelSize; mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO - AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", pixelSize, { mode }); - setEnabled(true); + initInterfaces("model_TODO", "manufacturer_TODO", "UUID_TODO", pixelSize, { mode }); setGeometry(QRect(logicalPosition, pixelSize)); - setScale(1.); } void VirtualOutput::setGeometry(const QRect &geo) diff --git a/plugins/platforms/wayland/wayland_output.cpp b/plugins/platforms/wayland/wayland_output.cpp --- a/plugins/platforms/wayland/wayland_output.cpp +++ b/plugins/platforms/wayland/wayland_output.cpp @@ -61,9 +61,7 @@ mode.size = pixelSize; mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO: can we get refresh rate data from Wayland host? - AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", pixelSize, { mode }); - setEnabled(true); + initInterfaces("model_TODO", "manufacturer_TODO", "UUID_TODO", pixelSize, { mode }); setGeometry(logicalPosition, pixelSize); setScale(backend()->initialOutputScale()); } diff --git a/plugins/platforms/x11/windowed/x11windowed_output.cpp b/plugins/platforms/x11/windowed/x11windowed_output.cpp --- a/plugins/platforms/x11/windowed/x11windowed_output.cpp +++ b/plugins/platforms/x11/windowed/x11windowed_output.cpp @@ -58,9 +58,7 @@ // Physicial size must be adjusted, such that QPA calculates correct sizes of // internal elements. const QSize physicalSize = pixelSize / 96.0 * 25.4 / m_backend->initialOutputScale(); - AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", physicalSize, { mode }); - setEnabled(true); + initInterfaces("model_TODO", "manufacturer_TODO", "UUID_TODO", physicalSize, { mode }); setGeometry(logicalPosition, pixelSize); setScale(m_backend->initialOutputScale());