diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-12-29 16:20:02 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-12-29 16:20:29 +0100 |
commit | f4bfdc5eed9f153f02f8370dc8bfa4aaea6de38c (patch) | |
tree | bd55c08da1d4c32ff16952b8ea5e3d96c19c5594 /src/compositor | |
parent | 97091ce346cebac7f03a1a98c58d44d8d22edc2e (diff) | |
parent | 19f688dac38ba439dc5068fc6ad02dc271422702 (diff) |
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts:
.qmake.conf
src/compositor/compositor_api/qwaylandsurface.cpp
Change-Id: I3ee40153c959dbe31ea685571c5a8bb1ae36606e
Diffstat (limited to 'src/compositor')
8 files changed, 20 insertions, 11 deletions
diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp index ae3dfbb5d..166514f73 100644 --- a/src/compositor/compositor_api/qwaylandquicksurface.cpp +++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp @@ -212,12 +212,16 @@ void QWaylandQuickSurface::updateTexture() Q_D(QWaylandQuickSurface); if (d->buffer->update) d->buffer->createTexture(); + foreach (QWaylandSurfaceView *view, views()) + static_cast<QWaylandSurfaceItem *>(view)->updateTexture(); } void QWaylandQuickSurface::invalidateTexture() { Q_D(QWaylandQuickSurface); d->buffer->invalidateTexture(); + foreach (QWaylandSurfaceView *view, views()) + static_cast<QWaylandSurfaceItem *>(view)->updateTexture(); } bool QWaylandQuickSurface::clientRenderingEnabled() const diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp index b5c38d88e..8dacc8ec3 100644 --- a/src/compositor/compositor_api/qwaylandsurface.cpp +++ b/src/compositor/compositor_api/qwaylandsurface.cpp @@ -95,8 +95,7 @@ QWaylandSurface::~QWaylandSurface() QWaylandClient *QWaylandSurface::client() const { Q_D(const QWaylandSurface); - - if (!d->compositor()->clients().contains(d->client)) + if (d->isDestroyed() || !d->compositor()->clients().contains(d->client)) return Q_NULLPTR; return d->client; } diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp index 79afa3786..8a0d6bd28 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp @@ -340,13 +340,11 @@ void QWaylandSurfaceItem::updateBuffer(bool hasBuffer) m_newTexture = true; } -QSGNode *QWaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) +void QWaylandSurfaceItem::updateTexture() { if (!m_provider) m_provider = new QWaylandSurfaceTextureProvider(); - // Order here is important, as the state of visible is that of the pending - // buffer but will be replaced after we advance the buffer queue. bool mapped = surface() && surface()->isMapped(); if (mapped) m_provider->t = static_cast<QWaylandQuickSurface *>(surface())->texture(); @@ -354,6 +352,11 @@ QSGNode *QWaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeD if (m_newTexture) emit m_provider->textureChanged(); m_newTexture = false; +} + +QSGNode *QWaylandSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) +{ + bool mapped = surface() && surface()->isMapped(); if (!mapped || !m_provider->t || !m_paintEnabled) { delete oldNode; diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h index fb70705b2..2573fba3e 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceitem.h +++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h @@ -80,6 +80,7 @@ public: bool paintEnabled() const; bool touchEventsEnabled() const { return m_touchEventsEnabled; } bool resizeSurfaceToItem() const { return m_resizeSurfaceToItem; } + void updateTexture(); void setTouchEventsEnabled(bool enabled); void setResizeSurfaceToItem(bool enabled); @@ -124,7 +125,6 @@ protected: private: friend class QWaylandSurfaceNode; - void updateTexture(); void init(QWaylandQuickSurface *); static QMutex *mutex; diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.cpp b/src/compositor/compositor_api/qwaylandsurfaceview.cpp index 3e2c546e0..e6fd90587 100644 --- a/src/compositor/compositor_api/qwaylandsurfaceview.cpp +++ b/src/compositor/compositor_api/qwaylandsurfaceview.cpp @@ -64,8 +64,10 @@ QWaylandSurfaceView::QWaylandSurfaceView(QWaylandSurface *surf) QWaylandSurfaceView::~QWaylandSurfaceView() { - if (d->surface) + if (d->surface) { d->surface->destroy(); + d->surface->d_func()->views.removeOne(this); + } delete d; } diff --git a/src/compositor/wayland_wrapper/qwldataoffer_p.h b/src/compositor/wayland_wrapper/qwldataoffer_p.h index 5911819d8..643322f32 100644 --- a/src/compositor/wayland_wrapper/qwldataoffer_p.h +++ b/src/compositor/wayland_wrapper/qwldataoffer_p.h @@ -41,6 +41,7 @@ #ifndef WLDATAOFFER_H #define WLDATAOFFER_H +#include <QPointer> #include <QtCompositor/private/qwayland-server-wayland.h> QT_BEGIN_NAMESPACE @@ -63,7 +64,7 @@ protected: void data_offer_destroy_resource(Resource *resource) Q_DECL_OVERRIDE; private: - DataSource *m_dataSource; + QPointer<DataSource> m_dataSource; }; } diff --git a/src/compositor/wayland_wrapper/qwldatasource_p.h b/src/compositor/wayland_wrapper/qwldatasource_p.h index 01ac4cbd9..013f4b54f 100644 --- a/src/compositor/wayland_wrapper/qwldatasource_p.h +++ b/src/compositor/wayland_wrapper/qwldatasource_p.h @@ -42,7 +42,7 @@ #define WLDATASOURCE_H #include <QtCompositor/private/qwayland-server-wayland.h> - +#include <QObject> #include <QtCore/QList> QT_BEGIN_NAMESPACE @@ -53,7 +53,7 @@ class DataOffer; class DataDevice; class DataDeviceManager; -class DataSource : public QtWaylandServer::wl_data_source +class DataSource : public QObject, public QtWaylandServer::wl_data_source { public: DataSource(struct wl_client *client, uint32_t id, uint32_t time); diff --git a/src/compositor/wayland_wrapper/qwlextendedsurface.cpp b/src/compositor/wayland_wrapper/qwlextendedsurface.cpp index 55878295d..e4ba40e70 100644 --- a/src/compositor/wayland_wrapper/qwlextendedsurface.cpp +++ b/src/compositor/wayland_wrapper/qwlextendedsurface.cpp @@ -174,7 +174,7 @@ void ExtendedSurface::extended_surface_set_window_flags(Resource *resource, int3 { Q_UNUSED(resource); QWaylandSurface::WindowFlags windowFlags(flags); - if (m_surface || windowFlags == m_windowFlags) + if (!m_surface || windowFlags == m_windowFlags) return; m_windowFlags = windowFlags; emit m_surface->waylandSurface()->windowFlagsChanged(windowFlags); |