diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-06-29 20:14:23 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-06-29 20:14:23 +0200 |
commit | 85956a9149c578d7a750fad0dc66e89eaa337ef5 (patch) | |
tree | 1e174c75f6010503ce081760814e8659ec4415b6 /src/compositor | |
parent | 2d9cd132061562902a9b347b87fd3ba20f434532 (diff) | |
parent | 05ea6b992f32443df27e38bdc8b21cf970755b57 (diff) |
Merge remote-tracking branch 'origin/5.5' into dev
Conflicts:
.qmake.conf
Change-Id: Ic75157b11eee188608c3ac7ed6fb1a033bb72750
Diffstat (limited to 'src/compositor')
10 files changed, 50 insertions, 6 deletions
diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index 44e0edf5d..ef78c8849 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -103,9 +103,12 @@ public: void invalidateTexture() { + if (bufferRef) + bufferRef.destroyTexture(); delete texture; texture = 0; update = true; + bufferRef = QWaylandBufferRef(); } QWaylandQuickSurface *surface; @@ -209,6 +212,8 @@ bool QWaylandQuickSurface::event(QEvent *e) this, &QWaylandQuickSurface::updateTexture); disconnect(oldWindow, &QQuickWindow::sceneGraphInvalidated, this, &QWaylandQuickSurface::invalidateTexture); + disconnect(oldWindow, &QQuickWindow::sceneGraphAboutToStop, + this, &QWaylandQuickSurface::invalidateTexture); } return true; @@ -225,6 +230,9 @@ bool QWaylandQuickSurface::event(QEvent *e) connect(window, &QQuickWindow::sceneGraphInvalidated, this, &QWaylandQuickSurface::invalidateTexture, Qt::DirectConnection); + connect(window, &QQuickWindow::sceneGraphAboutToStop, + this, &QWaylandQuickSurface::invalidateTexture, + Qt::DirectConnection); } return true; @@ -236,10 +244,11 @@ bool QWaylandQuickSurface::event(QEvent *e) void QWaylandQuickSurface::updateTexture() { Q_D(QWaylandQuickSurface); + const bool update = d->buffer->update; if (d->buffer->update) d->buffer->createTexture(); foreach (QWaylandSurfaceView *view, views()) - static_cast<QWaylandSurfaceItem *>(view)->updateTexture(); + static_cast<QWaylandSurfaceItem *>(view)->updateTexture(update); } void QWaylandQuickSurface::invalidateTexture() @@ -247,7 +256,8 @@ void QWaylandQuickSurface::invalidateTexture() Q_D(QWaylandQuickSurface); d->buffer->invalidateTexture(); foreach (QWaylandSurfaceView *view, views()) - static_cast<QWaylandSurfaceItem *>(view)->updateTexture(); + static_cast<QWaylandSurfaceItem *>(view)->updateTexture(true); + emit redraw(); } bool QWaylandQuickSurface::clientRenderingEnabled() const diff --git a/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp b/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp index 9fc7fd6ab..355777377 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceinterface.cpp @@ -60,6 +60,7 @@ QWaylandSurfaceInterface::QWaylandSurfaceInterface(QWaylandSurface *surface) QWaylandSurfaceInterface::~QWaylandSurfaceInterface() { d->surface->removeInterface(this); + delete d; } QWaylandSurface *QWaylandSurfaceInterface::surface() const @@ -96,6 +97,11 @@ QWaylandSurfaceOp::QWaylandSurfaceOp(int t) d->type = t; } +QWaylandSurfaceOp::~QWaylandSurfaceOp() +{ + delete d; +} + int QWaylandSurfaceOp::type() const { return d->type; diff --git a/src/compositor/compositor_api/qwaylandsurfaceinterface.h b/src/compositor/compositor_api/qwaylandsurfaceinterface.h index 60d8ae5fa..322037e6d 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceinterface.h +++ b/src/compositor/compositor_api/qwaylandsurfaceinterface.h @@ -62,6 +62,8 @@ public: }; QWaylandSurfaceOp(int t); + virtual ~QWaylandSurfaceOp(); + int type() const; private: diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp index 90a68c4f9..93cfaf008 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp @@ -356,6 +356,11 @@ void QWaylandSurfaceItem::updateBuffer(bool hasBuffer) void QWaylandSurfaceItem::updateTexture() { + updateTexture(false); +} + +void QWaylandSurfaceItem::updateTexture(bool changed) +{ if (!m_provider) m_provider = new QWaylandSurfaceTextureProvider(); @@ -363,7 +368,7 @@ void QWaylandSurfaceItem::updateTexture() if (mapped) m_provider->t = static_cast<QWaylandQuickSurface *>(surface())->texture(); m_provider->smooth = smooth(); - if (m_newTexture) + if (m_newTexture || changed) emit m_provider->textureChanged(); m_newTexture = false; } diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h index 91dc6879b..cb51b6bfb 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.h +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h @@ -125,7 +125,9 @@ protected: private: friend class QWaylandSurfaceNode; + friend class QWaylandQuickSurface; void init(QWaylandQuickSurface *); + void updateTexture(bool changed); static QMutex *mutex; diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp index 7941db824..303b9601a 100644 --- a/src/compositor/wayland_wrapper/qwlcompositor.cpp +++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp @@ -88,9 +88,11 @@ #include <wayland-server.h> +#if defined (QT_COMPOSITOR_WAYLAND_GL) #include "hardware_integration/qwlhwintegration_p.h" #include "hardware_integration/qwlclientbufferintegration_p.h" #include "hardware_integration/qwlserverbufferintegration_p.h" +#endif #include "windowmanagerprotocol/waylandwindowmanagerintegration_p.h" #include "hardware_integration/qwlclientbufferintegrationfactory_p.h" @@ -465,6 +467,7 @@ void Compositor::bindGlobal(wl_client *client, void *data, uint32_t version, uin void Compositor::loadClientBufferIntegration() { +#ifdef QT_COMPOSITOR_WAYLAND_GL QStringList keys = ClientBufferIntegrationFactory::keys(); QString targetKey; QByteArray clientBufferIntegration = qgetenv("QT_WAYLAND_HARDWARE_INTEGRATION"); @@ -486,11 +489,13 @@ void Compositor::loadClientBufferIntegration() m_hw_integration->setClientBufferIntegration(targetKey); } } - //BUG: if there is no client buffer integration, bad things will when opengl is used + //BUG: if there is no client buffer integration, bad things will happen when opengl is used +#endif } void Compositor::loadServerBufferIntegration() { +#ifdef QT_COMPOSITOR_WAYLAND_GL QStringList keys = ServerBufferIntegrationFactory::keys(); QString targetKey; QByteArray serverBufferIntegration = qgetenv("QT_WAYLAND_SERVER_BUFFER_INTEGRATION"); @@ -502,6 +507,7 @@ void Compositor::loadServerBufferIntegration() if (m_hw_integration) m_hw_integration->setServerBufferIntegration(targetKey); } +#endif } void Compositor::registerInputDevice(QWaylandInputDevice *device) diff --git a/src/compositor/wayland_wrapper/qwlinputdevice.cpp b/src/compositor/wayland_wrapper/qwlinputdevice.cpp index cb27ab4e4..ea127ee74 100644 --- a/src/compositor/wayland_wrapper/qwlinputdevice.cpp +++ b/src/compositor/wayland_wrapper/qwlinputdevice.cpp @@ -352,7 +352,7 @@ QWaylandInputDevice *InputDevice::handle() const QWaylandDrag *InputDevice::dragHandle() const { - return m_dragHandle; + return m_dragHandle.data(); } const DataDevice *InputDevice::dataDevice() const diff --git a/src/compositor/wayland_wrapper/qwlinputdevice_p.h b/src/compositor/wayland_wrapper/qwlinputdevice_p.h index 785c6d7e9..8444eaa50 100644 --- a/src/compositor/wayland_wrapper/qwlinputdevice_p.h +++ b/src/compositor/wayland_wrapper/qwlinputdevice_p.h @@ -128,7 +128,7 @@ public: private: QWaylandInputDevice *m_handle; - QWaylandDrag *m_dragHandle; + QScopedPointer<QWaylandDrag> m_dragHandle; Compositor *m_compositor; QWaylandInputDevice::CapabilityFlags m_capabilities; diff --git a/src/compositor/wayland_wrapper/qwlkeyboard.cpp b/src/compositor/wayland_wrapper/qwlkeyboard.cpp index 4f1c451b5..5af3e8c29 100644 --- a/src/compositor/wayland_wrapper/qwlkeyboard.cpp +++ b/src/compositor/wayland_wrapper/qwlkeyboard.cpp @@ -375,6 +375,7 @@ void Keyboard::createXKBKeymap() } strcpy(m_keymap_area, keymap_str); + free(keymap_str); m_state = xkb_state_new(keymap); diff --git a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h index 8e07068bc..580e71d0b 100644 --- a/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h +++ b/src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h @@ -95,7 +95,12 @@ public: bool isDestroyed() { return m_destroyed; } void createTexture(); +#ifdef QT_COMPOSITOR_WAYLAND_GL inline GLuint texture() const; +#else + inline uint texture() const; +#endif + void destroyTexture(); inline struct ::wl_resource *waylandBufferHandle() const { return m_buffer; } @@ -150,12 +155,19 @@ private: friend class ::QWaylandBufferRef; }; +#ifdef QT_COMPOSITOR_WAYLAND_GL GLuint SurfaceBuffer::texture() const { if (m_buffer) return m_texture; return 0; } +#else +uint SurfaceBuffer::texture() const +{ + return 0; +} +#endif } |