1/*
2 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5*/
6#include "subsurface.h"
7#include "surface.h"
8#include "wayland_pointer_p.h"
9// Wayland
10#include <wayland-client-protocol.h>
11
12namespace KWayland
13{
14namespace Client
15{
16class Q_DECL_HIDDEN SubSurface::Private
17{
18public:
19 Private(QPointer<Surface> surface, QPointer<Surface> parentSurface, SubSurface *q);
20 void setup(wl_subsurface *subsurface);
21
22 WaylandPointer<wl_subsurface, wl_subsurface_destroy> subSurface;
23 QPointer<Surface> surface;
24 QPointer<Surface> parentSurface;
25 Mode mode = Mode::Synchronized;
26 QPoint pos = QPoint(0, 0);
27
28 static SubSurface *cast(wl_subsurface *native);
29
30private:
31 SubSurface *q;
32};
33
34SubSurface::Private::Private(QPointer<Surface> surface, QPointer<Surface> parentSurface, SubSurface *q)
35 : surface(surface)
36 , parentSurface(parentSurface)
37 , q(q)
38{
39}
40
41void SubSurface::Private::setup(wl_subsurface *subsurface)
42{
43 Q_ASSERT(subsurface);
44 Q_ASSERT(!subSurface.isValid());
45 subSurface.setup(pointer: subsurface);
46 wl_subsurface_set_user_data(wl_subsurface: subsurface, user_data: this);
47}
48
49SubSurface *SubSurface::Private::cast(wl_subsurface *native)
50{
51 return reinterpret_cast<Private *>(wl_subsurface_get_user_data(wl_subsurface: native))->q;
52}
53
54SubSurface::SubSurface(QPointer<Surface> surface, QPointer<Surface> parentSurface, QObject *parent)
55 : QObject(parent)
56 , d(new Private(surface, parentSurface, this))
57{
58}
59
60SubSurface::~SubSurface()
61{
62 release();
63}
64
65void SubSurface::setup(wl_subsurface *subsurface)
66{
67 d->setup(subsurface);
68}
69
70void SubSurface::destroy()
71{
72 d->subSurface.destroy();
73}
74
75void SubSurface::release()
76{
77 d->subSurface.release();
78}
79
80bool SubSurface::isValid() const
81{
82 return d->subSurface.isValid();
83}
84
85QPointer<Surface> SubSurface::surface() const
86{
87 return d->surface;
88}
89
90QPointer<Surface> SubSurface::parentSurface() const
91{
92 return d->parentSurface;
93}
94
95void SubSurface::setMode(SubSurface::Mode mode)
96{
97 if (mode == d->mode) {
98 return;
99 }
100 d->mode = mode;
101 switch (d->mode) {
102 case Mode::Synchronized:
103 wl_subsurface_set_sync(wl_subsurface: d->subSurface);
104 break;
105 case Mode::Desynchronized:
106 wl_subsurface_set_desync(wl_subsurface: d->subSurface);
107 break;
108 }
109}
110
111SubSurface::Mode SubSurface::mode() const
112{
113 return d->mode;
114}
115
116void SubSurface::setPosition(const QPoint &pos)
117{
118 if (pos == d->pos) {
119 return;
120 }
121 d->pos = pos;
122 wl_subsurface_set_position(wl_subsurface: d->subSurface, x: pos.x(), y: pos.y());
123}
124
125QPoint SubSurface::position() const
126{
127 return d->pos;
128}
129
130void SubSurface::raise()
131{
132 placeAbove(referenceSurface: d->parentSurface);
133}
134
135void SubSurface::placeAbove(QPointer<SubSurface> sibling)
136{
137 if (sibling.isNull()) {
138 return;
139 }
140 placeAbove(referenceSurface: sibling->surface());
141}
142
143void SubSurface::placeAbove(QPointer<Surface> sibling)
144{
145 if (sibling.isNull()) {
146 return;
147 }
148 wl_subsurface_place_above(wl_subsurface: d->subSurface, sibling: *sibling);
149}
150
151void SubSurface::lower()
152{
153 placeBelow(referenceSurface: d->parentSurface);
154}
155
156void SubSurface::placeBelow(QPointer<Surface> sibling)
157{
158 if (sibling.isNull()) {
159 return;
160 }
161 wl_subsurface_place_below(wl_subsurface: d->subSurface, sibling: *sibling);
162}
163
164void SubSurface::placeBelow(QPointer<SubSurface> sibling)
165{
166 if (sibling.isNull()) {
167 return;
168 }
169 placeBelow(sibling: sibling->surface());
170}
171
172QPointer<SubSurface> SubSurface::get(wl_subsurface *native)
173{
174 return QPointer<SubSurface>(Private::cast(native));
175}
176
177SubSurface::operator wl_subsurface *() const
178{
179 return d->subSurface;
180}
181
182SubSurface::operator wl_subsurface *()
183{
184 return d->subSurface;
185}
186
187}
188}
189
190#include "moc_subsurface.cpp"
191

source code of kwayland/src/client/subsurface.cpp