Add support for setMask to set input region

Also fix input region handling in compositor.

Change-Id: If88ad6a03443526eddee045d7af54daf5057373a
Done-with: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
This commit is contained in:
Jan Arne Petersen 2014-08-10 06:54:55 +02:00
parent 5d30b5086d
commit e1514abaea
4 changed files with 34 additions and 0 deletions

View File

@ -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();

View File

@ -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;

View File

@ -88,6 +88,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
, mMouseDevice(0)
, mMouseSerial(0)
, mState(Qt::WindowNoState)
, mMask()
{
init(mDisplay->createSurface(static_cast<QtWayland::wl_surface *>(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);

View File

@ -139,6 +139,8 @@ public:
void raise() Q_DECL_OVERRIDE;
void lower() Q_DECL_OVERRIDE;
void setMask(const QRegion &region) 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);