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:
parent
5d30b5086d
commit
e1514abaea
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user