summaryrefslogtreecommitdiffstats
path: root/src/compositor/wayland_wrapper
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-07 12:35:44 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:10:33 +0200
commitdfec7314fd3758375e96d4641d2d6b5bec595320 (patch)
tree22cfabe1662b3e45795cd66f80388157490d575f /src/compositor/wayland_wrapper
parentfd9a8983832bbeb240097327ff9f8565f7356b08 (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.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwloutput.cpp34
-rw-r--r--src/compositor/wayland_wrapper/qwloutput_p.h18
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp21
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h5
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;