From e4e7c901092e8efdce8be5402298e272ffa37a85 Mon Sep 17 00:00:00 2001 From: borgmanJeremy <46930769+borgmanJeremy@users.noreply.github.com> Date: Wed, 3 Nov 2021 08:01:19 -0500 Subject: [PATCH] Gnome41 (#2035) * testing new portal on gnome41 * applied clang format * macro out portal API on windows --- src/utils/screengrabber.cpp | 129 ++++++++++++++++-------------------- src/utils/screengrabber.h | 1 + 2 files changed, 58 insertions(+), 72 deletions(-) diff --git a/src/utils/screengrabber.cpp b/src/utils/screengrabber.cpp index fab36340..748fd9b1 100644 --- a/src/utils/screengrabber.cpp +++ b/src/utils/screengrabber.cpp @@ -23,6 +23,61 @@ ScreenGrabber::ScreenGrabber(QObject* parent) : QObject(parent) {} +void ScreenGrabber::freeDesktopPortal(bool& ok, QPixmap& res) +{ + +#if defined(Q_OS_LINUX) || defined(Q_OS_UNIX) + QDBusInterface screenshotInterface( + QStringLiteral("org.freedesktop.portal.Desktop"), + QStringLiteral("/org/freedesktop/portal/desktop"), + QStringLiteral("org.freedesktop.portal.Screenshot")); + + // unique token + QString token = + QUuid::createUuid().toString().remove('-').remove('{').remove('}'); + + // premake interface + auto* request = new OrgFreedesktopPortalRequestInterface( + QStringLiteral("org.freedesktop.portal.Desktop"), + "/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) { + if (status == 0) { + QString uri = map.value("uri").toString().remove(0, 7); + res = QPixmap(uri); + res.setDevicePixelRatio(qApp->devicePixelRatio()); + QFile imgFile(uri); + imgFile.remove(); + } + 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(); + request->deleteLater(); + + if (res.isNull()) { + ok = false; + } +#endif +} QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) { ok = true; @@ -42,22 +97,7 @@ QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) // handle screenshot based on DE switch (m_info.windowManager()) { case DesktopInfo::GNOME: { - // https://github.com/GNOME/gnome-shell/blob/695bfb96160033be55cfb5ac41c121998f98c328/data/org.gnome.Shell.Screenshot.xml - QString path = FileNameHandler().properScreenshotPath( - QDir::tempPath(), "png"); - QDBusInterface gnomeInterface( - QStringLiteral("org.gnome.Shell"), - QStringLiteral("/org/gnome/Shell/Screenshot"), - QStringLiteral("org.gnome.Shell.Screenshot")); - QDBusReply reply = gnomeInterface.call( - QStringLiteral("Screenshot"), false, false, path); - if (reply.value()) { - res = QPixmap(path); - QFile dbusResult(path); - dbusResult.remove(); - } else { - ok = false; - } + freeDesktopPortal(ok, res); break; } case DesktopInfo::KDE: { @@ -76,62 +116,7 @@ QPixmap ScreenGrabber::grabEntireDesktop(bool& ok) break; } case DesktopInfo::SWAY: { - QDBusInterface screenshotInterface( - QStringLiteral("org.freedesktop.portal.Desktop"), - QStringLiteral("/org/freedesktop/portal/desktop"), - QStringLiteral("org.freedesktop.portal.Screenshot")); - - // unique token - QString token = - QUuid::createUuid().toString().remove('-').remove('{').remove( - '}'); - - // premake interface - auto* request = new OrgFreedesktopPortalRequestInterface( - QStringLiteral("org.freedesktop.portal.Desktop"), - "/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) { - if (status == 0) { - QString uri = map.value("uri").toString().remove(0, 7); - res = QPixmap(uri); - res.setDevicePixelRatio(qApp->devicePixelRatio()); - QFile imgFile(uri); - imgFile.remove(); - } - 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(); - request->deleteLater(); - - if (res.isNull()) { - ok = false; - } + freeDesktopPortal(ok, res); break; } default: diff --git a/src/utils/screengrabber.h b/src/utils/screengrabber.h index bee4d7b3..e120a04c 100644 --- a/src/utils/screengrabber.h +++ b/src/utils/screengrabber.h @@ -14,6 +14,7 @@ public: QPixmap grabEntireDesktop(bool& ok); QRect screenGeometry(int screenNumber); QPixmap grabScreen(int screenNumber, bool& ok); + void freeDesktopPortal(bool& ok, QPixmap& res); private: DesktopInfo m_info;