]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix loop of FocusIn events
authorElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 3 Jun 2018 12:53:55 +0000 (14:53 +0200)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Wed, 13 Jun 2018 19:39:22 +0000 (21:39 +0200)
Summary:
Commit 43da84eefc7d 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

src/search/dolphinsearchbox.cpp

index 12f0c213846d6fe0212836ced33b17949971354d..61f5c2db4f8e341ed22fe0ef079a27a554d10c48 100644 (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: