293
293
class KdeAppMenuPlatformTheme : public QKdeTheme
296
KdeAppMenuPlatformTheme(const QString &kdeHome, int kdeVersion);
296
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
297
KdeAppMenuPlatformTheme(const QStringList &kdeDirs, int kdeVersion)
298
: QKdeTheme(kdeDirs, kdeVersion)
302
KdeAppMenuPlatformTheme(const QString &kdeHome, int kdeVersion)
303
: QKdeTheme(kdeHome, kdeVersion)
297
307
virtual QPlatformMenuItem* createPlatformMenuItem() const { return 0; }
298
308
virtual QPlatformMenu* createPlatformMenu() const { return 0; }
299
309
virtual QPlatformMenuBar* createPlatformMenuBar() const;
303
KdeAppMenuPlatformTheme::KdeAppMenuPlatformTheme(const QString &kdeHome, int kdeVersion)
304
: QKdeTheme(kdeHome, kdeVersion)
308
313
QPlatformMenuBar *
309
314
KdeAppMenuPlatformTheme::createPlatformMenuBar() const
338
343
const QByteArray kdeVersionBA = qgetenv("KDE_SESSION_VERSION");
339
344
const int kdeVersion = kdeVersionBA.toInt();
340
345
if (kdeVersion >= 4) {
346
#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0))
347
// Determine KDE prefixes in the following priority order:
348
// - KDEHOME and KDEDIRS environment variables
349
// - ~/.kde(<version>)
350
// - read prefixes from /etc/kde<version>rc
351
// - fallback to /etc/kde<version>
354
const QString kdeHomePathVar = QFile::decodeName(qgetenv("KDEHOME"));
355
if (!kdeHomePathVar.isEmpty())
356
kdeDirs += kdeHomePathVar;
358
const QString kdeDirsVar = QFile::decodeName(qgetenv("KDEDIRS"));
359
if (!kdeDirsVar.isEmpty())
360
kdeDirs += kdeDirsVar.split(QLatin1Char(':'), QString::SkipEmptyParts);
362
const QString kdeVersionHomePath = QDir::homePath() + QStringLiteral("/.kde") + QLatin1String(kdeVersionBA);
363
if (QFileInfo(kdeVersionHomePath).isDir())
364
kdeDirs += kdeVersionHomePath;
366
const QString kdeHomePath = QDir::homePath() + QStringLiteral("/.kde");
367
if (QFileInfo(kdeHomePath).isDir())
368
kdeDirs += kdeHomePath;
370
const QString kdeRcPath = QStringLiteral("/etc/kde") + QLatin1String(kdeVersionBA) + QStringLiteral("rc");
371
if (QFileInfo(kdeRcPath).isReadable()) {
372
QSettings kdeSettings(kdeRcPath, QSettings::IniFormat);
373
kdeSettings.beginGroup(QStringLiteral("Directories-default"));
374
kdeDirs += kdeSettings.value(QStringLiteral("prefixes")).toStringList();
377
const QString kdeVersionPrefix = QStringLiteral("/etc/kde") + QLatin1String(kdeVersionBA);
378
if (QFileInfo(kdeVersionPrefix).isDir())
379
kdeDirs += kdeVersionPrefix;
381
kdeDirs.removeDuplicates();
382
if (!kdeDirs.isEmpty()) {
383
return new KdeAppMenuPlatformTheme(kdeDirs, kdeVersion);
386
qWarning("%s: Unable to determine KDE dirs", Q_FUNC_INFO);
387
WARN << "Unable to determine KDE dirs, falling back to the gnome theme";
341
390
const QString kdeHomePathVar = QString::fromLocal8Bit(qgetenv("KDEHOME"));
342
391
if (!kdeHomePathVar.isEmpty())
343
392
return new KdeAppMenuPlatformTheme(kdeHomePathVar, kdeVersion);
349
398
const QString kdeHomePath = QDir::homePath() + QStringLiteral("/.kde");
350
399
if (QFileInfo(kdeHomePath).isDir())
351
400
return new KdeAppMenuPlatformTheme(kdeHomePath, kdeVersion);
353
WARN << "Unable to determine KDEHOME, falling back to the gnome theme";
401
#endif // QT_VERSION_CHECK
356
404
WARN << "KDE version too old or cannot be properly identified, "
357
405
"falling back to the gnome theme";
408
#endif // QKDETHEME_STILL_PRIVATE
410
// Fallback path - use the Gnome theme in this case
361
411
return new GnomeAppMenuPlatformTheme();