diff options
Diffstat (limited to 'src/querycompleter.cpp')
| -rw-r--r-- | src/querycompleter.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/querycompleter.cpp b/src/querycompleter.cpp index a6a1aeb..7e9dfd9 100644 --- a/src/querycompleter.cpp +++ b/src/querycompleter.cpp @@ -422,6 +422,12 @@ bool QueryCompleter::eventFilter(QObject *watched, QEvent *event) if (event->type() != QEvent::KeyPress || !popupVisible()) return QObject::eventFilter(watched, event); + // A key this filter is itself redelivering. sendEvent re-runs application + // event filters, so without this the forwarded key comes straight back and + // recurses until the stack is gone. + if (m_forwarding) + return QObject::eventFilter(watched, event); + auto *keyEvent = static_cast<QKeyEvent *>(event); switch (keyEvent->key()) { case Qt::Key_Tab: @@ -452,11 +458,17 @@ bool QueryCompleter::eventFilter(QObject *watched, QEvent *event) case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_PageUp: - case Qt::Key_PageDown: + case Qt::Key_PageDown: { // Navigation belongs to the popup, which is not the focus widget while // the user is typing in the bar. + // + // m_forwarding is what keeps this from recursing; see the guard at the + // top of the filter. + m_forwarding = true; QCoreApplication::sendEvent(m_popup, event); + m_forwarding = false; return true; + } default: break; } |
