// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef COMPOSITOR_H #define COMPOSITOR_H #include #include #include #include QT_BEGIN_NAMESPACE class Window; class QOpenGLTexture; class QWaylandIviApplication; class QWaylandIviSurface; class View : public QWaylandView { Q_OBJECT public: explicit View(int iviId) : m_iviId(iviId) {} QOpenGLTexture *getTexture(); int iviId() const { return m_iviId; } QRect globalGeometry() const { return QRect(globalPosition(), surface()->destinationSize()); } void setGlobalPosition(const QPoint &globalPos) { m_pos = globalPos; m_positionSet = true; } QPoint globalPosition() const { return m_pos; } QPoint mapToLocal(const QPoint &globalPos) const; QSize size() const { return surface() ? surface()->destinationSize() : QSize(); } void initPosition(const QSize &screenSize, const QSize &surfaceSize); private: QOpenGLTexture *m_texture = nullptr; bool m_positionSet = false; QPoint m_pos; int m_iviId; }; class Compositor : public QWaylandCompositor { Q_OBJECT public: Compositor(Window *window); ~Compositor() override; void create() override; QList views() const { return m_views; } View *viewAt(const QPoint &position); void raise(View *view); void handleMousePress(const QPoint &position, Qt::MouseButton button); void handleMouseRelease(const QPoint &position, Qt::MouseButton button, Qt::MouseButtons buttons); void handleMouseMove(const QPoint &position); void handleMouseWheel(const QPoint &angleDelta); void handleKeyPress(quint32 nativeScanCode); void handleKeyRelease(quint32 nativeScanCode); void startRender(); void endRender(); private slots: void onIviSurfaceCreated(QWaylandIviSurface *iviSurface); void triggerRender(); void viewSurfaceDestroyed(); private: Window *m_window = nullptr; QWaylandIviApplication *m_iviApplication = nullptr; QList m_views; QPointer m_mouseView; }; QT_END_NAMESPACE #endif // COMPOSITOR_H