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; @@ -152,6 +149,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 @@ -84,10 +84,8 @@ { m_waylandOutputDevice->setGlobalPosition(pos); - if (m_waylandOutput) { + if (isEnabled()) { m_waylandOutput->setGlobalPosition(pos); - } - if (m_xdgOutput) { m_xdgOutput->setLogicalPosition(pos); m_xdgOutput->done(); } @@ -107,16 +105,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(); } @@ -155,6 +151,13 @@ } } +using Enablement = KWayland::Server::OutputDeviceInterface::Enablement; + +bool AbstractWaylandOutput::isEnabled() const +{ + return m_waylandOutputDevice->enabled() == Enablement::Enabled; +} + void AbstractWaylandOutput::setEnabled(bool enable) { if (enable == isEnabled()) { @@ -167,20 +170,17 @@ 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 ? Enablement::Enabled : 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() @@ -254,6 +254,9 @@ m_waylandOutputDevice->setModel(model); m_waylandOutputDevice->setPhysicalSize(physicalSize); + // The output must be explicitly enabled by the backend after initialization. + m_waylandOutputDevice->setEnabled(Enablement::Disabled); + int i = 0; for (auto mode : modes) { qCDebug(KWIN_CORE).nospace() << "Adding mode " << ++i << ": " << mode.size << " [" << mode.refreshRate << "]";