Make flatpak portal support to be used also by Snap applications

Snap now uses xdg-desktop-portal for portal support. Add check for apps
running in Snap and make them use portals by default. We also should be
using different name for the platform theme used by sandboxed apps.

Change-Id: Ibaa35b7549b3d94775d7edb937f729a300d071b6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Jan Grulich 2018-08-30 10:45:49 +02:00
parent 7c0884f2a2
commit 101cb8e5d9
12 changed files with 150 additions and 148 deletions

View File

@ -256,10 +256,10 @@ static inline void clearFontUnlocked()
QGuiApplicationPrivate::app_font = 0; QGuiApplicationPrivate::app_font = 0;
} }
static bool checkRunningUnderFlatpak() static bool checkNeedPortalSupport()
{ {
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
return !QStandardPaths::locate(QStandardPaths::RuntimeLocation, QLatin1String("flatpak-info")).isEmpty(); return !QStandardPaths::locate(QStandardPaths::RuntimeLocation, QLatin1String("flatpak-info")).isEmpty() || qEnvironmentVariableIsSet("SNAP");
#else #else
return false; return false;
#endif // QT_CONFIG(dbus) #endif // QT_CONFIG(dbus)
@ -1225,9 +1225,9 @@ static void init_platform(const QString &pluginNamesWithArguments, const QString
if (!platformThemeName.isEmpty()) if (!platformThemeName.isEmpty())
themeNames.append(platformThemeName); themeNames.append(platformThemeName);
// 2) Special case - check whether we are in sandbox to use flatpak platform theme for portals support // 2) Special case - check whether it's a flatpak or snap app to use xdg-desktop-portal platform theme for portals support
if (checkRunningUnderFlatpak()) { if (checkNeedPortalSupport()) {
themeNames.append(QStringLiteral("flatpak")); themeNames.append(QStringLiteral("xdgdesktopportal"));
} }
// 3) Ask the platform integration for a list of theme names // 3) Ask the platform integration for a list of theme names

View File

@ -50,7 +50,7 @@
#include <QtCore/QUrl> #include <QtCore/QUrl>
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
// These QtCore includes are needed for flatpak support // These QtCore includes are needed for xdg-desktop-portal support
#include <QtCore/private/qcore_unix_p.h> #include <QtCore/private/qcore_unix_p.h>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
@ -172,12 +172,12 @@ static inline bool launch(const QString &launcher, const QUrl &url)
} }
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
static inline bool checkRunningUnderFlatpak() static inline bool checkNeedPortalSupport()
{ {
return !QStandardPaths::locate(QStandardPaths::RuntimeLocation, QLatin1String("flatpak-info")).isEmpty(); return !QStandardPaths::locate(QStandardPaths::RuntimeLocation, QLatin1String("flatpak-info")).isEmpty() || qEnvironmentVariableIsSet("SNAP");
} }
static inline bool flatpakOpenFile(const QUrl &url) static inline bool xdgDesktopPortalOpenFile(const QUrl &url)
{ {
// DBus signature: // DBus signature:
// OpenFile (IN s parent_window, // OpenFile (IN s parent_window,
@ -212,7 +212,7 @@ static inline bool flatpakOpenFile(const QUrl &url)
return false; return false;
} }
static inline bool flatpakOpenUrl(const QUrl &url) static inline bool xdgDesktopPortalOpenUrl(const QUrl &url)
{ {
// DBus signature: // DBus signature:
// OpenURI (IN s parent_window, // OpenURI (IN s parent_window,
@ -236,7 +236,7 @@ static inline bool flatpakOpenUrl(const QUrl &url)
return !reply.isError(); return !reply.isError();
} }
static inline bool flatpakSendEmail(const QUrl &url) static inline bool xdgDesktopPortalSendEmail(const QUrl &url)
{ {
// DBus signature: // DBus signature:
// ComposeEmail (IN s parent_window, // ComposeEmail (IN s parent_window,
@ -294,15 +294,15 @@ bool QGenericUnixServices::openUrl(const QUrl &url)
{ {
if (url.scheme() == QLatin1String("mailto")) { if (url.scheme() == QLatin1String("mailto")) {
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
if (checkRunningUnderFlatpak()) if (checkNeedPortalSupport())
return flatpakSendEmail(url); return xdgDesktopPortalSendEmail(url);
#endif #endif
return openDocument(url); return openDocument(url);
} }
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
if (checkRunningUnderFlatpak()) if (checkNeedPortalSupport())
return flatpakOpenUrl(url); return xdgDesktopPortalOpenUrl(url);
#endif #endif
if (m_webBrowser.isEmpty() && !detectWebBrowser(desktopEnvironment(), true, &m_webBrowser)) { if (m_webBrowser.isEmpty() && !detectWebBrowser(desktopEnvironment(), true, &m_webBrowser)) {
@ -315,8 +315,8 @@ bool QGenericUnixServices::openUrl(const QUrl &url)
bool QGenericUnixServices::openDocument(const QUrl &url) bool QGenericUnixServices::openDocument(const QUrl &url)
{ {
#if QT_CONFIG(dbus) #if QT_CONFIG(dbus)
if (checkRunningUnderFlatpak()) if (checkNeedPortalSupport())
return flatpakOpenFile(url); return xdgDesktopPortalOpenFile(url);
#endif #endif
if (m_documentLauncher.isEmpty() && !detectWebBrowser(desktopEnvironment(), false, &m_documentLauncher)) { if (m_documentLauncher.isEmpty() && !detectWebBrowser(desktopEnvironment(), false, &m_documentLauncher)) {

View File

@ -1,3 +0,0 @@
{
"Keys": [ "flatpak" ]
}

View File

@ -1,17 +0,0 @@
TARGET = qflatpak
PLUGIN_TYPE = platformthemes
PLUGIN_EXTENDS = -
PLUGIN_CLASS_NAME = QFlatpakThemePlugin
load(qt_plugin)
QT += core-private dbus gui-private theme_support-private
HEADERS += \
qflatpaktheme.h \
qflatpakfiledialog_p.h
SOURCES += \
main.cpp \
qflatpaktheme.cpp \
qflatpakfiledialog.cpp

View File

@ -1,6 +1,6 @@
TEMPLATE = subdirs TEMPLATE = subdirs
QT_FOR_CONFIG += widgets-private QT_FOR_CONFIG += widgets-private
qtConfig(dbus):qtConfig(regularexpression): SUBDIRS += flatpak qtConfig(dbus):qtConfig(regularexpression): SUBDIRS += xdgdesktopportal
qtHaveModule(widgets):qtConfig(gtk3): SUBDIRS += gtk3 qtHaveModule(widgets):qtConfig(gtk3): SUBDIRS += gtk3

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 Red Hat, Inc ** Copyright (C) 2017-2018 Red Hat, Inc
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
@ -38,24 +38,26 @@
****************************************************************************/ ****************************************************************************/
#include <qpa/qplatformthemeplugin.h> #include <qpa/qplatformthemeplugin.h>
#include "qflatpaktheme.h" #include "qxdgdesktopportaltheme.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFlatpakThemePlugin : public QPlatformThemePlugin class QXdgDesktopPortalThemePlugin : public QPlatformThemePlugin
{ {
Q_OBJECT Q_OBJECT
Q_PLUGIN_METADATA(IID QPlatformThemeFactoryInterface_iid FILE "flatpak.json") Q_PLUGIN_METADATA(IID QPlatformThemeFactoryInterface_iid FILE "xdgdesktopportal.json")
public: public:
QPlatformTheme *create(const QString &key, const QStringList &params) override; QPlatformTheme *create(const QString &key, const QStringList &params) override;
}; };
QPlatformTheme *QFlatpakThemePlugin::create(const QString &key, const QStringList &params) QPlatformTheme *QXdgDesktopPortalThemePlugin::create(const QString &key, const QStringList &params)
{ {
Q_UNUSED(params); Q_UNUSED(params);
if (!key.compare(QLatin1String("flatpak"), Qt::CaseInsensitive)) if (!key.compare(QLatin1String("xdgdesktopportal"), Qt::CaseInsensitive) ||
return new QFlatpakTheme; !key.compare(QLatin1String("flatpak"), Qt::CaseInsensitive) ||
!key.compare(QLatin1String("snap"), Qt::CaseInsensitive))
return new QXdgDesktopPortalTheme;
return nullptr; return nullptr;
} }

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 Red Hat, Inc ** Copyright (C) 2017-2018 Red Hat, Inc
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
@ -37,7 +37,7 @@
** **
****************************************************************************/ ****************************************************************************/
#include "qflatpakfiledialog_p.h" #include "qxdgdesktopportalfiledialog_p.h"
#include <QtCore/qeventloop.h> #include <QtCore/qeventloop.h>
@ -56,7 +56,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
QDBusArgument &operator <<(QDBusArgument &arg, const QFlatpakFileDialog::FilterCondition &filterCondition) QDBusArgument &operator <<(QDBusArgument &arg, const QXdgDesktopPortalFileDialog::FilterCondition &filterCondition)
{ {
arg.beginStructure(); arg.beginStructure();
arg << filterCondition.type << filterCondition.pattern; arg << filterCondition.type << filterCondition.pattern;
@ -64,20 +64,20 @@ QDBusArgument &operator <<(QDBusArgument &arg, const QFlatpakFileDialog::FilterC
return arg; return arg;
} }
const QDBusArgument &operator >>(const QDBusArgument &arg, QFlatpakFileDialog::FilterCondition &filterCondition) const QDBusArgument &operator >>(const QDBusArgument &arg, QXdgDesktopPortalFileDialog::FilterCondition &filterCondition)
{ {
uint type; uint type;
QString filterPattern; QString filterPattern;
arg.beginStructure(); arg.beginStructure();
arg >> type >> filterPattern; arg >> type >> filterPattern;
filterCondition.type = (QFlatpakFileDialog::ConditionType)type; filterCondition.type = (QXdgDesktopPortalFileDialog::ConditionType)type;
filterCondition.pattern = filterPattern; filterCondition.pattern = filterPattern;
arg.endStructure(); arg.endStructure();
return arg; return arg;
} }
QDBusArgument &operator <<(QDBusArgument &arg, const QFlatpakFileDialog::Filter filter) QDBusArgument &operator <<(QDBusArgument &arg, const QXdgDesktopPortalFileDialog::Filter filter)
{ {
arg.beginStructure(); arg.beginStructure();
arg << filter.name << filter.filterConditions; arg << filter.name << filter.filterConditions;
@ -85,10 +85,10 @@ QDBusArgument &operator <<(QDBusArgument &arg, const QFlatpakFileDialog::Filter
return arg; return arg;
} }
const QDBusArgument &operator >>(const QDBusArgument &arg, QFlatpakFileDialog::Filter &filter) const QDBusArgument &operator >>(const QDBusArgument &arg, QXdgDesktopPortalFileDialog::Filter &filter)
{ {
QString name; QString name;
QFlatpakFileDialog::FilterConditionList filterConditions; QXdgDesktopPortalFileDialog::FilterConditionList filterConditions;
arg.beginStructure(); arg.beginStructure();
arg >> name >> filterConditions; arg >> name >> filterConditions;
filter.name = name; filter.name = name;
@ -98,10 +98,10 @@ const QDBusArgument &operator >>(const QDBusArgument &arg, QFlatpakFileDialog::F
return arg; return arg;
} }
class QFlatpakFileDialogPrivate class QXdgDesktopPortalFileDialogPrivate
{ {
public: public:
QFlatpakFileDialogPrivate(QPlatformFileDialogHelper *nativeFileDialog) QXdgDesktopPortalFileDialogPrivate(QPlatformFileDialogHelper *nativeFileDialog)
: nativeFileDialog(nativeFileDialog) : nativeFileDialog(nativeFileDialog)
{ } { }
@ -118,11 +118,11 @@ public:
QPlatformFileDialogHelper *nativeFileDialog = nullptr; QPlatformFileDialogHelper *nativeFileDialog = nullptr;
}; };
QFlatpakFileDialog::QFlatpakFileDialog(QPlatformFileDialogHelper *nativeFileDialog) QXdgDesktopPortalFileDialog::QXdgDesktopPortalFileDialog(QPlatformFileDialogHelper *nativeFileDialog)
: QPlatformFileDialogHelper() : QPlatformFileDialogHelper()
, d_ptr(new QFlatpakFileDialogPrivate(nativeFileDialog)) , d_ptr(new QXdgDesktopPortalFileDialogPrivate(nativeFileDialog))
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) { if (d->nativeFileDialog) {
connect(d->nativeFileDialog, SIGNAL(accept()), this, SIGNAL(accept())); connect(d->nativeFileDialog, SIGNAL(accept()), this, SIGNAL(accept()));
@ -130,13 +130,13 @@ QFlatpakFileDialog::QFlatpakFileDialog(QPlatformFileDialogHelper *nativeFileDial
} }
} }
QFlatpakFileDialog::~QFlatpakFileDialog() QXdgDesktopPortalFileDialog::~QXdgDesktopPortalFileDialog()
{ {
} }
void QFlatpakFileDialog::initializeDialog() void QXdgDesktopPortalFileDialog::initializeDialog()
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) if (d->nativeFileDialog)
d->nativeFileDialog->setOptions(options()); d->nativeFileDialog->setOptions(options());
@ -162,9 +162,9 @@ void QFlatpakFileDialog::initializeDialog()
setDirectory(options()->initialDirectory()); setDirectory(options()->initialDirectory());
} }
void QFlatpakFileDialog::openPortal() void QXdgDesktopPortalFileDialog::openPortal()
{ {
Q_D(const QFlatpakFileDialog); Q_D(const QXdgDesktopPortalFileDialog);
QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"),
QLatin1String("/org/freedesktop/portal/desktop"), QLatin1String("/org/freedesktop/portal/desktop"),
@ -270,14 +270,14 @@ void QFlatpakFileDialog::openPortal()
}); });
} }
bool QFlatpakFileDialog::defaultNameFilterDisables() const bool QXdgDesktopPortalFileDialog::defaultNameFilterDisables() const
{ {
return false; return false;
} }
void QFlatpakFileDialog::setDirectory(const QUrl &directory) void QXdgDesktopPortalFileDialog::setDirectory(const QUrl &directory)
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) { if (d->nativeFileDialog) {
d->nativeFileDialog->setOptions(options()); d->nativeFileDialog->setOptions(options());
@ -287,9 +287,9 @@ void QFlatpakFileDialog::setDirectory(const QUrl &directory)
d->directory = directory.path(); d->directory = directory.path();
} }
QUrl QFlatpakFileDialog::directory() const QUrl QXdgDesktopPortalFileDialog::directory() const
{ {
Q_D(const QFlatpakFileDialog); Q_D(const QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly)) if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly))
return d->nativeFileDialog->directory(); return d->nativeFileDialog->directory();
@ -297,9 +297,9 @@ QUrl QFlatpakFileDialog::directory() const
return d->directory; return d->directory;
} }
void QFlatpakFileDialog::selectFile(const QUrl &filename) void QXdgDesktopPortalFileDialog::selectFile(const QUrl &filename)
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) { if (d->nativeFileDialog) {
d->nativeFileDialog->setOptions(options()); d->nativeFileDialog->setOptions(options());
@ -309,9 +309,9 @@ void QFlatpakFileDialog::selectFile(const QUrl &filename)
d->selectedFiles << filename.path(); d->selectedFiles << filename.path();
} }
QList<QUrl> QFlatpakFileDialog::selectedFiles() const QList<QUrl> QXdgDesktopPortalFileDialog::selectedFiles() const
{ {
Q_D(const QFlatpakFileDialog); Q_D(const QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly)) if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly))
return d->nativeFileDialog->selectedFiles(); return d->nativeFileDialog->selectedFiles();
@ -323,9 +323,9 @@ QList<QUrl> QFlatpakFileDialog::selectedFiles() const
return files; return files;
} }
void QFlatpakFileDialog::setFilter() void QXdgDesktopPortalFileDialog::setFilter()
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) { if (d->nativeFileDialog) {
d->nativeFileDialog->setOptions(options()); d->nativeFileDialog->setOptions(options());
@ -333,9 +333,9 @@ void QFlatpakFileDialog::setFilter()
} }
} }
void QFlatpakFileDialog::selectNameFilter(const QString &filter) void QXdgDesktopPortalFileDialog::selectNameFilter(const QString &filter)
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) { if (d->nativeFileDialog) {
d->nativeFileDialog->setOptions(options()); d->nativeFileDialog->setOptions(options());
@ -343,15 +343,15 @@ void QFlatpakFileDialog::selectNameFilter(const QString &filter)
} }
} }
QString QFlatpakFileDialog::selectedNameFilter() const QString QXdgDesktopPortalFileDialog::selectedNameFilter() const
{ {
// TODO // TODO
return QString(); return QString();
} }
void QFlatpakFileDialog::exec() void QXdgDesktopPortalFileDialog::exec()
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly)) { if (d->nativeFileDialog && (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly)) {
d->nativeFileDialog->exec(); d->nativeFileDialog->exec();
@ -365,17 +365,17 @@ void QFlatpakFileDialog::exec()
loop.exec(); loop.exec();
} }
void QFlatpakFileDialog::hide() void QXdgDesktopPortalFileDialog::hide()
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (d->nativeFileDialog) if (d->nativeFileDialog)
d->nativeFileDialog->hide(); d->nativeFileDialog->hide();
} }
bool QFlatpakFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) bool QXdgDesktopPortalFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
initializeDialog(); initializeDialog();
@ -390,9 +390,9 @@ bool QFlatpakFileDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality wi
return true; return true;
} }
void QFlatpakFileDialog::gotResponse(uint response, const QVariantMap &results) void QXdgDesktopPortalFileDialog::gotResponse(uint response, const QVariantMap &results)
{ {
Q_D(QFlatpakFileDialog); Q_D(QXdgDesktopPortalFileDialog);
if (!response) { if (!response) {
if (results.contains(QLatin1String("uris"))) if (results.contains(QLatin1String("uris")))

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2017 Red Hat, Inc ** Copyright (C) 2017-2018 Red Hat, Inc
** Contact: https://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
@ -36,20 +36,20 @@
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **
****************************************************************************/ ****************************************************************************/
#ifndef QFLATPAKFILEDIALOG_P_H #ifndef QXDGDESKTOPPORTALFILEDIALOG_P_H
#define QFLATPAKFILEDIALOG_P_H #define QXDGDESKTOPPORTALFILEDIALOG_P_H
#include <qpa/qplatformdialoghelper.h> #include <qpa/qplatformdialoghelper.h>
#include <QVector> #include <QVector>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFlatpakFileDialogPrivate; class QXdgDesktopPortalFileDialogPrivate;
class QFlatpakFileDialog : public QPlatformFileDialogHelper class QXdgDesktopPortalFileDialog : public QPlatformFileDialogHelper
{ {
Q_OBJECT Q_OBJECT
Q_DECLARE_PRIVATE(QFlatpakFileDialog) Q_DECLARE_PRIVATE(QXdgDesktopPortalFileDialog)
public: public:
enum ConditionType : uint { enum ConditionType : uint {
GlobalPattern = 0, GlobalPattern = 0,
@ -69,8 +69,8 @@ public:
}; };
typedef QVector<Filter> FilterList; typedef QVector<Filter> FilterList;
QFlatpakFileDialog(QPlatformFileDialogHelper *nativeFileDialog = nullptr); QXdgDesktopPortalFileDialog(QPlatformFileDialogHelper *nativeFileDialog = nullptr);
~QFlatpakFileDialog(); ~QXdgDesktopPortalFileDialog();
bool defaultNameFilterDisables() const override; bool defaultNameFilterDisables() const override;
QUrl directory() const override; QUrl directory() const override;
@ -92,15 +92,15 @@ private:
void initializeDialog(); void initializeDialog();
void openPortal(); void openPortal();
QScopedPointer<QFlatpakFileDialogPrivate> d_ptr; QScopedPointer<QXdgDesktopPortalFileDialogPrivate> d_ptr;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE
Q_DECLARE_METATYPE(QFlatpakFileDialog::FilterCondition); Q_DECLARE_METATYPE(QXdgDesktopPortalFileDialog::FilterCondition);
Q_DECLARE_METATYPE(QFlatpakFileDialog::FilterConditionList); Q_DECLARE_METATYPE(QXdgDesktopPortalFileDialog::FilterConditionList);
Q_DECLARE_METATYPE(QFlatpakFileDialog::Filter); Q_DECLARE_METATYPE(QXdgDesktopPortalFileDialog::Filter);
Q_DECLARE_METATYPE(QFlatpakFileDialog::FilterList); Q_DECLARE_METATYPE(QXdgDesktopPortalFileDialog::FilterList);
#endif // QFLATPAKFILEDIALOG_P_H #endif // QXDGDESKTOPPORTALFILEDIALOG_P_H

View File

@ -37,8 +37,8 @@
** **
****************************************************************************/ ****************************************************************************/
#include "qflatpaktheme.h" #include "qxdgdesktopportaltheme.h"
#include "qflatpakfiledialog_p.h" #include "qxdgdesktopportalfiledialog_p.h"
#include <private/qguiapplication_p.h> #include <private/qguiapplication_p.h>
#include <qpa/qplatformtheme_p.h> #include <qpa/qplatformtheme_p.h>
@ -47,14 +47,14 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFlatpakThemePrivate : public QPlatformThemePrivate class QXdgDesktopPortalThemePrivate : public QPlatformThemePrivate
{ {
public: public:
QFlatpakThemePrivate() QXdgDesktopPortalThemePrivate()
: QPlatformThemePrivate() : QPlatformThemePrivate()
{ } { }
~QFlatpakThemePrivate() ~QXdgDesktopPortalThemePrivate()
{ {
delete baseTheme; delete baseTheme;
} }
@ -62,10 +62,10 @@ public:
QPlatformTheme *baseTheme; QPlatformTheme *baseTheme;
}; };
QFlatpakTheme::QFlatpakTheme() QXdgDesktopPortalTheme::QXdgDesktopPortalTheme()
: d_ptr(new QFlatpakThemePrivate) : d_ptr(new QXdgDesktopPortalThemePrivate)
{ {
Q_D(QFlatpakTheme); Q_D(QXdgDesktopPortalTheme);
QStringList themeNames; QStringList themeNames;
themeNames += QGuiApplicationPrivate::platform_integration->themeNames(); themeNames += QGuiApplicationPrivate::platform_integration->themeNames();
@ -92,33 +92,33 @@ QFlatpakTheme::QFlatpakTheme()
d->baseTheme = new QPlatformTheme; d->baseTheme = new QPlatformTheme;
} }
QPlatformMenuItem* QFlatpakTheme::createPlatformMenuItem() const QPlatformMenuItem* QXdgDesktopPortalTheme::createPlatformMenuItem() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->createPlatformMenuItem(); return d->baseTheme->createPlatformMenuItem();
} }
QPlatformMenu* QFlatpakTheme::createPlatformMenu() const QPlatformMenu* QXdgDesktopPortalTheme::createPlatformMenu() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->createPlatformMenu(); return d->baseTheme->createPlatformMenu();
} }
QPlatformMenuBar* QFlatpakTheme::createPlatformMenuBar() const QPlatformMenuBar* QXdgDesktopPortalTheme::createPlatformMenuBar() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->createPlatformMenuBar(); return d->baseTheme->createPlatformMenuBar();
} }
void QFlatpakTheme::showPlatformMenuBar() void QXdgDesktopPortalTheme::showPlatformMenuBar()
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->showPlatformMenuBar(); return d->baseTheme->showPlatformMenuBar();
} }
bool QFlatpakTheme::usePlatformNativeDialog(DialogType type) const bool QXdgDesktopPortalTheme::usePlatformNativeDialog(DialogType type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
if (type == FileDialog) if (type == FileDialog)
return true; return true;
@ -126,74 +126,74 @@ bool QFlatpakTheme::usePlatformNativeDialog(DialogType type) const
return d->baseTheme->usePlatformNativeDialog(type); return d->baseTheme->usePlatformNativeDialog(type);
} }
QPlatformDialogHelper* QFlatpakTheme::createPlatformDialogHelper(DialogType type) const QPlatformDialogHelper* QXdgDesktopPortalTheme::createPlatformDialogHelper(DialogType type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
if (type == FileDialog) { if (type == FileDialog) {
if (d->baseTheme->usePlatformNativeDialog(type)) if (d->baseTheme->usePlatformNativeDialog(type))
return new QFlatpakFileDialog(static_cast<QPlatformFileDialogHelper*>(d->baseTheme->createPlatformDialogHelper(type))); return new QXdgDesktopPortalFileDialog(static_cast<QPlatformFileDialogHelper*>(d->baseTheme->createPlatformDialogHelper(type)));
return new QFlatpakFileDialog; return new QXdgDesktopPortalFileDialog;
} }
return d->baseTheme->createPlatformDialogHelper(type); return d->baseTheme->createPlatformDialogHelper(type);
} }
#ifndef QT_NO_SYSTEMTRAYICON #ifndef QT_NO_SYSTEMTRAYICON
QPlatformSystemTrayIcon* QFlatpakTheme::createPlatformSystemTrayIcon() const QPlatformSystemTrayIcon* QXdgDesktopPortalTheme::createPlatformSystemTrayIcon() const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->createPlatformSystemTrayIcon(); return d->baseTheme->createPlatformSystemTrayIcon();
} }
#endif #endif
const QPalette *QFlatpakTheme::palette(Palette type) const const QPalette *QXdgDesktopPortalTheme::palette(Palette type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->palette(type); return d->baseTheme->palette(type);
} }
const QFont* QFlatpakTheme::font(Font type) const const QFont* QXdgDesktopPortalTheme::font(Font type) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->font(type); return d->baseTheme->font(type);
} }
QVariant QFlatpakTheme::themeHint(ThemeHint hint) const QVariant QXdgDesktopPortalTheme::themeHint(ThemeHint hint) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->themeHint(hint); return d->baseTheme->themeHint(hint);
} }
QPixmap QFlatpakTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const QPixmap QXdgDesktopPortalTheme::standardPixmap(StandardPixmap sp, const QSizeF &size) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->standardPixmap(sp, size); return d->baseTheme->standardPixmap(sp, size);
} }
QIcon QFlatpakTheme::fileIcon(const QFileInfo &fileInfo, QIcon QXdgDesktopPortalTheme::fileIcon(const QFileInfo &fileInfo,
QPlatformTheme::IconOptions iconOptions) const QPlatformTheme::IconOptions iconOptions) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->fileIcon(fileInfo, iconOptions); return d->baseTheme->fileIcon(fileInfo, iconOptions);
} }
QIconEngine * QFlatpakTheme::createIconEngine(const QString &iconName) const QIconEngine * QXdgDesktopPortalTheme::createIconEngine(const QString &iconName) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->createIconEngine(iconName); return d->baseTheme->createIconEngine(iconName);
} }
QList<QKeySequence> QFlatpakTheme::keyBindings(QKeySequence::StandardKey key) const QList<QKeySequence> QXdgDesktopPortalTheme::keyBindings(QKeySequence::StandardKey key) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->keyBindings(key); return d->baseTheme->keyBindings(key);
} }
QString QFlatpakTheme::standardButtonText(int button) const QString QXdgDesktopPortalTheme::standardButtonText(int button) const
{ {
Q_D(const QFlatpakTheme); Q_D(const QXdgDesktopPortalTheme);
return d->baseTheme->standardButtonText(button); return d->baseTheme->standardButtonText(button);
} }

View File

@ -37,20 +37,20 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef QFLATPAKTHEME_H #ifndef QXDGDESKTOPPORTALTHEME_H
#define QFLATPAKTHEME_H #define QXDGDESKTOPPORTALTHEME_H
#include <qpa/qplatformtheme.h> #include <qpa/qplatformtheme.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFlatpakThemePrivate; class QXdgDesktopPortalThemePrivate;
class QFlatpakTheme : public QPlatformTheme class QXdgDesktopPortalTheme : public QPlatformTheme
{ {
Q_DECLARE_PRIVATE(QFlatpakTheme) Q_DECLARE_PRIVATE(QXdgDesktopPortalTheme)
public: public:
QFlatpakTheme(); QXdgDesktopPortalTheme();
QPlatformMenuItem *createPlatformMenuItem() const override; QPlatformMenuItem *createPlatformMenuItem() const override;
QPlatformMenu *createPlatformMenu() const override; QPlatformMenu *createPlatformMenu() const override;
@ -81,10 +81,10 @@ public:
QString standardButtonText(int button) const override; QString standardButtonText(int button) const override;
private: private:
QScopedPointer<QFlatpakThemePrivate> d_ptr; QScopedPointer<QXdgDesktopPortalThemePrivate> d_ptr;
Q_DISABLE_COPY(QFlatpakTheme) Q_DISABLE_COPY(QXdgDesktopPortalTheme)
}; };
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QFLATPAKTHEME_H #endif // QXDGDESKTOPPORTALTHEME_H

View File

@ -0,0 +1,3 @@
{
"Keys": [ "xdgdesktopportal", "flatpak", "snap" ]
}

View File

@ -0,0 +1,17 @@
TARGET = qxdgdesktopportal
PLUGIN_TYPE = platformthemes
PLUGIN_EXTENDS = -
PLUGIN_CLASS_NAME = QXdgDesktopPortalThemePlugin
load(qt_plugin)
QT += core-private dbus gui-private theme_support-private
HEADERS += \
qxdgdesktopportaltheme.h \
qxdgdesktopportalfiledialog_p.h
SOURCES += \
main.cpp \
qxdgdesktopportaltheme.cpp \
qxdgdesktopportalfiledialog.cpp