diff --git a/abstract_output.h b/abstract_output.h --- a/abstract_output.h +++ b/abstract_output.h @@ -30,6 +30,7 @@ #include #include +#include #include namespace KWayland @@ -104,7 +105,7 @@ } protected: - void initWaylandOutput(); + void initWaylandOutput(bool dpmsSupported); QPointer xdgOutput() const { return m_xdgOutput; @@ -136,6 +137,9 @@ void setInternal(bool set) { m_internal = set; } + virtual void updateDpms(KWayland::Server::OutputInterface::DpmsMode mode) { + Q_UNUSED(mode); + } virtual void updateMode(int modeIndex) { Q_UNUSED(modeIndex); } @@ -149,6 +153,8 @@ QPointer m_xdgOutput; QPointer m_waylandOutputDevice; + KWayland::Server::OutputInterface::DpmsMode m_dpms = KWayland::Server::OutputInterface::DpmsMode::On; + QPoint m_globalPos; qreal m_scale = 1; QSize m_physicalSize; diff --git a/abstract_output.cpp b/abstract_output.cpp --- a/abstract_output.cpp +++ b/abstract_output.cpp @@ -22,7 +22,6 @@ // KWayland #include -#include #include #include // KF5 @@ -157,7 +156,7 @@ m_waylandOutputDevice = set; } -void AbstractOutput::initWaylandOutput() +void AbstractOutput::initWaylandOutput(bool dpmsSupported) { Q_ASSERT(m_waylandOutputDevice); @@ -168,10 +167,16 @@ m_waylandOutput = waylandServer()->display()->createOutput(); createXdgOutput(); + /* + * add base wayland output data + */ m_waylandOutput->setManufacturer(m_waylandOutputDevice->manufacturer()); m_waylandOutput->setModel(m_waylandOutputDevice->model()); m_waylandOutput->setPhysicalSize(rawPhysicalSize()); + /* + * add modes + */ for(const auto &mode: m_waylandOutputDevice->modes()) { KWayland::Server::OutputInterface::ModeFlags flags; if (mode.flags & KWayland::Server::OutputDeviceInterface::ModeFlag::Current) { @@ -183,6 +188,18 @@ m_waylandOutput->addMode(mode.size, flags, mode.refreshRate); } m_waylandOutput->create(); + + /* + * set dpms + */ + m_waylandOutput->setDpmsSupported(dpmsSupported); + // set to last known mode + m_waylandOutput->setDpmsMode(m_dpms); + connect(m_waylandOutput.data(), &KWayland::Server::OutputInterface::dpmsModeRequested, this, + [this] (KWayland::Server::OutputInterface::DpmsMode mode) { + updateDpms(mode); + }, Qt::QueuedConnection + ); } } diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -144,7 +144,7 @@ { m_dpmsFilter.reset(); for (auto it = m_enabledOutputs.constBegin(), end = m_enabledOutputs.constEnd(); it != end; it++) { - (*it)->setDpms(DrmOutput::DpmsMode::On); + (*it)->updateDpms(KWayland::Server::OutputInterface::DpmsMode::On); } } diff --git a/plugins/platforms/drm/drm_output.h b/plugins/platforms/drm/drm_output.h --- a/plugins/platforms/drm/drm_output.h +++ b/plugins/platforms/drm/drm_output.h @@ -67,7 +67,7 @@ /** * Enable or disable the output. - * This differs from setDpms as it also + * This differs from updateDpms as it also * removes the wl_output * The default is on */ @@ -83,7 +83,6 @@ Suspend = DRM_MODE_DPMS_SUSPEND, Off = DRM_MODE_DPMS_OFF }; - void setDpms(DpmsMode mode); bool isDpmsEnabled() const { // We care for current as well as pending mode in order to allow first present in AMS. return m_dpmsModePending == DpmsMode::On; @@ -120,7 +119,6 @@ void initEdid(drmModeConnector *connector); void initDpms(drmModeConnector *connector); void initOutputDevice(drmModeConnector *connector); - void initDrmWaylandOutput(); bool isCurrentMode(const drmModeModeInfo *mode) const; void initUuid(); @@ -131,6 +129,7 @@ void dpmsOffHandler(); bool dpmsAtomicOff(); bool atomicReqModesetPopulate(drmModeAtomicReq *req, bool enable); + void updateDpms(KWayland::Server::OutputInterface::DpmsMode mode) override; void updateMode(int modeIndex) override; void setWaylandMode(); 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 @@ -192,11 +192,10 @@ return; } if (enabled) { - setDpms(DpmsMode::On); - initWaylandOutput(); - initDrmWaylandOutput(); + updateDpms(KWayland::Server::OutputInterface::DpmsMode::On); + initWaylandOutput(true); } else { - setDpms(DpmsMode::Off); + updateDpms(KWayland::Server::OutputInterface::DpmsMode::Off); delete waylandOutput().data(); } waylandOutputDevice()->setEnabled(enabled ? @@ -329,21 +328,6 @@ m_uuid = hash.result().toHex().left(10); } -void DrmOutput::initDrmWaylandOutput() -{ - auto wlOutput = waylandOutput(); - // set dpms - if (!m_dpms.isNull()) { - wlOutput->setDpmsSupported(true); - wlOutput->setDpmsMode(toWaylandDpmsMode(m_dpmsMode)); - connect(wlOutput.data(), &KWayland::Server::OutputInterface::dpmsModeRequested, this, - [this] (KWayland::Server::OutputInterface::DpmsMode mode) { - setDpms(fromWaylandDpmsMode(mode)); - }, Qt::QueuedConnection - ); - } -} - void DrmOutput::initOutputDevice(drmModeConnector *connector) { auto wlOutputDevice = waylandOutputDevice(); @@ -654,21 +638,23 @@ } } -void DrmOutput::setDpms(DrmOutput::DpmsMode mode) +void DrmOutput::updateDpms(KWayland::Server::OutputInterface::DpmsMode mode) { if (m_dpms.isNull()) { return; } - if (mode == m_dpmsModePending) { + + const auto drmMode = fromWaylandDpmsMode(mode); + if (drmMode == m_dpmsModePending) { qCDebug(KWIN_DRM) << "New DPMS mode equals old mode. DPMS unchanged."; return; } - m_dpmsModePending = mode; + m_dpmsModePending = drmMode; if (m_backend->atomicModeSetting()) { m_modesetRequested = true; - if (mode == DpmsMode::On) { + if (drmMode == DpmsMode::On) { if (m_pageFlipPending) { m_pageFlipPending = false; Compositor::self()->bufferSwapComplete(); @@ -681,12 +667,12 @@ } } } else { - if (drmModeConnectorSetProperty(m_backend->fd(), m_conn->id(), m_dpms->prop_id, uint64_t(mode)) < 0) { + if (drmModeConnectorSetProperty(m_backend->fd(), m_conn->id(), m_dpms->prop_id, uint64_t(drmMode)) < 0) { m_dpmsModePending = m_dpmsMode; qCWarning(KWIN_DRM) << "Setting DPMS failed"; return; } - if (mode == DpmsMode::On) { + if (drmMode == DpmsMode::On) { dpmsOnHandler(); } else { dpmsOffHandler();