From 6f99a6e2f39aaacabe8bb51a7bb1ff53c1b2082f Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sun, 11 Jan 2009 23:34:17 +0100 Subject: [PATCH] Add a method to find data files in standard directories (such as $PREFIX/share) Also we move finding those directories out of iconloader.cpp into util.cpp such that we can reuse that elsewhere. Oh, and we make IconLoader spit out a warning if an icon isn't found now, as sometimes icons change names upstream. --- src/common/util.cpp | 29 +++++++++++++++++++++++++++++ src/common/util.h | 15 +++++++++++++++ src/uisupport/iconloader.cpp | 16 +++------------- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/common/util.cpp b/src/common/util.cpp index 9e9bf887..a8a38875 100644 --- a/src/common/util.cpp +++ b/src/common/util.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -175,6 +176,34 @@ QDir quasselDir() { return qDir; } +QStringList dataDirPaths() { + QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts); + + // Provide a fallback +# ifdef Q_OS_UNIX + if(dataDirNames.isEmpty()) dataDirNames.append("/usr/share"); + // on UNIX, we always check our install prefix + QString appDir = QCoreApplication::applicationDirPath(); + int binpos = appDir.lastIndexOf("/bin"); + if(binpos >= 0) { + appDir.replace(binpos, 4, "/share"); + if(!dataDirNames.contains(appDir)) dataDirNames.append(appDir); + } +# endif + + return dataDirNames; +} + +QString findDataFilePath(const QString &fileName) { + QStringList dataDirs = dataDirPaths(); + foreach(QString dataDir, dataDirs) { + QString path = dataDir + "/apps/quassel/" + fileName; + if(QFile::exists(path)) + return path; + } + return QString(); +} + void loadTranslation(const QLocale &locale) { QTranslator *qtTranslator = QCoreApplication::instance()->findChild("QtTr"); QTranslator *quasselTranslator = QCoreApplication::instance()->findChild("QuasselTr"); diff --git a/src/common/util.h b/src/common/util.h index bbacda04..28639ba9 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -52,6 +52,21 @@ uint editingDistance(const QString &s1, const QString &s2); QDir quasselDir(); +//! Returns a list of data directory paths +/** There are several locations for applications to install their data files in. On Unix, + * a common location is /usr/share; others include $PREFIX/share and additional directories + * specified in the env variable XDG_DATA_DIRS. + * \return A list of directory paths to look for data files in + */ +QStringList dataDirPaths(); + +//! Searches for a data file in the possible data directories +/** Data files can reside in $DATA_DIR/apps/quassel, where $DATA_DIR is one of the directories + * returned by \sa dataDirPaths(). + * \return The full path to the data file if found; a null QString else + */ +QString findDataFilePath(const QString &fileName); + void loadTranslation(const QLocale &locale); template diff --git a/src/uisupport/iconloader.cpp b/src/uisupport/iconloader.cpp index cc4a823e..d3df5b31 100644 --- a/src/uisupport/iconloader.cpp +++ b/src/uisupport/iconloader.cpp @@ -26,6 +26,7 @@ #include #include "iconloader.h" +#include "util.h" IconLoader IconLoader::_iconLoader; int IconLoader::_groupSize[] = { 48, 22, 22, 16, 32, 22 }; // default sizes taken from Oxygen @@ -53,19 +54,7 @@ void IconLoader::setTheme(const QString &theme) { _themedIconDirNames.clear(); _plainIconDirNames.clear(); QString path; - QStringList dataDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts); - -// Provide a fallback -# ifdef Q_OS_UNIX - if(dataDirNames.isEmpty()) dataDirNames.append("/usr/share"); - // on UNIX, we always check our install prefix - QString appDir = QCoreApplication::applicationDirPath(); - int binpos = appDir.lastIndexOf("/bin"); - if(binpos >= 0) { - appDir.replace(binpos, 4, "/share"); - if(!dataDirNames.contains(appDir)) dataDirNames.append(appDir); - } -# endif + QStringList dataDirNames = dataDirPaths(); // System theme in $data/icons/$theme foreach(QString dir, dataDirNames) { @@ -135,6 +124,7 @@ QString IconLoader::findIconPath(const QString &name, int size) { if(QFile::exists(path)) return path; } + qWarning() << "Icon not found:" << name << size; return QString(); } -- 2.20.1