// Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef COMPOSITOR_H #define COMPOSITOR_H #include #include #include #include QT_BEGIN_NAMESPACE class Window; class QOpenGLTexture; class QWaylandXdgShell; class QWaylandXdgSurface; class QWaylandXdgToplevel; class View : public QWaylandView { Q_OBJECT public: explicit View() = default; QOpenGLTexture *getTexture(); QSize bufferSize() const { return surface() ? surface()->bufferSize() : QSize(); } QRect globalGeometry() const { return {globalPosition(), surface()->bufferSize()}; } QPoint globalPosition() const { return m_globalPosition; } void setGlobalPosition(const QPoint &position); QPoint mapToLocal(const QPoint &globalPosition) const; void setAnchorEdges(Qt::Edges edges) { m_anchorEdges = edges; } void updateAnchoredPosition(); virtual void handleResizeMove(const QPoint &delta); virtual void handleResizeRelease() {} signals: void globalPositionChanged(); void startResize(); void startMove(); private: QOpenGLTexture *m_texture = nullptr; QPoint m_globalPosition; Qt::Edges m_anchorEdges; QSize m_lastSize; }; class ToplevelView : public View { Q_OBJECT public: explicit ToplevelView(QWaylandXdgToplevel *toplevel); void handleResizeMove(const QPoint &delta) override; void handleResizeRelease() override; private: QWaylandXdgToplevel *m_toplevel = nullptr; struct Resize { QSize initialSize; Qt::Edges edges; } m_resize; }; class Compositor : public QWaylandCompositor { Q_OBJECT public: explicit Compositor() = default; ~Compositor() override; void create() override; void setWindow(Window *window) { m_window = window; } QList views() const { return m_views; } View *viewAt(const QPoint &position); void raise(View *view); void handleGlInitialized() { create(); } 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(Qt::Orientation orientation, int delta); void handleKeyPress(quint32 nativeScanCode); void handleKeyRelease(quint32 nativeScanCode); signals: void startMove(); private slots: void handleXdgToplevelCreated(QWaylandXdgToplevel *toplevel, QWaylandXdgSurface *xdgSurface); void addView(View *view); void handleViewSurfaceDestroyed(); void triggerRender(); private: Window *m_window = nullptr; QWaylandXdgShell *m_xdgShell = nullptr; QList m_views; // Sorted by painters algorithm (back to front) struct Grab { QPointer view; enum State { None, Input, Move, Resize }; State state = None; QPoint startLocalPosition; // in View's coordinate system QPoint startGlobalPosition; } m_grab; }; QT_END_NAMESPACE #endif // COMPOSITOR_H