45void QWaylandViewporter::initialize()
47 Q_D(QWaylandViewporter);
49 QWaylandCompositorExtensionTemplate::initialize();
50 auto *compositor =
static_cast<QWaylandCompositor *>(extensionContainer());
52 qWarning() <<
"Failed to find QWaylandCompositor when initializing QWaylandViewporter";
55 d->init(compositor->display(), 1);
72void QWaylandViewporterPrivate::wp_viewporter_get_viewport(Resource *resource, uint id, wl_resource *surfaceResource)
74 auto *surface = QWaylandSurface::fromResource(surfaceResource);
76 qWarning() <<
"Couldn't find surface for viewporter";
80 auto *surfacePrivate = QWaylandSurfacePrivate::get(surface);
81 if (surfacePrivate->viewport) {
82 wl_resource_post_error(resource->handle, WP_VIEWPORTER_ERROR_VIEWPORT_EXISTS,
83 "viewport already exists for surface");
87 surfacePrivate->viewport =
new Viewport(surface, resource->client(), id);
109void QWaylandViewporterPrivate::Viewport::checkCommittedState()
111 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
117 QSize destination = surfacePrivate->pending.destinationSize;
118 QRectF source = surfacePrivate->pending.sourceGeometry;
120 if (!destination.isValid() && source.size() != source.size().toSize()) {
121 wl_resource_post_error(resource()->handle, error_bad_size,
122 "non-integer size (%fx%f) with unset destination",
123 source.width(), source.height());
127 if (m_surface->bufferSize().isValid()) {
128 QRectF max = QRectF(QPointF(), m_surface->bufferSize() / m_surface->bufferScale());
130 if (max.united(source) != max) {
131 wl_resource_post_error(resource()->handle, error_out_of_buffer,
132 "source %f,%f, %fx%f extends outside attached buffer %fx%f",
133 source.x(), source.y(), source.width(), source.height(),
134 max.width(), max.height());
147void QWaylandViewporterPrivate::Viewport::wp_viewport_destroy(Resource *resource)
150 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
151 surfacePrivate->pending.destinationSize = QSize();
152 surfacePrivate->pending.sourceGeometry = QRectF();
154 wl_resource_destroy(resource->handle);
157void 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)
162 wl_resource_post_error(resource->handle, error_no_surface,
163 "set_source requested for destroyed surface");
167 QPointF position(wl_fixed_to_double(x), wl_fixed_to_double(y));
168 QSizeF size(wl_fixed_to_double(width), wl_fixed_to_double(height));
169 QRectF sourceGeometry(position, size);
171 if (sourceGeometry == QRectF(-1, -1, -1, -1)) {
172 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
173 surfacePrivate->pending.sourceGeometry = QRectF();
177 if (position.x() < 0 || position.y() < 0) {
178 wl_resource_post_error(resource->handle, error_bad_value,
179 "negative position in set_source");
183 if (!size.isValid()) {
184 wl_resource_post_error(resource->handle, error_bad_value,
185 "negative size in set_source");
189 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
190 surfacePrivate->pending.sourceGeometry = sourceGeometry;
193void QWaylandViewporterPrivate::Viewport::wp_viewport_set_destination(QtWaylandServer::wp_viewport::Resource *resource, int32_t width, int32_t height)
198 wl_resource_post_error(resource->handle, error_no_surface,
199 "set_destination requested for destroyed surface");
203 QSize destinationSize(width, height);
204 if (!destinationSize.isValid() && destinationSize != QSize(-1, -1)) {
205 wl_resource_post_error(resource->handle, error_bad_value,
206 "negative size in set_destination");
209 auto *surfacePrivate = QWaylandSurfacePrivate::get(m_surface);
210 surfacePrivate->pending.destinationSize = destinationSize;