From 214c5e8e226172e07f6e36984a65e0757a994a32 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 1 Mar 2022 14:21:35 +0300 Subject: [PATCH] Make PreventDelayedActivation more reliable. --- ui/delayed_activation.cpp | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/ui/delayed_activation.cpp b/ui/delayed_activation.cpp index fb1250a..63e373f 100644 --- a/ui/delayed_activation.cpp +++ b/ui/delayed_activation.cpp @@ -7,19 +7,35 @@ #include "ui/delayed_activation.h" #include "ui/ui_utility.h" +#include "base/call_delayed.h" +#include "base/invoke_queued.h" #include +#include namespace Ui { namespace { -auto Paused = false; +constexpr auto kPreventTimeout = crl::time(100); + +bool Paused/* = false*/; +bool Attempted/* = false*/; auto Window = QPointer(); +bool Unpause(bool force = false) { + if (force || Attempted) { + Attempted = false; + Paused = false; + return true; + } + return false; +} + } // namespace void ActivateWindowDelayed(not_null widget) { if (Paused) { + Attempted = true; return; } else if (std::exchange(Window, widget.get())) { return; @@ -40,7 +56,22 @@ void PreventDelayedActivation() { Window = nullptr; Paused = true; PostponeCall([] { - Paused = false; + if (Unpause()) { + return; + } + InvokeQueued(qApp, [] { + if (Unpause()) { + return; + } + crl::on_main([] { + if (Unpause()) { + return; + } + base::call_delayed(kPreventTimeout, [] { + Unpause(true); + }); + }); + }); }); }