diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-07 12:35:44 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:10:33 +0200 |
commit | dfec7314fd3758375e96d4641d2d6b5bec595320 (patch) | |
tree | 22cfabe1662b3e45795cd66f80388157490d575f /src/compositor/wayland_wrapper | |
parent | fd9a8983832bbeb240097327ff9f8565f7356b08 (diff) |
Remove output from QWaylandSurface
It is the views that belong to outputs.
This leads to a couple of interesting cases with enter and leave events,
but the implementation says you will get enter events for the first view
of a surface entering an output, and for the last view being removed
from an output.
Also to throttle a surface, there has to be 1 surface which takes care
of this. This is because if multiple views throttle, then the client
might render to quick.
Change-Id: If4bba380fd4d7f506fd769606cbdea4ce58b908d
Diffstat (limited to 'src/compositor/wayland_wrapper')
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor.cpp | 2 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput.cpp | 34 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput_p.h | 18 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface.cpp | 21 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface_p.h | 5 |
5 files changed, 41 insertions, 39 deletions
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; |