12void QWaylandQuickShellSurfaceItemPrivate::setShellSurface(QWaylandShellSurface *shellSurface)
14 Q_Q(QWaylandQuickShellSurfaceItem);
17 QObject::disconnect(m_shellSurface, &QObject::destroyed, q,
nullptr);
18 QObject::disconnect(m_shellSurface, &QWaylandShellSurface::modalChanged, q,
nullptr);
21 if (m_shellIntegration) {
22 q->removeEventFilter(m_shellIntegration);
23 delete m_shellIntegration;
24 m_shellIntegration =
nullptr;
27 m_shellSurface = shellSurface;
30 m_shellIntegration = m_shellSurface->createIntegration(q);
31 q->installEventFilter(m_shellIntegration);
33 QObject::connect(m_shellSurface, &QObject::destroyed,
35 setShellSurface(
nullptr);
36 emit q_func()->shellSurfaceChanged();
38 QObject::connect(m_shellSurface, &QWaylandShellSurface::modalChanged,
40 if (m_shellSurface && m_shellSurface->isModal())
46QWaylandQuickShellSurfaceItem *QWaylandQuickShellSurfaceItemPrivate::maybeCreateAutoPopup(QWaylandShellSurface* shellSurface)
48 if (!m_autoCreatePopupItems)
51 Q_Q(QWaylandQuickShellSurfaceItem);
52 auto *popupItem =
new QWaylandQuickShellSurfaceItem(q);
53 popupItem->setShellSurface(shellSurface);
54 popupItem->setAutoCreatePopupItems(
true);
55 QObject::connect(popupItem, &QWaylandQuickShellSurfaceItem::surfaceDestroyed,
56 popupItem, &QObject::deleteLater);
130void QWaylandQuickShellSurfaceItem::setShellSurface(QWaylandShellSurface *shellSurface)
132 Q_D(QWaylandQuickShellSurfaceItem);
133 if (d->m_shellSurface == shellSurface)
136 d->setShellSurface(shellSurface);
138 emit shellSurfaceChanged();
162void QWaylandQuickShellSurfaceItem::setMoveItem(QQuickItem *moveItem)
164 Q_D(QWaylandQuickShellSurfaceItem);
165 moveItem = moveItem ? moveItem :
this;
166 if (
this->moveItem() == moveItem)
168 d->m_moveItem = moveItem;
191void QWaylandQuickShellSurfaceItem::setAutoCreatePopupItems(
bool enabled)
193 Q_D(QWaylandQuickShellSurfaceItem);
195 if (enabled == d->m_autoCreatePopupItems)
198 d->m_autoCreatePopupItems = enabled;
199 emit autoCreatePopupItemsChanged();
208void QWaylandQuickShellEventFilter::startFilter(QWaylandClient *client, CallbackFunction closePopups)
211 self =
new QWaylandQuickShellEventFilter(qGuiApp);
212 if (!self->eventFilterInstalled) {
213 qGuiApp->installEventFilter(self);
214 self->eventFilterInstalled =
true;
215 self->client = client;
216 self->closePopups = closePopups;
242bool QWaylandQuickShellEventFilter::eventFilter(QObject *receiver, QEvent *e)
244 if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease) {
245 bool press = e->type() == QEvent::MouseButtonPress;
246 if (press && !waitForRelease) {
248 if (!mousePressTimeout.isActive())
249 mousePressTimeout.start(0,
this);
252 QQuickItem *item = qobject_cast<QQuickItem*>(receiver);
256 QMouseEvent *event =
static_cast<QMouseEvent*>(e);
257 QWaylandQuickShellSurfaceItem *shellSurfaceItem = qobject_cast<QWaylandQuickShellSurfaceItem*>(item);
258 bool finalRelease = (event->type() == QEvent::MouseButtonRelease) && (event->buttons() == Qt::NoButton);
259 bool popupClient = shellSurfaceItem && shellSurfaceItem->surface() && shellSurfaceItem->surface()->client() == client;
261 if (waitForRelease) {
264 waitForRelease =
false;
270 if (finalRelease && mousePressTimeout.isActive()) {
272 qWarning(
"Badly written autotest detected");
273 mousePressTimeout.stop();
277 if (press && !shellSurfaceItem && !QQmlProperty(item, QStringLiteral(
"qtwayland_blocking_overlay")).isValid()) {
283 mousePressTimeout.stop();
285 if (press && !popupClient) {
289 waitForRelease =
true;
339void QWaylandQuickShellSurfaceItemPrivate::raise()
341 Q_Q(QWaylandQuickShellSurfaceItem);
342 auto *moveItem = q->moveItem();
343 QQuickItem *parent = moveItem->parentItem();
344 if (!parent || !m_shellSurface)
346 const bool putOnTop = staysOnTop || m_shellSurface->isModal();
347 const bool putOnBottom = staysOnBottom && !m_shellSurface->isModal();
349 auto it = parent->childItems().crbegin();
350 auto skip = [putOnTop, putOnBottom](QQuickItem *item) {
351 if (
auto *surf = findSurfaceItemFromMoveItem(item))
352 return (!putOnTop && onTop(surf)) || (putOnBottom && !onBottom(surf));
355 auto end = parent->childItems().crend();
356 while (it != end && skip(*it))
359 QQuickItem *top = *it;
361 moveItem->stackAfter(top);
372void QWaylandQuickShellSurfaceItemPrivate::lower()
374 Q_Q(QWaylandQuickShellSurfaceItem);
375 auto *moveItem = q->moveItem();
376 QQuickItem *parent = moveItem->parentItem();
377 if (!parent || !m_shellSurface)
379 const bool putOnTop = staysOnTop || m_shellSurface->isModal();
380 const bool putOnBottom = staysOnBottom && !m_shellSurface->isModal();
382 auto it = parent->childItems().cbegin();
383 auto skip = [putOnTop, putOnBottom](QQuickItem *item) {
384 if (
auto *surf = findSurfaceItemFromMoveItem(item))
385 return (!putOnBottom && onBottom(surf)) || (putOnTop && !onTop(surf));
391 QQuickItem *bottom = *it;
392 if (moveItem != bottom)
393 moveItem->stackBefore(bottom);
407void QWaylandQuickShellSurfaceItem::setStaysOnTop(
bool onTop)
409 Q_D(QWaylandQuickShellSurfaceItem);
410 if (d->staysOnTop == onTop)
412 d->staysOnTop = onTop;
413 if (d->staysOnBottom) {
414 d->staysOnBottom =
false;
415 emit staysOnBottomChanged();
420 emit staysOnTopChanged();
421 Q_ASSERT(!(d->staysOnTop && d->staysOnBottom));
435void QWaylandQuickShellSurfaceItem::setStaysOnBottom(
bool onBottom)
437 Q_D(QWaylandQuickShellSurfaceItem);
438 if (d->staysOnBottom == onBottom)
440 d->staysOnBottom = onBottom;
442 d->staysOnTop =
false;
443 emit staysOnTopChanged();
448 emit staysOnBottomChanged();
449 Q_ASSERT(!(d->staysOnTop && d->staysOnBottom));