diff options
18 files changed, 102 insertions, 105 deletions
diff --git a/examples/wayland/pure-qml/qml/main.qml b/examples/wayland/pure-qml/qml/main.qml index e80c6a5ee..18fd45fa1 100644 --- a/examples/wayland/pure-qml/qml/main.qml +++ b/examples/wayland/pure-qml/qml/main.qml @@ -65,6 +65,6 @@ WaylandCompositor { } onSurfaceCreated: { - var chrome = chromeComponent.createObject(surface.primaryOutputWindow.surfacesArea, { "surface" : surface } ); + var chrome = chromeComponent.createObject(primaryOutputSpace.primaryOutput.window.surfacesArea, { "surface" : surface } ); } } diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp index bb8d3463a..22d097b6b 100644 --- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp +++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp @@ -256,6 +256,7 @@ void QWindowCompositor::onShellSurfaceCreated(QWaylandSurface *surface, QtWaylan { SurfaceView *newView = new SurfaceView(); newView->setSurface(surface); + newView->setOutput(output(m_window)); shellSurface->setView(newView); m_renderScheduler.start(0); } diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp index 08aaf589d..e4865d163 100644 --- a/src/compositor/compositor_api/qwaylandoutput.cpp +++ b/src/compositor/compositor_api/qwaylandoutput.cpp @@ -272,6 +272,16 @@ void QWaylandOutput::sendFrameCallbacks() d_ptr->sendFrameCallbacks(); } +void QWaylandOutput::surfaceEnter(QWaylandSurface *surface) +{ + d_ptr->surfaceEnter(surface); +} + +void QWaylandOutput::surfaceLeave(QWaylandSurface *surface) +{ + d_ptr->surfaceLeave(surface); +} + QtWayland::Output *QWaylandOutput::handle() const { return d_ptr.data(); diff --git a/src/compositor/compositor_api/qwaylandoutput.h b/src/compositor/compositor_api/qwaylandoutput.h index 95d964d83..f261f16a4 100644 --- a/src/compositor/compositor_api/qwaylandoutput.h +++ b/src/compositor/compositor_api/qwaylandoutput.h @@ -160,6 +160,9 @@ public: void frameStarted(); void sendFrameCallbacks(); + void surfaceEnter(QWaylandSurface *surface); + void surfaceLeave(QWaylandSurface *surface); + QtWayland::Output *handle() const; Q_INVOKABLE virtual QWaylandView *pickView(const QPointF &outputPosition) const; diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp index 4e357dea2..376ea0582 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.cpp +++ b/src/compositor/compositor_api/qwaylandquickitem.cpp @@ -150,6 +150,7 @@ QWaylandQuickItem::QWaylandQuickItem(QQuickItem *parent) setAcceptHoverEvents(true); connect(this, &QQuickItem::windowChanged, this, &QWaylandQuickItem::updateWindow); + connect(this, &QQuickItem::windowChanged, this, &QWaylandQuickItem::outputHasChanged); } QWaylandQuickItem::~QWaylandQuickItem() @@ -354,6 +355,10 @@ void QWaylandQuickItem::waylandSurfaceChanged(QWaylandSurface *newSurface, QWayl m_origin = newSurface->origin(); emit originChanged(); } + if (window()) { + QWaylandOutput *output = newSurface->compositor()->output(window()); + setOutput(output); + } } emit surfaceChanged(); @@ -531,6 +536,16 @@ void QWaylandQuickItem::beforeSync() } } +void QWaylandQuickItem::outputHasChanged() +{ + if (!compositor()) + return; + QWaylandOutput *output = Q_NULLPTR; + if (window()) + output = compositor()->output(window()); + setOutput(output); +} + QSGNode *QWaylandQuickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { bool mapped = (surface() && surface()->isMapped() && currentBuffer().hasBuffer()) diff --git a/src/compositor/compositor_api/qwaylandquickitem.h b/src/compositor/compositor_api/qwaylandquickitem.h index d7b32c1aa..33234cfce 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.h +++ b/src/compositor/compositor_api/qwaylandquickitem.h @@ -135,6 +135,7 @@ private Q_SLOTS: void updateBuffer(bool hasBuffer); void updateWindow(); void beforeSync(); + void outputHasChanged(); Q_SIGNALS: void surfaceChanged(); diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index f5399699d..3e5f1c656 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -41,7 +41,6 @@ #include "qwaylandquicksurface.h" #include "qwaylandquickcompositor.h" -#include "qwaylandoutput.h" #include "qwaylandquickitem.h" #include <QtCompositor/qwaylandbufferref.h> #include <QtCompositor/QWaylandView> @@ -67,16 +66,6 @@ public: { } - void surface_commit(Resource *resource) Q_DECL_OVERRIDE - { - QWaylandSurfacePrivate::surface_commit(resource); - - Q_FOREACH (QWaylandView *view, views) { - if (view->output()) - view->output()->update(); - } - } - QWaylandQuickCompositor *compositor; bool useTextureAlpha; bool clientRenderingEnabled; @@ -85,7 +74,6 @@ public: QWaylandQuickSurface::QWaylandQuickSurface(wl_client *client, quint32 id, int version, QWaylandQuickCompositor *compositor) : QWaylandSurface(new QWaylandQuickSurfacePrivate(client, id, version, compositor, this)) { - connect(this, &QWaylandSurface::primaryOutputChanged, this, &QWaylandQuickSurface::primaryOutputWindowChanged); } QWaylandQuickSurface::~QWaylandQuickSurface() @@ -109,11 +97,6 @@ void QWaylandQuickSurface::setUseTextureAlpha(bool useTextureAlpha) } } -QWindow *QWaylandQuickSurface::primaryOutputWindow() const -{ - return primaryOutput() ? primaryOutput()->window() : Q_NULLPTR; -} - bool QWaylandQuickSurface::clientRenderingEnabled() const { Q_D(const QWaylandQuickSurface); diff --git a/src/compositor/compositor_api/qwaylandquicksurface.h b/src/compositor/compositor_api/qwaylandquicksurface.h index 622a1e7e0..decb15216 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.h +++ b/src/compositor/compositor_api/qwaylandquicksurface.h @@ -53,7 +53,6 @@ class Q_COMPOSITOR_EXPORT QWaylandQuickSurface : public QWaylandSurface Q_DECLARE_PRIVATE(QWaylandQuickSurface) Q_PROPERTY(bool useTextureAlpha READ useTextureAlpha WRITE setUseTextureAlpha NOTIFY useTextureAlphaChanged) Q_PROPERTY(bool clientRenderingEnabled READ clientRenderingEnabled WRITE setClientRenderingEnabled NOTIFY clientRenderingEnabledChanged) - Q_PROPERTY(QWindow *primaryOutputWindow READ primaryOutputWindow NOTIFY primaryOutputWindowChanged) public: QWaylandQuickSurface(wl_client *client, quint32 id, int version, QWaylandQuickCompositor *compositor); ~QWaylandQuickSurface(); @@ -64,12 +63,9 @@ public: bool clientRenderingEnabled() const; void setClientRenderingEnabled(bool enabled); - QWindow *primaryOutputWindow() const; - Q_SIGNALS: void useTextureAlphaChanged(); void clientRenderingEnabledChanged(); - void primaryOutputWindowChanged(); }; QT_END_NAMESPACE diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index d6d9b1d53..ca5e3cfb9 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -53,7 +53,6 @@ #include "qwaylandsurface_p.h" #include "qwaylandview_p.h" #include "qwaylandbufferref.h" -#include "qwaylandoutput.h" #include <QtGui/QGuiApplication> #include <QtGui/QScreen> @@ -162,20 +161,6 @@ QWaylandCompositor *QWaylandSurface::compositor() const return d->compositor()->waylandCompositor(); } -QWaylandOutput *QWaylandSurface::primaryOutput() const -{ - Q_D(const QWaylandSurface); - if (!d->primaryOutput()) - return Q_NULLPTR; - return d->primaryOutput()->waylandOutput(); -} - -void QWaylandSurface::setPrimaryOutput(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - d->setPrimaryOutput(output->handle()); -} - void QWaylandSurface::sendFrameCallbacks() { Q_D(QWaylandSurface); @@ -212,22 +197,6 @@ void QWaylandSurface::destroy() deref(); } -void QWaylandSurface::enter(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - QtWayland::OutputResource *outputResource = output->handle()->outputForClient(d->resource()->client()); - if (outputResource) - handle()->send_enter(outputResource->handle); -} - -void QWaylandSurface::leave(QWaylandOutput *output) -{ - Q_D(QWaylandSurface); - QtWayland::OutputResource *outputResource = output->handle()->outputForClient(d->resource()->client()); - if (outputResource) - d->send_leave(outputResource->handle); -} - void QWaylandSurface::markAsCursorSurface(bool cursorSurface) { Q_D(QWaylandSurface); @@ -271,6 +240,31 @@ void QWaylandSurface::deref() compositor()->handle()->destroySurface(d); } +QWaylandView *QWaylandSurface::throttlingView() const +{ + Q_D(const QWaylandSurface); + if (d->views.isEmpty()) + return Q_NULLPTR; + return d->views.first(); +} + +void QWaylandSurface::setThrottlingView(QWaylandView *view) +{ + Q_D(QWaylandSurface); + + if (!view) + return; + + int index = d->views.indexOf(view); + + if (index < 0) { + view->setSurface(this); + index = d->views.indexOf(view); + } + + d->views.move(index, 0); +} + QList<QWaylandView *> QWaylandSurface::views() const { Q_D(const QWaylandSurface); diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h index 038c7d611..17f585e73 100644 --- a/src/compositor/compositor_api/qwaylandsurface.h +++ b/src/compositor/compositor_api/qwaylandsurface.h @@ -58,7 +58,6 @@ class QWaylandCompositor; class QWaylandBufferRef; class QWaylandView; class QWaylandSurfaceOp; -class QWaylandOutput; namespace QtWayland { class Surface; @@ -75,7 +74,6 @@ class Q_COMPOSITOR_EXPORT QWaylandSurface : public QObject, public QWaylandExten Q_PROPERTY(Qt::ScreenOrientation contentOrientation READ contentOrientation NOTIFY contentOrientationChanged) Q_PROPERTY(QString className READ className NOTIFY classNameChanged) Q_PROPERTY(QString title READ title NOTIFY titleChanged) - Q_PROPERTY(QWaylandOutput *primaryOutput READ primaryOutput WRITE setPrimaryOutput NOTIFY primaryOutputChanged) Q_PROPERTY(QWaylandSurface::Origin origin READ origin NOTIFY originChanged) Q_PROPERTY(bool isMapped READ isMapped NOTIFY mappedChanged) @@ -108,9 +106,6 @@ public: QWaylandCompositor *compositor() const; - QWaylandOutput *primaryOutput() const; - void setPrimaryOutput(QWaylandOutput *output); - QString className() const; QString title() const; @@ -126,14 +121,14 @@ public: void ref(); void deref(); + QWaylandView *throttlingView() const; + void setThrottlingView(QWaylandView *view); + QList<QWaylandView *> views() const; static QWaylandSurface *fromResource(::wl_resource *resource); struct wl_resource *resource() const; - void enter(QWaylandOutput *output); - void leave(QWaylandOutput *output); - void markAsCursorSurface(bool cursorSurface); bool isCursorSurface() const; @@ -157,7 +152,6 @@ Q_SIGNALS: void lowerRequested(); void pong(); void surfaceDestroyed(); - void primaryOutputChanged(QWaylandOutput *newOutput, QWaylandOutput *oldOutput); void originChanged(); void configure(bool hasBuffer); diff --git a/src/compositor/compositor_api/qwaylandview.cpp b/src/compositor/compositor_api/qwaylandview.cpp index 1a64b73ee..1dd570d94 100644 --- a/src/compositor/compositor_api/qwaylandview.cpp +++ b/src/compositor/compositor_api/qwaylandview.cpp @@ -91,9 +91,6 @@ void QWaylandView::setSurface(QWaylandSurface *newSurface) if (d->surface == newSurface) return; - if (!d->output && newSurface && !d->surface) - setOutput(newSurface->primaryOutput()); - QWaylandSurface *oldSurface = d->surface; d->surface = newSurface; diff --git a/src/compositor/compositor_api/qwaylandview.h b/src/compositor/compositor_api/qwaylandview.h index a11e20df9..4bb9b39d5 100644 --- a/src/compositor/compositor_api/qwaylandview.h +++ b/src/compositor/compositor_api/qwaylandview.h @@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE class QWaylandSurface; class QWaylandCompositor; class QWaylandViewPrivate; +class QWaylandOutput; class Q_COMPOSITOR_EXPORT QWaylandView { diff --git a/src/compositor/compositor_api/qwaylandview_p.h b/src/compositor/compositor_api/qwaylandview_p.h index 777675f96..562b54f6c 100644 --- a/src/compositor/compositor_api/qwaylandview_p.h +++ b/src/compositor/compositor_api/qwaylandview_p.h @@ -64,7 +64,7 @@ public: bool shouldBroadcastRequestedPositionChanged() const { - return broadcastRequestedPositionChanged && output && surface && surface->primaryOutput() == output; + return broadcastRequestedPositionChanged && output; } QWaylandView *q_ptr; diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 3fef11521..fee40c7ef 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -314,8 +314,6 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id) QWaylandClient *client = QWaylandClient::fromWlClient(m_qt_compositor, resource->client()); QWaylandSurface *surface = m_qt_compositor->createSurface(client, id, resource->version()); m_all_surfaces.append(surface); - if (primaryOutput()) - surface->setPrimaryOutput(primaryOutput()); emit m_qt_compositor->surfaceCreated(surface); } diff --git a/src/compositor/wayland_wrapper/qwloutput.cpp b/src/compositor/wayland_wrapper/qwloutput.cpp index 15f644966..caffb9028 100644 --- a/src/compositor/wayland_wrapper/qwloutput.cpp +++ b/src/compositor/wayland_wrapper/qwloutput.cpp @@ -331,8 +331,7 @@ void Output::frameStarted() { for (int i = 0; i < m_surfaceViews.size(); i++) { SurfaceViewMapper &surfacemapper = m_surfaceViews[i]; - if (surfacemapper.surface && (!surfacemapper.surface->primaryOutput() - || surfacemapper.surface->primaryOutput()->handle() == this)) + if (surfacemapper.maybeThrottelingView()) surfacemapper.surface->handle()->frameStarted(); } } @@ -341,14 +340,31 @@ void Output::sendFrameCallbacks() { for (int i = 0; i < m_surfaceViews.size(); i++) { const SurfaceViewMapper &surfacemapper = m_surfaceViews.at(i); - if (surfacemapper.surface && surfacemapper.surface->isMapped() - && (!surfacemapper.surface->primaryOutput() - || surfacemapper.surface->primaryOutput()->handle() == this)) - surfacemapper.surface->handle()->sendFrameCallback(); + if (surfacemapper.surface && surfacemapper.surface->isMapped()) { + if (!surfacemapper.has_entered) { + surfaceEnter(surfacemapper.surface); + } + if (surfacemapper.maybeThrottelingView()) + surfacemapper.surface->handle()->sendFrameCallback(); + } } wl_display_flush_clients(compositor()->waylandDisplay()); } +void Output::surfaceEnter(QWaylandSurface *surface) +{ + if (!surface) + return; + surface->handle()->send_enter(outputForClient(surface->client())->handle); +} + +void Output::surfaceLeave(QWaylandSurface *surface) +{ + if (!surface) + return; + surface->handle()->send_leave(outputForClient(surface->client())->handle); +} + void Output::addView(QWaylandView *view) { addView(view, view->surface()); @@ -369,8 +385,6 @@ void Output::addView(QWaylandView *view, QWaylandSurface *surface) surfaceViewMapper.surface = surface; surfaceViewMapper.views.append(view); m_surfaceViews.append(surfaceViewMapper); - if (surface) - surface->enter(waylandOutput()); } void Output::removeView(QWaylandView *view) @@ -384,9 +398,9 @@ void Output::removeView(QWaylandView *view, QWaylandSurface *surface) if (surface == m_surfaceViews.at(i).surface) { bool removed = m_surfaceViews[i].views.removeOne(view); if (m_surfaceViews.at(i).views.isEmpty() && removed) { + if (m_surfaceViews.at(i).has_entered) + surfaceLeave(surface); m_surfaceViews.remove(i); - if (surface) - surface->leave(waylandOutput()); } return; } diff --git a/src/compositor/wayland_wrapper/qwloutput_p.h b/src/compositor/wayland_wrapper/qwloutput_p.h index 8005ed26d..5ec9b1cbc 100644 --- a/src/compositor/wayland_wrapper/qwloutput_p.h +++ b/src/compositor/wayland_wrapper/qwloutput_p.h @@ -40,11 +40,13 @@ #include <QtCompositor/qwaylandexport.h> +#include <QtCompositor/QWaylandClient> #include <QtCore/QRect> #include <QtCore/QList> #include <QtCore/QVector> #include <QtCompositor/QWaylandOutputSpace> +#include <QtCompositor/QWaylandSurface> #include <QtCompositor/private/qwayland-server-wayland.h> #include <QtCompositor/qwaylandoutput.h> @@ -62,10 +64,21 @@ struct SurfaceViewMapper SurfaceViewMapper() : surface(0) , views() + , has_entered(false) {} + QWaylandView *maybeThrottelingView() const + { + for (int i = 0; i < views.size(); i++) { + if (surface && surface->throttlingView() == views.at(i)) + return views.at(i); + } + return Q_NULLPTR; + } + QWaylandSurface *surface; QVector<QWaylandView *> views; + bool has_entered; }; //Just for naming convenience @@ -124,6 +137,9 @@ public: void frameStarted(); void sendFrameCallbacks(); + void surfaceEnter(QWaylandSurface *surface); + void surfaceLeave(QWaylandSurface *surface); + void addView(QWaylandView *view); void addView(QWaylandView *view, QWaylandSurface *surface); void removeView(QWaylandView *view); @@ -132,6 +148,7 @@ public: QWindow *window() const { return m_window; } + OutputResource *outputForClient(QWaylandClient *client) const { return outputForClient(client->client()); } OutputResource *outputForClient(struct wl_client *client) const; void output_bind_resource(Resource *resource) Q_DECL_OVERRIDE; @@ -154,7 +171,6 @@ private: QWaylandOutput::Subpixel m_subpixel; QWaylandOutput::Transform m_transform; int m_scaleFactor; - QList<QWaylandSurface *> m_surfaces; bool m_sizeFollowsWindow; void sendGeometryInfo(); diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp index 7992f6d18..961163b88 100644 --- a/src/compositor/wayland_wrapper/qwlsurface.cpp +++ b/src/compositor/wayland_wrapper/qwlsurface.cpp @@ -114,7 +114,6 @@ Surface::Surface(struct wl_client *client, uint32_t id, int version, QWaylandCom : QtWaylandServer::wl_surface(client, id, version) , m_compositor(compositor->handle()) , m_waylandSurface(surface) - , m_primaryOutput(0) , m_buffer(0) , m_surfaceMapped(false) , m_subSurface(0) @@ -239,23 +238,6 @@ Compositor *Surface::compositor() const return m_compositor; } -void Surface::setPrimaryOutput(Output *output) -{ - if (m_primaryOutput == output) - return; - - QWaylandOutput *new_output = output ? output->waylandOutput() : Q_NULLPTR; - QWaylandOutput *old_output = m_primaryOutput ? m_primaryOutput->waylandOutput() : Q_NULLPTR; - m_primaryOutput = output; - - waylandSurface()->primaryOutputChanged(new_output, old_output); -} - -Output *Surface::primaryOutput() const -{ - return m_primaryOutput; -} - /*! * Sets the backbuffer for this surface. The back buffer is not yet on * screen and will become live during the next swapBuffers(). @@ -406,9 +388,6 @@ void Surface::surface_commit(Resource *) m_inputRegion = m_pending.inputRegion.intersected(QRect(QPoint(), m_size)); emit m_waylandSurface->redraw(); - - if (primaryOutput()) - primaryOutput()->waylandOutput()->update(); } void Surface::surface_set_buffer_transform(Resource *resource, int32_t orientation) diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h index 6b8a92883..4014d3d2e 100644 --- a/src/compositor/wayland_wrapper/qwlsurface_p.h +++ b/src/compositor/wayland_wrapper/qwlsurface_p.h @@ -40,7 +40,6 @@ #include <QtCompositor/qwaylandexport.h> #include <private/qwlsurfacebuffer_p.h> -#include <private/qwloutput_p.h> #include <QtCompositor/qwaylandsurface.h> #include <QtCompositor/qwaylandbufferref.h> @@ -111,9 +110,6 @@ public: Compositor *compositor() const; - Output *primaryOutput() const; - void setPrimaryOutput(Output *output); - QString className() const { return m_className; } void setClassName(const QString &className); @@ -158,7 +154,6 @@ protected: Compositor *m_compositor; QWaylandSurface *m_waylandSurface; - Output *m_primaryOutput; QRegion m_damage; SurfaceBuffer *m_buffer; |