summaryrefslogtreecommitdiffstats
path: root/src/compositor/wayland_wrapper
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-07-29 13:48:26 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:09:36 +0200
commit964eb66e37dbbb9ff6736c3b40e8fcc76d1b8d61 (patch)
tree77c728990a42970fe6151cc8a593a8a1a5dc06ed /src/compositor/wayland_wrapper
parent7c5d8fc7fd9ea7391e97bde950f5a866ae1f78b6 (diff)
Move surface management to outputs
Diffstat (limited to 'src/compositor/wayland_wrapper')
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp15
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor_p.h4
-rw-r--r--src/compositor/wayland_wrapper/qwloutput.cpp50
-rw-r--r--src/compositor/wayland_wrapper/qwloutput_p.h8
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp18
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h1
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);