1/****************************************************************************
2**
3** Copyright (C) 2017 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 QWAYLANDWLSHELLINTEGRATION_H
31#define QWAYLANDWLSHELLINTEGRATION_H
32
33#include <QtWaylandCompositor/private/qwaylandquickshellsurfaceitem_p.h>
34
35#include <QtWaylandCompositor/QWaylandWlShellSurface>
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
50namespace QtWayland {
51
52class WlShellIntegration : public QWaylandQuickShellIntegration
53{
54 Q_OBJECT
55public:
56 WlShellIntegration(QWaylandQuickShellSurfaceItem *item);
57 ~WlShellIntegration() override;
58
59protected:
60 bool eventFilter(QObject *object, QEvent *event) override;
61
62private Q_SLOTS:
63 void handleStartMove(QWaylandSeat *seat);
64 void handleStartResize(QWaylandSeat *seat, QWaylandWlShellSurface::ResizeEdge edges);
65 void handleSetDefaultTopLevel();
66 void handleSetTransient(QWaylandSurface *parentSurface, const QPoint &relativeToParent, bool inactive);
67 void handleSetMaximized(QWaylandOutput *output);
68 void handleSetFullScreen(QWaylandWlShellSurface::FullScreenMethod method, uint framerate, QWaylandOutput *output);
69 void handleSetPopup(QWaylandSeat *seat, QWaylandSurface *parent, const QPoint &relativeToParent);
70 void handleShellSurfaceDestroyed();
71 void handleSurfaceHasContentChanged();
72 void handleRedraw();
73 void adjustOffsetForNextFrame(const QPointF &offset);
74 void handleFullScreenSizeChanged();
75 void handleMaximizedSizeChanged();
76
77private:
78 enum class GrabberState {
79 Default,
80 Resize,
81 Move
82 };
83
84 void handlePopupClosed();
85 void handlePopupRemoved();
86 qreal devicePixelRatio() const;
87
88 QWaylandQuickShellSurfaceItem *m_item = nullptr;
89 QPointer<QWaylandWlShellSurface> m_shellSurface;
90 GrabberState grabberState = GrabberState::Default;
91 struct {
92 QWaylandSeat *seat = nullptr;
93 QPointF initialOffset;
94 bool initialized = false;
95 } moveState;
96 struct {
97 QWaylandSeat *seat = nullptr;
98 QWaylandWlShellSurface::ResizeEdge resizeEdges;
99 QSizeF initialSize;
100 QPointF initialMousePos;
101 bool initialized = false;
102 } resizeState;
103
104 bool isPopup = false;
105
106 enum class State {
107 Windowed,
108 Maximized,
109 FullScreen
110 };
111
112 State currentState = State::Windowed;
113 State nextState = State::Windowed;
114
115 struct {
116 QWaylandOutput *output = nullptr;
117 QMetaObject::Connection sizeChangedConnection; // Depending on whether maximized or fullscreen,
118 // will be hooked to geometry-changed or available-
119 // geometry-changed.
120 } nonwindowedState;
121
122 QPointF normalPosition;
123 QPointF finalPosition;
124
125 bool filterMouseMoveEvent(QMouseEvent *event);
126 bool filterMouseReleaseEvent(QMouseEvent *event);
127};
128
129}
130
131QT_END_NAMESPACE
132
133#endif // QWAYLANDWLSHELLINTEGRATION_H
134

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