diff --git a/abstract_backend.cpp b/abstract_backend.cpp index a8b7881c4a..e02bb89d9b 100644 --- a/abstract_backend.cpp +++ b/abstract_backend.cpp @@ -330,4 +330,9 @@ EGLContext AbstractBackend::sceneEglContext() const return EGL_NO_CONTEXT; } +QSize AbstractBackend::screenSize() const +{ + return QSize(); +} + } diff --git a/abstract_backend.h b/abstract_backend.h index f564c30cbd..79d7fc2204 100644 --- a/abstract_backend.h +++ b/abstract_backend.h @@ -60,6 +60,14 @@ public: **/ virtual EGLContext sceneEglContext() const; + /** + * Implementing subclasses should provide a size in case the backend represents + * a basic screen and uses the BasicScreens. + * + * Base implementation returns an invalid size. + **/ + virtual QSize screenSize() const; + bool usesSoftwareCursor() const { return m_softWareCursor; } @@ -114,6 +122,10 @@ Q_SIGNALS: void initFailed(); void cursorChanged(); void readyChanged(bool); + /** + * Emitted by backends using a one screen (nested window) approach and when the size of that changes. + **/ + void screenSizeChanged(); protected: explicit AbstractBackend(QObject *parent = nullptr); diff --git a/screens.cpp b/screens.cpp index 5a2aeb5e0a..5a372ce344 100644 --- a/screens.cpp +++ b/screens.cpp @@ -184,4 +184,50 @@ int Screens::intersecting(const QRect &r) const return cnt; } +BasicScreens::BasicScreens(AbstractBackend *backend, QObject *parent) + : Screens(parent) + , m_backend(backend) +{ +} + +BasicScreens::~BasicScreens() = default; + +void BasicScreens::init() +{ + KWin::Screens::init(); +#ifndef KWIN_UNIT_TEST + connect(m_backend, &AbstractBackend::screenSizeChanged, + this, &BasicScreens::startChangedTimer); +#endif + updateCount(); + emit changed(); +} + +QRect BasicScreens::geometry(int screen) const +{ + if (screen == 0) { + return QRect(QPoint(0, 0), size(screen)); + } + return QRect(); +} + +QSize BasicScreens::size(int screen) const +{ + if (screen == 0) { + return m_backend->screenSize(); + } + return QSize(); +} + +void BasicScreens::updateCount() +{ + setCount(1); +} + +int BasicScreens::number(const QPoint &pos) const +{ + Q_UNUSED(pos) + return 0; +} + } // namespace diff --git a/screens.h b/screens.h index 59fe910722..97f1fed399 100644 --- a/screens.h +++ b/screens.h @@ -33,6 +33,7 @@ along with this program. If not, see . namespace KWin { class AbstractClient; +class AbstractBackend; class KWIN_EXPORT Screens : public QObject { @@ -148,6 +149,26 @@ private: KWIN_SINGLETON(Screens) }; +/** + * @brief A base implementation for backends with just a (nested) window + **/ +class KWIN_EXPORT BasicScreens : public Screens +{ + Q_OBJECT +public: + BasicScreens(AbstractBackend *backend, QObject *parent = nullptr); + virtual ~BasicScreens(); + + void init() override; + QRect geometry(int screen) const override; + int number(const QPoint &pos) const override; + QSize size(int screen) const override; + void updateCount() override; + +private: + AbstractBackend *m_backend; +}; + inline void Screens::setConfig(KSharedConfig::Ptr config) {