summaryrefslogtreecommitdiffstats
path: root/src/compositor
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-06-29 20:14:23 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2015-06-29 20:14:23 +0200
commit85956a9149c578d7a750fad0dc66e89eaa337ef5 (patch)
tree1e174c75f6010503ce081760814e8659ec4415b6 /src/compositor
parent2d9cd132061562902a9b347b87fd3ba20f434532 (diff)
parent05ea6b992f32443df27e38bdc8b21cf970755b57 (diff)
Merge remote-tracking branch 'origin/5.5' into dev
Conflicts: .qmake.conf Change-Id: Ic75157b11eee188608c3ac7ed6fb1a033bb72750
Diffstat (limited to 'src/compositor')
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.cpp14
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceinterface.cpp6
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceinterface.h2
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.cpp7
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.h2
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp8
-rw-r--r--src/compositor/wayland_wrapper/qwlinputdevice.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlinputdevice_p.h2
-rw-r--r--src/compositor/wayland_wrapper/qwlkeyboard.cpp1
-rw-r--r--src/compositor/wayland_wrapper/qwlsurfacebuffer_p.h12
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
}