X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Ficonloader.cpp;h=1c3d6e77cba22661a7ef7ecac3a66951ffb60361;hp=354e0ee1b1359e8f062a5ba7f003ff4753d69ff3;hb=4261ffff050064aebc8b4d0566886c3ef7352cfa;hpb=04e8c75490d092c1a1f446129e86994c57981d2c diff --git a/src/uisupport/iconloader.cpp b/src/uisupport/iconloader.cpp index 354e0ee1..1c3d6e77 100644 --- a/src/uisupport/iconloader.cpp +++ b/src/uisupport/iconloader.cpp @@ -54,39 +54,59 @@ void IconLoader::setTheme(const QString &theme) { // check which dirs could contain themed icons _themedIconDirNames.clear(); _plainIconDirNames.clear(); - QString path; - QStringList dataDirNames = Quassel::dataDirPaths(); - // System theme in $data/icons/$theme - foreach(QString dir, dataDirNames) { - path = QString("%1/icons/%2").arg(dir, theme); - if(QFile::exists(path)) - _themedIconDirNames.append(path); + // First, look for a system theme + // This is supposed to only work on Unix, though other platforms might set $XDG_DATA_DIRS if they please. + QStringList iconDirNames = QString(qgetenv("XDG_DATA_DIRS")).split(':', QString::SkipEmptyParts); + if(!iconDirNames.isEmpty()) { + for(int i = 0; i < iconDirNames.count(); i++) + iconDirNames[i].append(QString("/icons/")); + } +#ifdef Q_OS_UNIX + else { + // Provide a fallback + iconDirNames << "/usr/share/icons/"; + } + // Add our prefix too + QString appDir = QCoreApplication::applicationDirPath(); + int binpos = appDir.lastIndexOf("/bin"); + if(binpos >= 0) { + appDir.replace(binpos, 4, "/share"); + appDir.append("/icons/"); + if(!iconDirNames.contains(appDir)) + iconDirNames.append(appDir); } - // Resource for system theme :/icons/$theme - path = QString(":/icons/%1").arg(theme); - if(QFile::exists(path)) - _themedIconDirNames.append(path); - - // Own icons in $data/apps/quassel/icons/hicolor - // Also, plain icon dirs $data/apps/quassel/pics - foreach(QString dir, dataDirNames) { - path = QString("%1/icons/hicolor").arg(dir); +#endif + + // Now look for an icons/ subdir in our data paths + foreach(const QString &dir, Quassel::dataDirPaths()) + iconDirNames << dir + "icons/"; + + // Add our resource path too + iconDirNames << ":/icons/"; + + // Ready do add theme names + foreach(const QString &dir, iconDirNames) { + QString path = dir + theme + '/'; if(QFile::exists(path)) - _themedIconDirNames.append(path); - path = QString("%1/apps/quassel/pics").arg(dir); + _themedIconDirNames << path; + } + foreach(const QString &dir, iconDirNames) { + QString path = dir + "hicolor/"; if(QFile::exists(path)) - _plainIconDirNames.append(path); + _themedIconDirNames << path; } - // Same for :/icons/hicolor and :/pics - path = QString(":/icons/hicolor"); - if(QFile::exists(path)) - _themedIconDirNames.append(path); + // We ship some plain (non-themed) icons in $data/pics + foreach(const QString &dir, Quassel::dataDirPaths()) { + QString path = dir + "pics/"; + if(QFile::exists(path)) + _plainIconDirNames << path; + } + // And of course, our resource path + if(QFile::exists(":/pics")) + _plainIconDirNames << ":/pics"; - path = QString(":/pics"); - if(QFile::exists(path)) - _plainIconDirNames.append(path); } // TODO: optionally implement cache (speed/memory tradeoff?)