diff options
Diffstat (limited to 'src/compositor')
32 files changed, 302 insertions, 122 deletions
diff --git a/src/compositor/compositor_api/qwaylandclient.cpp b/src/compositor/compositor_api/qwaylandclient.cpp index 7f0b225b2..d26dfc6d5 100644 --- a/src/compositor/compositor_api/qwaylandclient.cpp +++ b/src/compositor/compositor_api/qwaylandclient.cpp @@ -44,7 +44,7 @@ #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> -#include <wayland-server.h> +#include <wayland-server-core.h> #include <wayland-util.h> QT_BEGIN_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylanddestroylistener_p.h b/src/compositor/compositor_api/qwaylanddestroylistener_p.h index 7c6001c36..0bbeb69c0 100644 --- a/src/compositor/compositor_api/qwaylanddestroylistener_p.h +++ b/src/compositor/compositor_api/qwaylanddestroylistener_p.h @@ -55,7 +55,7 @@ #include <QtCore/private/qobject_p.h> -#include <wayland-server.h> +#include <wayland-server-core.h> QT_BEGIN_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp index 1f34f4eac..006edbe6a 100644 --- a/src/compositor/compositor_api/qwaylandoutput.cpp +++ b/src/compositor/compositor_api/qwaylandoutput.cpp @@ -47,6 +47,7 @@ #include <QtWaylandCompositor/private/qwaylandsurface_p.h> #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> #include <QtWaylandCompositor/private/qwaylandview_p.h> +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtCore/QCoreApplication> #include <QtCore/QtMath> @@ -350,8 +351,8 @@ void QWaylandOutput::initialize() */ QWaylandOutput *QWaylandOutput::fromResource(wl_resource *resource) { - if (auto *r = QWaylandOutputPrivate::Resource::fromResource(resource)) - return static_cast<QWaylandOutputPrivate *>(r->output_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandOutputPrivate *>(resource)) + return p->q_func(); return nullptr; } diff --git a/src/compositor/compositor_api/qwaylandpointer.cpp b/src/compositor/compositor_api/qwaylandpointer.cpp index 77e736a58..96263e0c2 100644 --- a/src/compositor/compositor_api/qwaylandpointer.cpp +++ b/src/compositor/compositor_api/qwaylandpointer.cpp @@ -239,7 +239,7 @@ uint QWaylandPointer::sendMouseReleaseEvent(Qt::MouseButton button) /*! * Sets the current mouse focus to \a view and sends a mouse move event to it with the - * local position \a localPos and output space position \a outputSpacePos. + * local position \a localPos in surface coordinates and output space position \a outputSpacePos. */ void QWaylandPointer::sendMouseMoveEvent(QWaylandView *view, const QPointF &localPos, const QPointF &outputSpacePos) { @@ -253,7 +253,7 @@ void QWaylandPointer::sendMouseMoveEvent(QWaylandView *view, const QPointF &loca if (view) { // We adjust if the mouse position is on the edge // to work around Qt's event propagation - QSizeF size(view->surface()->size()); + QSizeF size(view->surface()->destinationSize()); if (d->localPosition.x() == size.width()) d->localPosition.rx() -= 0.01; if (d->localPosition.y() == size.height()) @@ -294,7 +294,7 @@ QWaylandView *QWaylandPointer::mouseFocus() const } /*! - * Returns the current local position of the QWaylandPointer. + * Returns the current local position of the QWaylandPointer in surface coordinates. */ QPointF QWaylandPointer::currentLocalPosition() const { diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp index 77a9247a9..bc8365982 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.cpp +++ b/src/compositor/compositor_api/qwaylandquickitem.cpp @@ -64,7 +64,7 @@ #include <QtCore/QMutexLocker> #include <QtCore/QMutex> -#include <wayland-server.h> +#include <wayland-server-core.h> #include <QThread> #ifndef GL_TEXTURE_EXTERNAL_OES @@ -886,7 +886,7 @@ void QWaylandQuickItem::handleSurfaceChanged() if (d->oldSurface) { disconnect(d->oldSurface.data(), &QWaylandSurface::hasContentChanged, this, &QWaylandQuickItem::surfaceMappedChanged); disconnect(d->oldSurface.data(), &QWaylandSurface::parentChanged, this, &QWaylandQuickItem::parentChanged); - disconnect(d->oldSurface.data(), &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize); + disconnect(d->oldSurface.data(), &QWaylandSurface::destinationSizeChanged, this, &QWaylandQuickItem::updateSize); disconnect(d->oldSurface.data(), &QWaylandSurface::bufferScaleChanged, this, &QWaylandQuickItem::updateSize); disconnect(d->oldSurface.data(), &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer); disconnect(d->oldSurface.data(), &QWaylandSurface::redraw, this, &QQuickItem::update); @@ -903,7 +903,7 @@ void QWaylandQuickItem::handleSurfaceChanged() if (QWaylandSurface *newSurface = d->view->surface()) { connect(newSurface, &QWaylandSurface::hasContentChanged, this, &QWaylandQuickItem::surfaceMappedChanged); connect(newSurface, &QWaylandSurface::parentChanged, this, &QWaylandQuickItem::parentChanged); - connect(newSurface, &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize); + connect(newSurface, &QWaylandSurface::destinationSizeChanged, this, &QWaylandQuickItem::updateSize); connect(newSurface, &QWaylandSurface::bufferScaleChanged, this, &QWaylandQuickItem::updateSize); connect(newSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer); connect(newSurface, &QWaylandSurface::redraw, this, &QQuickItem::update); @@ -992,7 +992,7 @@ void QWaylandQuickItem::updateSize() QSize size(0, 0); if (surface()) - size = surface()->size() * (d->scaleFactor() / surface()->bufferScale()); + size = surface()->destinationSize() * d->scaleFactor(); setImplicitSize(size.width(), size.height()); if (d->sizeFollowsSurface) @@ -1061,16 +1061,32 @@ bool QWaylandQuickItem::inputRegionContains(const QPointF &localPosition) QPointF QWaylandQuickItem::mapToSurface(const QPointF &point) const { Q_D(const QWaylandQuickItem); - if (!surface() || surface()->size().isEmpty()) + if (!surface() || surface()->destinationSize().isEmpty()) return point / d->scaleFactor(); - qreal xScale = width() / surface()->size().width() * surface()->bufferScale(); - qreal yScale = height() / surface()->size().height() * surface()->bufferScale(); + qreal xScale = width() / surface()->destinationSize().width(); + qreal yScale = height() / surface()->destinationSize().height(); return QPointF(point.x() / xScale, point.y() / yScale); } /*! + * Maps the given \a point in the Wayland surfaces's coordinate system to the equivalent + * point within this item's coordinate system, and returns the mapped coordinate. + */ +QPointF QWaylandQuickItem::mapFromSurface(const QPointF &point) const +{ + Q_D(const QWaylandQuickItem); + if (!surface() || surface()->destinationSize().isEmpty()) + return point * d->scaleFactor(); + + qreal xScale = width() / surface()->destinationSize().width(); + qreal yScale = height() / surface()->destinationSize().height(); + + return QPointF(point.x() * xScale, point.y() * yScale); +} + +/*! * \qmlproperty bool QtWaylandCompositor::WaylandQuickItem::sizeFollowsSurface * * This property specifies whether the size of the item should always match diff --git a/src/compositor/compositor_api/qwaylandquickitem.h b/src/compositor/compositor_api/qwaylandquickitem.h index 23708353e..6f47c29a4 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.h +++ b/src/compositor/compositor_api/qwaylandquickitem.h @@ -102,6 +102,7 @@ public: bool inputRegionContains(const QPointF &localPosition) const; bool inputRegionContains(const QPointF &localPosition); Q_INVOKABLE QPointF mapToSurface(const QPointF &point) const; + Q_INVOKABLE QPointF mapFromSurface(const QPointF &point) const; bool sizeFollowsSurface() const; void setSizeFollowsSurface(bool sizeFollowsSurface); diff --git a/src/compositor/compositor_api/qwaylandseat.cpp b/src/compositor/compositor_api/qwaylandseat.cpp index a7b01ef03..d135ad035 100644 --- a/src/compositor/compositor_api/qwaylandseat.cpp +++ b/src/compositor/compositor_api/qwaylandseat.cpp @@ -54,6 +54,7 @@ #if QT_CONFIG(wayland_datadevice) #include <QtWaylandCompositor/private/qwldatadevice_p.h> #endif +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include "extensions/qwlqtkey_p.h" #include "extensions/qwaylandtextinput.h" @@ -631,8 +632,8 @@ bool QWaylandSeat::isOwner(QInputEvent *inputEvent) const */ QWaylandSeat *QWaylandSeat::fromSeatResource(struct ::wl_resource *resource) { - if (auto *r = QWaylandSeatPrivate::Resource::fromResource(resource)) - return static_cast<QWaylandSeatPrivate *>(r->seat_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandSeatPrivate *>(resource)) + return p->q_func(); return nullptr; } diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index 050ab5641..8ad2389b6 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -59,6 +59,7 @@ #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> #include <QtWaylandCompositor/private/qwaylandview_p.h> #include <QtWaylandCompositor/private/qwaylandseat_p.h> +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtCore/private/qobject_p.h> @@ -234,19 +235,21 @@ void QWaylandSurfacePrivate::surface_commit(Resource *) // Needed in order to know whether we want to emit signals later QSize oldBufferSize = bufferSize; + QSize oldDestinationSize = destinationSize; bool oldHasContent = hasContent; int oldBufferScale = bufferScale; // Update all internal state if (pending.buffer.hasBuffer() || pending.newlyAttached) bufferRef = pending.buffer; + bufferScale = pending.bufferScale; bufferSize = bufferRef.size(); - damage = pending.damage.intersected(QRect(QPoint(), bufferSize)); + destinationSize = pending.destinationSize.isEmpty() ? bufferSize / bufferScale : pending.destinationSize; + damage = pending.damage.intersected(QRect(QPoint(), destinationSize)); hasContent = bufferRef.hasContent(); - bufferScale = pending.bufferScale; frameCallbacks << pendingFrameCallbacks; - inputRegion = pending.inputRegion.intersected(QRect(QPoint(), bufferSize)); - opaqueRegion = pending.opaqueRegion.intersected(QRect(QPoint(), bufferSize)); + inputRegion = pending.inputRegion.intersected(QRect(QPoint(), destinationSize)); + opaqueRegion = pending.opaqueRegion.intersected(QRect(QPoint(), destinationSize)); QPoint offsetForNextFrame = pending.offset; // Clear per-commit state @@ -268,12 +271,19 @@ void QWaylandSurfacePrivate::surface_commit(Resource *) emit q->damaged(damage); - if (oldBufferSize != bufferSize) + if (oldBufferSize != bufferSize) { + emit q->bufferSizeChanged(); +#if QT_DEPRECATED_SINCE(5, 13) emit q->sizeChanged(); +#endif + } if (oldBufferScale != bufferScale) emit q->bufferScaleChanged(); + if (oldDestinationSize != destinationSize) + emit q->destinationSizeChanged(); + if (oldHasContent != hasContent) emit q->hasContentChanged(); @@ -461,21 +471,76 @@ bool QWaylandSurface::hasContent() const } /*! + * \qmlproperty size QtWaylandCompositor::WaylandSurface::destinationSize + * + * This property holds the size of this WaylandSurface in surface coordinates. + * + * \sa bufferScale + * \sa bufferSize + */ + +/*! + * \property QWaylandSurface::destinationSize + * + * This property holds the size of this WaylandSurface in surface coordinates. + * + * \sa bufferScale + * \sa bufferSize + */ +QSize QWaylandSurface::destinationSize() const +{ + Q_D(const QWaylandSurface); + return d->destinationSize; +} + +/*! + * \qmlproperty size QtWaylandCompositor::WaylandSurface::bufferSize + * + * This property holds the size of the current buffer of this WaylandSurface in pixels, + * not in surface coordinates. + * + * For the size in surface coordinates, use \l destinationSize instead. + * + * \sa destinationSize + * \sa bufferScale + */ + +/*! + * \property QWaylandSurface::bufferSize + * + * This property holds the size of the current buffer of this QWaylandSurface in pixels, + * not in surface coordinates. + * + * For the size in surface coordinates, use \l destinationSize instead. + * + * \sa destinationSize + * \sa bufferScale + */ +QSize QWaylandSurface::bufferSize() const +{ + Q_D(const QWaylandSurface); + return d->bufferSize; +} + +#if QT_DEPRECATED_SINCE(5, 13) +/*! * \qmlproperty size QtWaylandCompositor::WaylandSurface::size + * \obsolete use bufferSize or destinationSize instead * - * This property holds the WaylandSurface's size in pixels. + * This property has been deprecated, use \l bufferSize or \l destinationSize instead. */ /*! * \property QWaylandSurface::size + * \obsolete use bufferSize or destinationSize instead * - * This property holds the QWaylandSurface's size in pixels. + * This property has been deprecated, use \l bufferSize or \l destinationSize instead. */ QSize QWaylandSurface::size() const { - Q_D(const QWaylandSurface); - return d->bufferSize; + return bufferSize(); } +#endif /*! * \qmlproperty size QtWaylandCompositor::WaylandSurface::bufferScale @@ -742,10 +807,10 @@ QList<QWaylandView *> QWaylandSurface::views() const /*! * Returns the QWaylandSurface corresponding to the Wayland resource \a res. */ -QWaylandSurface *QWaylandSurface::fromResource(::wl_resource *res) +QWaylandSurface *QWaylandSurface::fromResource(::wl_resource *resource) { - if (auto *r = QWaylandSurfacePrivate::Resource::fromResource(res)) - return static_cast<QWaylandSurfacePrivate *>(r->surface_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandSurfacePrivate *>(resource)) + return p->q_func(); return nullptr; } diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index a138b2af5..13f09f33c 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -81,7 +81,10 @@ class Q_WAYLAND_COMPOSITOR_EXPORT QWaylandSurface : public QWaylandObject Q_OBJECT Q_DECLARE_PRIVATE(QWaylandSurface) Q_PROPERTY(QWaylandClient *client READ client CONSTANT) - Q_PROPERTY(QSize size READ size NOTIFY sizeChanged) + Q_PROPERTY(QSize destinationSize READ destinationSize NOTIFY destinationSizeChanged) +#if QT_DEPRECATED_SINCE(5, 13) + Q_PROPERTY(QSize size READ size NOTIFY sizeChanged) // Qt 6: Remove +#endif Q_PROPERTY(int bufferScale READ bufferScale NOTIFY bufferScaleChanged) Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged) Q_PROPERTY(QWaylandSurface::Origin origin READ origin NOTIFY originChanged) @@ -110,7 +113,11 @@ public: bool hasContent() const; - QSize size() const; + QSize destinationSize() const; +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED QSize size() const; +#endif + QSize bufferSize() const; int bufferScale() const; Qt::ScreenOrientation contentOrientation() const; @@ -155,7 +162,11 @@ Q_SIGNALS: void damaged(const QRegion &rect); void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent); void childAdded(QWaylandSurface *child); - void sizeChanged(); + void destinationSizeChanged(); +#if QT_DEPRECATED_SINCE(5, 13) + QT_DEPRECATED void sizeChanged(); +#endif + void bufferSizeChanged(); void bufferScaleChanged(); void offsetForNextFrame(const QPoint &offset); void contentOrientationChanged(); diff --git a/src/compositor/compositor_api/qwaylandsurface_p.h b/src/compositor/compositor_api/qwaylandsurface_p.h index df868de63..b34367801 100644 --- a/src/compositor/compositor_api/qwaylandsurface_p.h +++ b/src/compositor/compositor_api/qwaylandsurface_p.h @@ -152,6 +152,7 @@ public: //member variables bool newlyAttached; QRegion inputRegion; int bufferScale; + QSize destinationSize; QRegion opaqueRegion; } pending; @@ -166,6 +167,7 @@ public: //member variables QRegion inputRegion; QRegion opaqueRegion; + QSize destinationSize; QSize bufferSize; int bufferScale = 1; bool isCursorSurface = false; diff --git a/src/compositor/configure.json b/src/compositor/configure.json index 3b3d33200..ec9327adf 100644 --- a/src/compositor/configure.json +++ b/src/compositor/configure.json @@ -79,6 +79,12 @@ "type": "compile", "test": "dmabuf_server_buffer", "use": "egl" + }, + "dmabuf-client-buffer": { + "label": "Linux Client dma-buf Buffer Sharing", + "type": "compile", + "test": "dmabuf_client_buffer", + "use": "egl" } }, @@ -127,6 +133,11 @@ "condition": "features.wayland-server && features.opengl && features.egl && tests.dmabuf-server-buffer", "output": [ "privateFeature" ] }, + "wayland-dmabuf-client-buffer": { + "label": "Linux dma-buf client buffer integration", + "condition": "features.wayland-server && features.opengl && features.egl && tests.dmabuf-client-buffer", + "output": [ "privateFeature" ] + }, "wayland-shm-emulation-server-buffer": { "label": "Shm emulation server buffer", "condition": "features.wayland-server && features.opengl", diff --git a/src/compositor/extensions/pregenerated/3rdparty/qwayland-server-xdg-shell-unstable-v5_p.h b/src/compositor/extensions/pregenerated/3rdparty/qwayland-server-xdg-shell-unstable-v5_p.h index 63817a5e3..8124860b9 100644 --- a/src/compositor/extensions/pregenerated/3rdparty/qwayland-server-xdg-shell-unstable-v5_p.h +++ b/src/compositor/extensions/pregenerated/3rdparty/qwayland-server-xdg-shell-unstable-v5_p.h @@ -71,6 +71,7 @@ namespace QtWaylandServer { virtual ~Resource() {} xdg_shell_v5 *xdg_shell_object; + xdg_shell_v5 *object() { return xdg_shell_object; } struct ::wl_resource *handle; struct ::wl_client *client() const { return wl_resource_get_client(handle); } @@ -191,6 +192,7 @@ namespace QtWaylandServer { virtual ~Resource() {} xdg_surface_v5 *xdg_surface_object; + xdg_surface_v5 *object() { return xdg_surface_object; } struct ::wl_resource *handle; struct ::wl_client *client() const { return wl_resource_get_client(handle); } @@ -364,6 +366,7 @@ namespace QtWaylandServer { virtual ~Resource() {} xdg_popup_v5 *xdg_popup_object; + xdg_popup_v5 *object() { return xdg_popup_object; } struct ::wl_resource *handle; struct ::wl_client *client() const { return wl_resource_get_client(handle); } diff --git a/src/compositor/extensions/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-server-protocol_p.h b/src/compositor/extensions/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-server-protocol_p.h index b979f048c..493fd52d4 100644 --- a/src/compositor/extensions/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-server-protocol_p.h +++ b/src/compositor/extensions/pregenerated/3rdparty/wayland-xdg-shell-unstable-v5-server-protocol_p.h @@ -6,7 +6,7 @@ #include <stdint.h> #include <stddef.h> -#include "wayland-server.h" +#include "wayland-server-core.h" #ifdef __cplusplus extern "C" { diff --git a/src/compositor/extensions/qwaylandivisurface.cpp b/src/compositor/extensions/qwaylandivisurface.cpp index b6398f060..0ae488def 100644 --- a/src/compositor/extensions/qwaylandivisurface.cpp +++ b/src/compositor/extensions/qwaylandivisurface.cpp @@ -47,6 +47,8 @@ #include <QtWaylandCompositor/QWaylandResource> #include <QDebug> +#include <QtWaylandCompositor/private/qwaylandutils_p.h> + QT_BEGIN_NAMESPACE QWaylandSurfaceRole QWaylandIviSurfacePrivate::s_role("ivi_surface"); @@ -182,10 +184,9 @@ QWaylandSurfaceRole *QWaylandIviSurface::role() */ QWaylandIviSurface *QWaylandIviSurface::fromResource(wl_resource *resource) { - auto iviSurfaceResource = QWaylandIviSurfacePrivate::Resource::fromResource(resource); - if (!iviSurfaceResource) - return nullptr; - return static_cast<QWaylandIviSurfacePrivate *>(iviSurfaceResource->ivi_surface_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandIviSurfacePrivate *>(resource)) + return p->q_func(); + return nullptr; } /*! diff --git a/src/compositor/extensions/qwaylandwlshell.cpp b/src/compositor/extensions/qwaylandwlshell.cpp index d932a06c9..3f6734632 100644 --- a/src/compositor/extensions/qwaylandwlshell.cpp +++ b/src/compositor/extensions/qwaylandwlshell.cpp @@ -44,6 +44,7 @@ #ifdef QT_WAYLAND_COMPOSITOR_QUICK #include "qwaylandwlshellintegration_p.h" #endif +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtWaylandCompositor/QWaylandCompositor> #include <QtWaylandCompositor/QWaylandView> @@ -699,9 +700,8 @@ void QWaylandWlShellSurface::ping() */ QWaylandWlShellSurface *QWaylandWlShellSurface::fromResource(wl_resource *resource) { - QWaylandWlShellSurfacePrivate::Resource *res = QWaylandWlShellSurfacePrivate::Resource::fromResource(resource); - if (res) - return static_cast<QWaylandWlShellSurfacePrivate *>(res->shell_surface_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandWlShellSurfacePrivate *>(resource)) + return p->q_func(); return nullptr; } diff --git a/src/compositor/extensions/qwaylandwlshell_p.h b/src/compositor/extensions/qwaylandwlshell_p.h index e8d568fce..f8a29bac8 100644 --- a/src/compositor/extensions/qwaylandwlshell_p.h +++ b/src/compositor/extensions/qwaylandwlshell_p.h @@ -46,7 +46,7 @@ #include <QtWaylandCompositor/QWaylandWlShellSurface> #include <QtWaylandCompositor/QWaylandSeat> -#include <wayland-server.h> +#include <wayland-server-core.h> #include <QHash> #include <QPoint> #include <QSet> diff --git a/src/compositor/extensions/qwaylandwlshellintegration.cpp b/src/compositor/extensions/qwaylandwlshellintegration.cpp index 896b1587d..99a2e7655 100644 --- a/src/compositor/extensions/qwaylandwlshellintegration.cpp +++ b/src/compositor/extensions/qwaylandwlshellintegration.cpp @@ -84,8 +84,7 @@ void WlShellIntegration::handleStartResize(QWaylandSeat *seat, QWaylandWlShellSu grabberState = GrabberState::Resize; resizeState.seat = seat; resizeState.resizeEdges = edges; - float scaleFactor = m_item->view()->output()->scaleFactor(); - resizeState.initialSize = m_shellSurface->surface()->size() / scaleFactor; + resizeState.initialSize = m_shellSurface->surface()->destinationSize(); resizeState.initialized = false; } @@ -217,9 +216,7 @@ void WlShellIntegration::handleSetPopup(QWaylandSeat *seat, QWaylandSurface *par t.clear(&t); m_item->setRotation(0); m_item->setScale(1.0); - auto scaleFactor = m_item->output()->scaleFactor() / devicePixelRatio(); - m_item->setX(relativeToParent.x() * scaleFactor); - m_item->setY(relativeToParent.y() * scaleFactor); + m_item->setPosition(m_item->mapFromSurface(relativeToParent)); m_item->setParentItem(parentItem); } @@ -267,7 +264,7 @@ void WlShellIntegration::handleShellSurfaceDestroyed() void WlShellIntegration::handleSurfaceHasContentChanged() { - if (m_shellSurface && m_shellSurface->surface()->size().isEmpty() + if (m_shellSurface && m_shellSurface->surface()->destinationSize().isEmpty() && m_shellSurface->windowType() == Qt::WindowType::Popup) { handlePopupClosed(); } @@ -287,9 +284,8 @@ void WlShellIntegration::adjustOffsetForNextFrame(const QPointF &offset) if (!m_item->view()->isPrimary()) return; - float scaleFactor = m_item->view()->output()->scaleFactor(); QQuickItem *moveItem = m_item->moveItem(); - moveItem->setPosition(moveItem->position() + offset * scaleFactor / devicePixelRatio()); + moveItem->setPosition(moveItem->position() + m_item->mapFromSurface(offset)); } bool WlShellIntegration::mouseMoveEvent(QMouseEvent *event) diff --git a/src/compositor/extensions/qwaylandxdgshell.cpp b/src/compositor/extensions/qwaylandxdgshell.cpp index bd332287e..6f0c83122 100644 --- a/src/compositor/extensions/qwaylandxdgshell.cpp +++ b/src/compositor/extensions/qwaylandxdgshell.cpp @@ -40,6 +40,7 @@ #ifdef QT_WAYLAND_COMPOSITOR_QUICK #include "qwaylandxdgshellintegration_p.h" #endif +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtWaylandCompositor/QWaylandCompositor> #include <QtWaylandCompositor/QWaylandSeat> @@ -311,7 +312,7 @@ QRect QWaylandXdgSurfacePrivate::calculateFallbackWindowGeometry() const { // TODO: The unset window geometry should include subsurfaces as well, so this solution // won't work too well on those kinds of clients. - return QRect(QPoint(0, 0), m_surface->size() / m_surface->bufferScale()); + return QRect(QPoint(), m_surface->destinationSize()); } void QWaylandXdgSurfacePrivate::updateFallbackWindowGeometry() @@ -510,7 +511,7 @@ void QWaylandXdgSurface::initialize(QWaylandXdgShell *xdgShell, QWaylandSurface d->init(resource.resource()); setExtensionContainer(surface); d->m_windowGeometry = d->calculateFallbackWindowGeometry(); - connect(surface, &QWaylandSurface::sizeChanged, this, &QWaylandXdgSurface::handleSurfaceSizeChanged); + connect(surface, &QWaylandSurface::destinationSizeChanged, this, &QWaylandXdgSurface::handleSurfaceSizeChanged); connect(surface, &QWaylandSurface::bufferScaleChanged, this, &QWaylandXdgSurface::handleBufferScaleChanged); emit shellChanged(); emit surfaceChanged(); @@ -674,10 +675,9 @@ QByteArray QWaylandXdgSurface::interfaceName() */ QWaylandXdgSurface *QWaylandXdgSurface::fromResource(wl_resource *resource) { - auto xsResource = QWaylandXdgSurfacePrivate::Resource::fromResource(resource); - if (!xsResource) - return nullptr; - return static_cast<QWaylandXdgSurfacePrivate *>(xsResource->xdg_surface_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandXdgSurfacePrivate *>(resource)) + return p->q_func(); + return nullptr; } #ifdef QT_WAYLAND_COMPOSITOR_QUICK @@ -1182,8 +1182,8 @@ QWaylandSurfaceRole *QWaylandXdgToplevel::role() */ QWaylandXdgToplevel *QWaylandXdgToplevel::fromResource(wl_resource *resource) { - if (auto *r = QWaylandXdgToplevelPrivate::Resource::fromResource(resource)) - return static_cast<QWaylandXdgToplevelPrivate *>(r->xdg_toplevel_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandXdgToplevelPrivate *>(resource)) + return p->q_func(); return nullptr; } @@ -2064,9 +2064,7 @@ void QWaylandXdgPositioner::xdg_positioner_set_offset(QtWaylandServer::xdg_posit QWaylandXdgPositioner *QWaylandXdgPositioner::fromResource(wl_resource *resource) { - if (auto *r = Resource::fromResource(resource)) - return static_cast<QWaylandXdgPositioner *>(r->xdg_positioner_object); - return nullptr; + return QtWayland::fromResource<QWaylandXdgPositioner *>(resource); } Qt::Edges QWaylandXdgPositioner::convertToEdges(anchor anchor) diff --git a/src/compositor/extensions/qwaylandxdgshellintegration.cpp b/src/compositor/extensions/qwaylandxdgshellintegration.cpp index cc8faf6c7..3de52944b 100644 --- a/src/compositor/extensions/qwaylandxdgshellintegration.cpp +++ b/src/compositor/extensions/qwaylandxdgshellintegration.cpp @@ -73,7 +73,7 @@ XdgToplevelIntegration::XdgToplevelIntegration(QWaylandQuickShellSurfaceItem *it connect(m_xdgSurface->shell(), &QWaylandXdgShell::popupCreated, this, [item](QWaylandXdgPopup *popup, QWaylandXdgSurface *){ handlePopupCreated(item, popup); }); - connect(m_xdgSurface->surface(), &QWaylandSurface::sizeChanged, this, &XdgToplevelIntegration::handleSurfaceSizeChanged); + connect(m_xdgSurface->surface(), &QWaylandSurface::destinationSizeChanged, this, &XdgToplevelIntegration::handleSurfaceSizeChanged); connect(m_toplevel, &QObject::destroyed, this, &XdgToplevelIntegration::handleToplevelDestroyed); } @@ -130,7 +130,7 @@ void XdgToplevelIntegration::handleStartResize(QWaylandSeat *seat, Qt::Edges edg resizeState.resizeEdges = edges; resizeState.initialWindowSize = m_xdgSurface->windowGeometry().size(); resizeState.initialPosition = m_item->moveItem()->position(); - resizeState.initialSurfaceSize = m_item->surface()->size(); + resizeState.initialSurfaceSize = m_item->surface()->destinationSize(); resizeState.initialized = false; } @@ -247,14 +247,14 @@ void XdgToplevelIntegration::handleActivatedChanged() void XdgToplevelIntegration::handleSurfaceSizeChanged() { if (grabberState == GrabberState::Resize) { - qreal x = resizeState.initialPosition.x(); - qreal y = resizeState.initialPosition.y(); + qreal dx = 0; + qreal dy = 0; if (resizeState.resizeEdges & Qt::TopEdge) - y += resizeState.initialSurfaceSize.height() - m_item->surface()->size().height(); - + dy = resizeState.initialSurfaceSize.height() - m_item->surface()->destinationSize().height(); if (resizeState.resizeEdges & Qt::LeftEdge) - x += resizeState.initialSurfaceSize.width() - m_item->surface()->size().width(); - m_item->moveItem()->setPosition(QPointF(x, y)); + dx = resizeState.initialSurfaceSize.width() - m_item->surface()->destinationSize().width(); + QPointF offset = m_item->mapFromSurface({dx, dy}); + m_item->moveItem()->setPosition(resizeState.initialPosition + offset); } } @@ -285,11 +285,11 @@ void XdgPopupIntegration::handleGeometryChanged() { if (m_item->view()->output()) { const QPoint windowOffset = m_popup->parentXdgSurface()->windowGeometry().topLeft(); - const QPoint position = m_popup->unconstrainedPosition() + windowOffset; + const QPoint surfacePosition = m_popup->unconstrainedPosition() + windowOffset; + const QPoint itemPosition = m_item->mapFromSurface(surfacePosition).toPoint(); //TODO: positioner size or other size...? - const float scaleFactor = m_item->view()->output()->scaleFactor(); //TODO check positioner constraints etc... sliding, flipping - m_item->moveItem()->setPosition(position * scaleFactor); + m_item->moveItem()->setPosition(itemPosition); } else { qWarning() << "XdgPopupIntegration popup item without output" << m_item; } diff --git a/src/compositor/extensions/qwaylandxdgshellv5.cpp b/src/compositor/extensions/qwaylandxdgshellv5.cpp index a6e88aabb..9e157a8a3 100644 --- a/src/compositor/extensions/qwaylandxdgshellv5.cpp +++ b/src/compositor/extensions/qwaylandxdgshellv5.cpp @@ -43,6 +43,7 @@ #ifdef QT_WAYLAND_COMPOSITOR_QUICK #include "qwaylandxdgshellv5integration_p.h" #endif +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtWaylandCompositor/QWaylandCompositor> #include <QtWaylandCompositor/QWaylandSurface> @@ -249,7 +250,7 @@ QRect QWaylandXdgSurfaceV5Private::calculateFallbackWindowGeometry() const { // TODO: The unset window geometry should include subsurfaces as well, so this solution // won't work too well on those kinds of clients. - return QRect(QPoint(0, 0), m_surface->size() / m_surface->bufferScale()); + return QRect(QPoint(), m_surface->destinationSize()); } void QWaylandXdgSurfaceV5Private::updateFallbackWindowGeometry() @@ -837,7 +838,7 @@ void QWaylandXdgSurfaceV5::initialize(QWaylandXdgShellV5 *xdgShell, QWaylandSurf d->init(resource.resource()); setExtensionContainer(surface); d->m_windowGeometry = d->calculateFallbackWindowGeometry(); - connect(surface, &QWaylandSurface::sizeChanged, this, &QWaylandXdgSurfaceV5::handleSurfaceSizeChanged); + connect(surface, &QWaylandSurface::destinationSizeChanged, this, &QWaylandXdgSurfaceV5::handleSurfaceSizeChanged); connect(surface, &QWaylandSurface::bufferScaleChanged, this, &QWaylandXdgSurfaceV5::handleBufferScaleChanged); emit shellChanged(); emit surfaceChanged(); @@ -1179,10 +1180,9 @@ QWaylandSurfaceRole *QWaylandXdgSurfaceV5::role() */ QWaylandXdgSurfaceV5 *QWaylandXdgSurfaceV5::fromResource(wl_resource *resource) { - auto xsResource = QWaylandXdgSurfaceV5Private::Resource::fromResource(resource); - if (!xsResource) - return nullptr; - return static_cast<QWaylandXdgSurfaceV5Private *>(xsResource->xdg_surface_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandXdgSurfaceV5Private *>(resource)) + return p->q_func(); + return nullptr; } QSize QWaylandXdgSurfaceV5::sizeForResize(const QSizeF &size, const QPointF &delta, @@ -1497,10 +1497,9 @@ QWaylandSurfaceRole *QWaylandXdgPopupV5::role() QWaylandXdgPopupV5 *QWaylandXdgPopupV5::fromResource(wl_resource *resource) { - auto popupResource = QWaylandXdgPopupV5Private::Resource::fromResource(resource); - if (!popupResource) - return nullptr; - return static_cast<QWaylandXdgPopupV5Private *>(popupResource->xdg_popup_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandXdgPopupV5Private *>(resource)) + return p->q_func(); + return nullptr; } void QWaylandXdgPopupV5::sendPopupDone() diff --git a/src/compositor/extensions/qwaylandxdgshellv5integration.cpp b/src/compositor/extensions/qwaylandxdgshellv5integration.cpp index ea04a33d2..1d63632a3 100644 --- a/src/compositor/extensions/qwaylandxdgshellv5integration.cpp +++ b/src/compositor/extensions/qwaylandxdgshellv5integration.cpp @@ -71,7 +71,7 @@ XdgShellV5Integration::XdgShellV5Integration(QWaylandQuickShellSurfaceItem *item connect(m_xdgSurface, &QWaylandXdgSurfaceV5::unsetMaximized, this, &XdgShellV5Integration::handleUnsetMaximized); connect(m_xdgSurface, &QWaylandXdgSurfaceV5::maximizedChanged, this, &XdgShellV5Integration::handleMaximizedChanged); connect(m_xdgSurface, &QWaylandXdgSurfaceV5::activatedChanged, this, &XdgShellV5Integration::handleActivatedChanged); - connect(m_xdgSurface->surface(), &QWaylandSurface::sizeChanged, this, &XdgShellV5Integration::handleSurfaceSizeChanged); + connect(m_xdgSurface->surface(), &QWaylandSurface::destinationSizeChanged, this, &XdgShellV5Integration::handleSurfaceSizeChanged); connect(m_xdgSurface->shell(), &QWaylandXdgShellV5::xdgPopupCreated, this, [item](QWaylandXdgPopupV5 *popup){ handlePopupCreated(item, popup); }); @@ -139,7 +139,7 @@ void XdgShellV5Integration::handleStartResize(QWaylandSeat *seat, QWaylandXdgSur resizeState.resizeEdges = edges; resizeState.initialWindowSize = m_xdgSurface->windowGeometry().size(); resizeState.initialPosition = m_item->moveItem()->position(); - resizeState.initialSurfaceSize = m_item->surface()->size(); + resizeState.initialSurfaceSize = m_item->surface()->destinationSize(); resizeState.initialized = false; } @@ -194,14 +194,14 @@ void XdgShellV5Integration::handleActivatedChanged() void XdgShellV5Integration::handleSurfaceSizeChanged() { if (grabberState == GrabberState::Resize) { - qreal x = resizeState.initialPosition.x(); - qreal y = resizeState.initialPosition.y(); + qreal dx = 0; + qreal dy = 0; if (resizeState.resizeEdges & QWaylandXdgSurfaceV5::ResizeEdge::TopEdge) - y += resizeState.initialSurfaceSize.height() - m_item->surface()->size().height(); - + dy = resizeState.initialSurfaceSize.height() - m_item->surface()->destinationSize().height(); if (resizeState.resizeEdges & QWaylandXdgSurfaceV5::ResizeEdge::LeftEdge) - x += resizeState.initialSurfaceSize.width() - m_item->surface()->size().width(); - m_item->moveItem()->setPosition(QPointF(x, y)); + dx = resizeState.initialSurfaceSize.width() - m_item->surface()->destinationSize().width(); + QPointF offset = m_item->mapFromSurface({dx, dy}); + m_item->moveItem()->setPosition(resizeState.initialPosition + offset); } } @@ -212,10 +212,12 @@ XdgPopupV5Integration::XdgPopupV5Integration(QWaylandQuickShellSurfaceItem *item , m_xdgShell(QWaylandXdgPopupV5Private::get(m_xdgPopup)->m_xdgShell) { item->setSurface(m_xdgPopup->surface()); - if (item->view()->output()) - item->moveItem()->setPosition(QPointF(m_xdgPopup->position() * item->view()->output()->scaleFactor())); - else + if (item->view()->output()) { + QPoint position = item->mapFromSurface(m_xdgPopup->position()).toPoint(); + item->moveItem()->setPosition(position); + } else { qWarning() << "XdgPopupV5Integration popup item without output" << item; + } QWaylandClient *client = m_xdgPopup->surface()->client(); auto shell = m_xdgShell; diff --git a/src/compositor/extensions/qwaylandxdgshellv6.cpp b/src/compositor/extensions/qwaylandxdgshellv6.cpp index 8338fe6e2..9aab9b2b8 100644 --- a/src/compositor/extensions/qwaylandxdgshellv6.cpp +++ b/src/compositor/extensions/qwaylandxdgshellv6.cpp @@ -40,6 +40,7 @@ #ifdef QT_WAYLAND_COMPOSITOR_QUICK #include "qwaylandxdgshellv6integration_p.h" #endif +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <QtWaylandCompositor/QWaylandCompositor> #include <QtWaylandCompositor/QWaylandSeat> @@ -316,7 +317,7 @@ QRect QWaylandXdgSurfaceV6Private::calculateFallbackWindowGeometry() const { // TODO: The unset window geometry should include subsurfaces as well, so this solution // won't work too well on those kinds of clients. - return QRect(QPoint(0, 0), m_surface->size() / m_surface->bufferScale()); + return QRect(QPoint(), m_surface->destinationSize()); } void QWaylandXdgSurfaceV6Private::updateFallbackWindowGeometry() @@ -515,7 +516,7 @@ void QWaylandXdgSurfaceV6::initialize(QWaylandXdgShellV6 *xdgShell, QWaylandSurf d->init(resource.resource()); setExtensionContainer(surface); d->m_windowGeometry = d->calculateFallbackWindowGeometry(); - connect(surface, &QWaylandSurface::sizeChanged, this, &QWaylandXdgSurfaceV6::handleSurfaceSizeChanged); + connect(surface, &QWaylandSurface::destinationSizeChanged, this, &QWaylandXdgSurfaceV6::handleSurfaceSizeChanged); connect(surface, &QWaylandSurface::bufferScaleChanged, this, &QWaylandXdgSurfaceV6::handleBufferScaleChanged); emit shellChanged(); emit surfaceChanged(); @@ -679,10 +680,9 @@ QByteArray QWaylandXdgSurfaceV6::interfaceName() */ QWaylandXdgSurfaceV6 *QWaylandXdgSurfaceV6::fromResource(wl_resource *resource) { - auto xsResource = QWaylandXdgSurfaceV6Private::Resource::fromResource(resource); - if (!xsResource) - return nullptr; - return static_cast<QWaylandXdgSurfaceV6Private *>(xsResource->zxdg_surface_v6_object)->q_func(); + if (auto p = QtWayland::fromResource<QWaylandXdgSurfaceV6Private *>(resource)) + return p->q_func(); + return nullptr; } #ifdef QT_WAYLAND_COMPOSITOR_QUICK @@ -1995,9 +1995,7 @@ void QWaylandXdgPositionerV6::zxdg_positioner_v6_set_offset(QtWaylandServer::zxd QWaylandXdgPositionerV6 *QWaylandXdgPositionerV6::fromResource(wl_resource *resource) { - if (auto *r = Resource::fromResource(resource)) - return static_cast<QWaylandXdgPositionerV6 *>(r->zxdg_positioner_v6_object); - return nullptr; + return QtWayland::fromResource<QWaylandXdgPositionerV6 *>(resource); } QT_END_NAMESPACE diff --git a/src/compositor/extensions/qwaylandxdgshellv6integration.cpp b/src/compositor/extensions/qwaylandxdgshellv6integration.cpp index 61a9092a3..66dbc6841 100644 --- a/src/compositor/extensions/qwaylandxdgshellv6integration.cpp +++ b/src/compositor/extensions/qwaylandxdgshellv6integration.cpp @@ -73,7 +73,7 @@ XdgToplevelV6Integration::XdgToplevelV6Integration(QWaylandQuickShellSurfaceItem connect(m_xdgSurface->shell(), &QWaylandXdgShellV6::popupCreated, this, [item](QWaylandXdgPopupV6 *popup, QWaylandXdgSurfaceV6 *){ handlePopupCreated(item, popup); }); - connect(m_xdgSurface->surface(), &QWaylandSurface::sizeChanged, this, &XdgToplevelV6Integration::handleSurfaceSizeChanged); + connect(m_xdgSurface->surface(), &QWaylandSurface::destinationSizeChanged, this, &XdgToplevelV6Integration::handleSurfaceSizeChanged); connect(m_toplevel, &QObject::destroyed, this, &XdgToplevelV6Integration::handleToplevelDestroyed); } @@ -130,7 +130,7 @@ void XdgToplevelV6Integration::handleStartResize(QWaylandSeat *seat, Qt::Edges e resizeState.resizeEdges = edges; resizeState.initialWindowSize = m_xdgSurface->windowGeometry().size(); resizeState.initialPosition = m_item->moveItem()->position(); - resizeState.initialSurfaceSize = m_item->surface()->size(); + resizeState.initialSurfaceSize = m_item->surface()->destinationSize(); resizeState.initialized = false; } @@ -247,14 +247,14 @@ void XdgToplevelV6Integration::handleActivatedChanged() void XdgToplevelV6Integration::handleSurfaceSizeChanged() { if (grabberState == GrabberState::Resize) { - qreal x = resizeState.initialPosition.x(); - qreal y = resizeState.initialPosition.y(); + qreal dx = 0; + qreal dy = 0; if (resizeState.resizeEdges & Qt::TopEdge) - y += resizeState.initialSurfaceSize.height() - m_item->surface()->size().height(); - + dy = resizeState.initialSurfaceSize.height() - m_item->surface()->destinationSize().height(); if (resizeState.resizeEdges & Qt::LeftEdge) - x += resizeState.initialSurfaceSize.width() - m_item->surface()->size().width(); - m_item->moveItem()->setPosition(QPointF(x, y)); + dx = resizeState.initialSurfaceSize.width() - m_item->surface()->destinationSize().width(); + QPointF offset = m_item->mapFromSurface({dx, dy}); + m_item->moveItem()->setPosition(resizeState.initialPosition + offset); } } @@ -285,11 +285,11 @@ void XdgPopupV6Integration::handleGeometryChanged() { if (m_item->view()->output()) { const QPoint windowOffset = m_popup->parentXdgSurface()->windowGeometry().topLeft(); - const QPoint position = m_popup->unconstrainedPosition() + windowOffset; + const QPoint surfacePosition = m_popup->unconstrainedPosition() + windowOffset; + const QPoint itemPosition = m_item->mapFromSurface(surfacePosition).toPoint(); //TODO: positioner size or other size...? - const float scaleFactor = m_item->view()->output()->scaleFactor(); //TODO check positioner constraints etc... sliding, flipping - m_item->moveItem()->setPosition(position * scaleFactor); + m_item->moveItem()->setPosition(itemPosition); } else { qWarning() << "XdgPopupV6Integration popup item without output" << m_item; } diff --git a/src/compositor/global/global.pri b/src/compositor/global/global.pri index 29d4f4376..172f916bf 100644 --- a/src/compositor/global/global.pri +++ b/src/compositor/global/global.pri @@ -4,6 +4,7 @@ HEADERS += \ global/qtwaylandcompositorglobal.h \ global/qwaylandcompositorextension.h \ global/qwaylandcompositorextension_p.h \ + global/qwaylandutils_p.h \ global/qwaylandquickextension.h \ SOURCES += \ diff --git a/src/compositor/global/qwaylandcompositorextension.cpp b/src/compositor/global/qwaylandcompositorextension.cpp index e50df48bd..912985399 100644 --- a/src/compositor/global/qwaylandcompositorextension.cpp +++ b/src/compositor/global/qwaylandcompositorextension.cpp @@ -44,7 +44,7 @@ #include <QtCore/QCoreApplication> #include <QtCore/QDebug> -#include <wayland-server.h> +#include <wayland-server-core.h> QT_BEGIN_NAMESPACE diff --git a/src/compositor/global/qwaylandutils_p.h b/src/compositor/global/qwaylandutils_p.h new file mode 100644 index 000000000..934e27617 --- /dev/null +++ b/src/compositor/global/qwaylandutils_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWaylandCompositor module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWAYLANDUTILS_P_H +#define QWAYLANDUTILS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtCore/qglobal.h> + +struct wl_resource; + +QT_BEGIN_NAMESPACE + +namespace QtWayland { + +template<typename return_type> +return_type fromResource(struct ::wl_resource *resource) { + if (auto *r = std::remove_pointer<return_type>::type::Resource::fromResource(resource)) + return static_cast<return_type>(r->object()); + return nullptr; +} + +} // namespace QtWayland + +QT_END_NAMESPACE + +#endif // QWAYLANDUTILS_P_H diff --git a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h index 13a69fce9..7b458fbc2 100644 --- a/src/compositor/hardware_integration/qwlclientbufferintegration_p.h +++ b/src/compositor/hardware_integration/qwlclientbufferintegration_p.h @@ -55,7 +55,7 @@ #include <QtWaylandCompositor/qwaylandsurface.h> #include <QtWaylandCompositor/qwaylandbufferref.h> #include <QtCore/QSize> -#include <wayland-server.h> +#include <wayland-server-core.h> QT_BEGIN_NAMESPACE diff --git a/src/compositor/wayland_wrapper/qwlclientbuffer.cpp b/src/compositor/wayland_wrapper/qwlclientbuffer.cpp index 7df9ead3c..cb1ee3da0 100644 --- a/src/compositor/wayland_wrapper/qwlclientbuffer.cpp +++ b/src/compositor/wayland_wrapper/qwlclientbuffer.cpp @@ -47,7 +47,7 @@ #include <QtCore/QDebug> -#include <wayland-server-protocol.h> +#include <QtWaylandCompositor/private/wayland-wayland-server-protocol.h> #include "qwaylandsharedmemoryformathelper_p.h" #include <QtWaylandCompositor/private/qwaylandcompositor_p.h> diff --git a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h index ac8c1ed01..f31ef5d46 100644 --- a/src/compositor/wayland_wrapper/qwlclientbuffer_p.h +++ b/src/compositor/wayland_wrapper/qwlclientbuffer_p.h @@ -59,7 +59,7 @@ #include <QtWaylandCompositor/QWaylandSurface> #include <QtWaylandCompositor/QWaylandBufferRef> -#include <wayland-server.h> +#include <wayland-server-core.h> QT_BEGIN_NAMESPACE @@ -110,7 +110,7 @@ protected: void ref(); void deref(); void sendRelease(); - void setDestroyed(); + virtual void setDestroyed(); struct ::wl_resource *m_buffer = nullptr; QRegion m_damage; diff --git a/src/compositor/wayland_wrapper/qwldatasource.cpp b/src/compositor/wayland_wrapper/qwldatasource.cpp index baa47d6fc..f5f456790 100644 --- a/src/compositor/wayland_wrapper/qwldatasource.cpp +++ b/src/compositor/wayland_wrapper/qwldatasource.cpp @@ -41,6 +41,7 @@ #include "qwldataoffer_p.h" #include "qwldatadevice_p.h" #include "qwldatadevicemanager_p.h" +#include <QtWaylandCompositor/private/qwaylandutils_p.h> #include <unistd.h> #include <QtWaylandCompositor/private/wayland-wayland-server-protocol.h> @@ -101,7 +102,7 @@ void DataSource::setDevice(DataDevice *device) DataSource *DataSource::fromResource(struct ::wl_resource *resource) { - return static_cast<DataSource *>(Resource::fromResource(resource)->data_source_object); + return QtWayland::fromResource<DataSource *>(resource); } void DataSource::data_source_offer(Resource *, const QString &mime_type) diff --git a/src/compositor/wayland_wrapper/qwlregion.cpp b/src/compositor/wayland_wrapper/qwlregion.cpp index 52c19e946..4383474cb 100644 --- a/src/compositor/wayland_wrapper/qwlregion.cpp +++ b/src/compositor/wayland_wrapper/qwlregion.cpp @@ -39,6 +39,8 @@ #include "qwlregion_p.h" +#include <QtWaylandCompositor/private/qwaylandutils_p.h> + QT_BEGIN_NAMESPACE namespace QtWayland { @@ -54,9 +56,7 @@ Region::~Region() Region *Region::fromResource(struct ::wl_resource *resource) { - if (auto *r = Resource::fromResource(resource)) - return static_cast<Region *>(r->region_object); - return nullptr; + return QtWayland::fromResource<Region *>(resource); } void Region::region_destroy_resource(Resource *) diff --git a/src/compositor/wayland_wrapper/wayland_wrapper.pri b/src/compositor/wayland_wrapper/wayland_wrapper.pri index 3041d7696..b0c8371f4 100644 --- a/src/compositor/wayland_wrapper/wayland_wrapper.pri +++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri @@ -1,6 +1,6 @@ CONFIG += wayland-scanner -WAYLANDSERVERSOURCES_SYSTEM += \ - ../3rdparty/protocol/wayland.xml \ +WAYLANDSERVERSOURCES += \ + ../3rdparty/protocol/wayland.xml HEADERS += \ wayland_wrapper/qwlbuffermanager_p.h \ |