25static bool isBlockedByPopup(QQuickItem *item)
27 if (!item || !item->window())
30 QQuickOverlay *overlay = QQuickOverlay::overlay(item->window());
31 auto popups = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
33 for (QWindow *popupWindow : QGuiApplicationPrivate::popup_list) {
34 if (QQuickPopupWindow *quickPopupWindow = qobject_cast<QQuickPopupWindow *>(popupWindow);
35 quickPopupWindow && quickPopupWindow->popup())
36 popups += quickPopupWindow->popup();
39 for (QQuickPopup *popup : std::as_const(popups)) {
40 if (qobject_cast<QQuickToolTip *>(popup))
42 if (popup->isModal() || popup->closePolicy() & QQuickPopup::CloseOnEscape) {
43 qCDebug(lcContextMatcher) << popup <<
"is modal or has a CloseOnEscape policy;"
44 <<
"if one of the following is true," << item
45 <<
"will be blocked by it:" << (item != popup->popupItem())
46 << !popup->popupItem()->isAncestorOf(item);
47 return item != popup->popupItem() && !popup->popupItem()->isAncestorOf(item);
53bool QQuickShortcutContext::matcher(QObject *obj, Qt::ShortcutContext context)
55 if ((context != Qt::ApplicationShortcut) && (context != Qt::WindowShortcut))
58 QQuickItem *item =
nullptr;
61 while (obj && !obj->isWindowType()) {
62 item = qobject_cast<QQuickItem *>(obj);
63 if (item && item->window()) {
66 }
else if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(obj)) {
67 obj = popup->window();
68 item = popup->popupItem();
70#if QT_CONFIG(qml_object_model)
76 if (
auto *menu = qobject_cast<QQuickMenu *>(popup)) {
77 auto parentMenu = QQuickMenuPrivate::get(menu)->parentMenu;
79 obj = parentMenu->window();
83 parentMenu = QQuickMenuPrivate::get(parentMenu)->parentMenu;
93 if (context == Qt::ApplicationShortcut) {
95 return obj && qobject_cast<QWindow*>(obj)->isVisible();
97 Q_ASSERT(context == Qt::WindowShortcut);
98 QQuickWindow *window = qobject_cast<QQuickWindow *>(obj);
99 if (QWindow *renderWindow = QQuickRenderControl::renderWindowFor(window))
101 qCDebug(lcContextMatcher) <<
"obj" << obj <<
"item" << item <<
"focusWindow"
102 << QGuiApplication::focusWindow()
103 <<
"!isBlockedByPopup(item)" << !isBlockedByPopup(item);
104 return obj && qobject_cast<QWindow*>(obj)->isActive() && !isBlockedByPopup(item);