44void QWaylandViewporter::initialize()
46 Q_D(QWaylandViewporter);
48 QWaylandCompositorExtensionTemplate::initialize();
49 auto *compositor =
static_cast<QWaylandCompositor *>(extensionContainer());
51 qWarning() <<
"Failed to find QWaylandCompositor when initializing QWaylandViewporter";
54 d->init(compositor->display(), 1);
71void QWaylandViewporterPrivate::wp_viewporter_get_viewport(Resource *resource, uint id, wl_resource *surfaceResource)
73 auto *surface = QWaylandSurface::fromResource(surfaceResource);
75 qWarning() <<
"Couldn't find surface for viewporter";
79 auto *surfacePrivate = QWaylandSurfacePrivate::get(surface);
80 if (surfacePrivate->viewport) {
81 wl_resource_post_error(resource->handle, WP_VIEWPORTER_ERROR_VIEWPORT_EXISTS,
82 "viewport already exists for surface");
86 surfacePrivate->viewport =
new Viewport(surface, resource->client(), id);
108void QWaylandViewporterPrivate::Viewport::checkCommittedState()
110 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
116 QSize destination = surfacePrivate->pending.destinationSize;
117 QRectF source = surfacePrivate->pending.sourceGeometry;
119 if (!destination.isValid() && source.size() != source.size().toSize()) {
120 wl_resource_post_error(resource()->handle, error_bad_size,
121 "non-integer size (%fx%f) with unset destination",
122 source.width(), source.height());
126 if (m_surface->bufferSize().isValid()) {
127 QRectF max = QRectF(QPointF(), m_surface->bufferSize() / m_surface->bufferScale());
129 if (max.united(source) != max) {
130 wl_resource_post_error(resource()->handle, error_out_of_buffer,
131 "source %f,%f, %fx%f extends outside attached buffer %fx%f",
132 source.x(), source.y(), source.width(), source.height(),
133 max.width(), max.height());
146void QWaylandViewporterPrivate::Viewport::wp_viewport_destroy(Resource *resource)
149 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
150 surfacePrivate->pending.destinationSize = QSize();
151 surfacePrivate->pending.sourceGeometry = QRectF();
153 wl_resource_destroy(resource->handle);
156void QWaylandViewporterPrivate::Viewport::wp_viewport_set_source(QtWaylandServer::wp_viewport::Resource *resource, wl_fixed_t x, wl_fixed_t y, wl_fixed_t width, wl_fixed_t height)
161 wl_resource_post_error(resource->handle, error_no_surface,
162 "set_source requested for destroyed surface");
166 QPointF position(wl_fixed_to_double(x), wl_fixed_to_double(y));
167 QSizeF size(wl_fixed_to_double(width), wl_fixed_to_double(height));
168 QRectF sourceGeometry(position, size);
170 if (sourceGeometry == QRectF(-1, -1, -1, -1)) {
171 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
172 surfacePrivate->pending.sourceGeometry = QRectF();
176 if (position.x() < 0 || position.y() < 0) {
177 wl_resource_post_error(resource->handle, error_bad_value,
178 "negative position in set_source");
182 if (!size.isValid()) {
183 wl_resource_post_error(resource->handle, error_bad_value,
184 "negative size in set_source");
188 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
189 surfacePrivate->pending.sourceGeometry = sourceGeometry;
192void QWaylandViewporterPrivate::Viewport::wp_viewport_set_destination(QtWaylandServer::wp_viewport::Resource *resource, int32_t width, int32_t height)
197 wl_resource_post_error(resource->handle, error_no_surface,
198 "set_destination requested for destroyed surface");
202 QSize destinationSize(width, height);
203 if (!destinationSize.isValid() && destinationSize != QSize(-1, -1)) {
204 wl_resource_post_error(resource->handle, error_bad_value,
205 "negative size in set_destination");
208 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
209 surfacePrivate->pending.destinationSize = destinationSize;