static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window) { const QList<QWidget *> &widgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->widgets; #if defined(DEBUG_QSHORTCUTMAP) if (widgets.isEmpty()) qDebug() << a << "not connected to any widgets; won't trigger"; #endif for (int i = 0; i < widgets.size(); ++i) { QWidget *w = widgets.at(i); #ifndef QT_NO_MENU if (QMenu *menu = qobject_cast<QMenu *>(w)) { #ifdef Q_OS_MAC // On Mac, menu item shortcuts are processed before reaching any window. // That means that if a menu action shortcut has not been already processed // (and reaches this point), then the menu item itself has been disabled. // This occurs at the QPA level on Mac, where we disable all the Cocoa menus // when showing a modal window. (Notice that only the QPA menu is disabled, // not the QMenu.) Since we can also reach this code by climbing the menu // hierarchy (see below), or when the shortcut is not a key-equivalent, we // need to check whether the QPA menu is actually disabled. QPlatformMenu *pm = menu->platformMenu(); if (!pm || !pm->isEnabled()) continue; #endif QAction *a = menu->menuAction(); if (correctActionContext(context, a, active_window)) return true; } else #endif if (correctWidgetContext(context, w, active_window)) return true; } #ifndef QT_NO_GRAPHICSVIEW const QList<QGraphicsWidget *> &graphicsWidgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->graphicsWidgets; #if defined(DEBUG_QSHORTCUTMAP) if (graphicsWidgets.isEmpty()) qDebug() << a << "not connected to any widgets; won't trigger"; #endif for (int i = 0; i < graphicsWidgets.size(); ++i) { QGraphicsWidget *w = graphicsWidgets.at(i); if (correctGraphicsWidgetContext(context, w, active_window)) return true; } #endif return false; }
static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window) { const QList<QWidget *> &widgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->widgets; #if defined(DEBUG_QSHORTCUTMAP) if (widgets.isEmpty()) qDebug() << a << "not connected to any widgets; won't trigger"; #endif for (int i = 0; i < widgets.size(); ++i) { QWidget *w = widgets.at(i); #ifndef QT_NO_MENU if (QMenu *menu = qobject_cast<QMenu *>(w)) { #ifdef Q_OS_MAC // On Mac, menu item shortcuts are processed before reaching any window. // That means that if a menu action shortcut has not been already processed // (and reaches this point), then the menu item itself has been disabled. // This occurs at the QPA level on Mac, were we disable all the Cocoa menus // when showing a modal window. Q_UNUSED(menu); continue; #else QAction *a = menu->menuAction(); if (correctActionContext(context, a, active_window)) return true; #endif } else #endif if (correctWidgetContext(context, w, active_window)) return true; } #ifndef QT_NO_GRAPHICSVIEW const QList<QGraphicsWidget *> &graphicsWidgets = static_cast<QActionPrivate *>(QObjectPrivate::get(a))->graphicsWidgets; #if defined(DEBUG_QSHORTCUTMAP) if (graphicsWidgets.isEmpty()) qDebug() << a << "not connected to any widgets; won't trigger"; #endif for (int i = 0; i < graphicsWidgets.size(); ++i) { QGraphicsWidget *w = graphicsWidgets.at(i); if (correctGraphicsWidgetContext(context, w, active_window)) return true; } #endif return false; }
/*! \internal Returns true if the widget \a w is a logical sub window of the current top-level widget. */ bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context) { Q_ASSERT_X(object, "QShortcutMap", "Shortcut has no owner. Illegal map state!"); QWidget *active_window = QApplication::activeWindow(); // popups do not become the active window, // so we fake it here to get the correct context // for the shortcut system. if (QApplication::activePopupWidget()) active_window = QApplication::activePopupWidget(); if (!active_window) return false; #ifndef QT_NO_ACTION if (QAction *a = qobject_cast<QAction *>(object)) return correctActionContext(context, a, active_window); #endif #ifndef QT_NO_GRAPHICSVIEW if (QGraphicsWidget *gw = qobject_cast<QGraphicsWidget *>(object)) return correctGraphicsWidgetContext(context, gw, active_window); #endif QWidget *w = qobject_cast<QWidget *>(object); if (!w) { QShortcut *s = qobject_cast<QShortcut *>(object); if (s) w = s->parentWidget(); } if (!w) return false; return correctWidgetContext(context, w, active_window); }