diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-07-29 13:48:26 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-08-28 13:09:36 +0200 |
commit | 964eb66e37dbbb9ff6736c3b40e8fcc76d1b8d61 (patch) | |
tree | 77c728990a42970fe6151cc8a593a8a1a5dc06ed /src/compositor/wayland_wrapper | |
parent | 7c5d8fc7fd9ea7391e97bde950f5a866ae1f78b6 (diff) |
Move surface management to outputs
Change-Id: I427e576a4e0834d6266af2670f7ff47e078153d4
Diffstat (limited to 'src/compositor/wayland_wrapper')
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor.cpp | 15 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor_p.h | 4 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput.cpp | 50 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput_p.h | 8 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface.cpp | 18 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface_p.h | 1 |
6 files changed, 80 insertions, 16 deletions
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index fd9720728..3d0ebdbb7 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -246,14 +246,6 @@ Compositor::~Compositor() delete m_display; } -void Compositor::sendFrameCallbacks(QList<QWaylandSurface *> visibleSurfaces) -{ - foreach (QWaylandSurface *surface, visibleSurfaces) { - surface->handle()->sendFrameCallback(); - } - wl_display_flush_clients(m_display->handle()); -} - uint Compositor::currentTimeMsecs() const { return m_timer.elapsed(); @@ -320,7 +312,7 @@ void Compositor::processWaylandEvents() void Compositor::destroySurface(Surface *surface) { - m_surfaces.removeOne(surface); + surface->removeFromOutput(); waylandCompositor()->surfaceAboutToBeDestroyed(surface->waylandSurface()); @@ -347,8 +339,9 @@ void Compositor::cleanupGraphicsResources() void Compositor::compositor_create_surface(Resource *resource, uint32_t id) { QWaylandSurface *surface = new QWaylandSurface(resource->client(), id, resource->version(), m_qt_compositor); - m_surfaces << surface->handle(); - surface->handle()->addToOutput(primaryOutput()->handle()); + + primaryOutput()->addSurface(surface); + //BUG: This may not be an on-screen window surface though m_qt_compositor->surfaceCreated(surface); } diff --git a/src/compositor/wayland_wrapper/qwlcompositor_p.h b/src/compositor/wayland_wrapper/qwlcompositor_p.h index 9875a03bf..9621c37bf 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor_p.h +++ b/src/compositor/wayland_wrapper/qwlcompositor_p.h @@ -90,6 +90,7 @@ public: ~Compositor(); void init(); + void sendFrameCallbacks(QList<QWaylandSurface *> visibleSurfaces); InputDevice *defaultInputDevice(); @@ -121,8 +122,6 @@ public: void initializeDefaultInputDevice(); void initializeWindowManagerProtocol(); - QList<Surface *> surfaces() const { return m_surfaces; } - QWaylandCompositor *waylandCompositor() const { return m_qt_compositor; } struct wl_display *wl_display() const { return m_display->handle(); } @@ -188,7 +187,6 @@ protected: DataDeviceManager *m_data_device_manager; QElapsedTimer m_timer; - QList<Surface *> m_surfaces; QSet<QWaylandSurface *> m_destroyed_surfaces; /* Render state */ diff --git a/src/compositor/wayland_wrapper/qwloutput.cpp b/src/compositor/wayland_wrapper/qwloutput.cpp index 5973aa496..1a80ab033 100644 --- a/src/compositor/wayland_wrapper/qwloutput.cpp +++ b/src/compositor/wayland_wrapper/qwloutput.cpp @@ -45,6 +45,9 @@ #include <QtCompositor/QWaylandSurface> #include <QtCompositor/QWaylandOutput> +#include <QtCompositor/QWaylandSurface> +#include <QtCompositor/QWaylandClient> + QT_BEGIN_NAMESPACE namespace QtWayland { @@ -262,6 +265,53 @@ void Output::sendGeometryInfo() } } + +void Output::frameStarted() +{ + foreach (QWaylandSurface *surface, m_surfaces) + surface->handle()->frameStarted(); +} + +void Output::sendFrameCallbacks(QList<QWaylandSurface *> visibleSurfaces) +{ + foreach (QWaylandSurface *surface, visibleSurfaces) { + surface->handle()->sendFrameCallback(); + } + wl_display_flush_clients(m_compositor->wl_display()); +} + +QList<QWaylandSurface *> Output::surfacesForClient(QWaylandClient *client) const +{ + QList<QWaylandSurface *> result; + + foreach (QWaylandSurface *surface, m_surfaces) { + if (surface->client() == client) + result.append(result); + } + + return result; +} + +void Output::addSurface(QWaylandSurface *surface) +{ + if (m_surfaces.contains(surface)) + return; + + m_surfaces.append(surface); + + surface->handle()->addToOutput(this); +} + +void Output::removeSurface(QWaylandSurface *surface) +{ + if (!m_surfaces.contains(surface)) + return; + + m_surfaces.removeOne(surface); + + surface->handle()->removeFromOutput(this); +} + } // namespace Wayland QT_END_NAMESPACE diff --git a/src/compositor/wayland_wrapper/qwloutput_p.h b/src/compositor/wayland_wrapper/qwloutput_p.h index c7c7249e0..ee6a34262 100644 --- a/src/compositor/wayland_wrapper/qwloutput_p.h +++ b/src/compositor/wayland_wrapper/qwloutput_p.h @@ -98,6 +98,14 @@ public: int scaleFactor() const { return m_scaleFactor; } void setScaleFactor(int scale); + void frameStarted(); + void sendFrameCallbacks(QList<QWaylandSurface *> visibleSurfaces); + + QList<QWaylandSurface *> surfaces() const { return m_surfaces; } + QList<QWaylandSurface *> surfacesForClient(QWaylandClient *client) const; + void addSurface(QWaylandSurface *surface); + void removeSurface(QWaylandSurface *surface); + QWindow *window() const { return m_window; } OutputResource *outputForClient(struct wl_client *client) const; diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp index 4c9d46e20..297a69132 100644 --- a/src/compositor/wayland_wrapper/qwlsurface.cpp +++ b/src/compositor/wayland_wrapper/qwlsurface.cpp @@ -135,6 +135,7 @@ Surface::Surface(struct wl_client *client, uint32_t id, int version, QWaylandCom Surface::~Surface() { + removeFromOutput(); delete m_subSurface; m_bufferRef = QWaylandBufferRef(); @@ -317,6 +318,8 @@ void Surface::addToOutput(Output *output) m_outputs.append(output); + output->addSurface(waylandSurface()); + QWaylandSurfaceEnterEvent event(output->waylandOutput()); QCoreApplication::sendEvent(waylandSurface(), &event); @@ -333,11 +336,15 @@ void Surface::removeFromOutput(Output *output) if (!output) return; + if (!m_outputs.contains(output)) + return; + m_outputs.removeOne(output); - if (m_outputs.size() == 0) - m_mainOutput = m_compositor->primaryOutput()->handle(); + if (m_mainOutput == output) + setMainOutput(Q_NULLPTR); + output->removeSurface(waylandSurface()); QWaylandSurfaceLeaveEvent event(output->waylandOutput()); QCoreApplication::sendEvent(waylandSurface(), &event); @@ -349,6 +356,13 @@ void Surface::removeFromOutput(Output *output) } } +void Surface::removeFromOutput() +{ + Q_FOREACH (Output *output, m_outputs) { + removeFromOutput(output); + } +} + /*! * Sets the backbuffer for this surface. The back buffer is not yet on * screen and will become live during the next swapBuffers(). diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h index 793c6d906..210d07e02 100644 --- a/src/compositor/wayland_wrapper/qwlsurface_p.h +++ b/src/compositor/wayland_wrapper/qwlsurface_p.h @@ -126,6 +126,7 @@ public: void addToOutput(Output *output); void removeFromOutput(Output *output); + void removeFromOutput(); QString className() const { return m_className; } void setClassName(const QString &className); |