mirror of
https://github.com/fergalmoran/flameshot.git
synced 2026-02-05 10:07:30 +00:00
Gnome41 (#2035)
* testing new portal on gnome41 * applied clang format * macro out portal API on windows
This commit is contained in:
@@ -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<QString, QVariant>({ { "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<bool> 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<QString, QVariant>(
|
||||
{ { "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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user