From 6b3e551ce615f866aab3383d5f2640835c9027f0 Mon Sep 17 00:00:00 2001 From: nullobsi Date: Thu, 4 Mar 2021 20:32:23 -0800 Subject: [PATCH] use unique token & subscribe to signal before calling screenshot --- src/utils/screengrabber.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/utils/screengrabber.cpp b/src/utils/screengrabber.cpp index 47160b32..e16de1f6 100644 --- a/src/utils/screengrabber.cpp +++ b/src/utils/screengrabber.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #endif ScreenGrabber::ScreenGrabber(QObject* parent) @@ -81,13 +82,21 @@ QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) QStringLiteral("/org/freedesktop/portal/desktop"), QStringLiteral("org.freedesktop.portal.Screenshot")); - QDBusReply reply = screenshotInterface.call( - QStringLiteral("Screenshot"), "", QMap()); + // unique token + QString token = QUuid::createUuid().toString(QUuid::Id128); + + // premake interface auto* request = new OrgFreedesktopPortalRequestInterface( QStringLiteral("org.freedesktop.portal.Desktop"), - reply.value().path(), + "/org/freedesktop/portal/desktop/request/" + + QDBusConnection::sessionBus() + .baseService() + .remove(':') + .replace('.', '_') + + "/" + token, QDBusConnection::sessionBus(), this); + QEventLoop loop; const auto gotSignal = [&res, &loop](uint status, const QVariantMap& map) { @@ -100,10 +109,20 @@ QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) } loop.quit(); }; + + // prevent racy situations and listen before calling screenshot QMetaObject::Connection conn = QObject::connect(request, &org::freedesktop::portal::Request::Response, gotSignal); + + screenshotInterface.call( + QStringLiteral("Screenshot"), + "", + QMap( + { { "handle_token", QVariant(token) }, + { "interactive", QVariant(false) } })); + loop.exec(); QObject::disconnect(conn); request->Close().waitForFinished();