XdgDesktopPortal: Prevent c'tor re-entry
XdgDesktopPortal requires a base platform theme, which is created in its c'tor. If XdgDesktopPortal was shipped as a plugin of its own, it would find itself as a plugin, create itself as its own base theme and thus end up in an infinite loop. Factor out the key check from main.cpp as a static bool in QXdgDesktopPortalTheme. Ignore XdgDesktop keys when scanning for plugins suitable as a base theme. Fixes: QTBUG-134703 Pick-to: 6.9 6.8 6.5 Change-Id: I4aab1e77a48251581369f371e4c9af308ef0a02b Reviewed-by: Liang Qi <liang.qi@qt.io>
This commit is contained in:
parent
22e05d74b2
commit
3404a1491e
@ -20,12 +20,7 @@ public:
|
|||||||
QPlatformTheme *QXdgDesktopPortalThemePlugin::create(const QString &key, const QStringList ¶ms)
|
QPlatformTheme *QXdgDesktopPortalThemePlugin::create(const QString &key, const QStringList ¶ms)
|
||||||
{
|
{
|
||||||
Q_UNUSED(params);
|
Q_UNUSED(params);
|
||||||
if (!key.compare("xdgdesktopportal"_L1, Qt::CaseInsensitive) ||
|
return QXdgDesktopPortalTheme::isXdgPlugin(key) ? new QXdgDesktopPortalTheme : nullptr;
|
||||||
!key.compare("flatpak"_L1, Qt::CaseInsensitive) ||
|
|
||||||
!key.compare("snap"_L1, Qt::CaseInsensitive))
|
|
||||||
return new QXdgDesktopPortalTheme;
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -88,6 +88,8 @@ QXdgDesktopPortalTheme::QXdgDesktopPortalTheme()
|
|||||||
themeNames += QGuiApplicationPrivate::platform_integration->themeNames();
|
themeNames += QGuiApplicationPrivate::platform_integration->themeNames();
|
||||||
// 1) Look for a theme plugin.
|
// 1) Look for a theme plugin.
|
||||||
for (const QString &themeName : std::as_const(themeNames)) {
|
for (const QString &themeName : std::as_const(themeNames)) {
|
||||||
|
if (QXdgDesktopPortalTheme::isXdgPlugin(themeName))
|
||||||
|
continue;
|
||||||
d->baseTheme = QPlatformThemeFactory::create(themeName, nullptr);
|
d->baseTheme = QPlatformThemeFactory::create(themeName, nullptr);
|
||||||
if (d->baseTheme)
|
if (d->baseTheme)
|
||||||
break;
|
break;
|
||||||
@ -97,6 +99,8 @@ QXdgDesktopPortalTheme::QXdgDesktopPortalTheme()
|
|||||||
// create a theme
|
// create a theme
|
||||||
if (!d->baseTheme) {
|
if (!d->baseTheme) {
|
||||||
for (const QString &themeName : std::as_const(themeNames)) {
|
for (const QString &themeName : std::as_const(themeNames)) {
|
||||||
|
if (QXdgDesktopPortalTheme::isXdgPlugin(themeName))
|
||||||
|
continue;
|
||||||
d->baseTheme = QGuiApplicationPrivate::platform_integration->createPlatformTheme(themeName);
|
d->baseTheme = QGuiApplicationPrivate::platform_integration->createPlatformTheme(themeName);
|
||||||
if (d->baseTheme)
|
if (d->baseTheme)
|
||||||
break;
|
break;
|
||||||
@ -263,6 +267,13 @@ QString QXdgDesktopPortalTheme::standardButtonText(int button) const
|
|||||||
return d->baseTheme->standardButtonText(button);
|
return d->baseTheme->standardButtonText(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool QXdgDesktopPortalTheme::isXdgPlugin(const QString &key)
|
||||||
|
{
|
||||||
|
return key.compare("xdgdesktopportal"_L1, Qt::CaseInsensitive) == 0 ||
|
||||||
|
key.compare("flatpak"_L1, Qt::CaseInsensitive) == 0 ||
|
||||||
|
key.compare("snap"_L1, Qt::CaseInsensitive) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#include "qxdgdesktopportaltheme.moc"
|
#include "qxdgdesktopportaltheme.moc"
|
||||||
|
@ -48,6 +48,8 @@ public:
|
|||||||
|
|
||||||
QString standardButtonText(int button) const override;
|
QString standardButtonText(int button) const override;
|
||||||
|
|
||||||
|
static bool isXdgPlugin(const QString &key);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QScopedPointer<QXdgDesktopPortalThemePrivate> d_ptr;
|
QScopedPointer<QXdgDesktopPortalThemePrivate> d_ptr;
|
||||||
Q_DISABLE_COPY_MOVE(QXdgDesktopPortalTheme)
|
Q_DISABLE_COPY_MOVE(QXdgDesktopPortalTheme)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user