From 1ebe3255e0a584a014b8ef890e38cf7eedf66363 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 24 Jul 2024 16:07:43 +0200 Subject: [PATCH] Fix share focus in IV. --- Telegram/SourceFiles/iv/iv_instance.cpp | 29 ++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/Telegram/SourceFiles/iv/iv_instance.cpp b/Telegram/SourceFiles/iv/iv_instance.cpp index d070c93d2..a49ba8887 100644 --- a/Telegram/SourceFiles/iv/iv_instance.cpp +++ b/Telegram/SourceFiles/iv/iv_instance.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "base/platform/base_platform_info.h" +#include "base/qt_signal_producer.h" #include "boxes/share_box.h" #include "core/application.h" #include "core/file_utilities.h" @@ -49,6 +50,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "window/window_session_controller_link_info.h" #include +#include namespace Iv { namespace { @@ -298,12 +300,33 @@ ShareBoxResult Shown::shareBox(ShareBoxDescriptor &&descriptor) { state->destroyRequests.fire({}); }, wrap->lifetime()); + const auto waiting = layer->lifetime().make_state(); const auto focus = crl::guard(layer, [=] { - if (!layer->window()->isActiveWindow()) { - layer->window()->activateWindow(); + const auto set = [=] { layer->window()->setFocus(); + layer->setInnerFocus(); + }; + + const auto handle = layer->window()->windowHandle(); + if (!handle) { + waiting->destroy(); + return; + } else if (QGuiApplication::focusWindow() == handle) { + waiting->destroy(); + set(); + } else { + *waiting = base::qt_signal_producer( + qApp, + &QGuiApplication::focusWindowChanged + ) | rpl::filter([=](QWindow *focused) { + const auto handle = layer->window()->windowHandle(); + return handle && (focused == handle); + }) | rpl::start_with_next([=] { + waiting->destroy(); + set(); + }); + layer->window()->activateWindow(); } - layer->setInnerFocus(); }); auto result = ShareBoxResult{ .focus = focus,