diff --git a/abstract_wayland_output.h b/abstract_wayland_output.h --- a/abstract_wayland_output.h +++ b/abstract_wayland_output.h @@ -113,6 +113,7 @@ void initWaylandOutputDevice(const QString &model, const QString &manufacturer, const QByteArray &uuid, + const QSize &physicalSize, const QVector &modes); QPointer xdgOutput() const { @@ -126,13 +127,6 @@ QPoint globalPos() const; - QSize rawPhysicalSize() const { - return m_physicalSize; - } - void setRawPhysicalSize(const QSize &set) { - m_physicalSize = set; - } - void setOrientation(Qt::ScreenOrientation set) { m_orientation = set; } @@ -166,7 +160,6 @@ KWayland::Server::OutputInterface::DpmsMode m_dpms = KWayland::Server::OutputInterface::DpmsMode::On; - QSize m_physicalSize; Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation; bool m_internal = false; bool m_supportsDpms = false; diff --git a/abstract_wayland_output.cpp b/abstract_wayland_output.cpp --- a/abstract_wayland_output.cpp +++ b/abstract_wayland_output.cpp @@ -59,7 +59,7 @@ QSize AbstractWaylandOutput::physicalSize() const { - return orientateSize(m_physicalSize); + return orientateSize(m_waylandOutputDevice->physicalSize()); } int AbstractWaylandOutput::refreshRate() const @@ -203,7 +203,7 @@ */ m_waylandOutput->setManufacturer(m_waylandOutputDevice->manufacturer()); m_waylandOutput->setModel(m_waylandOutputDevice->model()); - m_waylandOutput->setPhysicalSize(rawPhysicalSize()); + m_waylandOutput->setPhysicalSize(m_waylandOutputDevice->physicalSize()); /* * add modes @@ -236,6 +236,7 @@ void AbstractWaylandOutput::initWaylandOutputDevice(const QString &model, const QString &manufacturer, const QByteArray &uuid, + const QSize &physicalSize, const QVector &modes) { Q_ASSERT(m_waylandOutputDevice.isNull()); @@ -249,7 +250,7 @@ } m_waylandOutputDevice->setModel(model); - m_waylandOutputDevice->setPhysicalSize(m_physicalSize); + m_waylandOutputDevice->setPhysicalSize(physicalSize); int i = 0; for (auto mode : modes) { 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 @@ -266,20 +266,6 @@ ); } - QSize physicalSize = !m_edid.physicalSize().isEmpty() ? m_edid.physicalSize() : QSize(connector->mmWidth, connector->mmHeight); - // the size might be completely borked. E.g. Samsung SyncMaster 2494HS reports 160x90 while in truth it's 520x292 - // as this information is used to calculate DPI info, it's going to result in everything being huge - const QByteArray unknown = QByteArrayLiteral("unknown"); - KConfigGroup group = kwinApp()->config()->group("EdidOverwrite").group(m_edid.eisaId().isEmpty() ? unknown : m_edid.eisaId()) - .group(m_edid.monitorName().isEmpty() ? unknown : m_edid.monitorName()) - .group(m_edid.serialNumber().isEmpty() ? unknown : m_edid.serialNumber()); - if (group.hasKey("PhysicalSize")) { - const QSize overwriteSize = group.readEntry("PhysicalSize", physicalSize); - qCWarning(KWIN_DRM) << "Overwriting monitor physical size for" << m_edid.eisaId() << "/" << m_edid.monitorName() << "/" << m_edid.serialNumber() << " from " << physicalSize << "to " << overwriteSize; - physicalSize = overwriteSize; - } - setRawPhysicalSize(physicalSize); - initOutputDevice(connector); setEnabled(true); @@ -343,7 +329,20 @@ modes << mode; } - AbstractWaylandOutput::initWaylandOutputDevice(model, manufacturer, m_uuid, modes); + QSize physicalSize = !m_edid.physicalSize().isEmpty() ? m_edid.physicalSize() : QSize(connector->mmWidth, connector->mmHeight); + // the size might be completely borked. E.g. Samsung SyncMaster 2494HS reports 160x90 while in truth it's 520x292 + // as this information is used to calculate DPI info, it's going to result in everything being huge + const QByteArray unknown = QByteArrayLiteral("unknown"); + KConfigGroup group = kwinApp()->config()->group("EdidOverwrite").group(m_edid.eisaId().isEmpty() ? unknown : m_edid.eisaId()) + .group(m_edid.monitorName().isEmpty() ? unknown : m_edid.monitorName()) + .group(m_edid.serialNumber().isEmpty() ? unknown : m_edid.serialNumber()); + if (group.hasKey("PhysicalSize")) { + const QSize overwriteSize = group.readEntry("PhysicalSize", physicalSize); + qCWarning(KWIN_DRM) << "Overwriting monitor physical size for" << m_edid.eisaId() << "/" << m_edid.monitorName() << "/" << m_edid.serialNumber() << " from " << physicalSize << "to " << overwriteSize; + physicalSize = overwriteSize; + } + + initWaylandOutputDevice(model, manufacturer, m_uuid, physicalSize, modes); } bool DrmOutput::isCurrentMode(const drmModeModeInfo *mode) const diff --git a/plugins/platforms/fbdev/fb_backend.h b/plugins/platforms/fbdev/fb_backend.h --- a/plugins/platforms/fbdev/fb_backend.h +++ b/plugins/platforms/fbdev/fb_backend.h @@ -37,11 +37,7 @@ FramebufferOutput(QObject *parent = nullptr) : AbstractWaylandOutput(parent) {} ~FramebufferOutput() override = default; - void init(const QSize &size); - - void setRawPhysicalSize(const QSize &set) { - AbstractWaylandOutput::setRawPhysicalSize(set); - } + void init(const QSize &pixelSize, const QSize &physicalSize); }; class KWIN_EXPORT FramebufferBackend : public Platform diff --git a/plugins/platforms/fbdev/fb_backend.cpp b/plugins/platforms/fbdev/fb_backend.cpp --- a/plugins/platforms/fbdev/fb_backend.cpp +++ b/plugins/platforms/fbdev/fb_backend.cpp @@ -37,15 +37,15 @@ namespace KWin { -void FramebufferOutput::init(const QSize &size) +void FramebufferOutput::init(const QSize &pixelSize, const QSize &physicalSize) { KWayland::Server::OutputDeviceInterface::Mode mode; mode.id = 0; - mode.size = size; + mode.size = pixelSize; mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO: get actual refresh rate of fb device? AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", { mode }); + "UUID_TODO", physicalSize, { mode }); } FramebufferBackend::FramebufferBackend(QObject *parent) @@ -149,8 +149,7 @@ } auto *output = new FramebufferOutput(this); - output->init(QSize(varinfo.xres, varinfo.yres)); - output->setRawPhysicalSize(QSize(varinfo.width, varinfo.height)); + output->init(QSize(varinfo.xres, varinfo.yres), QSize(varinfo.width, varinfo.height)); output->setEnabled(true); m_outputs << output; diff --git a/plugins/platforms/hwcomposer/hwcomposer_backend.cpp b/plugins/platforms/hwcomposer/hwcomposer_backend.cpp --- a/plugins/platforms/hwcomposer/hwcomposer_backend.cpp +++ b/plugins/platforms/hwcomposer/hwcomposer_backend.cpp @@ -502,35 +502,35 @@ HWC_DISPLAY_NO_ATTRIBUTE }; device->getDisplayAttributes(device, 0, configs[0], attributes, attr_values); - QSize pixel(attr_values[0], attr_values[1]); - if (pixel.isEmpty()) { + QSize pixelSize(attr_values[0], attr_values[1]); + if (pixelSize.isEmpty()) { return; } + QSizeF physicalSize; if (attr_values[2] != 0 && attr_values[3] != 0) { static const qreal factor = 25.4; - auto physicalSize = QSizeF(qreal(pixel.width() * 1000) / qreal(attr_values[2]) * factor, - qreal(pixel.height() * 1000) / qreal(attr_values[3]) * factor); - setRawPhysicalSize(physicalSize.toSize()); + physicalSize = QSizeF(qreal(pixelSize.width() * 1000) / qreal(attr_values[2]) * factor, + qreal(pixelSize.height() * 1000) / qreal(attr_values[3]) * factor); } else { // couldn't read physical size, assume 96 dpi - setRawPhysicalSize(pixel / 3.8); + physicalSize = pixelSize / 3.8; } OutputDeviceInterface::Mode mode; mode.id = 0; - mode.size = pixel; + mode.size = pixelSize; mode.flags = OutputDeviceInterface::ModeFlag::Current | OutputDeviceInterface::ModeFlag::Preferred; mode.refreshRate = (attr_values[4] == 0) ? 60000 : 10E11/attr_values[4]; - initWaylandOutputDevice(QString(), QString(), QByteArray(), {mode}); + initWaylandOutputDevice(QString(), QString(), QByteArray(), physicalSize.toSize(), {mode}); setInternal(true); setEnabled(true); setDpmsSupported(true); const auto outputGroup = kwinApp()->config()->group("HWComposerOutputs").group("0"); setScale(outputGroup.readEntry("Scale", 1)); - setWaylandMode(pixel, mode.refreshRate); + setWaylandMode(pixelSize, mode.refreshRate); } HwcomposerOutput::~HwcomposerOutput() diff --git a/plugins/platforms/virtual/virtual_output.cpp b/plugins/platforms/virtual/virtual_output.cpp --- a/plugins/platforms/virtual/virtual_output.cpp +++ b/plugins/platforms/virtual/virtual_output.cpp @@ -40,16 +40,15 @@ mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", { mode }); + "UUID_TODO", pixelSize, { mode }); setEnabled(true); setGeometry(QRect(logicalPosition, pixelSize)); setScale(1.); } void VirtualOutput::setGeometry(const QRect &geo) { // TODO: set mode to have updated pixelSize - setRawPhysicalSize(geo.size()); setGlobalPos(geo.topLeft()); } diff --git a/plugins/platforms/wayland/wayland_output.cpp b/plugins/platforms/wayland/wayland_output.cpp --- a/plugins/platforms/wayland/wayland_output.cpp +++ b/plugins/platforms/wayland/wayland_output.cpp @@ -62,17 +62,17 @@ mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO: can we get refresh rate data from Wayland host? AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", { mode }); - setRawPhysicalSize(pixelSize); + "UUID_TODO", pixelSize, { mode }); setEnabled(true); setGeometry(logicalPosition, pixelSize); setScale(backend()->initialOutputScale()); } void WaylandOutput::setGeometry(const QPoint &logicalPosition, const QSize &pixelSize) { // TODO: set mode to have updated pixelSize - setRawPhysicalSize(pixelSize); + Q_UNUSED(pixelSize) + setGlobalPos(logicalPosition); } diff --git a/plugins/platforms/x11/windowed/x11windowed_output.cpp b/plugins/platforms/x11/windowed/x11windowed_output.cpp --- a/plugins/platforms/x11/windowed/x11windowed_output.cpp +++ b/plugins/platforms/x11/windowed/x11windowed_output.cpp @@ -54,8 +54,12 @@ mode.size = pixelSize; mode.flags = KWayland::Server::OutputDeviceInterface::ModeFlag::Current; mode.refreshRate = 60000; // TODO: get refresh rate via randr + + // Physicial size must be adjusted, such that QPA calculates correct sizes of + // internal elements. + const QSize physicalSize = pixelSize / 96.0 * 25.4 / scale(); AbstractWaylandOutput::initWaylandOutputDevice("model_TODO", "manufacturer_TODO", - "UUID_TODO", { mode }); + "UUID_TODO", physicalSize, { mode }); setEnabled(true); setGeometry(logicalPosition, pixelSize); @@ -137,11 +141,6 @@ void X11WindowedOutput::setGeometry(const QPoint &logicalPosition, const QSize &pixelSize) { // TODO: set mode to have updated pixelSize - - // Physicial size must be adjusted, such that QPA calculates correct sizes of - // internal elements. - setRawPhysicalSize(pixelSize / 96.0 * 25.4 / scale()); - setGlobalPos(logicalPosition); }