Skip to content

Commit

Permalink
sync: from linuxdeepin/dtkgui
Browse files Browse the repository at this point in the history
Synchronize source files from linuxdeepin/dtkgui.

Source-pull-request: linuxdeepin/dtkgui#234
  • Loading branch information
deepin-ci-robot committed Apr 18, 2024
1 parent eed3c72 commit aa477ba
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 18 deletions.
3 changes: 2 additions & 1 deletion src/util/dicontheme.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,8 @@ QIcon DIconTheme::Cached::findQIcon(const QString &iconName, Options options, co
}

auto newIcon = new QIcon(DIconTheme::findQIcon(iconName, options));
data->cache.insert(cacheKey, newIcon);
if (!newIcon->isNull())
data->cache.insert(cacheKey, newIcon);

if (newIcon->isNull())
return fallback;
Expand Down
67 changes: 50 additions & 17 deletions src/util/private/diconproxyengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,22 @@ static inline QIconEngine *createDBuiltinIconEngine(const QString &iconName)
return nullptr;
}

#ifdef DTK_DISABLE_LIBXDG
static inline QIconEngine *createQIconEngine(const QString &iconName)
{
QIconEngine *engine = nullptr;

// fallback to QPlatformTheme::createIconEngine ==> QIconLoaderEngine
QPlatformTheme * const platformTheme = QGuiApplicationPrivate::platformTheme();
bool hasUserTheme = QIconLoader::instance()->hasUserTheme();
if (platformTheme && !hasUserTheme) {
engine = platformTheme->QPlatformTheme::createIconEngine(iconName);
}

return engine;
}
#endif

static bool hasDciIcon(const QString &iconName, const QString &iconThemeName)
{
QString iconPath;
Expand All @@ -103,6 +119,11 @@ static inline bool isDciIconEngine(QIconEngine *engine)
return dynamic_cast<DDciIconEngine *>(engine);
}

static inline bool isDBuiltinIconEngine(QIconEngine *engine)
{
return dynamic_cast<DBuiltinIconEngine *>(engine);
}

DIconProxyEngine::DIconProxyEngine(const QString &iconName, DIconTheme::Options options)
: m_iconName(iconName)
, m_option(options)
Expand Down Expand Up @@ -216,6 +237,16 @@ void DIconProxyEngine::virtual_hook(int id, void *data)
}
}

void DIconProxyEngine::createQXIconengine()
{
#ifdef DTK_DISABLE_LIBXDG
if (Q_UNLIKELY(!m_option.testFlag(DIconTheme::DontFallbackToQIconFromTheme)))
m_iconEngine = createQIconEngine(m_iconName);
#else
m_iconEngine = createXdgProxyIconEngine(m_iconName);
#endif
}

void DIconProxyEngine::ensureEngine()
{
if (m_iconName.isEmpty())
Expand All @@ -227,8 +258,12 @@ void DIconProxyEngine::ensureEngine()

static QMap<QString, QSet<QString>> nonCache;
const auto it = nonCache.find(theme);
if (it != nonCache.end() && it->contains(m_iconName))
return;
if (it != nonCache.end() && it->contains(m_iconName)) {
if (isDciIconEngine(m_iconEngine) || isDBuiltinIconEngine(m_iconEngine))
return;

createQXIconengine();
}

if (m_iconEngine) {
// dci => dci
Expand Down Expand Up @@ -257,28 +292,26 @@ void DIconProxyEngine::ensureEngine()
if (!m_iconEngine && Q_UNLIKELY(!m_option.testFlag(DIconTheme::IgnoreBuiltinIcons)) ) {
m_iconEngine = createDBuiltinIconEngine(m_iconName);
}
#ifdef DTK_DISABLE_LIBXDG
if (!m_iconEngine && Q_UNLIKELY(!m_option.testFlag(DIconTheme::DontFallbackToQIconFromTheme))) {
// fallback to QPlatformTheme::createIconEngine ==> QIconLoaderEngine
QPlatformTheme * const platformTheme = QGuiApplicationPrivate::platformTheme();
bool hasUserTheme = QIconLoader::instance()->hasUserTheme();
if (platformTheme && !hasUserTheme) {
m_iconEngine = platformTheme->QPlatformTheme::createIconEngine(m_iconName);
}
}
#else
if (!m_iconEngine ) {
m_iconEngine = createXdgProxyIconEngine(m_iconName);
}
#endif
if (!m_iconEngine ) {

if (!m_iconEngine )
m_iconEngine = createQXIconengine();

if (!m_iconEngine && !nonCache[theme].contains(m_iconName)) {
qErrnoWarning("create icon [%s] engine failed.[theme:%s] nonCache[theme].size[%d]",
m_iconName.toUtf8().data(),
theme.toUtf8().data(), nonCache[theme].size());
nonCache[theme].insert(m_iconName);
return;
}

if (m_iconEngine && m_iconEngine->isNull()) {
// QIcon::setThemeSearchPaths(QIcon::themeSearchPaths());
delete m_iconEngine;
m_iconEngine = nullptr;
} else if (m_iconEngine && !m_iconEngine->isNull() && nonCache[theme].contains(m_iconName)) {
nonCache[theme].remove(m_iconName);
}

m_iconThemeName = theme;
}

Expand Down
1 change: 1 addition & 0 deletions src/util/private/diconproxyengine_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class Q_DECL_HIDDEN DIconProxyEngine : public QIconEngine

void ensureEngine();
DIconProxyEngine(const DIconProxyEngine &other);
void createQXIconengine();
QString m_iconName;
QString m_iconThemeName;
QIconEngine *m_iconEngine = nullptr;
Expand Down

0 comments on commit aa477ba

Please sign in to comment.