Fix loop of FocusIn events

Summary:
Commit 43da84eefc introduced the risk of entering an endless loop of
`FocusIn`/`FocusOut` events sent to two DolphinSearchBox instances when
opening a second tab (see D11871).

This happens because we deactivate the first tab when we open a new one, but
since the `setActive(true)` is delayed with a QTimer, both the old tab
and the new one become active and receive their own `FocusIn` event
(which starts the loop of focus in/out events).

To prevent this issue, we schedule the searchbox activation only if the
searchbox is not already active.

Test Plan:
- Search something in dolphin
- Open a new tab after the search ends
- Check that dolphin does not eat the CPU

Reviewers: #dolphin, anthonyfieroni

Subscribers: kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D13152
This commit is contained in:
Elvis Angelaccio 2018-06-03 14:53:55 +02:00
parent 2f6635f4e8
commit 9616edbb66

View file

@ -231,10 +231,14 @@ bool DolphinSearchBox::eventFilter(QObject* obj, QEvent* event)
// #379135: we get the FocusIn event when we close a tab but we don't want to emit
// the activated() signal before the removeTab() call in DolphinTabWidget::closeTab() returns.
// To avoid this issue, we delay the activation of the search box.
QTimer::singleShot(0, this, [this] {
setActive(true);
setFocus();
});
// We also don't want to schedule the activation process if we are already active,
// otherwise we can enter in a loop of FocusIn/FocusOut events with the searchbox of another tab.
if (!isActive()) {
QTimer::singleShot(0, this, [this] {
setActive(true);
setFocus();
});
}
break;
default: