From 1fe27f79f77785c34b4c7f480d4eb42756fda3ff Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Wed, 13 Sep 2017 16:05:14 +0200 Subject: Widgets: add QWidgetPrivate::deepestFocusProxy() Factor out searching for the deepest focus proxy in to a private function. Other than being called from QWidget::setFocus(), this function will also be used in subsequent patches. Change-Id: I4450a42e362eccb64f8a88c7ea83b415101973b9 Reviewed-by: Friedemann Kleint Reviewed-by: Andy Shaw --- src/widgets/kernel/qwidget.cpp | 27 ++++++++++++++++++++++++--- src/widgets/kernel/qwidget_p.h | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) (limited to 'src/widgets/kernel') diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 05bd6ea04b..8e6b44c370 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -6523,9 +6523,9 @@ void QWidget::setFocus(Qt::FocusReason reason) if (!isEnabled()) return; - QWidget *f = this; - while (f->d_func()->extra && f->d_func()->extra->focus_proxy) - f = f->d_func()->extra->focus_proxy; + QWidget *f = d_func()->deepestFocusProxy(); + if (!f) + f = this; if (QApplication::focusWidget() == f #if 0 // Used to be included in Qt4 for Q_WS_WIN @@ -6622,6 +6622,27 @@ void QWidget::setFocus(Qt::FocusReason reason) } } + +/*!\internal + * A focus proxy can have its own focus proxy, which can have its own + * proxy, and so on. This helper function returns the widget that sits + * at the bottom of the proxy chain, and therefore the one that should + * normally get focus if this widget receives a focus request. + */ +QWidget *QWidgetPrivate::deepestFocusProxy() const +{ + Q_Q(const QWidget); + + QWidget *focusProxy = q->focusProxy(); + if (!focusProxy) + return nullptr; + + while (QWidget *nextFocusProxy = focusProxy->focusProxy()) + focusProxy = nextFocusProxy; + + return focusProxy; +} + void QWidgetPrivate::setFocus_sys() { Q_Q(QWidget); diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index f1eefd68dd..4a86f87c71 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -369,6 +369,7 @@ public: void lower_sys(); void stackUnder_sys(QWidget *); + QWidget *deepestFocusProxy() const; void setFocus_sys(); void updateFocusChild(); -- cgit v1.2.3