1/****************************************************************************
2**
3** Copyright (C) 2018 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtWaylandCompositor module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 or (at your option) any later version
20** approved by the KDE Free Qt Foundation. The licenses are as published by
21** the Free Software Foundation and appearing in the file LICENSE.GPL3
22** included in the packaging of this file. Please review the following
23** information to ensure the GNU General Public License requirements will
24** be met: https://www.gnu.org/licenses/gpl-3.0.html.
25**
26** $QT_END_LICENSE$
27**
28****************************************************************************/
29
30#ifndef QWAYLANDXDGSHELLINTEGRATION_H
31#define QWAYLANDXDGSHELLINTEGRATION_H
32
33#include <QtWaylandCompositor/private/qwaylandquickshellsurfaceitem_p.h>
34#include <QtWaylandCompositor/QWaylandQuickShellSurfaceItem>
35#include <QtWaylandCompositor/QWaylandXdgToplevel>
36
37QT_BEGIN_NAMESPACE
38
39//
40// W A R N I N G
41// -------------
42//
43// This file is not part of the Qt API. It exists purely as an
44// implementation detail. This header file may change from version to
45// version without notice, or even be removed.
46//
47// We mean it.
48//
49
50class QWaylandXdgSurface;
51
52namespace QtWayland {
53
54class XdgToplevelIntegration : public QWaylandQuickShellIntegration
55{
56 Q_OBJECT
57public:
58 XdgToplevelIntegration(QWaylandQuickShellSurfaceItem *item);
59
60protected:
61 bool eventFilter(QObject *object, QEvent *event) override;
62
63private Q_SLOTS:
64 void handleStartMove(QWaylandSeat *seat);
65 void handleStartResize(QWaylandSeat *seat, Qt::Edges edges);
66 void handleSetMaximized();
67 void handleUnsetMaximized();
68 void handleMaximizedChanged();
69 void handleSetFullscreen();
70 void handleUnsetFullscreen();
71 void handleFullscreenChanged();
72 void handleActivatedChanged();
73 void handleSurfaceSizeChanged();
74 void handleToplevelDestroyed();
75 void handleMaximizedSizeChanged();
76 void handleFullscreenSizeChanged();
77
78private:
79 QWaylandQuickShellSurfaceItem *m_item = nullptr;
80 QWaylandXdgSurface *m_xdgSurface = nullptr;
81 QWaylandXdgToplevel *m_toplevel = nullptr;
82
83 enum class GrabberState {
84 Default,
85 Resize,
86 Move
87 };
88 GrabberState grabberState;
89
90 struct {
91 QWaylandSeat *seat = nullptr;
92 QPointF initialOffset;
93 bool initialized;
94 } moveState;
95
96 struct {
97 QWaylandSeat *seat = nullptr;
98 Qt::Edges resizeEdges;
99 QSizeF initialWindowSize;
100 QPointF initialMousePos;
101 QPointF initialPosition;
102 QSize initialSurfaceSize;
103 bool initialized;
104 } resizeState;
105
106 struct {
107 QSize initialWindowSize;
108 QPointF initialPosition;
109 } windowedGeometry;
110
111 struct {
112 QWaylandOutput *output = nullptr;
113 QMetaObject::Connection sizeChangedConnection; // Depending on whether maximized or fullscreen,
114 // will be hooked to geometry-changed or available-
115 // geometry-changed.
116 } nonwindowedState;
117
118 bool filterMouseMoveEvent(QMouseEvent *event);
119 bool filterMouseReleaseEvent(QMouseEvent *event);
120};
121
122class XdgPopupIntegration : public QWaylandQuickShellIntegration
123{
124 Q_OBJECT
125public:
126 XdgPopupIntegration(QWaylandQuickShellSurfaceItem *item);
127
128private Q_SLOTS:
129 void handleGeometryChanged();
130
131private:
132 QWaylandQuickShellSurfaceItem *m_item = nullptr;
133 QWaylandXdgSurface *m_xdgSurface = nullptr;
134 QWaylandXdgPopup *m_popup = nullptr;
135};
136
137}
138
139QT_END_NAMESPACE
140
141#endif // QWAYLANDXDGSHELLINTEGRATION_H
142

source code of qtwayland/src/compositor/extensions/qwaylandxdgshellintegration_p.h