diff --git a/ui/delayed_activation.cpp b/ui/delayed_activation.cpp index 63e373f..a7ae51e 100644 --- a/ui/delayed_activation.cpp +++ b/ui/delayed_activation.cpp @@ -9,9 +9,11 @@ #include "ui/ui_utility.h" #include "base/call_delayed.h" #include "base/invoke_queued.h" +#include "base/platform/base_platform_info.h" #include -#include +#include +#include namespace Ui { namespace { @@ -40,15 +42,41 @@ void ActivateWindowDelayed(not_null widget) { } else if (std::exchange(Window, widget.get())) { return; } - crl::on_main(Window, [=] { - if (const auto widget = base::take(Window)) { - if (const auto window = widget->window()) { - if (!window->isHidden()) { - window->raise(); - window->activateWindow(); - } - } + const auto focusAncestor = [&] { + const auto focusWindow = QGuiApplication::focusWindow(); + if (!focusWindow || !widget->window()) { + return false; } + const auto handle = widget->window()->windowHandle(); + if (!handle) { + return false; + } + return handle->isAncestorOf(focusWindow); + }(); + crl::on_main(Window, [=] { + const auto widget = base::take(Window); + if (!widget) { + return; + } + const auto window = widget->window(); + if (!window || window->isHidden()) { + return; + } + const auto guard = [&] { + if (!::Platform::IsX11() || !focusAncestor) { + return gsl::finally(Fn([] {})); + } + const auto handle = window->windowHandle(); + if (!(handle->flags() & Qt::X11BypassWindowManagerHint)) { + handle->setFlag(Qt::X11BypassWindowManagerHint); + return gsl::finally(Fn([&] { + handle->setFlag(Qt::X11BypassWindowManagerHint, false); + })); + } + return gsl::finally(Fn([] {})); + }(); + window->raise(); + window->activateWindow(); }); }