diff --git a/src/plugins/platforms/wayland/qwaylanddisplay.cpp b/src/plugins/platforms/wayland/qwaylanddisplay.cpp index 5764d3110fd..4475356b0af 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay.cpp +++ b/src/plugins/platforms/wayland/qwaylanddisplay.cpp @@ -96,6 +96,16 @@ QWaylandShellSurface *QWaylandDisplay::createShellSurface(QWaylandWindow *window return Q_NULLPTR; } +struct ::wl_region *QWaylandDisplay::createRegion(const QRegion &qregion) +{ + struct ::wl_region *region = mCompositor.create_region(); + + Q_FOREACH (const QRect &rect, qregion.rects()) + wl_region_add(region, rect.x(), rect.y(), rect.width(), rect.height()); + + return region; +} + QWaylandClientBufferIntegration * QWaylandDisplay::clientBufferIntegration() const { return mWaylandIntegration->clientBufferIntegration(); diff --git a/src/plugins/platforms/wayland/qwaylanddisplay_p.h b/src/plugins/platforms/wayland/qwaylanddisplay_p.h index 6ed30d195a4..ade8475e7d9 100644 --- a/src/plugins/platforms/wayland/qwaylanddisplay_p.h +++ b/src/plugins/platforms/wayland/qwaylanddisplay_p.h @@ -103,6 +103,7 @@ public: struct wl_surface *createSurface(void *handle); QWaylandShellSurface *createShellSurface(QWaylandWindow *window); + struct ::wl_region *createRegion(const QRegion &qregion); QWaylandClientBufferIntegration *clientBufferIntegration() const; diff --git a/src/plugins/platforms/wayland/qwaylandwindow.cpp b/src/plugins/platforms/wayland/qwaylandwindow.cpp index a6190c0d171..a3e9b53cf28 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow.cpp +++ b/src/plugins/platforms/wayland/qwaylandwindow.cpp @@ -88,6 +88,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window) , mMouseDevice(0) , mMouseSerial(0) , mState(Qt::WindowNoState) + , mMask() { init(mDisplay->createSurface(static_cast(this))); @@ -124,6 +125,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window) setOrientationMask(window->screen()->orientationUpdateMask()); setWindowFlags(window->flags()); setGeometry_helper(window->geometry()); + setMask(window->mask()); setWindowStateInternal(window->windowState()); handleContentOrientationChange(window->contentOrientation()); } @@ -262,6 +264,24 @@ void QWaylandWindow::lower() mShellSurface->lower(); } +void QWaylandWindow::setMask(const QRegion &mask) +{ + if (mMask == mask) + return; + + mMask = mask; + + if (mMask.isEmpty()) { + set_input_region(0); + } else { + struct ::wl_region *region = mDisplay->createRegion(mMask); + set_input_region(region); + wl_region_destroy(region); + } + + commit(); +} + void QWaylandWindow::configure(uint32_t edges, int32_t width, int32_t height) { QMutexLocker resizeLocker(&mResizeLock); diff --git a/src/plugins/platforms/wayland/qwaylandwindow_p.h b/src/plugins/platforms/wayland/qwaylandwindow_p.h index 9c0be84c6a5..85e9f429ee1 100644 --- a/src/plugins/platforms/wayland/qwaylandwindow_p.h +++ b/src/plugins/platforms/wayland/qwaylandwindow_p.h @@ -139,6 +139,8 @@ public: void raise() Q_DECL_OVERRIDE; void lower() Q_DECL_OVERRIDE; + void setMask(const QRegion ®ion) Q_DECL_OVERRIDE; + void requestActivateWindow() Q_DECL_OVERRIDE; bool isExposed() const Q_DECL_OVERRIDE; @@ -215,6 +217,7 @@ protected: int mMouseSerial; Qt::WindowState mState; + QRegion mMask; private: bool setWindowStateInternal(Qt::WindowState flags);