blob: b2810d0da56d945e4cd07fceb8b27c378ae2b650 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
// 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 <QtCore/QPointer>
#include <QtWaylandCompositor/QWaylandCompositor>
#include <QtWaylandCompositor/QWaylandSurface>
#include <QtWaylandCompositor/QWaylandView>
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<View *> 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<View *> m_views; // Sorted by painters algorithm (back to front)
struct Grab {
QPointer<View> 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
|