diff options
Diffstat (limited to 'src/compositor/wayland_wrapper')
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor.cpp | 13 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor_p.h | 7 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput.cpp | 3 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwloutput_p.h | 1 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface.cpp | 63 | ||||
-rw-r--r-- | src/compositor/wayland_wrapper/qwlsurface_p.h | 11 |
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; |