diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp index dc65476e83734c..c9476a0c502897 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp @@ -408,35 +408,37 @@ void XDPFileDialog::openPortal() { + uniqueName + '/' + handleToken; + + const auto responseCallback = crl::guard(this, [=]( + const Glib::RefPtr &connection, + const Glib::ustring &sender_name, + const Glib::ustring &object_path, + const Glib::ustring &interface_name, + const Glib::ustring &signal_name, + const Glib::VariantContainerBase ¶meters) { + try { + auto parametersCopy = parameters; - _requestSignalId = _dbusConnection->signal_subscribe( - crl::guard(this, [=]( - const Glib::RefPtr &connection, - const Glib::ustring &sender_name, - const Glib::ustring &object_path, - const Glib::ustring &interface_name, - const Glib::ustring &signal_name, - const Glib::VariantContainerBase ¶meters) { - try { - auto parametersCopy = parameters; + const auto response = base::Platform::GlibVariantCast( + parametersCopy.get_child(0)); - const auto response = base::Platform::GlibVariantCast( - parametersCopy.get_child(0)); + const auto results = base::Platform::GlibVariantCast< + std::map< + Glib::ustring, + Glib::VariantBase + >>(parametersCopy.get_child(1)); - const auto results = base::Platform::GlibVariantCast< - std::map< - Glib::ustring, - Glib::VariantBase - >>(parametersCopy.get_child(1)); + gotResponse(response, results); + } catch (const std::exception &e) { + LOG(("XDP File Dialog Error: %1").arg( + QString::fromStdString(e.what()))); - gotResponse(response, results); - } catch (const std::exception &e) { - LOG(("XDP File Dialog Error: %1").arg( - QString::fromStdString(e.what()))); + _reject.fire({}); + } + }); - _reject.fire({}); - } - }), + _requestSignalId = _dbusConnection->signal_subscribe( + responseCallback, {}, "org.freedesktop.portal.Request", "Response", @@ -461,10 +463,15 @@ void XDPFileDialog::openPortal() { Glib::ustring>(reply.get_child(0)); if (handle != requestPath) { - crl::on_main([=] { - _failedToOpen = true; - _reject.fire({}); - }); + _dbusConnection->signal_unsubscribe( + _requestSignalId); + + _requestSignalId = _dbusConnection->signal_subscribe( + responseCallback, + {}, + "org.freedesktop.portal.Request", + "Response", + handle); } } catch (const Glib::Error &e) { static const auto NotSupportedErrors = {