Index: CMakeLists.txt =================================================================== --- CMakeLists.txt +++ CMakeLists.txt @@ -410,6 +410,7 @@ killwindow.cpp geometrytip.cpp screens.cpp + outputscreens.cpp shadow.cpp sm.cpp group.cpp Index: outputscreens.h =================================================================== --- outputscreens.h +++ outputscreens.h @@ -2,7 +2,7 @@ KWin - the KDE window manager This file is part of the KDE project. -Copyright (C) 2015 Martin Gräßlin +Copyright 2018 Roman Gilg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,38 +17,39 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . *********************************************************************/ -#ifndef KWIN_SCREENS_DRM_H -#define KWIN_SCREENS_DRM_H +#ifndef KWIN_OUTPUTSCREENS_H +#define KWIN_OUTPUTSCREENS_H + #include "screens.h" namespace KWin { -class DrmBackend; -class DrmScreens : public Screens +/** + * @brief Implementation for backends with Outputs + **/ +class KWIN_EXPORT OutputScreens : public Screens { Q_OBJECT public: - DrmScreens(DrmBackend *backend, QObject *parent = nullptr); - virtual ~DrmScreens(); + OutputScreens(Platform *platform, QObject *parent = nullptr); + virtual ~OutputScreens(); + void init() override; + QString name(int screen) const override; + bool isInternal(int screen) const; + QSizeF physicalSize(int screen) const; 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; + qreal scale(int screen) const override; + Qt::ScreenOrientation orientation(int screen) const; void updateCount() override; - QString name(int screen) const override; - float refreshRate(int screen) const override; - - QSizeF physicalSize(int screen) const override; - bool isInternal(int screen) const override; - bool supportsTransformations(int screen) const override; - Qt::ScreenOrientation orientation(int screen) const override; + int number(const QPoint &pos) const override; -private: - DrmBackend *m_backend; +protected: + Platform *m_platform; }; } -#endif +#endif // KWIN_OUTPUTSCREENS_H Index: outputscreens.cpp =================================================================== --- /dev/null +++ outputscreens.cpp @@ -0,0 +1,132 @@ +/******************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright 2018 Roman Gilg + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "outputscreens.h" +#include "platform.h" +#include "output.h" + +namespace KWin +{ + +OutputScreens::OutputScreens(Platform *platform, QObject *parent) + : Screens(parent), + m_platform(platform) +{ +} + +OutputScreens::~OutputScreens() = default; + +void OutputScreens::init() +{ + updateCount(); + KWin::Screens::init(); + emit changed(); +} + +QString OutputScreens::name(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return Screens::name(screen); + } + return enOuts.at(screen)->name(); +} + +bool OutputScreens::isInternal(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return false; + } + return enOuts.at(screen)->isInternal(); +} + +QRect OutputScreens::geometry(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return QRect(); + } + return enOuts.at(screen)->geometry(); +} + +QSize OutputScreens::size(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return QSize(); + } + return enOuts.at(screen)->geometry().size(); +} + +qreal OutputScreens::scale(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return 1; + } + return enOuts.at(screen)->scale(); +} + +QSizeF OutputScreens::physicalSize(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return Screens::physicalSize(screen); + } + return enOuts.at(screen)->physicalSize(); +} + +Qt::ScreenOrientation OutputScreens::orientation(int screen) const +{ + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { + return Qt::PrimaryOrientation; + } + return enOuts.at(screen)->orientation(); +} + +void OutputScreens::updateCount() +{ + setCount(m_platform->enabledOutputs().size()); +} + +int OutputScreens::number(const QPoint &pos) const +{ + int bestScreen = 0; + int minDistance = INT_MAX; + const auto enOuts = m_platform->enabledOutputs(); + for (int i = 0; i < enOuts.size(); ++i) { + const QRect &geo = enOuts.at(i)->geometry(); + if (geo.contains(pos)) { + return i; + } + int distance = QPoint(geo.topLeft() - pos).manhattanLength(); + distance = qMin(distance, QPoint(geo.topRight() - pos).manhattanLength()); + distance = qMin(distance, QPoint(geo.bottomRight() - pos).manhattanLength()); + distance = qMin(distance, QPoint(geo.bottomLeft() - pos).manhattanLength()); + if (distance < minDistance) { + minDistance = distance; + bestScreen = i; + } + } + return bestScreen; +} + +} // namespace Index: platform.h =================================================================== --- platform.h +++ platform.h @@ -412,15 +412,6 @@ return false; } - // outputs with connections (org_kde_kwin_outputdevice) - QVector outputs() const { - return m_outputs; - } - // actively compositing outputs (wl_output) - QVector enabledOutputs() const { - return m_enabledOutputs; - } - /* * A string of information to include in kwin debug output * It should not be translated. @@ -430,6 +421,15 @@ */ virtual QString supportInformation() const; + // outputs with connections (org_kde_kwin_outputdevice) + QVector outputs() const { + return m_outputs; + } + // actively compositing outputs (wl_output) + QVector enabledOutputs() const { + return m_enabledOutputs; + } + public Q_SLOTS: void pointerMotion(const QPointF &position, quint32 time); void pointerButtonPressed(quint32 button, quint32 time); Index: plugins/platforms/drm/egl_gbm_backend.cpp =================================================================== --- plugins/platforms/drm/egl_gbm_backend.cpp +++ plugins/platforms/drm/egl_gbm_backend.cpp @@ -22,6 +22,7 @@ #include "composite.h" #include "drm_backend.h" #include "drm_output.h" +#include "screens_drm.h" #include "gbm_surface.h" #include "logging.h" #include "options.h" Index: plugins/platforms/drm/scene_qpainter_drm_backend.cpp =================================================================== --- plugins/platforms/drm/scene_qpainter_drm_backend.cpp +++ plugins/platforms/drm/scene_qpainter_drm_backend.cpp @@ -20,6 +20,7 @@ #include "scene_qpainter_drm_backend.h" #include "drm_backend.h" #include "drm_output.h" +#include "screens_drm.h" #include "logind.h" namespace KWin Index: plugins/platforms/drm/screens_drm.h =================================================================== --- plugins/platforms/drm/screens_drm.h +++ plugins/platforms/drm/screens_drm.h @@ -19,34 +19,21 @@ *********************************************************************/ #ifndef KWIN_SCREENS_DRM_H #define KWIN_SCREENS_DRM_H -#include "screens.h" +#include "outputscreens.h" namespace KWin { class DrmBackend; -class DrmScreens : public Screens +class DrmScreens : public OutputScreens { Q_OBJECT public: DrmScreens(DrmBackend *backend, QObject *parent = nullptr); virtual ~DrmScreens(); - 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; - float refreshRate(int screen) const override; - QSizeF physicalSize(int screen) const override; - bool isInternal(int screen) const override; + float refreshRate(int screen) const override; bool supportsTransformations(int screen) const override; - Qt::ScreenOrientation orientation(int screen) const override; - -private: - DrmBackend *m_backend; }; } Index: plugins/platforms/drm/screens_drm.cpp =================================================================== --- plugins/platforms/drm/screens_drm.cpp +++ plugins/platforms/drm/screens_drm.cpp @@ -25,133 +25,32 @@ { DrmScreens::DrmScreens(DrmBackend *backend, QObject *parent) - : Screens(parent) - , m_backend(backend) + : OutputScreens(backend, parent) { connect(backend, &DrmBackend::screensQueried, this, &DrmScreens::updateCount); connect(backend, &DrmBackend::screensQueried, this, &DrmScreens::changed); } DrmScreens::~DrmScreens() = default; -void DrmScreens::init() -{ - updateCount(); - KWin::Screens::init(); - emit changed(); -} - -QRect DrmScreens::geometry(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return QRect(); - } - return outputs.at(screen)->geometry(); -} - -qreal DrmScreens::scale(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return 1; - } - return outputs.at(screen)->scale(); -} - -QSize DrmScreens::size(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return QSize(); - } - return outputs.at(screen)->geometry().size(); -} - -void DrmScreens::updateCount() -{ - setCount(m_backend->enabledOutputs().size()); -} - -int DrmScreens::number(const QPoint &pos) const -{ - int bestScreen = 0; - int minDistance = INT_MAX; - const auto outputs = m_backend->enabledOutputs(); - for (int i = 0; i < outputs.size(); ++i) { - auto o = static_cast(outputs.at(i)); - const QRect &geo = o->geometry(); - if (geo.contains(pos)) { - return i; - } - int distance = QPoint(geo.topLeft() - pos).manhattanLength(); - distance = qMin(distance, QPoint(geo.topRight() - pos).manhattanLength()); - distance = qMin(distance, QPoint(geo.bottomRight() - pos).manhattanLength()); - distance = qMin(distance, QPoint(geo.bottomLeft() - pos).manhattanLength()); - if (distance < minDistance) { - minDistance = distance; - bestScreen = i; - } - } - return bestScreen; -} - -QString DrmScreens::name(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return Screens::name(screen); - } - return outputs.at(screen)->name(); -} - float DrmScreens::refreshRate(int screen) const { - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { return Screens::refreshRate(screen); } - auto *o = static_cast(outputs.at(screen)); + auto *o = static_cast(enOuts.at(screen)); return o->currentRefreshRate() / 1000.0f; } -QSizeF DrmScreens::physicalSize(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return Screens::physicalSize(screen); - } - auto *o = static_cast(outputs.at(screen)); - return o->physicalSize(); -} - -bool DrmScreens::isInternal(int screen) const -{ - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { - return false; - } - return outputs.at(screen)->isInternal(); -} - bool DrmScreens::supportsTransformations(int screen) const { - const auto outputs = m_backend->enabledOutputs(); - if (screen >= outputs.size()) { + const auto enOuts = m_platform->enabledOutputs(); + if (screen >= enOuts.size()) { return false; } - auto *o = static_cast(outputs.at(screen)); + auto *o = static_cast(enOuts.at(screen)); return o->supportsTransformations(); } -Qt::ScreenOrientation DrmScreens::orientation(int screen) const -{ - const auto outputs = m_backend->outputs(); - if (screen >= outputs.size()) { - return Qt::PrimaryOrientation; - } - auto *o = static_cast(outputs.at(screen)); - return o->orientation(); -} - }