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 @@ -139,6 +140,12 @@ void setInternal(bool set) { m_internal = set; } + void setDpmsSupported(bool set) { + m_supportsDpms = set; + } + virtual void updateDpms(KWayland::Server::OutputInterface::DpmsMode mode) { + Q_UNUSED(mode); + } virtual void updateMode(int modeIndex) { Q_UNUSED(modeIndex); } @@ -152,11 +159,14 @@ 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; Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation; bool m_internal = false; + bool m_supportsDpms = false; }; } 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 @@ -169,10 +168,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) { @@ -184,6 +189,18 @@ m_waylandOutput->addMode(mode.size, flags, mode.refreshRate); } m_waylandOutput->create(); + + /* + * set dpms + */ + m_waylandOutput->setDpmsSupported(m_supportsDpms); + // 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; @@ -119,7 +118,6 @@ void initEdid(drmModeConnector *connector); void initDpms(drmModeConnector *connector); void initOutputDevice(drmModeConnector *connector); - void initDrmWaylandOutput(); bool isCurrentMode(const drmModeModeInfo *mode) const; void initUuid(); @@ -130,6 +128,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); + updateDpms(KWayland::Server::OutputInterface::DpmsMode::On); initWaylandOutput(); - initDrmWaylandOutput(); } else { - setDpms(DpmsMode::Off); + updateDpms(KWayland::Server::OutputInterface::DpmsMode::Off); delete waylandOutput().data(); } waylandOutputDevice()->setEnabled(enabled ? @@ -290,6 +289,7 @@ } setInternal(connector->connector_type == DRM_MODE_CONNECTOR_LVDS || connector->connector_type == DRM_MODE_CONNECTOR_eDP); + setDpmsSupported(true); if (internal()) { connect(kwinApp(), &Application::screensCreated, this, @@ -329,21 +329,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 +639,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 +668,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();