summaryrefslogtreecommitdiffstats
path: root/src/compositor/wayland_wrapper
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor/wayland_wrapper')
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp13
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor_p.h7
-rw-r--r--src/compositor/wayland_wrapper/qwloutput.cpp3
-rw-r--r--src/compositor/wayland_wrapper/qwloutput_p.h1
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp63
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h11
6 files changed, 77 insertions, 21 deletions
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp
index 43c9475e4..2fd91f30d 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp
@@ -300,6 +300,7 @@ 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());
//BUG: This may not be an on-screen window surface though
m_qt_compositor->surfaceCreated(surface);
}
@@ -405,18 +406,6 @@ InputDevice* Compositor::defaultInputDevice()
return m_inputDevices.last()->handle();
}
-QList<QtWayland::Surface *> Compositor::surfacesForClient(wl_client *client)
-{
- QList<QtWayland::Surface *> ret;
-
- for (int i=0; i < m_surfaces.count(); ++i) {
- if (m_surfaces.at(i)->resource()->client() == client) {
- ret.append(m_surfaces.at(i));
- }
- }
- return ret;
-}
-
void Compositor::configureTouchExtension(int flags)
{
if (m_touchExtension)
diff --git a/src/compositor/wayland_wrapper/qwlcompositor_p.h b/src/compositor/wayland_wrapper/qwlcompositor_p.h
index 2a55ae493..1efbd2ee3 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor_p.h
+++ b/src/compositor/wayland_wrapper/qwlcompositor_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
+** Copyright (C) 2014-2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -95,7 +95,6 @@ public:
void init();
void sendFrameCallbacks(QList<QWaylandSurface *> visibleSurfaces);
- void frameFinished(Surface *surface = 0);
InputDevice *defaultInputDevice();
@@ -126,8 +125,8 @@ public:
void initializeDefaultInputDevice();
void initializeWindowManagerProtocol();
- QList<Surface*> surfaces() const { return m_surfaces; }
- QList<Surface*> surfacesForClient(wl_client* client);
+ QList<Surface *> surfaces() const { return m_surfaces; }
+
QWaylandCompositor *waylandCompositor() const { return m_qt_compositor; }
struct wl_display *wl_display() const { return m_display->handle(); }
diff --git a/src/compositor/wayland_wrapper/qwloutput.cpp b/src/compositor/wayland_wrapper/qwloutput.cpp
index b01ffa59b..ba9338d34 100644
--- a/src/compositor/wayland_wrapper/qwloutput.cpp
+++ b/src/compositor/wayland_wrapper/qwloutput.cpp
@@ -43,9 +43,12 @@
#include "qwlcompositor_p.h"
#include "qwlextendedoutput_p.h"
+#include "qwlsurface_p.h"
#include <QtGui/QWindow>
#include <QRect>
+#include <QtCompositor/QWaylandSurface>
+#include <QtCompositor/QWaylandOutput>
QT_BEGIN_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwloutput_p.h b/src/compositor/wayland_wrapper/qwloutput_p.h
index 06ff02eda..1bf6e01f6 100644
--- a/src/compositor/wayland_wrapper/qwloutput_p.h
+++ b/src/compositor/wayland_wrapper/qwloutput_p.h
@@ -128,6 +128,7 @@ private:
QWaylandOutput::Subpixel m_subpixel;
QWaylandOutput::Transform m_transform;
int m_scaleFactor;
+ QList<QWaylandSurface *> m_surfaces;
void sendGeometryInfo();
};
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index e26eec8ba..4cadbb590 100644
--- a/src/compositor/wayland_wrapper/qwlsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurface.cpp
@@ -114,7 +114,7 @@ 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_output(m_compositor->primaryOutput()->handle())
+ , m_mainOutput(0)
, m_buffer(0)
, m_surfaceMapped(false)
, m_attacher(0)
@@ -278,9 +278,66 @@ Compositor *Surface::compositor() const
return m_compositor;
}
-Output *Surface::output() const
+Output *Surface::mainOutput() const
{
- return m_output;
+ if (!m_mainOutput)
+ return m_compositor->primaryOutput()->handle();
+ return m_mainOutput;
+}
+
+void Surface::setMainOutput(Output *output)
+{
+ m_mainOutput = output;
+}
+
+QList<Output *> Surface::outputs() const
+{
+ return m_outputs;
+}
+
+void Surface::addToOutput(Output *output)
+{
+ if (!output)
+ return;
+
+ if (!m_mainOutput)
+ m_mainOutput = output;
+
+ if (m_outputs.contains(output))
+ return;
+
+ m_outputs.append(output);
+
+ QWaylandSurfaceEnterEvent event(output->waylandOutput());
+ QCoreApplication::sendEvent(waylandSurface(), &event);
+
+ // Send surface enter event
+ Q_FOREACH (Resource *resource, resourceMap().values()) {
+ QList<Output::Resource *> outputs = output->resourceMap().values();
+ for (int i = 0; i < outputs.size(); i++)
+ send_enter(resource->handle, outputs.at(i)->handle);
+ }
+}
+
+void Surface::removeFromOutput(Output *output)
+{
+ if (!output)
+ return;
+
+ m_outputs.removeOne(output);
+
+ if (m_outputs.size() == 0)
+ m_mainOutput = m_compositor->primaryOutput()->handle();
+
+ QWaylandSurfaceLeaveEvent event(output->waylandOutput());
+ QCoreApplication::sendEvent(waylandSurface(), &event);
+
+ // Send surface leave event
+ Q_FOREACH (Resource *resource, resourceMap().values()) {
+ QList<Output::Resource *> outputs = output->resourceMap().values();
+ for (int i = 0; i < outputs.size(); i++)
+ send_leave(resource->handle, outputs.at(i)->handle);
+ }
}
/*!
diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h
index 0633a938b..103b5994a 100644
--- a/src/compositor/wayland_wrapper/qwlsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurface_p.h
@@ -113,7 +113,13 @@ public:
Compositor *compositor() const;
- Output *output() const;
+ Output *mainOutput() const;
+ void setMainOutput(Output *output);
+
+ QList<Output *> outputs() const;
+
+ void addToOutput(Output *output);
+ void removeFromOutput(Output *output);
QString className() const { return m_className; }
void setClassName(const QString &className);
@@ -162,7 +168,8 @@ protected:
Compositor *m_compositor;
QWaylandSurface *m_waylandSurface;
- Output *m_output;
+ Output *m_mainOutput;
+ QList<Output *> m_outputs;
QRegion m_damage;
SurfaceBuffer *m_buffer;