Resubscribe to signal when running with old xdg-desktop-portal

This commit is contained in:
Ilya Fedin 2021-05-06 22:12:03 +04:00 committed by John Preston
parent f1a9884011
commit 95b4435396
1 changed files with 38 additions and 31 deletions

View File

@ -408,35 +408,37 @@ void XDPFileDialog::openPortal() {
+ uniqueName
+ '/'
+ handleToken;
const auto responseCallback = crl::guard(this, [=](
const Glib::RefPtr<Gio::DBus::Connection> &connection,
const Glib::ustring &sender_name,
const Glib::ustring &object_path,
const Glib::ustring &interface_name,
const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters) {
try {
auto parametersCopy = parameters;
const auto response = base::Platform::GlibVariantCast<uint>(
parametersCopy.get_child(0));
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())));
_reject.fire({});
}
});
_requestSignalId = _dbusConnection->signal_subscribe(
crl::guard(this, [=](
const Glib::RefPtr<Gio::DBus::Connection> &connection,
const Glib::ustring &sender_name,
const Glib::ustring &object_path,
const Glib::ustring &interface_name,
const Glib::ustring &signal_name,
const Glib::VariantContainerBase &parameters) {
try {
auto parametersCopy = parameters;
const auto response = base::Platform::GlibVariantCast<uint>(
parametersCopy.get_child(0));
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())));
_reject.fire({});
}
}),
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 = {