1 | // Copyright (C) 2017 The Qt Company Ltd. |
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only |
3 | |
4 | #include "qwaylandivisurface.h" |
5 | #include "qwaylandivisurface_p.h" |
6 | #include "qwaylandiviapplication_p.h" |
7 | #if QT_CONFIG(wayland_compositor_quick) |
8 | #include "qwaylandivisurfaceintegration_p.h" |
9 | #endif |
10 | |
11 | #include <QtWaylandCompositor/QWaylandResource> |
12 | #include <QDebug> |
13 | |
14 | #include <QtWaylandCompositor/private/qwaylandutils_p.h> |
15 | |
16 | QT_BEGIN_NAMESPACE |
17 | |
18 | QWaylandSurfaceRole QWaylandIviSurfacePrivate::s_role("ivi_surface" ); |
19 | |
20 | /*! |
21 | * \qmltype IviSurface |
22 | * \instantiates QWaylandIviSurface |
23 | * \inqmlmodule QtWayland.Compositor.IviApplication |
24 | * \since 5.8 |
25 | * \brief Provides a simple way to identify and resize a surface. |
26 | * |
27 | * This type is part of the \l{IviApplication} extension and provides a way to extend |
28 | * the functionality of an existing WaylandSurface with a way to resize and identify it. |
29 | * |
30 | * It corresponds to the Wayland \c ivi_surface interface. |
31 | */ |
32 | |
33 | /*! |
34 | * \class QWaylandIviSurface |
35 | * \inmodule QtWaylandCompositor |
36 | * \since 5.8 |
37 | * \brief The QWaylandIviSurface class provides a simple way to identify and resize a surface. |
38 | * |
39 | * This class is part of the QWaylandIviApplication extension and provides a way to |
40 | * extend the functionality of an existing QWaylandSurface with a way to resize and identify it. |
41 | * |
42 | * It corresponds to the Wayland \c ivi_surface interface. |
43 | */ |
44 | |
45 | /*! |
46 | * Constructs a QWaylandIviSurface. |
47 | */ |
48 | QWaylandIviSurface::QWaylandIviSurface() |
49 | : QWaylandShellSurfaceTemplate<QWaylandIviSurface>(*new QWaylandIviSurfacePrivate()) |
50 | { |
51 | } |
52 | |
53 | /*! |
54 | * Constructs a QWaylandIviSurface for \a surface and initializes it with the |
55 | * given \a application, \a surface, \a iviId, and \a resource. |
56 | */ |
57 | QWaylandIviSurface::QWaylandIviSurface(QWaylandIviApplication *application, QWaylandSurface *surface, uint iviId, const QWaylandResource &resource) |
58 | : QWaylandShellSurfaceTemplate<QWaylandIviSurface>(*new QWaylandIviSurfacePrivate()) |
59 | { |
60 | initialize(iviApplication: application, surface, iviId, resource); |
61 | } |
62 | |
63 | /*! |
64 | * \qmlmethod void IviSurface::initialize(IviApplication iviApplication, WaylandSurface surface, int iviId, WaylandResource resource) |
65 | * |
66 | * Initializes the IviSurface, associating it with the given \a iviApplication, \a surface, |
67 | * \a iviId, and \a resource. |
68 | */ |
69 | |
70 | /*! |
71 | * Initializes the QWaylandIviSurface, associating it with the given \a iviApplication, \a surface, |
72 | * \a iviId, and \a resource. |
73 | */ |
74 | void QWaylandIviSurface::initialize(QWaylandIviApplication *iviApplication, QWaylandSurface *surface, uint iviId, const QWaylandResource &resource) |
75 | { |
76 | Q_D(QWaylandIviSurface); |
77 | |
78 | d->m_iviApplication = iviApplication; |
79 | d->m_surface = surface; |
80 | d->m_iviId = iviId; |
81 | |
82 | d->init(resource.resource()); |
83 | setExtensionContainer(surface); |
84 | |
85 | emit surfaceChanged(); |
86 | emit iviIdChanged(); |
87 | |
88 | QWaylandCompositorExtension::initialize(); |
89 | } |
90 | |
91 | /*! |
92 | * \qmlproperty WaylandSurface IviSurface::surface |
93 | * |
94 | * This property holds the surface associated with this IviSurface. |
95 | */ |
96 | |
97 | /*! |
98 | * \property QWaylandIviSurface::surface |
99 | * |
100 | * This property holds the surface associated with this QWaylandIviSurface. |
101 | */ |
102 | QWaylandSurface *QWaylandIviSurface::surface() const |
103 | { |
104 | Q_D(const QWaylandIviSurface); |
105 | return d->m_surface; |
106 | } |
107 | |
108 | /*! |
109 | * \qmlproperty int IviSurface::iviId |
110 | * \readonly |
111 | * |
112 | * This property holds the ivi id id of this IviSurface. |
113 | */ |
114 | |
115 | /*! |
116 | * \property QWaylandIviSurface::iviId |
117 | * |
118 | * This property holds the ivi id of this QWaylandIviSurface. |
119 | */ |
120 | uint QWaylandIviSurface::iviId() const |
121 | { |
122 | Q_D(const QWaylandIviSurface); |
123 | return d->m_iviId; |
124 | } |
125 | |
126 | /*! |
127 | * Returns the Wayland interface for the QWaylandIviSurface. |
128 | */ |
129 | const struct wl_interface *QWaylandIviSurface::interface() |
130 | { |
131 | return QWaylandIviSurfacePrivate::interface(); |
132 | } |
133 | |
134 | QByteArray QWaylandIviSurface::interfaceName() |
135 | { |
136 | return QWaylandIviSurfacePrivate::interfaceName(); |
137 | } |
138 | |
139 | /*! |
140 | * Returns the surface role for the QWaylandIviSurface. |
141 | */ |
142 | QWaylandSurfaceRole *QWaylandIviSurface::role() |
143 | { |
144 | return &QWaylandIviSurfacePrivate::s_role; |
145 | } |
146 | |
147 | /*! |
148 | * Returns the QWaylandIviSurface corresponding to the \a resource. |
149 | */ |
150 | QWaylandIviSurface *QWaylandIviSurface::fromResource(wl_resource *resource) |
151 | { |
152 | if (auto p = QtWayland::fromResource<QWaylandIviSurfacePrivate *>(resource)) |
153 | return p->q_func(); |
154 | return nullptr; |
155 | } |
156 | |
157 | /*! |
158 | * \qmlmethod int IviSurface::sendConfigure(size size) |
159 | * |
160 | * Sends a configure event to the client, telling it to resize the surface to the given \a size. |
161 | */ |
162 | |
163 | /*! |
164 | * Sends a configure event to the client, telling it to resize the surface to the given \a size. |
165 | */ |
166 | void QWaylandIviSurface::sendConfigure(const QSize &size) |
167 | { |
168 | if (!size.isValid()) { |
169 | qWarning() << "Can't configure ivi_surface with an invalid size" << size; |
170 | return; |
171 | } |
172 | Q_D(QWaylandIviSurface); |
173 | d->send_configure(size.width(), size.height()); |
174 | } |
175 | |
176 | #if QT_CONFIG(wayland_compositor_quick) |
177 | QWaylandQuickShellIntegration *QWaylandIviSurface::createIntegration(QWaylandQuickShellSurfaceItem *item) |
178 | { |
179 | return new QtWayland::IviSurfaceIntegration(item); |
180 | } |
181 | #endif |
182 | |
183 | /*! |
184 | * \internal |
185 | */ |
186 | void QWaylandIviSurface::initialize() |
187 | { |
188 | QWaylandShellSurfaceTemplate::initialize(); |
189 | } |
190 | |
191 | QWaylandIviSurfacePrivate::QWaylandIviSurfacePrivate() |
192 | { |
193 | } |
194 | |
195 | void QWaylandIviSurfacePrivate::ivi_surface_destroy_resource(QtWaylandServer::ivi_surface::Resource *resource) |
196 | { |
197 | Q_UNUSED(resource); |
198 | Q_Q(QWaylandIviSurface); |
199 | QWaylandIviApplicationPrivate::get(iviApplication: m_iviApplication)->unregisterIviSurface(iviSurface: q); |
200 | delete q; |
201 | } |
202 | |
203 | void QWaylandIviSurfacePrivate::ivi_surface_destroy(QtWaylandServer::ivi_surface::Resource *resource) |
204 | { |
205 | wl_resource_destroy(resource->handle); |
206 | } |
207 | |
208 | QT_END_NAMESPACE |
209 | |
210 | #include "moc_qwaylandivisurface.cpp" |
211 | |