diff --git a/backends/kwayland/waylandconfig.cpp b/backends/kwayland/waylandconfig.cpp --- a/backends/kwayland/waylandconfig.cpp +++ b/backends/kwayland/waylandconfig.cpp @@ -226,7 +226,9 @@ // TODO: do this setScreen call less clunky m_kscreenConfig->setScreen(m_screen->toKScreenScreen(m_kscreenConfig)); - auto features = Config::Feature::Writable | Config::Feature::PerOutputScaling; + const Config::Features features = Config::Feature::Writable | + Config::Feature::PerOutputScaling | + Config::Feature::OutputReplication; m_kscreenConfig->setSupportedFeatures(features); m_kscreenConfig->setValid(m_connection->display()); diff --git a/backends/kwayland/waylandoutput.h b/backends/kwayland/waylandoutput.h --- a/backends/kwayland/waylandoutput.h +++ b/backends/kwayland/waylandoutput.h @@ -71,10 +71,12 @@ private: void showOutput(); QString modeName(const KWayland::Client::OutputDevice::Mode &m) const; + int getReplicationSource() const; quint32 m_id; KWayland::Client::OutputDevice *m_device; KWayland::Client::Registry *m_registry; + WaylandConfig *m_config; // left-hand-side: KScreen::Mode, right-hand-side: KWayland's mode.id QMap m_modeIdMap; diff --git a/backends/kwayland/waylandoutput.cpp b/backends/kwayland/waylandoutput.cpp --- a/backends/kwayland/waylandoutput.cpp +++ b/backends/kwayland/waylandoutput.cpp @@ -56,6 +56,7 @@ : QObject(parent) , m_id(id) , m_device(nullptr) + , m_config(parent) { } @@ -95,6 +96,19 @@ return output; } +int WaylandOutput::getReplicationSource() const +{ + const auto uuid = m_device->replicationSource(); + if (!uuid.isEmpty()) { + for (auto waylandOutput : m_config->outputMap()) { + if (uuid == waylandOutput->outputDevice()->uuid()) { + return waylandOutput->id(); + } + } + } + return 0; +} + void WaylandOutput::updateKScreenOutput(OutputPtr &output) { // Initialize primary output @@ -106,6 +120,7 @@ output->setSizeMm(m_device->physicalSize()); output->setPos(m_device->globalPosition()); output->setRotation(s_rotationMap[m_device->transform()]); + output->setReplicationSource(getReplicationSource()); ModeList modeList; QStringList preferredModeIds; @@ -189,6 +204,19 @@ wlConfig->setTransform(m_device, toKWaylandTransform(output->rotation())); } + // replication + const QByteArray oldSourceUuid = m_device->replicationSource(); + if (output->replicationSource() != 0) { + auto *newSource = m_config->outputMap()[output->replicationSource()]->outputDevice(); + if (oldSourceUuid != newSource->uuid()) { + changed = true; + wlConfig->setReplicationSource(m_device, newSource); + } + } else if (!oldSourceUuid.isEmpty()) { + changed = true; + wlConfig->setReplicationSource(m_device, nullptr); + } + // mode if (m_modeIdMap.contains(output->currentModeId())) { const int newModeId = m_modeIdMap.value(output->currentModeId(), -1); diff --git a/backends/kwayland/waylandscreen.cpp b/backends/kwayland/waylandscreen.cpp --- a/backends/kwayland/waylandscreen.cpp +++ b/backends/kwayland/waylandscreen.cpp @@ -45,8 +45,8 @@ QRect r; for (const auto *out : outputs) { - if (out->enabled()) { - const auto *dev = out->outputDevice(); + const auto *dev = out->outputDevice(); + if (out->enabled() && dev->replicationSource() == nullptr) { r |= QRect(dev->globalPosition(), dev->pixelSize() / dev->scale()); } } diff --git a/src/configserializer.cpp b/src/configserializer.cpp --- a/src/configserializer.cpp +++ b/src/configserializer.cpp @@ -92,6 +92,7 @@ obj[QLatin1String("clones")] = serializeList(output->clones()); //obj[QLatin1String("edid")] = output->edid()->raw(); obj[QLatin1String("sizeMM")] = serializeSize(output->sizeMm()); + obj[QLatin1String("replicationSource")] = output->replicationSource(); QJsonArray modes; Q_FOREACH (const ModePtr &mode, output->modes()) { @@ -251,6 +252,8 @@ output->setPrimary(value.toBool()); } else if (key == QLatin1String("clones")) { output->setClones(deserializeList(value.value())); + } else if (key == QLatin1String("replicationSource")) { + output->setReplicationSource(value.toInt()); } else if (key == QLatin1String("sizeMM")) { output->setSizeMm(deserializeSize(value.value())); } else if (key == QLatin1String("modes")) {