diff --git a/backends/kwayland/waylandconfig.cpp b/backends/kwayland/waylandconfig.cpp --- a/backends/kwayland/waylandconfig.cpp +++ b/backends/kwayland/waylandconfig.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include @@ -290,47 +289,7 @@ } for (const auto &output : newConfig->outputs()) { - auto o_old = m_outputMap[output->id()]; - auto device = o_old->outputDevice(); - Q_ASSERT(o_old != nullptr); - - // enabled? - bool old_enabled = (o_old->outputDevice()->enabled() == OutputDevice::Enablement::Enabled); - if (old_enabled != output->isEnabled()) { - changed = true; - auto _enablement = output->isEnabled() ? OutputDevice::Enablement::Enabled : OutputDevice::Enablement::Disabled; - wlConfig->setEnabled(o_old->outputDevice(), _enablement); - } - - // position - if (device->globalPosition() != output->pos()) { - changed = true; - wlConfig->setPosition(o_old->outputDevice(), output->pos()); - } - - // scale - if (!qFuzzyCompare(device->scaleF(), output->scale())) { - changed = true; - wlConfig->setScaleF(o_old->outputDevice(), output->scale()); - } - - // rotation - auto r_current = o_old->toKScreenRotation(device->transform()); - auto r_new = output->rotation(); - if (r_current != r_new) { - changed = true; - wlConfig->setTransform(device, o_old->toKWaylandTransform(r_new)); - } - - // mode - int w_currentmodeid = device->currentMode().id; - QString l_newmodeid = output->currentModeId(); - - int w_newmodeid = o_old->toKWaylandModeId(l_newmodeid); - if (w_newmodeid != w_currentmodeid) { - changed = true; - wlConfig->setMode(device, w_newmodeid); - } + changed |= m_outputMap[output->id()]->setWlConfig(wlConfig, output); } if (!changed) { diff --git a/backends/kwayland/waylandoutput.h b/backends/kwayland/waylandoutput.h --- a/backends/kwayland/waylandoutput.h +++ b/backends/kwayland/waylandoutput.h @@ -29,6 +29,14 @@ #include #include +namespace KWayland +{ +namespace Client +{ +class OutputConfiguration; +} +} + namespace KScreen { @@ -50,14 +58,8 @@ KWayland::Client::OutputDevice* outputDevice() const; void createOutputDevice(KWayland::Client::Registry *registry, quint32 name, quint32 version); - // translation methods - KScreen::Output::Rotation toKScreenRotation( - const KWayland::Client::OutputDevice::Transform transform) const; - KWayland::Client::OutputDevice::Transform toKWaylandTransform( - const KScreen::Output::Rotation rotation) const; - - QString toKScreenModeId(int kwaylandmodeid) const; - int toKWaylandModeId(const QString &kscreenmodeid) const; + bool setWlConfig(KWayland::Client::OutputConfiguration *wlConfig, + const KScreen::OutputPtr &output); Q_SIGNALS: void deviceRemoved(); diff --git a/backends/kwayland/waylandoutput.cpp b/backends/kwayland/waylandoutput.cpp --- a/backends/kwayland/waylandoutput.cpp +++ b/backends/kwayland/waylandoutput.cpp @@ -23,6 +23,9 @@ #include #include +#include +#include + using namespace KScreen; namespace Wl = KWayland::Client; @@ -38,42 +41,22 @@ {Wl::OutputDevice::Transform::Flipped270, Output::Left} }; -WaylandOutput::WaylandOutput(quint32 id, WaylandConfig *parent) - : QObject(parent) - , m_id(id) - , m_output(nullptr) -{ -} - -Output::Rotation -WaylandOutput::toKScreenRotation(const Wl::OutputDevice::Transform transform) const +Output::Rotation toKScreenRotation(const Wl::OutputDevice::Transform transform) { auto it = s_rotationMap.constFind(transform); return it.value(); } -Wl::OutputDevice::Transform -WaylandOutput::toKWaylandTransform(const Output::Rotation rotation) const +Wl::OutputDevice::Transform toKWaylandTransform(const Output::Rotation rotation) { return s_rotationMap.key(rotation); } -QString WaylandOutput::toKScreenModeId(int kwaylandmodeid) const -{ - auto it = std::find(m_modeIdMap.constBegin(), m_modeIdMap.constEnd(), kwaylandmodeid); - if (it == m_modeIdMap.constEnd()) { - qCWarning(KSCREEN_WAYLAND) << "Invalid kwayland mode id:" << kwaylandmodeid << m_modeIdMap; - return QStringLiteral("invalid_mode_id"); - } - return it.key(); -} - -int WaylandOutput::toKWaylandModeId(const QString &kscreenmodeid) const +WaylandOutput::WaylandOutput(quint32 id, WaylandConfig *parent) + : QObject(parent) + , m_id(id) + , m_output(nullptr) { - if (!m_modeIdMap.contains(kscreenmodeid)) { - qCWarning(KSCREEN_WAYLAND) << "Invalid kscreen mode id:" << kscreenmodeid << m_modeIdMap; - } - return m_modeIdMap.value(kscreenmodeid, -1); } quint32 WaylandOutput::id() const @@ -174,6 +157,52 @@ output->setType(Utils::guessOutputType(m_output->model(), m_output->model())); } +bool WaylandOutput::setWlConfig(Wl::OutputConfiguration *wlConfig, + const KScreen::OutputPtr &output) +{ + bool changed = false; + + // enabled? + if ((m_output->enabled() == Wl::OutputDevice::Enablement::Enabled) + != output->isEnabled()) { + changed = true; + const auto enablement = output->isEnabled() ? Wl::OutputDevice::Enablement::Enabled : + Wl::OutputDevice::Enablement::Disabled; + wlConfig->setEnabled(m_output, enablement); + } + + // position + if (m_output->globalPosition() != output->pos()) { + changed = true; + wlConfig->setPosition(m_output, output->pos()); + } + + // scale + if (!qFuzzyCompare(m_output->scaleF(), output->scale())) { + changed = true; + wlConfig->setScaleF(m_output, output->scale()); + } + + // rotation + if (toKScreenRotation(m_output->transform()) != output->rotation()) { + changed = true; + wlConfig->setTransform(m_output, toKWaylandTransform(output->rotation())); + } + + // mode + if (m_modeIdMap.contains(output->currentModeId())) { + const int newModeId = m_modeIdMap.value(output->currentModeId(), -1); + if (newModeId != m_output->currentMode().id) { + changed = true; + wlConfig->setMode(m_output, newModeId); + } + } else { + qCWarning(KSCREEN_WAYLAND) << "Invalid kscreen mode id:" << output->currentModeId() + << "\n\n" << m_modeIdMap; + } + return changed; +} + QString WaylandOutput::modeName(const Wl::OutputDevice::Mode &m) const { return QString::number(m.size.width()) + QLatin1Char('x') +