summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-06 13:41:27 +0200
committerJørgen Lind <jorgen.lind@theqtcompany.com>2015-08-28 13:10:32 +0200
commitfd9a8983832bbeb240097327ff9f8565f7356b08 (patch)
treedb359b31c502694b3c33e451825fda7257c31bc1
parente6a44555c60859fd61a6cc78140a36fa36e7b9f5 (diff)
Fixups after rebasing
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.cpp21
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.h5
-rw-r--r--src/compositor/compositor_api/qwaylandoutput.cpp2
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.cpp14
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.h4
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.cpp40
-rw-r--r--src/compositor/compositor_api/qwaylandquicksurface.h2
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp70
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h37
-rw-r--r--src/compositor/compositor_api/qwaylandview.cpp16
-rw-r--r--src/compositor/compositor_api/qwaylandview.h3
-rw-r--r--src/compositor/compositor_api/qwaylandview_p.h2
-rw-r--r--src/compositor/extensions/qwlshellsurface.cpp11
-rw-r--r--src/compositor/extensions/qwlshellsurface_p.h4
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlkeyboard.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlkeyboard_p.h9
-rw-r--r--src/compositor/wayland_wrapper/qwlpointer.cpp2
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp35
19 files changed, 78 insertions, 203 deletions
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
index 0f8462211..bb8d3463a 100644
--- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
+++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
@@ -179,9 +179,16 @@ void QWindowCompositor::surfaceDestroyed()
m_renderScheduler.start(0);
}
-void QWindowCompositor::surfaceMapped()
+void QWindowCompositor::surfaceMappedChanged()
{
QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());
+ if (surface->isMapped())
+ surfaceMapped(surface);
+ else
+ surfaceUnmapped(surface);
+}
+void QWindowCompositor::surfaceMapped(QWaylandSurface *surface)
+{
QtWayland::ShellSurface *shellSurface = QtWayland::ShellSurface::findIn(surface);
QPoint pos;
if (!m_surfaces.contains(surface)) {
@@ -206,16 +213,15 @@ void QWindowCompositor::surfaceMapped()
}
m_surfaces.append(surface);
- defaultInputDevice()->setKeyboardFocus(surface);
+ if (!surface->isCursorSurface())
+ defaultInputDevice()->setKeyboardFocus(surface);
m_renderScheduler.start(0);
}
-void QWindowCompositor::surfaceUnmapped()
+void QWindowCompositor::surfaceUnmapped(QWaylandSurface *surface)
{
- QWaylandSurface *surface = qobject_cast<QWaylandSurface *>(sender());
- if (m_surfaces.removeOne(surface))
- m_surfaces.insert(0, surface);
+ m_surfaces.removeOne(surface);
ensureKeyboardFocusSurface(surface);
m_renderScheduler.start(0);
@@ -241,8 +247,7 @@ void QWindowCompositor::surfaceCommitted(QWaylandSurface *surface)
void QWindowCompositor::onSurfaceCreated(QWaylandSurface *surface)
{
connect(surface, SIGNAL(surfaceDestroyed()), this, SLOT(surfaceDestroyed()));
- connect(surface, SIGNAL(mapped()), this, SLOT(surfaceMapped()));
- connect(surface, SIGNAL(unmapped()), this, SLOT(surfaceUnmapped()));
+ connect(surface, SIGNAL(mappedChanged()), this, SLOT(surfaceMappedChanged()));
connect(surface, SIGNAL(redraw()), this, SLOT(surfaceCommitted()));
connect(surface, SIGNAL(extendedSurfaceReady()), this, SLOT(sendExpose()));
}
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.h b/examples/wayland/qwindow-compositor/qwindowcompositor.h
index 7534b57b0..2ac302f2f 100644
--- a/examples/wayland/qwindow-compositor/qwindowcompositor.h
+++ b/examples/wayland/qwindow-compositor/qwindowcompositor.h
@@ -70,9 +70,8 @@ public:
void create() Q_DECL_OVERRIDE;
private slots:
+ void surfaceMappedChanged();
void surfaceDestroyed();
- void surfaceMapped();
- void surfaceUnmapped();
void surfaceCommitted();
void surfacePosChanged();
@@ -98,6 +97,8 @@ private slots:
void updateCursor(bool hasBuffer);
private:
+ void surfaceMapped(QWaylandSurface *surface);
+ void surfaceUnmapped(QWaylandSurface *surface);
void drawSubSurface(const QPoint &offset, QWaylandSurface *surface);
CompositorWindow *m_window;
diff --git a/src/compositor/compositor_api/qwaylandoutput.cpp b/src/compositor/compositor_api/qwaylandoutput.cpp
index 9b8b252ba..08aaf589d 100644
--- a/src/compositor/compositor_api/qwaylandoutput.cpp
+++ b/src/compositor/compositor_api/qwaylandoutput.cpp
@@ -282,6 +282,8 @@ QWaylandView *QWaylandOutput::pickView(const QPointF &outputPosition) const
const QVector<QtWayland::SurfaceViewMapper> surfaceViewMappers = d_ptr->surfaceMappers();
for (int nSurface = 0; surfaceViewMappers.size(); nSurface++) {
const QWaylandSurface *surface = surfaceViewMappers.at(nSurface).surface;
+ if (surface->isCursorSurface())
+ continue;
const QVector<QWaylandView *> views = surfaceViewMappers.at(nSurface).views;
for (int nView = 0; views.size(); nView++) {
if (QRectF(views.at(nView)->requestedPosition(), surface->size()).contains(outputPosition))
diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp
index ef62257ad..4e357dea2 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.cpp
+++ b/src/compositor/compositor_api/qwaylandquickitem.cpp
@@ -239,6 +239,7 @@ void QWaylandQuickItem::hoverMoveEvent(QHoverEvent *event)
event->ignore();
return;
}
+ }
if (shouldSendInputEvents()) {
QWaylandInputDevice *inputDevice = compositor()->inputDeviceFor(event);
inputDevice->sendMouseMoveEvent(this, event->pos());
@@ -335,16 +336,14 @@ void QWaylandQuickItem::waylandSurfaceChanged(QWaylandSurface *newSurface, QWayl
{
QWaylandView::waylandSurfaceChanged(newSurface, oldSurface);
if (oldSurface) {
- disconnect(oldSurface, &QWaylandSurface::mapped, this, &QWaylandQuickItem::surfaceMapped);
- disconnect(oldSurface, &QWaylandSurface::unmapped, this, &QWaylandQuickItem::surfaceUnmapped);
+ disconnect(oldSurface, &QWaylandSurface::mappedChanged, this, &QWaylandQuickItem::surfaceMappedChanged);
disconnect(oldSurface, &QWaylandSurface::parentChanged, this, &QWaylandQuickItem::parentChanged);
disconnect(oldSurface, &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize);
disconnect(oldSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
disconnect(oldSurface, &QWaylandSurface::redraw, this, &QQuickItem::update);
}
if (newSurface) {
- connect(newSurface, &QWaylandSurface::mapped, this, &QWaylandQuickItem::surfaceMapped);
- connect(newSurface, &QWaylandSurface::unmapped, this, &QWaylandQuickItem::surfaceUnmapped);
+ connect(newSurface, &QWaylandSurface::mappedChanged, this, &QWaylandQuickItem::surfaceMappedChanged);
connect(newSurface, &QWaylandSurface::parentChanged, this, &QWaylandQuickItem::parentChanged);
connect(newSurface, &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize);
connect(newSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
@@ -379,12 +378,7 @@ void QWaylandQuickItem::takeFocus(QWaylandInputDevice *device)
target->setKeyboardFocus(surface());
}
-void QWaylandQuickItem::surfaceMapped()
-{
- update();
-}
-
-void QWaylandQuickItem::surfaceUnmapped()
+void QWaylandQuickItem::surfaceMappedChanged()
{
update();
}
diff --git a/src/compositor/compositor_api/qwaylandquickitem.h b/src/compositor/compositor_api/qwaylandquickitem.h
index 20a4256a5..d7b32c1aa 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.h
+++ b/src/compositor/compositor_api/qwaylandquickitem.h
@@ -112,6 +112,7 @@ protected:
void mouseReleaseEvent(QMouseEvent *event);
void hoverEnterEvent(QHoverEvent *event);
void hoverMoveEvent(QHoverEvent *event);
+ void hoverLeaveEvent(QHoverEvent *event);
void wheelEvent(QWheelEvent *event);
void keyPressEvent(QKeyEvent *event);
@@ -128,8 +129,7 @@ public Q_SLOTS:
void setPaintEnabled(bool paintEnabled);
private Q_SLOTS:
- void surfaceMapped();
- void surfaceUnmapped();
+ void surfaceMappedChanged();
void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent);
void updateSize();
void updateBuffer(bool hasBuffer);
diff --git a/src/compositor/compositor_api/qwaylandquicksurface.cpp b/src/compositor/compositor_api/qwaylandquicksurface.cpp
index 71bb6e3a6..f5399699d 100644
--- a/src/compositor/compositor_api/qwaylandquicksurface.cpp
+++ b/src/compositor/compositor_api/qwaylandquicksurface.cpp
@@ -114,46 +114,6 @@ QWindow *QWaylandQuickSurface::primaryOutputWindow() const
return primaryOutput() ? primaryOutput()->window() : Q_NULLPTR;
}
-bool QWaylandQuickSurface::event(QEvent *e)
-{
- if (e->type() == static_cast<QEvent::Type>(QWaylandSurfaceLeaveEvent::WaylandSurfaceLeave)) {
- QWaylandSurfaceLeaveEvent *event = static_cast<QWaylandSurfaceLeaveEvent *>(e);
-
- if (event->output()) {
- QQuickWindow *oldWindow = static_cast<QQuickWindow *>(event->output()->window());
- disconnect(oldWindow, &QQuickWindow::beforeSynchronizing,
- this, &QWaylandQuickSurface::updateTexture);
- disconnect(oldWindow, &QQuickWindow::sceneGraphInvalidated,
- this, &QWaylandQuickSurface::invalidateTexture);
- disconnect(oldWindow, &QQuickWindow::sceneGraphAboutToStop,
- this, &QWaylandQuickSurface::invalidateTexture);
- }
-
- return true;
- }
-
- if (e->type() == static_cast<QEvent::Type>(QWaylandSurfaceEnterEvent::WaylandSurfaceEnter)) {
- QWaylandSurfaceEnterEvent *event = static_cast<QWaylandSurfaceEnterEvent *>(e);
-
- if (event->output()) {
- QQuickWindow *window = static_cast<QQuickWindow *>(event->output()->window());
- connect(window, &QQuickWindow::beforeSynchronizing,
- this, &QWaylandQuickSurface::updateTexture,
- Qt::DirectConnection);
- connect(window, &QQuickWindow::sceneGraphInvalidated,
- this, &QWaylandQuickSurface::invalidateTexture,
- Qt::DirectConnection);
- connect(window, &QQuickWindow::sceneGraphAboutToStop,
- this, &QWaylandQuickSurface::invalidateTexture,
- Qt::DirectConnection);
- }
-
- return true;
- }
-
- return QObject::event(e);
-}
-
bool QWaylandQuickSurface::clientRenderingEnabled() const
{
Q_D(const QWaylandQuickSurface);
diff --git a/src/compositor/compositor_api/qwaylandquicksurface.h b/src/compositor/compositor_api/qwaylandquicksurface.h
index abc363347..622a1e7e0 100644
--- a/src/compositor/compositor_api/qwaylandquicksurface.h
+++ b/src/compositor/compositor_api/qwaylandquicksurface.h
@@ -65,8 +65,6 @@ public:
void setClientRenderingEnabled(bool enabled);
QWindow *primaryOutputWindow() const;
-protected:
- bool event(QEvent *event) Q_DECL_OVERRIDE;
Q_SIGNALS:
void useTextureAlphaChanged();
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index 6fcf6ea56..d6d9b1d53 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -58,10 +58,9 @@
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
-QT_BEGIN_NAMESPACE
+#include <QtCore/QDebug>
-const QEvent::Type QWaylandSurfaceEnterEvent::WaylandSurfaceEnter = (QEvent::Type)QEvent::registerEventType();
-const QEvent::Type QWaylandSurfaceLeaveEvent::WaylandSurfaceLeave = (QEvent::Type)QEvent::registerEventType();
+QT_BEGIN_NAMESPACE
QWaylandSurfacePrivate::QWaylandSurfacePrivate(wl_client *wlClient, quint32 id, int version, QWaylandCompositor *compositor, QWaylandSurface *surface)
: QtWayland::Surface(wlClient, id, version, compositor, surface)
@@ -78,64 +77,6 @@ QWaylandSurfacePrivate::~QWaylandSurfacePrivate()
views.clear();
}
-class QWaylandSurfaceEnterEventPrivate
-{
-public:
- QWaylandSurfaceEnterEventPrivate(QWaylandOutput *_output)
- : output(_output)
- {
- }
-
- QWaylandOutput *output;
-};
-
-
-QWaylandSurfaceEnterEvent::QWaylandSurfaceEnterEvent(QWaylandOutput *output)
- : QEvent(WaylandSurfaceEnter)
- , d(new QWaylandSurfaceEnterEventPrivate(output))
-{
-}
-
-QWaylandSurfaceEnterEvent::~QWaylandSurfaceEnterEvent()
-{
- delete d;
-}
-
-QWaylandOutput *QWaylandSurfaceEnterEvent::output() const
-{
- return d->output;
-}
-
-
-class QWaylandSurfaceLeaveEventPrivate
-{
-public:
- QWaylandSurfaceLeaveEventPrivate(QWaylandOutput *_output)
- : output(_output)
- {
- }
-
- QWaylandOutput *output;
-};
-
-
-QWaylandSurfaceLeaveEvent::QWaylandSurfaceLeaveEvent(QWaylandOutput *output)
- : QEvent(WaylandSurfaceLeave)
- , d(new QWaylandSurfaceLeaveEventPrivate(output))
-{
-}
-
-QWaylandSurfaceLeaveEvent::~QWaylandSurfaceLeaveEvent()
-{
- delete d;
-}
-
-QWaylandOutput *QWaylandSurfaceLeaveEvent::output() const
-{
- return d->output;
-}
-
-
QWaylandSurface::QWaylandSurface(wl_client *client, quint32 id, int version, QWaylandCompositor *compositor)
: QObject(*new QWaylandSurfacePrivate(client, id, version, compositor, this))
{
@@ -158,6 +99,7 @@ QWaylandClient *QWaylandSurface::client() const
Q_D(const QWaylandSurface);
if (d->isDestroyed() || !d->compositor()->clients().contains(d->client))
return Q_NULLPTR;
+
return d->client;
}
@@ -329,12 +271,6 @@ void QWaylandSurface::deref()
compositor()->handle()->destroySurface(d);
}
-void QWaylandSurface::setMapped(bool mapped)
-{
- Q_D(QWaylandSurface);
- d->setMapped(mapped);
-}
-
QList<QWaylandView *> QWaylandSurface::views() const
{
Q_D(const QWaylandSurface);
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index 2295a3a34..038c7d611 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -66,38 +66,6 @@ class SurfacePrivate;
class ExtendedSurface;
}
-class QWaylandSurfaceEnterEventPrivate;
-
-class Q_COMPOSITOR_EXPORT QWaylandSurfaceEnterEvent : public QEvent
-{
-public:
- QWaylandSurfaceEnterEvent(QWaylandOutput *output);
- ~QWaylandSurfaceEnterEvent();
-
- QWaylandOutput *output() const;
-
- static const QEvent::Type WaylandSurfaceEnter;
-
-private:
- QWaylandSurfaceEnterEventPrivate *d;
-};
-
-class QWaylandSurfaceLeaveEventPrivate;
-
-class Q_COMPOSITOR_EXPORT QWaylandSurfaceLeaveEvent : public QEvent
-{
-public:
- QWaylandSurfaceLeaveEvent(QWaylandOutput *output);
- ~QWaylandSurfaceLeaveEvent();
-
- QWaylandOutput *output() const;
-
- static const QEvent::Type WaylandSurfaceLeave;
-
-private:
- QWaylandSurfaceLeaveEventPrivate *d;
-};
-
class Q_COMPOSITOR_EXPORT QWaylandSurface : public QObject, public QWaylandExtensionContainer
{
Q_OBJECT
@@ -109,6 +77,7 @@ class Q_COMPOSITOR_EXPORT QWaylandSurface : public QObject, public QWaylandExten
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QWaylandOutput *primaryOutput READ primaryOutput WRITE setPrimaryOutput NOTIFY primaryOutputChanged)
Q_PROPERTY(QWaylandSurface::Origin origin READ origin NOTIFY originChanged)
+ Q_PROPERTY(bool isMapped READ isMapped NOTIFY mappedChanged)
public:
enum Origin {
@@ -156,7 +125,6 @@ public:
void ref();
void deref();
- void setMapped(bool mapped);
QList<QWaylandView *> views() const;
@@ -176,8 +144,7 @@ protected:
QWaylandSurface(QWaylandSurfacePrivate *dptr);
Q_SIGNALS:
- void mapped();
- void unmapped();
+ void mappedChanged();
void damaged(const QRegion &rect);
void parentChanged(QWaylandSurface *newParent, QWaylandSurface *oldParent);
void sizeChanged();
diff --git a/src/compositor/compositor_api/qwaylandview.cpp b/src/compositor/compositor_api/qwaylandview.cpp
index 81c199964..1a64b73ee 100644
--- a/src/compositor/compositor_api/qwaylandview.cpp
+++ b/src/compositor/compositor_api/qwaylandview.cpp
@@ -104,10 +104,13 @@ void QWaylandView::setSurface(QWaylandSurface *newSurface)
QWaylandSurfacePrivate::get(newSurface)->refView(this);
waylandSurfaceChanged(newSurface, oldSurface);
- if (!d->lockedBuffer)
+ if (!d->lockedBuffer) {
d->currentBuffer = QWaylandBufferRef();
+ d->currentDamage = QRegion();
+ }
d->nextBuffer = QWaylandBufferRef();
+ d->nextDamage = QRegion();
}
QWaylandOutput *QWaylandView::output() const
@@ -157,11 +160,12 @@ QPointF QWaylandView::pos() const
return d->requestedPos;
}
-void QWaylandView::attach(const QWaylandBufferRef &ref)
+void QWaylandView::attach(const QWaylandBufferRef &ref, const QRegion &damage)
{
Q_D(QWaylandView);
QMutexLocker locker(&d->bufferMutex);
d->nextBuffer = ref;
+ d->nextDamage = damage;
}
bool QWaylandView::advance()
@@ -175,6 +179,7 @@ bool QWaylandView::advance()
QMutexLocker locker(&d->bufferMutex);
d->currentBuffer = d->nextBuffer;
+ d->currentDamage = d->nextDamage;
return true;
}
@@ -185,6 +190,13 @@ QWaylandBufferRef QWaylandView::currentBuffer()
return d->currentBuffer;
}
+QRegion QWaylandView::currentDamage()
+{
+ Q_D(QWaylandView);
+ QMutexLocker locker(&d->bufferMutex);
+ return d->currentDamage;
+}
+
bool QWaylandView::lockedBuffer() const
{
Q_D(const QWaylandView);
diff --git a/src/compositor/compositor_api/qwaylandview.h b/src/compositor/compositor_api/qwaylandview.h
index 3e69e9b8a..a11e20df9 100644
--- a/src/compositor/compositor_api/qwaylandview.h
+++ b/src/compositor/compositor_api/qwaylandview.h
@@ -67,9 +67,10 @@ public:
virtual QPointF requestedPosition() const;
virtual QPointF pos() const;
- virtual void attach(const QWaylandBufferRef &ref);
+ virtual void attach(const QWaylandBufferRef &ref, const QRegion &damage);
virtual bool advance();
virtual QWaylandBufferRef currentBuffer();
+ virtual QRegion currentDamage();
bool lockedBuffer() const;
void setLockedBuffer(bool locked);
diff --git a/src/compositor/compositor_api/qwaylandview_p.h b/src/compositor/compositor_api/qwaylandview_p.h
index c805e78df..777675f96 100644
--- a/src/compositor/compositor_api/qwaylandview_p.h
+++ b/src/compositor/compositor_api/qwaylandview_p.h
@@ -73,7 +73,9 @@ public:
QPointF requestedPos;
QMutex bufferMutex;
QWaylandBufferRef currentBuffer;
+ QRegion currentDamage;
QWaylandBufferRef nextBuffer;
+ QRegion nextDamage;
bool lockedBuffer;
bool broadcastRequestedPositionChanged;
};
diff --git a/src/compositor/extensions/qwlshellsurface.cpp b/src/compositor/extensions/qwlshellsurface.cpp
index e2d92c5ed..1a4e87bbb 100644
--- a/src/compositor/extensions/qwlshellsurface.cpp
+++ b/src/compositor/extensions/qwlshellsurface.cpp
@@ -92,8 +92,7 @@ ShellSurface::ShellSurface(Shell *shell, wl_client *client, uint32_t id, Surface
, m_transientParent(0)
, m_transientOffset()
{
- connect(surface->waylandSurface(), &QWaylandSurface::configure, this, &ShellSurface::configure);
- connect(surface->waylandSurface(), &QWaylandSurface::mapped, this, &ShellSurface::mapped);
+ connect(surface->waylandSurface(), &QWaylandSurface::mappedChanged, this, &ShellSurface::mappedChanged);
connect(surface->waylandSurface(), &QWaylandSurface::offsetForNextFrame, this, &ShellSurface::adjustOffset);
}
@@ -169,13 +168,11 @@ void ShellSurface::setOffset(const QPointF &offset)
setTransientOffset(offset);
}
-void ShellSurface::configure(bool hasBuffer)
+void ShellSurface::mappedChanged()
{
- m_surface->setMapped(hasBuffer);
-}
+ if (!m_surface->waylandSurface()->isMapped())
+ return;
-void ShellSurface::mapped()
-{
if (m_surfaceType == Popup) {
if (m_surface->mapped() && m_popupGrabber->grabSerial() == m_popupSerial) {
m_popupGrabber->addPopup(this);
diff --git a/src/compositor/extensions/qwlshellsurface_p.h b/src/compositor/extensions/qwlshellsurface_p.h
index 8afc2fb25..d222fba03 100644
--- a/src/compositor/extensions/qwlshellsurface_p.h
+++ b/src/compositor/extensions/qwlshellsurface_p.h
@@ -101,8 +101,6 @@ public:
void setOffset(const QPointF &offset);
- void configure(bool hasBuffer);
-
void requestSize(const QSize &size);
Q_INVOKABLE void ping();
@@ -126,7 +124,7 @@ Q_SIGNALS:
void surfaceTypeChanged();
private Q_SLOTS:
- void mapped();
+ void mappedChanged();
void adjustOffset(const QPoint &p);
private:
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp
index 722893bbf..3fef11521 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp
@@ -100,8 +100,6 @@ QT_BEGIN_NAMESPACE
namespace QtWayland {
-static Compositor *compositor;
-
class WindowSystemEventHandler : public QWindowSystemEventHandler
{
public:
diff --git a/src/compositor/wayland_wrapper/qwlkeyboard.cpp b/src/compositor/wayland_wrapper/qwlkeyboard.cpp
index 7ee0e11cc..d40422c31 100644
--- a/src/compositor/wayland_wrapper/qwlkeyboard.cpp
+++ b/src/compositor/wayland_wrapper/qwlkeyboard.cpp
@@ -113,6 +113,8 @@ QWaylandKeyboardPrivate *QWaylandKeyboardPrivate::get(QWaylandKeyboard *keyboard
void QWaylandKeyboardPrivate::focused(QWaylandSurface *surface)
{
+ if (surface && surface->isCursorSurface())
+ surface = Q_NULLPTR;
if (m_focusResource && m_focus != surface) {
uint32_t serial = wl_display_next_serial(compositor()->waylandDisplay());
send_leave(m_focusResource->handle, serial, m_focus->handle()->resource()->handle);
diff --git a/src/compositor/wayland_wrapper/qwlkeyboard_p.h b/src/compositor/wayland_wrapper/qwlkeyboard_p.h
index 1c1651989..bcd0bab69 100644
--- a/src/compositor/wayland_wrapper/qwlkeyboard_p.h
+++ b/src/compositor/wayland_wrapper/qwlkeyboard_p.h
@@ -100,16 +100,17 @@ public:
struct xkb_state *xkbState() const { return m_state; }
uint32_t xkbModsMask() const { return m_modsDepressed | m_modsLatched | m_modsLocked; }
#endif
+ void keyEvent(uint code, uint32_t state);
+ void sendKeyEvent(uint code, uint32_t state);
+ void updateModifierState(uint code, uint32_t state);
+ void updateKeymap();
+
protected:
void keyboard_bind_resource(Resource *resource);
void keyboard_destroy_resource(Resource *resource);
void keyboard_release(Resource *resource) Q_DECL_OVERRIDE;
private:
- void keyEvent(uint code, uint32_t state);
- void sendKeyEvent(uint code, uint32_t state);
- void updateModifierState(uint code, uint32_t state);
- void updateKeymap();
#ifndef QT_NO_WAYLAND_XKB
void initXKB();
diff --git a/src/compositor/wayland_wrapper/qwlpointer.cpp b/src/compositor/wayland_wrapper/qwlpointer.cpp
index cf02d003c..13963d269 100644
--- a/src/compositor/wayland_wrapper/qwlpointer.cpp
+++ b/src/compositor/wayland_wrapper/qwlpointer.cpp
@@ -147,6 +147,8 @@ void QWaylandPointerPrivate::sendMouseReleaseEvent(Qt::MouseButton button)
void QWaylandPointerPrivate::sendMouseMoveEvent(QWaylandView *view, const QPointF &localPos, const QPointF &outputSpacePos)
{
Q_Q(QWaylandPointer);
+ if (view && (!view->surface() || view->surface()->isCursorSurface()))
+ view = Q_NULLPTR;
m_seat->setMouseFocus(view);
m_localPosition = localPos;
m_spacePosition = outputSpacePos;
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index 95aa8c98b..7992f6d18 100644
--- a/src/compositor/wayland_wrapper/qwlsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurface.cpp
@@ -163,11 +163,6 @@ Surface *Surface::fromResource(struct ::wl_resource *resource)
return static_cast<Surface *>(Resource::fromResource(resource)->surface_object);
}
-bool Surface::mapped() const
-{
- return m_buffer && bool(m_buffer->waylandBufferHandle());
-}
-
QSize Surface::size() const
{
return m_size;
@@ -278,31 +273,35 @@ void Surface::setBackBuffer(SurfaceBuffer *buffer, const QRegion &damage)
if (valid)
setSize(m_buffer->size());
- m_damage = m_damage.intersected(QRect(QPoint(), m_size));
- emit m_waylandSurface->damaged(m_damage);
+ m_damage = damage.intersected(QRect(QPoint(), m_size));
+ } else {
+ setSize(QSize());
+ m_damage = QRect();
}
- m_damage = damage;
-
QWaylandSurfacePrivate *priv = QWaylandSurfacePrivate::get(waylandSurface());
for (int i = 0; i < priv->views.size(); i++) {
- priv->views.at(i)->attach(m_bufferRef);
+ priv->views.at(i)->attach(m_bufferRef, m_damage);
}
- emit m_waylandSurface->configure(m_bufferRef.hasBuffer());
+ emit m_waylandSurface->damaged(m_damage);
+ setMapped(m_bufferRef.hasBuffer());
if (!m_pending.offset.isNull())
emit m_waylandSurface->offsetForNextFrame(m_pending.offset);
}
+bool Surface::mapped() const
+{
+ return m_buffer && bool(m_buffer->waylandBufferHandle());
+}
+
void Surface::setMapped(bool mapped)
{
- if (!m_surfaceMapped && mapped) {
- m_surfaceMapped = true;
- emit m_waylandSurface->mapped();
- } else if (!mapped && m_surfaceMapped) {
- m_surfaceMapped = false;
- emit m_waylandSurface->unmapped();
- }
+ if (m_surfaceMapped == mapped)
+ return;
+
+ m_surfaceMapped = mapped;
+ emit m_waylandSurface->mappedChanged();
}
SurfaceBuffer *Surface::createSurfaceBuffer(struct ::wl_resource *buffer)