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 @@ -443,7 +443,8 @@ const auto outputConfig = configGroup.group((*it)->uuid()); (*it)->setGlobalPos(outputConfig.readEntry("Position", pos)); // TODO: add mode - pos.setX(pos.x() + (*it)->size().width()); + (*it)->setScale(outputConfig.readEntry("Scale", 1.0)); + pos.setX(pos.x() + (*it)->geometry().width()); } } 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 @@ -77,8 +77,14 @@ void setChanges(KWayland::Server::OutputChangeSet *changeset); bool commitChanges(); - QSize size() const; + QSize pixelSize() const; + qreal scale() const; + + /* + * The geometry of this output in global compositor co-ordinates (i.e scaled) + */ QRect geometry() const; + QString name() const; int currentRefreshRate() const; // These values are defined by the kernel @@ -112,14 +118,16 @@ bool isCurrentMode(const drmModeModeInfo *mode) const; void initUuid(); void setGlobalPos(const QPoint &pos); + void setScale(qreal scale); void pageFlippedBufferRemover(DrmBuffer *oldbuffer, DrmBuffer *newbuffer); bool initPrimaryPlane(); bool initCursorPlane(); DrmObject::AtomicReturn atomicReqModesetPopulate(drmModeAtomicReq *req, bool enable); DrmBackend *m_backend; QPoint m_globalPos; + qreal m_scale = 1; quint32 m_crtcId = 0; quint32 m_connector = 0; quint32 m_lastStride = 0; 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 @@ -112,16 +112,22 @@ drmModeMoveCursor(m_backend->fd(), m_crtcId, p.x(), p.y()); } -QSize DrmOutput::size() const +QSize DrmOutput::pixelSize() const { return QSize(m_mode.hdisplay, m_mode.vdisplay); } QRect DrmOutput::geometry() const { - return QRect(m_globalPos, size()); + return QRect(m_globalPos, pixelSize() / scale()); } +qreal DrmOutput::scale() const +{ + return m_scale; +} + + static KWayland::Server::OutputInterface::DpmsMode toWaylandDpmsMode(DrmOutput::DpmsMode mode) { using namespace KWayland::Server; @@ -633,6 +639,17 @@ } } +void DrmOutput::setScale(qreal scale) +{ + m_scale = scale; + if (m_waylandOutput) { + m_waylandOutput->setScale(scale); + } + if (m_waylandOutputDevice) { + m_waylandOutputDevice->setScale(scale); + } +} + void DrmOutput::setChanges(KWayland::Server::OutputChangeSet *changes) { m_changeset = changes; @@ -674,8 +691,7 @@ } if (m_changeset->scaleChanged()) { qCDebug(KWIN_DRM) << "Setting scale:" << m_changeset->scale(); - m_waylandOutputDevice->setScale(m_changeset->scale()); - // FIXME: implement for wl_output + setScale(m_changeset->scale()); } return true; } @@ -723,7 +739,7 @@ bool DrmOutput::blank() { if (!m_blackBuffer) { - m_blackBuffer = m_backend->createBuffer(size()); + m_blackBuffer = m_backend->createBuffer(pixelSize()); if (!m_blackBuffer->map()) { cleanupBlackBuffer(); return false; diff --git a/plugins/platforms/drm/scene_qpainter_drm_backend.cpp b/plugins/platforms/drm/scene_qpainter_drm_backend.cpp --- a/plugins/platforms/drm/scene_qpainter_drm_backend.cpp +++ b/plugins/platforms/drm/scene_qpainter_drm_backend.cpp @@ -64,7 +64,7 @@ { Output o; auto initBuffer = [&o, output, this] (int index) { - o.buffer[index] = m_backend->createBuffer(output->size()); + o.buffer[index] = m_backend->createBuffer(output->pixelSize()); o.buffer[index]->map(); o.buffer[index]->image()->fill(Qt::black); }; diff --git a/plugins/platforms/drm/screens_drm.h b/plugins/platforms/drm/screens_drm.h --- a/plugins/platforms/drm/screens_drm.h +++ b/plugins/platforms/drm/screens_drm.h @@ -34,6 +34,7 @@ void init() override; QRect geometry(int screen) const override; int number(const QPoint &pos) const override; + qreal scale(int screen) const override; QSize size(int screen) const override; void updateCount() override; QString name(int screen) const override; diff --git a/plugins/platforms/drm/screens_drm.cpp b/plugins/platforms/drm/screens_drm.cpp --- a/plugins/platforms/drm/screens_drm.cpp +++ b/plugins/platforms/drm/screens_drm.cpp @@ -50,13 +50,22 @@ return outputs.at(screen)->geometry(); } +qreal DrmScreens::scale(int screen) const +{ + const auto outputs = m_backend->outputs(); + if (screen >= outputs.size()) { + return 1; + } + return outputs.at(screen)->scale(); +} + QSize DrmScreens::size(int screen) const { const auto outputs = m_backend->outputs(); if (screen >= outputs.size()) { return QSize(); } - return outputs.at(screen)->size(); + return outputs.at(screen)->geometry().size(); } void DrmScreens::updateCount()