13void QWaylandQuickShellSurfaceItemPrivate::setShellSurface(QWaylandShellSurface *shellSurface)
15 Q_Q(QWaylandQuickShellSurfaceItem);
18 QObject::disconnect(m_shellSurface, &QObject::destroyed, q,
nullptr);
19 QObject::disconnect(m_shellSurface, &QWaylandShellSurface::modalChanged, q,
nullptr);
22 m_shellSurface = shellSurface;
24 if (m_shellIntegration) {
25 q->removeEventFilter(m_shellIntegration);
26 delete m_shellIntegration;
27 m_shellIntegration =
nullptr;
31 m_shellIntegration = m_shellSurface->createIntegration(q);
32 q->installEventFilter(m_shellIntegration);
34 QObject::connect(m_shellSurface, &QObject::destroyed,
36 setShellSurface(
nullptr);
37 emit q_func()->shellSurfaceChanged();
39 QObject::connect(m_shellSurface, &QWaylandShellSurface::modalChanged,
41 if (m_shellSurface && m_shellSurface->isModal())
47QWaylandQuickShellSurfaceItem *QWaylandQuickShellSurfaceItemPrivate::maybeCreateAutoPopup(QWaylandShellSurface* shellSurface)
49 if (!m_autoCreatePopupItems)
52 Q_Q(QWaylandQuickShellSurfaceItem);
53 auto *popupItem =
new QWaylandQuickShellSurfaceItem(q);
54 popupItem->setShellSurface(shellSurface);
55 popupItem->setAutoCreatePopupItems(
true);
56 QObject::connect(popupItem, &QWaylandQuickShellSurfaceItem::surfaceDestroyed,
57 popupItem, &QObject::deleteLater);
131void QWaylandQuickShellSurfaceItem::setShellSurface(QWaylandShellSurface *shellSurface)
133 Q_D(QWaylandQuickShellSurfaceItem);
134 if (d->m_shellSurface == shellSurface)
137 d->setShellSurface(shellSurface);
139 emit shellSurfaceChanged();
163void QWaylandQuickShellSurfaceItem::setMoveItem(QQuickItem *moveItem)
165 Q_D(QWaylandQuickShellSurfaceItem);
166 moveItem = moveItem ? moveItem :
this;
167 if (
this->moveItem() == moveItem)
169 d->m_moveItem = moveItem;
193void QWaylandQuickShellSurfaceItem::setAutoCreatePopupItems(
bool enabled)
195 Q_D(QWaylandQuickShellSurfaceItem);
197 if (enabled == d->m_autoCreatePopupItems)
200 d->m_autoCreatePopupItems = enabled;
201 emit autoCreatePopupItemsChanged();
210void QWaylandQuickShellEventFilter::startFilter(QWaylandClient *client, CallbackFunction closePopups)
213 self =
new QWaylandQuickShellEventFilter(qGuiApp);
214 if (!self->eventFilterInstalled) {
215 qGuiApp->installEventFilter(self);
216 self->eventFilterInstalled =
true;
217 self->client = client;
218 self->closePopups = closePopups;
244bool QWaylandQuickShellEventFilter::eventFilter(QObject *receiver, QEvent *e)
246 if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease) {
247 bool press = e->type() == QEvent::MouseButtonPress;
248 if (press && !waitForRelease) {
250 if (!mousePressTimeout.isActive())
251 mousePressTimeout.start(0,
this);
254 QQuickItem *item = qobject_cast<QQuickItem*>(receiver);
258 QMouseEvent *event =
static_cast<QMouseEvent*>(e);
259 QWaylandQuickShellSurfaceItem *shellSurfaceItem = qobject_cast<QWaylandQuickShellSurfaceItem*>(item);
260 bool finalRelease = (event->type() == QEvent::MouseButtonRelease) && (event->buttons() == Qt::NoButton);
261 bool popupClient = shellSurfaceItem && shellSurfaceItem->surface() && shellSurfaceItem->surface()->client() == client;
263 if (waitForRelease) {
266 waitForRelease =
false;
272 if (finalRelease && mousePressTimeout.isActive()) {
274 qWarning(
"Badly written autotest detected");
275 mousePressTimeout.stop();
279 if (press && !shellSurfaceItem && !QQmlProperty(item, QStringLiteral(
"qtwayland_blocking_overlay")).isValid()) {
285 mousePressTimeout.stop();
287 if (press && !popupClient) {
291 waitForRelease =
true;
343void QWaylandQuickShellSurfaceItemPrivate::raise()
345 Q_Q(QWaylandQuickShellSurfaceItem);
346 auto *moveItem = q->moveItem();
347 QQuickItem *parent = moveItem->parentItem();
348 if (!parent || !m_shellSurface)
350 const bool putOnTop = staysOnTop || m_shellSurface->isModal();
351 const bool putOnBottom = staysOnBottom && !m_shellSurface->isModal();
353 const QList<QQuickItem *> childItems = parent->childItems();
354 auto it = childItems.crbegin();
355 const auto end = childItems.crend();
356 auto skip = [putOnTop, putOnBottom](QQuickItem *item) {
357 if (
auto *surf = findSurfaceItemFromMoveItem(item))
358 return (!putOnTop && onTop(surf)) || (putOnBottom && !onBottom(surf));
361 while (it != end && skip(*it))
364 QQuickItem *top = *it;
366 moveItem->stackAfter(top);
377void QWaylandQuickShellSurfaceItemPrivate::lower()
379 Q_Q(QWaylandQuickShellSurfaceItem);
380 auto *moveItem = q->moveItem();
381 QQuickItem *parent = moveItem->parentItem();
382 if (!parent || !m_shellSurface)
384 const bool putOnTop = staysOnTop || m_shellSurface->isModal();
385 const bool putOnBottom = staysOnBottom && !m_shellSurface->isModal();
387 const QList<QQuickItem *> childItems = parent->childItems();
388 auto it = childItems.cbegin();
389 auto skip = [putOnTop, putOnBottom](QQuickItem *item) {
390 if (
auto *surf = findSurfaceItemFromMoveItem(item))
391 return (!putOnBottom && onBottom(surf)) || (putOnTop && !onTop(surf));
397 QQuickItem *bottom = *it;
398 if (moveItem != bottom)
399 moveItem->stackBefore(bottom);
413void QWaylandQuickShellSurfaceItem::setStaysOnTop(
bool onTop)
415 Q_D(QWaylandQuickShellSurfaceItem);
416 if (d->staysOnTop == onTop)
418 d->staysOnTop = onTop;
419 if (d->staysOnBottom) {
420 d->staysOnBottom =
false;
421 emit staysOnBottomChanged();
426 emit staysOnTopChanged();
427 Q_ASSERT(!(d->staysOnTop && d->staysOnBottom));
441void QWaylandQuickShellSurfaceItem::setStaysOnBottom(
bool onBottom)
443 Q_D(QWaylandQuickShellSurfaceItem);
444 if (d->staysOnBottom == onBottom)
446 d->staysOnBottom = onBottom;
448 d->staysOnTop =
false;
449 emit staysOnTopChanged();
454 emit staysOnBottomChanged();
455 Q_ASSERT(!(d->staysOnTop && d->staysOnBottom));