From 03c04a963521eb435e3fc0dd7a538da0b6737c4e Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Tue, 16 Feb 2021 19:35:43 +0600 Subject: [PATCH 01/11] Copied from mere-config to make a tiny lib to be used mere-launch --- mere-xdg-lib.pro | 64 +++++++++ src/autostartdirectoryspec.cpp | 97 +++++++++++++ src/autostartdirectoryspec.h | 41 ++++++ src/basedirectoryspec.cpp | 213 +++++++++++++++++++++++++++ src/basedirectoryspec.h | 171 ++++++++++++++++++++++ src/desktopentry.cpp | 26 ++++ src/desktopentry.h | 41 ++++++ src/desktopentrydirectoryspec.cpp | 62 ++++++++ src/desktopentrydirectoryspec.h | 35 +++++ src/desktopentryspec.cpp | 77 ++++++++++ src/desktopentryspec.h | 27 ++++ src/global.h | 14 ++ src/icontheme.cpp | 6 + src/icontheme.h | 21 +++ src/iconthemedirectoryspec.cpp | 123 ++++++++++++++++ src/iconthemedirectoryspec.h | 41 ++++++ src/iconthemespec.cpp | 229 ++++++++++++++++++++++++++++++ src/iconthemespec.h | 45 ++++++ 18 files changed, 1333 insertions(+) create mode 100644 mere-xdg-lib.pro create mode 100644 src/autostartdirectoryspec.cpp create mode 100644 src/autostartdirectoryspec.h create mode 100644 src/basedirectoryspec.cpp create mode 100644 src/basedirectoryspec.h create mode 100644 src/desktopentry.cpp create mode 100644 src/desktopentry.h create mode 100644 src/desktopentrydirectoryspec.cpp create mode 100644 src/desktopentrydirectoryspec.h create mode 100644 src/desktopentryspec.cpp create mode 100644 src/desktopentryspec.h create mode 100644 src/global.h create mode 100644 src/icontheme.cpp create mode 100644 src/icontheme.h create mode 100644 src/iconthemedirectoryspec.cpp create mode 100644 src/iconthemedirectoryspec.h create mode 100644 src/iconthemespec.cpp create mode 100644 src/iconthemespec.h diff --git a/mere-xdg-lib.pro b/mere-xdg-lib.pro new file mode 100644 index 0000000..d694611 --- /dev/null +++ b/mere-xdg-lib.pro @@ -0,0 +1,64 @@ +include(../../mere-utils/mere-utils-lib/mere-utils-lib.pri) +include(../../mere-store/mere-store-lib/mere-store-lib.pri) + +QT = core + +CONFIG += c++11 +CONFIG += shared + +TARGET = mere-xdg +VERSION= 0.0.1 +TEMPLATE = lib + +DEFINES += LIB_CODE=\\\"xdg\\\" +DEFINES += LIB_NAME=\\\"$$TARGET\\\" +DEFINES += LIB_VERSION=\\\"$$VERSION\\\" +DEFINES += MERE_XDG_LIB + +SOURCES += \ + src/autostartdirectoryspec.cpp \ + src/basedirectoryspec.cpp \ + src/desktopentry.cpp \ + src/desktopentrydirectoryspec.cpp \ + src/desktopentryspec.cpp \ + src/icontheme.cpp \ + src/iconthemedirectoryspec.cpp \ + src/iconthemespec.cpp + +HEADERS += \ + src/autostartdirectoryspec.h \ + src/basedirectoryspec.h \ + src/desktopentry.h \ + src/desktopentrydirectoryspec.h \ + src/desktopentryspec.h \ + src/global.h \ + src/global.h \ + src/icontheme.h \ + src/iconthemedirectoryspec.h \ + src/iconthemespec.h + +INCLUDEPATH += /usr/local/include + +LIBS += -L/usr/local/lib +LIBS += -lmere-utils + + +# +# Install +# +unix { + target.path = /usr/local/lib + INSTALLS += target + + INSTALL_PREFIX = /usr/local/include/mere/xdg + for(header, HEADERS) { + sdir = $${dirname(header)} + sdir = $$replace(sdir, "src", "") + path = $${INSTALL_PREFIX}$${sdir} + + eval(headers_$${path}.files += $$header) + eval(headers_$${path}.path = $$path) + eval(INSTALLS *= headers_$${path}) + } +} + diff --git a/src/autostartdirectoryspec.cpp b/src/autostartdirectoryspec.cpp new file mode 100644 index 0000000..2c87b0b --- /dev/null +++ b/src/autostartdirectoryspec.cpp @@ -0,0 +1,97 @@ +#include "autostartdirectoryspec.h" +#include "basedirectoryspec.h" +#include "desktopentryspec.h" + +#include "mere/utils/stringutils.h" + +#include +#include +#include +#include +#include + +Mere::XDG::AutostartDirectorySpec::AutostartDirectorySpec() +{ + +} + +std::vector Mere::XDG::AutostartDirectorySpec::autostartDirectories() +{ + std::vector autostartDirectories; + + QString userConfigHome = BaseDirectorySpec::userConfigDirectory(); + expandEnvVars(userConfigHome); + + if (Mere::Utils::StringUtils::isNotBlank(userConfigHome)) + autostartDirectories.push_back( autostarDirectory(userConfigHome.toStdString()) ); + + const QStringList configSearchDirectories = BaseDirectorySpec::configSearchDirectories(); + for (QString configSearchDirectory : configSearchDirectories) + { + expandEnvVars(configSearchDirectory); + + if (Mere::Utils::StringUtils::isNotBlank(configSearchDirectory)) + autostartDirectories.push_back( autostarDirectory(configSearchDirectory.toStdString()) ); + } + + return autostartDirectories; +} + +std::vector Mere::XDG::AutostartDirectorySpec::autostartApplications() +{ + std::vector desktopEntries ; + + std::vector autostartDirectories = AutostartDirectorySpec::autostartDirectories(); + + for(const std::string &autostartDirectory : autostartDirectories) + { + QDir autostartDir(autostartDirectory.c_str()); + qDebug()<< "Looking for autostart apps in " << autostartDir; + + QFileInfoList fileInfoList = autostartDir.entryInfoList(QDir::AllEntries); + QListIterator i(fileInfoList); + while (i.hasNext()) + { + QFileInfo fileInfo = i.next(); + + if (fileInfo.isFile() && fileInfo.suffix() == "desktop") + { + DesktopEntry desktopEntry = DesktopEntrySpec::parse(fileInfo); + + if (Mere::XDG::DesktopEntrySpec::isValid(desktopEntry)) + desktopEntries.push_back(desktopEntry); + } + } + } + + return desktopEntries; +} + +std::string Mere::XDG::AutostartDirectorySpec::autostarDirectory(const std::string &path) +{ + //FIXME + QString autostartDirectory(path.c_str()); + + if (autostartDirectory.endsWith(QDir::separator())) + autostartDirectory = autostartDirectory.append(QString(XDG::AUTOSTART_DIRECTORY)); + else + autostartDirectory = autostartDirectory.append(QString(QDir::separator()).append(QString(XDG::AUTOSTART_DIRECTORY))); + + return autostartDirectory.toStdString(); +} + +//FIXME +void Mere::XDG::AutostartDirectorySpec::expandEnvVars(QString &path) +{ + if (path.contains("$HOME")) + { + const QString home(getenv("HOME")); + path = path.replace("$HOME", home); + } + + if (path.contains("$USER")) + { + const QString user(getenv("USER")); + path = path.replace("$USER", user); + } +} diff --git a/src/autostartdirectoryspec.h b/src/autostartdirectoryspec.h new file mode 100644 index 0000000..fd388a9 --- /dev/null +++ b/src/autostartdirectoryspec.h @@ -0,0 +1,41 @@ +#ifndef XDGAUTOSTARTDIRECTORYSPEC_H +#define XDGAUTOSTARTDIRECTORYSPEC_H + +#include "global.h" +#include "desktopentry.h" + +#include +#include + +namespace Mere +{ +namespace XDG +{ + +static const char* AUTOSTART_DIRECTORY = "autostart"; + +class MERE_XDG_LIB_SPEC AutostartDirectorySpec +{ +private: + AutostartDirectorySpec(); + static std::string autostarDirectory(const std::string &path); + static void expandEnvVars(QString &path); + +public: + /** + * @brief autostartDirectories + * + * Directories when system will search for 'Desktop Entry' files, and will be + * automatically launched during startup of the user's desktop environment after the user has logged in. + * + * @return + */ + static std::vector autostartDirectories(); + + static std::vector autostartApplications(); +}; + +} +} + +#endif // XDGAUTOSTARTDIRECTORYSPEC_H diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp new file mode 100644 index 0000000..5f096e0 --- /dev/null +++ b/src/basedirectoryspec.cpp @@ -0,0 +1,213 @@ +#include "basedirectoryspec.h" + +#include "mere/utils/envutils.h" +#include "mere/utils/stringutils.h" + +#include +#include +#include +#include +#include + +Mere::XDG::BaseDirectorySpec::BaseDirectorySpec() +{ + +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupEnv() +{ + int result = 0; + + result += setupDataHomeEnv(); + result += setupConfigHomeEnv(); + result += setupDataDirsEnv(); + result += setupConfigDirsEnv(); + result += setupCacheHomeEnv(); + result += setupRuntimeDirEnv(); + + return result; +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupEnvVar(const char* env, const char* value, unsigned int err) +{ + QString valueStr(value); + Mere::Utils::EnvUtils::expandEnvVar(valueStr); + +// char* data = valueStr.toLatin1().data(); + char* data = new char[valueStr.length() + 1]; + for(int i = 0; i < valueStr.length(); i++) + { + data[i] = valueStr.at(i).toLatin1(); + } + data[valueStr.length()] = '\0'; + + int result = setenv(env, data, 1); + delete[] data; + + if (result != 0) return err; + + QDir valueDir = QDir(valueStr); + if (!valueDir.exists()) + createPath(valueDir.absolutePath()); + + return 0; +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupDesktopEnv() +{ + int result = setenv(XDG::SESSION_DESKTOP, XDG::BaseDirectory::SESSION_DESKTOP, 1); + if (result != 0) return XDG::ErrorMask::SESSION_DESKTOP; + + result = setenv(XDG::CURRENT_DESKTOP, XDG::BaseDirectory::CURRENT_DESKTOP, 1); + if (result != 0) return XDG::ErrorMask::CURRENT_DESKTOP; + + return 0; +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupDataHomeEnv() +{ + return BaseDirectorySpec::setupEnvVar(XDG::DATA_HOME, XDG::BaseDirectory::DATA_HOME, XDG::ErrorMask::DATA_HOME); +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupConfigHomeEnv() +{ + return BaseDirectorySpec::setupEnvVar(XDG::CONFIG_HOME, XDG::BaseDirectory::CONFIG_HOME, XDG::ErrorMask::CONFIG_HOME); +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupDataDirsEnv() +{ + int result = setenv(XDG::DATA_DIRS, XDG::BaseDirectory::DATA_DIRS, XDG::ErrorMask::DATA_DIRS); + if (result != 0) return 4; + + QString dataDirs(getenv(XDG::DATA_DIRS)); + +// QDir cacheHomeDir = QDir(dataDirs); +// if (!cacheHomeDir.exists()) +// createPath(cacheHomeDir.absolutePath()); + + return 0; +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupConfigDirsEnv() +{ + int result = setenv(XDG::CONFIG_DIRS, XDG::BaseDirectory::CONFIG_DIRS, XDG::ErrorMask::CONFIG_DIRS); + if (result != 0) return 8; + + QString configDirs(getenv(XDG::CONFIG_DIRS)); + + return 0; +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupCacheHomeEnv() +{ + return BaseDirectorySpec::setupEnvVar(XDG::CACHE_HOME, XDG::BaseDirectory::CACHE_HOME, XDG::ErrorMask::CACHE_HOME); +} + +unsigned int Mere::XDG::BaseDirectorySpec::setupRuntimeDirEnv() +{ + return BaseDirectorySpec::setupEnvVar(XDG::RUNTIME_DIR, XDG::BaseDirectory::RUNTIME_DIR, XDG::ErrorMask::RUNTIME_DIR); +} + +QString Mere::XDG::BaseDirectorySpec::userDataDirectory() +{ + QString dataHome = QString(getenv(XDG::DATA_HOME)); + + if(Mere::Utils::StringUtils::isBlank(dataHome)) + dataHome = QString(XDG::BaseDirectory::DATA_HOME); + + Mere::Utils::EnvUtils::expandEnvVar(dataHome); + + QDir dataHomeDir = QDir(dataHome); + if (!dataHomeDir.exists()) + createPath(dataHomeDir.absolutePath()); + + return dataHome; +} + +QString Mere::XDG::BaseDirectorySpec::userConfigDirectory() +{ + QString configHome = QString(getenv(XDG::CONFIG_HOME)); + if(Mere::Utils::StringUtils::isBlank(configHome)) + configHome = QString(XDG::BaseDirectory::CONFIG_HOME); + + Mere::Utils::EnvUtils::expandEnvVar(configHome); + + QDir configHomeDir = QDir(configHome); + if (!configHomeDir.exists()) + createPath(configHomeDir.absolutePath()); + + return configHome; +} + +QString Mere::XDG::BaseDirectorySpec::userCacheDirectory() +{ + QString cacheHome = QString(getenv(XDG::CACHE_HOME)); + if(Mere::Utils::StringUtils::isBlank(cacheHome)) + cacheHome = QString(XDG::BaseDirectory::CACHE_HOME); + + Mere::Utils::EnvUtils::expandEnvVar(cacheHome); + + QDir cacheHomeDir = QDir(cacheHome); + if (!cacheHomeDir.exists()) + createPath(cacheHomeDir.absolutePath()); + + return cacheHome; +} + +QStringList Mere::XDG::BaseDirectorySpec::dataSearchDirectories() +{ + QString dataDirectories = QString(getenv(XDG::DATA_DIRS)); + if(Mere::Utils::StringUtils::isBlank(dataDirectories)) + dataDirectories = QString(XDG::BaseDirectory::DATA_DIRS); + + QStringList dirs = dataDirectories.split(":", QString::SkipEmptyParts); + + if (!dirs.isEmpty()) + { + for (int i = 0; i < dirs.size(); i++) + { + QString dir = dirs.at(i); + Mere::Utils::EnvUtils::expandEnvVar(dir); + + QDir _dir = QDir(dir); + if (!QDir(_dir).exists()) + createPath(_dir.absolutePath()); + } + } + + return dirs; +} + +QStringList Mere::XDG::BaseDirectorySpec::configSearchDirectories() +{ + QString configDirectories = QString(getenv(XDG::CONFIG_DIRS)); + if(Mere::Utils::StringUtils::isBlank(configDirectories)) + configDirectories = QString(XDG::BaseDirectory::CONFIG_DIRS); + + QStringList dirs = configDirectories.split(":", QString::SkipEmptyParts); + + if (!dirs.isEmpty()) + { + for (int i = 0; i < dirs.size(); i++) + { + QString dir = dirs.at(i); + Mere::Utils::EnvUtils::expandEnvVar(dir); + + QDir _dir = QDir(dir); + if (!QDir(_dir).exists()) + createPath(_dir.absolutePath()); + } + } + + return dirs; +} + +bool Mere::XDG::BaseDirectorySpec::createPath(const QString path) +{ + qInfo() << "Going to create folder " << path; + bool created = QDir().mkpath(path); + if (!created) + qWarning() << "Unabled to create " << path; + + return created; +} diff --git a/src/basedirectoryspec.h b/src/basedirectoryspec.h new file mode 100644 index 0000000..15737d0 --- /dev/null +++ b/src/basedirectoryspec.h @@ -0,0 +1,171 @@ +#ifndef MERE_XDG_DIRECTORYSPEC_H +#define MERE_XDG_DIRECTORYSPEC_H + +#include "global.h" + +class QString; +class QStringList; + +namespace Mere +{ +namespace XDG +{ + + static const char* SESSION_DESKTOP = "XDG_SESSION_DESKTOP"; + static const char* CURRENT_DESKTOP = "XDG_CURRENT_DESKTOP"; + + static const char* DATA_HOME = "XDG_DATA_HOME"; + static const char* CONFIG_HOME = "XDG_CONFIG_HOME"; + static const char* CACHE_HOME = "XDG_CACHE_HOME"; + static const char* ICON_HOME = "XDG_ICON_HOME"; + + static const char* DATA_DIRS = "XDG_DATA_DIRS"; + static const char* CONFIG_DIRS = "XDG_CONFIG_DIRS"; + + static const char* RUNTIME_DIR = "XDG_RUNTIME_DIR"; + + namespace BaseDirectory + { + static const char* SESSION_DESKTOP = "Mere"; + static const char* CURRENT_DESKTOP = "Mere"; + + static const char* DATA_HOME = "$HOME/.local/share"; + static const char* CONFIG_HOME = "$HOME/.config"; + static const char* CACHE_HOME = "$HOME/.cache"; + static const char* ICON_HOME = "$HOME/.icons"; + + static const char* DATA_DIRS = "/usr/local/share/:/usr/share/"; + static const char* CONFIG_DIRS = "/etc/xdg"; + + static const char* RUNTIME_DIR = "/tmp/mere-$USER"; + } + + namespace ErrorMask + { + static const unsigned int SESSION_DESKTOP = 1 << 1; + static const unsigned int CURRENT_DESKTOP = 1 << 2; + static const unsigned int DATA_HOME = 1 << 3; + static const unsigned int CONFIG_HOME = 1 << 4; + static const unsigned int CACHE_HOME = 1 << 5; + static const unsigned int ICON_HOME = 1 << 6; + static const unsigned int DATA_DIRS = 1 << 7; + static const unsigned int CONFIG_DIRS = 1 << 8; + static const unsigned int RUNTIME_DIR = 1 << 9; + } + +class MERE_XDG_LIB_SPEC BaseDirectorySpec +{ + +private: + BaseDirectorySpec(); + +public: + /** + * @brief setupEnv + * + * Setup environments variables specified in XDG base directory specification. + * - XDG_DATA_HOME + * - XDG_CONFIG_HOME + * - XDG_DATA_DIRS + * - XDG_CONFIG_DIRS + * - XDG_CONFIG_DIRS + * - XDG_RUNTIME_DIR + * @return + */ + static unsigned int setupEnv(); + + /** + * @brief userDataDirectory + * + * Single base directory relative to which user-specific data files should be written. + * This directory is defined by the environment variable $XDG_DATA_HOME. + * + * If $XDG_DATA_HOME is either not set or empty, a default equal to $HOME/.local/share should be used. + * + * @return + */ + static QString userDataDirectory(); + + /** + * @brief userConfigDirectory + * + * Single base directory relative to which user-specific configuration files should be written. + * This directory is defined by the environment variable $XDG_CONFIG_HOME. + * + * If $XDG_CONFIG_HOME is either not set or empty, a default equal to $HOME/.config should be used. + * + * @return + */ + static QString userConfigDirectory(); + + /** + * @brief userCacheDirectory + * + * Base directory relative to which user-specific non-essential (cached) data should be written. + * This directory is defined by the environment variable $XDG_CACHE_HOME. + * + * If $XDG_CACHE_HOME is either not set or empty, a default equal to $HOME/.cache should be used. + * + * @return + */ + static QString userCacheDirectory(); + + /** + * @brief dataSearchDirectories + * + * Directories relative to which data files should be searched. + * This set of directories is defined by the environment variable $XDG_DATA_DIRS. + * + * $XDG_DATA_DIRS defines the preference-ordered set of base directories to search for data files in addition to the $XDG_DATA_HOME base directory. + * The directories in $XDG_DATA_DIRS should be seperated with a colon ':'. + * + * If $XDG_DATA_DIRS is either not set or empty, a value equal to /usr/local/share/:/usr/share/ should be used. + * + * @return + */ + static QStringList dataSearchDirectories(); + + /** + * @brief configSearchDirectories + * + * Directories relative to which configuration files should be searched. + * This set of directories is defined by the environment variable $XDG_CONFIG_DIRS. + * + * $XDG_CONFIG_DIRS defines the preference-ordered set of base directories to search for configuration files in addition to the $XDG_CONFIG_HOME base directory. + * The directories in $XDG_CONFIG_DIRS should be seperated with a colon ':'. + * + * If $XDG_CONFIG_DIRS is either not set or empty, a value equal to /etc/xdg should be used. + * @return + */ + static QStringList configSearchDirectories(); + +private: + static unsigned int setupDesktopEnv(); + + /** + * @brief setupDataHomeEnv + * User-specific data files store localtion + * @return + */ + static unsigned int setupDataHomeEnv(); + + /** + * @brief setupConfigHomeEnv + * User-specific configuration files store localtion + * @return + */ + static unsigned int setupConfigHomeEnv(); + static unsigned int setupDataDirsEnv(); + static unsigned int setupConfigDirsEnv(); + static unsigned int setupCacheHomeEnv(); + static unsigned int setupRuntimeDirEnv(); + + static unsigned int setupEnvVar(const char *env, const char *value, unsigned int err); + static bool createPath(const QString path); +}; + +} +} + + +#endif // MERE_XDG_DIRECTORYSPEC_H diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp new file mode 100644 index 0000000..bb1e4b8 --- /dev/null +++ b/src/desktopentry.cpp @@ -0,0 +1,26 @@ +#include "desktopentry.h" + +Mere::XDG::DesktopEntry::~DesktopEntry() +{ + +} + +Mere::XDG::DesktopEntry::DesktopEntry() +{ + +} + +Mere::XDG::DesktopEntry::DesktopEntry(QString &path) +{ + Q_UNUSED(path); +} + +QVariant Mere::XDG::DesktopEntry::get(Attribute attrbute) +{ + return this->attributes.value(attrbute); +} + +void Mere::XDG::DesktopEntry::set(Attribute attrbute, QVariant value) +{ + this->attributes.insert(attrbute, value); +} diff --git a/src/desktopentry.h b/src/desktopentry.h new file mode 100644 index 0000000..256ac8e --- /dev/null +++ b/src/desktopentry.h @@ -0,0 +1,41 @@ +#ifndef MERE_XDG_DESKTOPENTRY_H +#define MERE_XDG_DESKTOPENTRY_H + +#include "global.h" + +#include +#include + +namespace Mere +{ +namespace XDG +{ + +class MERE_XDG_LIB_SPEC DesktopEntry +{ +public: + ~DesktopEntry(); + explicit DesktopEntry(); + explicit DesktopEntry(QString &path); + + enum Attribute + { + DESKTOP_ENTRY_ID, + DESKTOP_ENTRY_NAME, + DESKTOP_ENTRY_ICON, + DESKTOP_ENTRY_EXEC, + DESKTOP_ENTRY_PATH, + DESKTOP_ENTRY_URL, + DESKTOP_ENTRY_COMMENT + }; + + QVariant get(Attribute); + void set(Attribute, QVariant value); + +private: + QMap attributes; +}; +} +} + +#endif // MERE_XDG_DESKTOPENTRY_H diff --git a/src/desktopentrydirectoryspec.cpp b/src/desktopentrydirectoryspec.cpp new file mode 100644 index 0000000..cb580a6 --- /dev/null +++ b/src/desktopentrydirectoryspec.cpp @@ -0,0 +1,62 @@ +#include "desktopentrydirectoryspec.h" +#include "basedirectoryspec.h" + +#include "mere/utils/stringutils.h" + +#include +#include + +Mere::XDG::DesktopEntryDirectorySpec::DesktopEntryDirectorySpec() +{ + +} + +//static +QStringList Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() +{ + QStringList applicationDirectories; + + QString userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); + expandEnvVars(userDatHome); + if (Mere::Utils::StringUtils::isNotBlank(userDatHome)) + applicationDirectories << applicationDirectory(userDatHome); + + const QStringList dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + foreach (QString dataSearchDirectory, dataSearchDirectories) + { + expandEnvVars(dataSearchDirectory); + if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) + applicationDirectories << applicationDirectory(dataSearchDirectory); + } + + return applicationDirectories; +} + +//static +QString Mere::XDG::DesktopEntryDirectorySpec::applicationDirectory(const QString &path) +{ + QString applicationDirectory(path); + + if (applicationDirectory.endsWith(QDir::separator())) + applicationDirectory = applicationDirectory.append(QString(Mere::XDG::APPLICATION_DIRECTORY)); + else + applicationDirectory = applicationDirectory.append(QString(QDir::separator()).append(QString(XDG::APPLICATION_DIRECTORY))); + + return applicationDirectory; +} + +//static +void Mere::XDG::DesktopEntryDirectorySpec::expandEnvVars(QString &path) +{ + if (path.contains("$HOME")) + { + const QString home(getenv("HOME")); + path = path.replace("$HOME", home); + } + + if (path.contains("$USER")) + { + const QString user(getenv("USER")); + path = path.replace("$USER", user); + } +} diff --git a/src/desktopentrydirectoryspec.h b/src/desktopentrydirectoryspec.h new file mode 100644 index 0000000..083eed2 --- /dev/null +++ b/src/desktopentrydirectoryspec.h @@ -0,0 +1,35 @@ +#ifndef MERE_XDG_DESKTOPENTRYDIRECTORYSPEC_H +#define MERE_XDG_DESKTOPENTRYDIRECTORYSPEC_H + +#include "global.h" + +namespace Mere +{ +namespace XDG +{ + +static const char* APPLICATION_DIRECTORY = "applications"; + +class MERE_XDG_LIB_SPEC DesktopEntryDirectorySpec +{ +public: + DesktopEntryDirectorySpec(); + +public: + /** + * @brief applicationDirectories + * + * Directories where system will search for 'Desktop Entry' files. + * + * @return + */ + static QStringList applicationDirectories(); + static QString applicationDirectory(const QString &path); + + // move it to a common place + static void expandEnvVars(QString &path); +}; +} +} + +#endif // MERE_XDG_DESKTOPENTRYDIRECTORYSPEC_H diff --git a/src/desktopentryspec.cpp b/src/desktopentryspec.cpp new file mode 100644 index 0000000..a3746a3 --- /dev/null +++ b/src/desktopentryspec.cpp @@ -0,0 +1,77 @@ +#include "desktopentryspec.h" + +#include "mere/utils/stringutils.h" + +#include +#include +#include + +Mere::XDG::DesktopEntrySpec::DesktopEntrySpec() +{ + +} + +Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QString &path) +{ + if(Mere::Utils::StringUtils::isBlank(path)) + { + qDebug() << path << " can't be blank. Please check the path."; + return DesktopEntry(); + } + + + qDebug() << "Going to read .desktop file"; + DesktopEntry entry; + + QSettings settings(path, QSettings::IniFormat); + settings.beginGroup("Desktop Entry"); + const QStringList keys = settings.childKeys(); + foreach (const QString &key, keys) + { + QVariant value = settings.value(key); + + if (key == "Name") + entry.set(DesktopEntry::DESKTOP_ENTRY_NAME, value); + else if (key == "Icon") + entry.set(DesktopEntry::DESKTOP_ENTRY_ICON, value); + else if (key == "Exec") + entry.set(DesktopEntry::DESKTOP_ENTRY_EXEC, value); + else if (key == "Path") + entry.set(DesktopEntry::DESKTOP_ENTRY_PATH, value); + else if (key == "URL") + entry.set(DesktopEntry::DESKTOP_ENTRY_URL, value); + else if (key == "Comment") + entry.set(DesktopEntry::DESKTOP_ENTRY_COMMENT, value); + + //qDebug() << key << value; + } + + settings.endGroup(); + + return entry; +} + +Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QFileInfo &fileInfo) +{ + if (!fileInfo.exists()) + { + qDebug() << fileInfo.absoluteFilePath() << " does not exists. Please check the path."; + return DesktopEntry(); + } + +// if(!fileInfo.isReadable()) +// { +// qDebug() << fileInfo.absoluteFilePath() << " is not readable. Please check the path."; +// return NULL; +// } + + return parse(fileInfo.absoluteFilePath()); +} + +//FIXME +bool Mere::XDG::DesktopEntrySpec::isValid(DesktopEntry &entry) +{ + Q_UNUSED(entry); + + return true; +} diff --git a/src/desktopentryspec.h b/src/desktopentryspec.h new file mode 100644 index 0000000..a51afb2 --- /dev/null +++ b/src/desktopentryspec.h @@ -0,0 +1,27 @@ +#ifndef MERE_XDG_DESKTOPENTRYSPEC_H +#define MERE_XDG_DESKTOPENTRYSPEC_H + +#include "global.h" +#include "desktopentry.h" + +#include + +namespace Mere +{ +namespace XDG +{ + +class MERE_XDG_LIB_SPEC DesktopEntrySpec +{ +private: + DesktopEntrySpec(); + +public: + static DesktopEntry parse(const QString &path); + static DesktopEntry parse(const QFileInfo &fileInfo); + static bool isValid(DesktopEntry &entry); +}; +} +} + +#endif // MERE_XDG_DESKTOPENTRYSPEC_H diff --git a/src/global.h b/src/global.h new file mode 100644 index 0000000..6a4c98f --- /dev/null +++ b/src/global.h @@ -0,0 +1,14 @@ +#ifndef MERE_XDG_GLOBAL_H +#define MERE_XDG_GLOBAL_H + +#include +#include + +#if defined(MERE_XDG_LIB) +# define MERE_XDG_LIB_SPEC Q_DECL_EXPORT +#else +# define MERE_XDG_LIB_SPEC Q_DECL_IMPORT +#endif + + +#endif // MERE_XDG_GLOBAL_H diff --git a/src/icontheme.cpp b/src/icontheme.cpp new file mode 100644 index 0000000..e170824 --- /dev/null +++ b/src/icontheme.cpp @@ -0,0 +1,6 @@ +#include "icontheme.h" + +Mere::XDG::IconTheme::IconTheme(const QString &themePath, QObject *parent) : QObject(parent) +{ + +} diff --git a/src/icontheme.h b/src/icontheme.h new file mode 100644 index 0000000..31e9259 --- /dev/null +++ b/src/icontheme.h @@ -0,0 +1,21 @@ +#ifndef MERE_XDG_ICONTHEME_H +#define MERE_XDG_ICONTHEME_H + +#include "global.h" + +#include +namespace Mere +{ +namespace XDG +{ + +class MERE_XDG_LIB_SPEC IconTheme : public QObject +{ + Q_OBJECT +public: + explicit IconTheme(const QString &themePath, QObject *parent = nullptr); +}; +} +} + +#endif // MERE_XDG_ICONTHEME_H diff --git a/src/iconthemedirectoryspec.cpp b/src/iconthemedirectoryspec.cpp new file mode 100644 index 0000000..23084bc --- /dev/null +++ b/src/iconthemedirectoryspec.cpp @@ -0,0 +1,123 @@ +#include "iconthemedirectoryspec.h" +#include "basedirectoryspec.h" + +#include "mere/utils/envutils.h" +#include "mere/utils/stringutils.h" + +#include + +Mere::XDG::IconThemeDirectorySpec::IconThemeDirectorySpec() +{ + +} + +//static +QStringList Mere::XDG::IconThemeDirectorySpec::baseDirectories() +{ + QStringList iconDirectories; + + QString userIconHome = IconThemeDirectorySpec::userIconDirectory(); + expandEnvVars(userIconHome); + if (Mere::Utils::StringUtils::isNotBlank(userIconHome)) + iconDirectories << userIconHome; + + // Not in specification + QString userDataDirectory = BaseDirectorySpec::userDataDirectory(); + expandEnvVars(userDataDirectory); + if (Mere::Utils::StringUtils::isNotBlank(userDataDirectory)) + iconDirectories << iconDirectory(userDataDirectory); + + const QStringList dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + foreach (QString dataSearchDirectory, dataSearchDirectories) + { + expandEnvVars(dataSearchDirectory); + if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) + iconDirectories << iconDirectory(dataSearchDirectory); + } + + // Not in specification + iconDirectories << "/usr/local/share/pixmaps"; + + iconDirectories << "/usr/share/pixmaps"; + + return iconDirectories; +} + +//static +QStringList Mere::XDG::IconThemeDirectorySpec::themeDirectories(const QString &theme) +{ + QStringList themeDirectories; + + QStringList baseDirectories = IconThemeDirectorySpec::baseDirectories(); + for ( const QString &baseDirectory : baseDirectories ) + { + QString themeDirectory = baseDirectory; + themeDirectory.append(QDir::separator()).append(theme); + + QString indexThemeFilePath = themeDirectory; + indexThemeFilePath.append(QDir::separator()).append("index.theme"); + + QFileInfo indexThemeFile(indexThemeFilePath); + if (indexThemeFile.exists()) + themeDirectories << themeDirectory; + } + + return themeDirectories; +} + +//static +QString Mere::XDG::IconThemeDirectorySpec::iconDirectory(const QString &path) +{ + QString iconDirectory(path); + + if (iconDirectory.endsWith(QDir::separator())) + iconDirectory = iconDirectory.append(QString(XDG::ICON_DIRECTORY)); + else + iconDirectory = iconDirectory.append(QString(QDir::separator()).append(QString(XDG::ICON_DIRECTORY))); + + return iconDirectory; +} + +//static +void Mere::XDG::IconThemeDirectorySpec::expandEnvVars(QString &path) +{ + if (path.contains("$HOME")) + { + const QString home(getenv("HOME")); + path = path.replace("$HOME", home); + } + + if (path.contains("$USER")) + { + const QString user(getenv("USER")); + path = path.replace("$USER", user); + } +} + +//static +QString Mere::XDG::IconThemeDirectorySpec::userIconDirectory() +{ + QString iconHome = QString(getenv(XDG::ICON_HOME)); + + if(Mere::Utils::StringUtils::isBlank(iconHome)) + iconHome = QString(XDG::BaseDirectory::ICON_HOME); + + Mere::Utils::EnvUtils::expandEnvVar(iconHome); + + QDir iconHomeDir = QDir(iconHome); + if (!iconHomeDir.exists()) + createPath(iconHomeDir.absolutePath()); + + return iconHome; +} + +//static +bool Mere::XDG::IconThemeDirectorySpec::createPath(const QString &path) +{ + qInfo() << "Going to create folder " << path; + bool created = QDir().mkpath(path); + if (!created) + qWarning() << "Unabled to create " << path; + + return created; +} diff --git a/src/iconthemedirectoryspec.h b/src/iconthemedirectoryspec.h new file mode 100644 index 0000000..aa6ddd8 --- /dev/null +++ b/src/iconthemedirectoryspec.h @@ -0,0 +1,41 @@ +#ifndef MERE_XDG_ICONTHEMEDIRECTORYSPEC_H +#define MERE_XDG_ICONTHEMEDIRECTORYSPEC_H + +#include "global.h" + +namespace Mere +{ +namespace XDG +{ +static const char* ICON_DIRECTORY = "icons"; + +class MERE_XDG_LIB_SPEC IconThemeDirectorySpec +{ +public: + IconThemeDirectorySpec(); + + static QString userIconDirectory(); + + /** + * @brief iconDirectories + * + * Directories where system will search for icon theme files. + * + * @return + */ + static QStringList baseDirectories(); + static QString iconDirectory(const QString &path); + + static QStringList themeDirectories(const QString &theme); + + // move to a commoon place + static void expandEnvVars(QString &path); + +private: + // move to a commoon place + static bool createPath(const QString &path); +}; +} +} + +#endif // MERE_XDG_ICONTHEMEDIRECTORYSPEC_H diff --git a/src/iconthemespec.cpp b/src/iconthemespec.cpp new file mode 100644 index 0000000..84c46aa --- /dev/null +++ b/src/iconthemespec.cpp @@ -0,0 +1,229 @@ +#include "iconthemespec.h" +#include "iconthemedirectoryspec.h" + +#include "mere/utils/stringutils.h" + +#include + +#include +#include +#include + +Mere::XDG::IconThemeSpec::~IconThemeSpec() +{ + +} + +Mere::XDG::IconThemeSpec::IconThemeSpec() +{ + +} + +//static +QString Mere::XDG::IconThemeSpec::path(const QString &icon) +{ + return path(icon, 0); +} + +//static +QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size) +{ + return path(icon, size, 0); +} + +//static +QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size, unsigned int scale) +{ + return FindIcon(icon, size, scale); +} + +//static +QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size, unsigned int scale, const QString &context) +{ + return FindIcon(icon, size, scale); +} + +//static +QString Mere::XDG::IconThemeSpec::path(const DesktopEntry &entry) +{ + +} + +QString Mere::XDG::IconThemeSpec::FindIcon(const QString &icon, unsigned int size, unsigned int scale) +{ + qDebug() << "Looking for icon : " << icon; +// filename = FindIconHelper(icon, size, scale, user selected theme); +// if filename != none +// return filename + + QString filepath = FindIconHelper(icon, size, scale, "hicolor"); + if( Mere::Utils::StringUtils::isNotBlank(filepath)) + return filepath; + + return LookupFallbackIcon (icon); +} + +QString Mere::XDG::IconThemeSpec::FindIconHelper(const QString &icon, unsigned int size, unsigned int scale, const QString &theme) +{ + QString filename = LookupIcon(icon, size, scale, theme); + if( Mere::Utils::StringUtils::isNotBlank(filename)) + return filename; + +// if theme has parents +// parents = theme.parents + +// for parent in parents { +// filename = FindIconHelper (icon, size, scale, parent) +// if filename != none +// return filename +// } + + return LookupFallbackIcon (icon); +} + +QString Mere::XDG::IconThemeSpec::LookupIcon(const QString &icon, unsigned int size, unsigned int scale, const QString &theme) +{ + int minsize = INT_MAX; + QString iconPath; + + QStringList themeDirectories = IconThemeDirectorySpec::themeDirectories(theme); + for ( const QString &themeDirectory : themeDirectories) + { + qDebug() << "Theme directory:" << themeDirectory; + + // Lookup into only the desire theme directory + // it contains all icon size and scale direcoties; + QString themeIndex = themeDirectory; + QSettings iconTheme(themeIndex.append(QDir::separator()).append("index.theme"), QSettings::IniFormat); + QStringList directories; + + iconTheme.beginGroup("Icon Theme"); + directories = iconTheme.value("Directories").toStringList(); + iconTheme.endGroup(); + +// QStringList filters; +// const QStringList extensions = {"png", "svg", "xpm"}; +// for (const QString &extension : extensions) +// filters << icon + "." + extension; + + for (const QString &directory : directories) + { + QDir dir(themeDirectory + QDir::separator() + directory); + QFileInfoList list = dir.entryInfoList(QStringList() << icon + ".*", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot); + if (list.size() == 0) continue; + + iconTheme.beginGroup(directory); + + IconDirectoryDefinition d; + d.type = iconTheme.value("Type").toString(); + + d.scale = 1; + if( iconTheme.contains("Scale")) + d.scale = iconTheme.value("Scale").toInt(); + + d.size = iconTheme.value("Size").toInt(); + + d.minsize = d.size; + if( iconTheme.contains("MinSize")) + d.minsize = iconTheme.value("MinSize").toInt(); + + d.maxsize = d.size; + if( iconTheme.contains("MaxSize")) + d.maxsize = iconTheme.value("MaxSize").toInt(); + + d.threshold = 2; + if( iconTheme.contains("Threshold")) + d.threshold = iconTheme.value("Threshold").toInt(); + + d.context = iconTheme.value("Context").toString(); + iconTheme.endGroup(); + + if (DirectoryMatchesSize(d, size, scale)) + { + return list.at(0).absoluteFilePath(); + } + else + { + int distance = DirectorySizeDistance(d, size, scale); + if( distance < minsize) + { + iconPath = list.at(0).absoluteFilePath(); + minsize = distance; + } + } + } + } + + return iconPath; +} + +QString Mere::XDG::IconThemeSpec::LookupFallbackIcon (const QString &icon) +{ + QStringList baseDirectories = IconThemeDirectorySpec::baseDirectories(); + + const QStringList extensions = {"png", "svg", "xpm"}; + for (const QString &directory : baseDirectories) + { + QString filePath = directory; + filePath.append(QDir::separator()).append(icon).append("."); + + for (const QString &extension : extensions) + { + filePath.append(extension); + QFileInfo file(filePath); + if (file.exists() && file.isReadable()) + return filePath; + + filePath.chop(extension.size()); + } + + } + + return QString(); +} + +//static +bool Mere::XDG::IconThemeSpec::DirectoryMatchesSize(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale) +{ + if (scale && def.scale != scale) + return false; + + if (def.type.compare("Fixed") == 0) + return (def.size == size); + + if (def.type.compare("Scaled") == 0) + return (def.minsize <= size && size <= def.maxsize); + + if (def.type.compare("Threshold") == 0) + return def.size - def.threshold <= size && size <= def.size + def.threshold; +} + +int Mere::XDG::IconThemeSpec::DirectorySizeDistance(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale) +{ + if (def.type.compare("Fixed") == 0) + return def.size * def.scale - size * scale; + + if (def.type.compare("Scaled") == 0) + { + if (size * scale < def.minsize * def.scale) + return def.minsize * def.scale - size * scale; + + if (size * scale > def.minsize * def.scale) + return size * scale - def.minsize * def.scale; + + return 0; + } + + if (def.type.compare("Threshold") == 0) + { + if ( size * scale < (def.size - def.threshold) * def.scale) + return def.minsize * def.scale - size * scale; + + if ( size * scale > (def.size + def.threshold) * def.scale) + return size * scale - def.maxsize * def.scale; + + return 0; + } + + return 0; +} diff --git a/src/iconthemespec.h b/src/iconthemespec.h new file mode 100644 index 0000000..b49afbe --- /dev/null +++ b/src/iconthemespec.h @@ -0,0 +1,45 @@ +#ifndef MERE_XDG_ICONTHEMESPEC_H +#define MERE_XDG_ICONTHEMESPEC_H + +#include "global.h" +#include "desktopentry.h" + +namespace Mere +{ +namespace XDG +{ + +typedef struct +{ + QString type; + int scale; + int size; + int minsize; + int maxsize; + int threshold; + QString context; +} IconDirectoryDefinition; + +class MERE_XDG_LIB_SPEC IconThemeSpec +{ +public: + ~IconThemeSpec(); + explicit IconThemeSpec(); + static QString path(const QString &icon); + static QString path(const QString &icon, unsigned int size); + static QString path(const QString &icon, unsigned int size, unsigned int scale); + static QString path(const QString &icon, unsigned int size, unsigned int scale, const QString &context); + static QString path(const DesktopEntry &entry); + +private: + static QString FindIcon(const QString &icon, unsigned int size, unsigned int scale); + static QString FindIconHelper(const QString &icon, unsigned int size, unsigned int scale, const QString &theme); + static QString LookupIcon (const QString &icon, unsigned int size, unsigned int scale, const QString &theme); + static QString LookupFallbackIcon (const QString &icon); + static bool DirectoryMatchesSize(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale); + static int DirectorySizeDistance(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale); +}; +} +} + +#endif // MERE_XDG_ICONTHEMESPEC_H From dc487f2980ec34b2eb1fd85d38814dcf0ea4fa10 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Tue, 16 Feb 2021 20:10:29 +0600 Subject: [PATCH 02/11] rename proj --- mere-xdg-lib.pro => mere-xdg-utils-lib.pro | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) rename mere-xdg-lib.pro => mere-xdg-utils-lib.pro (90%) diff --git a/mere-xdg-lib.pro b/mere-xdg-utils-lib.pro similarity index 90% rename from mere-xdg-lib.pro rename to mere-xdg-utils-lib.pro index d694611..5c7c377 100644 --- a/mere-xdg-lib.pro +++ b/mere-xdg-utils-lib.pro @@ -1,12 +1,9 @@ -include(../../mere-utils/mere-utils-lib/mere-utils-lib.pri) -include(../../mere-store/mere-store-lib/mere-store-lib.pri) - QT = core CONFIG += c++11 CONFIG += shared -TARGET = mere-xdg +TARGET = mere-xdg-utils VERSION= 0.0.1 TEMPLATE = lib @@ -40,8 +37,8 @@ HEADERS += \ INCLUDEPATH += /usr/local/include LIBS += -L/usr/local/lib -LIBS += -lmere-utils +LIBS += -lmere-utils # # Install From befa60d017ca49defc36cba8b26a997f06ef7b06 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 02:51:46 +0600 Subject: [PATCH 03/11] A working version prepared for mere-launch --- mere-xdg-utils-lib.pro | 61 ------------------- src/autostartdirectoryspec.cpp | 2 +- src/desktopentry.cpp | 34 +++++++++-- src/desktopentry.h | 47 ++++++++++----- src/desktopentryspec.cpp | 103 ++++++++++++++++++++------------- src/desktopentryspec.h | 6 +- 6 files changed, 129 insertions(+), 124 deletions(-) delete mode 100644 mere-xdg-utils-lib.pro diff --git a/mere-xdg-utils-lib.pro b/mere-xdg-utils-lib.pro deleted file mode 100644 index 5c7c377..0000000 --- a/mere-xdg-utils-lib.pro +++ /dev/null @@ -1,61 +0,0 @@ -QT = core - -CONFIG += c++11 -CONFIG += shared - -TARGET = mere-xdg-utils -VERSION= 0.0.1 -TEMPLATE = lib - -DEFINES += LIB_CODE=\\\"xdg\\\" -DEFINES += LIB_NAME=\\\"$$TARGET\\\" -DEFINES += LIB_VERSION=\\\"$$VERSION\\\" -DEFINES += MERE_XDG_LIB - -SOURCES += \ - src/autostartdirectoryspec.cpp \ - src/basedirectoryspec.cpp \ - src/desktopentry.cpp \ - src/desktopentrydirectoryspec.cpp \ - src/desktopentryspec.cpp \ - src/icontheme.cpp \ - src/iconthemedirectoryspec.cpp \ - src/iconthemespec.cpp - -HEADERS += \ - src/autostartdirectoryspec.h \ - src/basedirectoryspec.h \ - src/desktopentry.h \ - src/desktopentrydirectoryspec.h \ - src/desktopentryspec.h \ - src/global.h \ - src/global.h \ - src/icontheme.h \ - src/iconthemedirectoryspec.h \ - src/iconthemespec.h - -INCLUDEPATH += /usr/local/include - -LIBS += -L/usr/local/lib - -LIBS += -lmere-utils - -# -# Install -# -unix { - target.path = /usr/local/lib - INSTALLS += target - - INSTALL_PREFIX = /usr/local/include/mere/xdg - for(header, HEADERS) { - sdir = $${dirname(header)} - sdir = $$replace(sdir, "src", "") - path = $${INSTALL_PREFIX}$${sdir} - - eval(headers_$${path}.files += $$header) - eval(headers_$${path}.path = $$path) - eval(INSTALLS *= headers_$${path}) - } -} - diff --git a/src/autostartdirectoryspec.cpp b/src/autostartdirectoryspec.cpp index 2c87b0b..e780132 100644 --- a/src/autostartdirectoryspec.cpp +++ b/src/autostartdirectoryspec.cpp @@ -58,7 +58,7 @@ std::vector Mere::XDG::AutostartDirectorySpec::autostar { DesktopEntry desktopEntry = DesktopEntrySpec::parse(fileInfo); - if (Mere::XDG::DesktopEntrySpec::isValid(desktopEntry)) + if (Mere::XDG::DesktopEntrySpec::valid(desktopEntry)) desktopEntries.push_back(desktopEntry); } } diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp index bb1e4b8..3b20e94 100644 --- a/src/desktopentry.cpp +++ b/src/desktopentry.cpp @@ -10,17 +10,41 @@ Mere::XDG::DesktopEntry::DesktopEntry() } -Mere::XDG::DesktopEntry::DesktopEntry(QString &path) +Mere::XDG::DesktopEntry::DesktopEntry(const std::string &path) { Q_UNUSED(path); } -QVariant Mere::XDG::DesktopEntry::get(Attribute attrbute) +QVariant Mere::XDG::DesktopEntry::get(const Attribute &attribute) { - return this->attributes.value(attrbute); + auto find = m_attributes.find(attribute); + if (find != m_attributes.end()) + return find->second; + + return QVariant(); +} + +void Mere::XDG::DesktopEntry::set(const Attribute &attribute, const QVariant &value) +{ + this->m_attributes.insert({attribute, value}); } -void Mere::XDG::DesktopEntry::set(Attribute attrbute, QVariant value) +bool Mere::XDG::DesktopEntry::valid() { - this->attributes.insert(attrbute, value); + // Type is required + QVariant type = get(DesktopEntry::Type); + if (!type.isValid()) return false; + + // Name is required + QVariant name = get(DesktopEntry::Name); + if (!name.isValid()) return false; + + // URL is required for Link type + if (type == QVariant("Link")) + { + QVariant url = get(DesktopEntry::URL); + if (!url.isValid()) return false; + } + + return true; } diff --git a/src/desktopentry.h b/src/desktopentry.h index 256ac8e..48bbddf 100644 --- a/src/desktopentry.h +++ b/src/desktopentry.h @@ -2,8 +2,8 @@ #define MERE_XDG_DESKTOPENTRY_H #include "global.h" +#include -#include #include namespace Mere @@ -15,25 +15,46 @@ class MERE_XDG_LIB_SPEC DesktopEntry { public: ~DesktopEntry(); - explicit DesktopEntry(); - explicit DesktopEntry(QString &path); + DesktopEntry(); + + explicit DesktopEntry(const std::string &path); enum Attribute { - DESKTOP_ENTRY_ID, - DESKTOP_ENTRY_NAME, - DESKTOP_ENTRY_ICON, - DESKTOP_ENTRY_EXEC, - DESKTOP_ENTRY_PATH, - DESKTOP_ENTRY_URL, - DESKTOP_ENTRY_COMMENT + Id, + Type, + Version, + Name, + GenericName, + NoDisplay, + Comment, + Icon, + Hidden, + OnlyShowIn, + NotShowIn, + DBusActivatable, + TryExec, + Exec, + Path, + Terminal, + Actions, + MimeType, + Categories, + Implements, + Keywords, + StartupNotify, + StartupWMClass, + URL, + PrefersNonDefaultGPU }; - QVariant get(Attribute); - void set(Attribute, QVariant value); + QVariant get(const Attribute &attribute); + void set(const Attribute &attribute, const QVariant &value); + + bool valid(); private: - QMap attributes; + std::map m_attributes; }; } } diff --git a/src/desktopentryspec.cpp b/src/desktopentryspec.cpp index a3746a3..4ae9307 100644 --- a/src/desktopentryspec.cpp +++ b/src/desktopentryspec.cpp @@ -2,48 +2,91 @@ #include "mere/utils/stringutils.h" +#include #include #include #include -Mere::XDG::DesktopEntrySpec::DesktopEntrySpec() +//static +Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QString &path) { + if(Mere::Utils::StringUtils::isBlank(path)) + { + std::cout << "path can't be blank. please check the path." << std::endl; + return DesktopEntry(); + } + return parse(QFileInfo(path)); } -Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QString &path) +Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QFileInfo &fileInfo) { - if(Mere::Utils::StringUtils::isBlank(path)) + if (!fileInfo.exists()) { - qDebug() << path << " can't be blank. Please check the path."; + qDebug() << fileInfo.absoluteFilePath() << " does not exists. Please check the path."; return DesktopEntry(); } - - qDebug() << "Going to read .desktop file"; DesktopEntry entry; - QSettings settings(path, QSettings::IniFormat); + entry.set(DesktopEntry::Id, fileInfo.fileName()); + + QSettings settings(fileInfo.absoluteFilePath(), QSettings::IniFormat); + settings.beginGroup("Desktop Entry"); const QStringList keys = settings.childKeys(); - foreach (const QString &key, keys) + for (const QString &key : keys) { QVariant value = settings.value(key); - if (key == "Name") - entry.set(DesktopEntry::DESKTOP_ENTRY_NAME, value); + if (key == "Type") + entry.set(DesktopEntry::Type, value); + else if (key == "Version") + entry.set(DesktopEntry::Version, value); + else if (key == "Name") + entry.set(DesktopEntry::Name, value); + else if (key == "GenericName") + entry.set(DesktopEntry::GenericName, value); + else if (key == "NoDisplay") + entry.set(DesktopEntry::NoDisplay, value); + else if (key == "Comment") + entry.set(DesktopEntry::Comment, value); else if (key == "Icon") - entry.set(DesktopEntry::DESKTOP_ENTRY_ICON, value); + entry.set(DesktopEntry::Icon, value); + else if (key == "Hidden") + entry.set(DesktopEntry::Hidden, value); + else if (key == "OnlyShowIn") + entry.set(DesktopEntry::OnlyShowIn, value); + else if (key == "NotShowIn") + entry.set(DesktopEntry::NotShowIn, value); + else if (key == "DBusActivatable") + entry.set(DesktopEntry::DBusActivatable, value); + else if (key == "TryExec") + entry.set(DesktopEntry::TryExec, value); else if (key == "Exec") - entry.set(DesktopEntry::DESKTOP_ENTRY_EXEC, value); + entry.set(DesktopEntry::Exec, value); else if (key == "Path") - entry.set(DesktopEntry::DESKTOP_ENTRY_PATH, value); + entry.set(DesktopEntry::Path, value); + else if (key == "Terminal") + entry.set(DesktopEntry::Terminal, value); + else if (key == "Actions") + entry.set(DesktopEntry::Actions, value); + else if (key == "MimeType") + entry.set(DesktopEntry::MimeType, value); + else if (key == "Categories") + entry.set(DesktopEntry::Categories, value); + else if (key == "Implements") + entry.set(DesktopEntry::Implements, value); + else if (key == "Keywords") + entry.set(DesktopEntry::Keywords, value); + else if (key == "StartupNotify") + entry.set(DesktopEntry::StartupNotify, value); + else if (key == "StartupWMClass") + entry.set(DesktopEntry::StartupWMClass, value); else if (key == "URL") - entry.set(DesktopEntry::DESKTOP_ENTRY_URL, value); - else if (key == "Comment") - entry.set(DesktopEntry::DESKTOP_ENTRY_COMMENT, value); - - //qDebug() << key << value; + entry.set(DesktopEntry::URL, value); + else if (key == "PrefersNonDefaultGPU") + entry.set(DesktopEntry::PrefersNonDefaultGPU, value); } settings.endGroup(); @@ -51,27 +94,7 @@ Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QString &path) return entry; } -Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QFileInfo &fileInfo) -{ - if (!fileInfo.exists()) - { - qDebug() << fileInfo.absoluteFilePath() << " does not exists. Please check the path."; - return DesktopEntry(); - } - -// if(!fileInfo.isReadable()) -// { -// qDebug() << fileInfo.absoluteFilePath() << " is not readable. Please check the path."; -// return NULL; -// } - - return parse(fileInfo.absoluteFilePath()); -} - -//FIXME -bool Mere::XDG::DesktopEntrySpec::isValid(DesktopEntry &entry) +bool Mere::XDG::DesktopEntrySpec::valid(DesktopEntry &entry) { - Q_UNUSED(entry); - - return true; + return entry.valid(); } diff --git a/src/desktopentryspec.h b/src/desktopentryspec.h index a51afb2..d7b7cda 100644 --- a/src/desktopentryspec.h +++ b/src/desktopentryspec.h @@ -13,13 +13,11 @@ namespace XDG class MERE_XDG_LIB_SPEC DesktopEntrySpec { -private: - DesktopEntrySpec(); - + DesktopEntrySpec() = default; public: static DesktopEntry parse(const QString &path); static DesktopEntry parse(const QFileInfo &fileInfo); - static bool isValid(DesktopEntry &entry); + static bool valid(DesktopEntry &entry); }; } } From 79117348573be931f50633cf2e1df5c0947280e0 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 14:01:30 +0600 Subject: [PATCH 04/11] Clean up --- src/autostartdirectoryspec.cpp | 51 +++-------- src/autostartdirectoryspec.h | 19 ++--- src/basedirectoryspec.cpp | 137 ++++++++++++------------------ src/basedirectoryspec.h | 11 ++- src/desktopentrydirectoryspec.cpp | 56 ++++-------- src/desktopentrydirectoryspec.h | 11 +-- src/icontheme.cpp | 2 +- src/icontheme.h | 2 +- src/iconthemedirectoryspec.cpp | 109 +++++++++--------------- src/iconthemedirectoryspec.h | 17 ++-- src/iconthemespec.cpp | 91 +++++++++++--------- src/iconthemespec.h | 18 ++-- 12 files changed, 206 insertions(+), 318 deletions(-) diff --git a/src/autostartdirectoryspec.cpp b/src/autostartdirectoryspec.cpp index e780132..6f209de 100644 --- a/src/autostartdirectoryspec.cpp +++ b/src/autostartdirectoryspec.cpp @@ -2,36 +2,29 @@ #include "basedirectoryspec.h" #include "desktopentryspec.h" +#include "mere/utils/envutils.h" #include "mere/utils/stringutils.h" #include -#include -#include #include -#include - -Mere::XDG::AutostartDirectorySpec::AutostartDirectorySpec() -{ - -} std::vector Mere::XDG::AutostartDirectorySpec::autostartDirectories() { std::vector autostartDirectories; - QString userConfigHome = BaseDirectorySpec::userConfigDirectory(); - expandEnvVars(userConfigHome); + std::string userConfigHome = BaseDirectorySpec::userConfigDirectory(); + Mere::Utils::EnvUtils::expandEnvVar(userConfigHome); if (Mere::Utils::StringUtils::isNotBlank(userConfigHome)) - autostartDirectories.push_back( autostarDirectory(userConfigHome.toStdString()) ); + autostartDirectories.push_back( autostarDirectory(userConfigHome) ); - const QStringList configSearchDirectories = BaseDirectorySpec::configSearchDirectories(); - for (QString configSearchDirectory : configSearchDirectories) + const std::vector configSearchDirectories = BaseDirectorySpec::configSearchDirectories(); + for (std::string configSearchDirectory : configSearchDirectories) { - expandEnvVars(configSearchDirectory); + Mere::Utils::EnvUtils::expandEnvVar(configSearchDirectory); if (Mere::Utils::StringUtils::isNotBlank(configSearchDirectory)) - autostartDirectories.push_back( autostarDirectory(configSearchDirectory.toStdString()) ); + autostartDirectories.push_back( autostarDirectory(configSearchDirectory) ); } return autostartDirectories; @@ -46,7 +39,6 @@ std::vector Mere::XDG::AutostartDirectorySpec::autostar for(const std::string &autostartDirectory : autostartDirectories) { QDir autostartDir(autostartDirectory.c_str()); - qDebug()<< "Looking for autostart apps in " << autostartDir; QFileInfoList fileInfoList = autostartDir.entryInfoList(QDir::AllEntries); QListIterator i(fileInfoList); @@ -69,29 +61,10 @@ std::vector Mere::XDG::AutostartDirectorySpec::autostar std::string Mere::XDG::AutostartDirectorySpec::autostarDirectory(const std::string &path) { - //FIXME - QString autostartDirectory(path.c_str()); - - if (autostartDirectory.endsWith(QDir::separator())) - autostartDirectory = autostartDirectory.append(QString(XDG::AUTOSTART_DIRECTORY)); - else - autostartDirectory = autostartDirectory.append(QString(QDir::separator()).append(QString(XDG::AUTOSTART_DIRECTORY))); - - return autostartDirectory.toStdString(); -} + std::string autostartDirectory(path); -//FIXME -void Mere::XDG::AutostartDirectorySpec::expandEnvVars(QString &path) -{ - if (path.contains("$HOME")) - { - const QString home(getenv("HOME")); - path = path.replace("$HOME", home); - } + if (autostartDirectory[autostartDirectory.length() - 1] != '/') + autostartDirectory.append("/"); - if (path.contains("$USER")) - { - const QString user(getenv("USER")); - path = path.replace("$USER", user); - } + return autostartDirectory.append(XDG::AUTOSTART_DIRECTORY); } diff --git a/src/autostartdirectoryspec.h b/src/autostartdirectoryspec.h index fd388a9..ae0ead6 100644 --- a/src/autostartdirectoryspec.h +++ b/src/autostartdirectoryspec.h @@ -1,12 +1,9 @@ -#ifndef XDGAUTOSTARTDIRECTORYSPEC_H -#define XDGAUTOSTARTDIRECTORYSPEC_H +#ifndef MERE_XDG_AUTOSTARTDIRECTORYSPEC_H +#define MERE_XDG_AUTOSTARTDIRECTORYSPEC_H #include "global.h" #include "desktopentry.h" -#include -#include - namespace Mere { namespace XDG @@ -16,11 +13,7 @@ static const char* AUTOSTART_DIRECTORY = "autostart"; class MERE_XDG_LIB_SPEC AutostartDirectorySpec { -private: - AutostartDirectorySpec(); - static std::string autostarDirectory(const std::string &path); - static void expandEnvVars(QString &path); - + AutostartDirectorySpec() = default; public: /** * @brief autostartDirectories @@ -31,11 +24,13 @@ class MERE_XDG_LIB_SPEC AutostartDirectorySpec * @return */ static std::vector autostartDirectories(); - static std::vector autostartApplications(); + +private: + static std::string autostarDirectory(const std::string &path); }; } } -#endif // XDGAUTOSTARTDIRECTORYSPEC_H +#endif // MERE_XDG_AUTOSTARTDIRECTORYSPEC_H diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp index 5f096e0..4df4e7e 100644 --- a/src/basedirectoryspec.cpp +++ b/src/basedirectoryspec.cpp @@ -3,11 +3,12 @@ #include "mere/utils/envutils.h" #include "mere/utils/stringutils.h" +#include +#include +#include + #include #include -#include -#include -#include Mere::XDG::BaseDirectorySpec::BaseDirectorySpec() { @@ -30,25 +31,14 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupEnv() unsigned int Mere::XDG::BaseDirectorySpec::setupEnvVar(const char* env, const char* value, unsigned int err) { - QString valueStr(value); - Mere::Utils::EnvUtils::expandEnvVar(valueStr); - -// char* data = valueStr.toLatin1().data(); - char* data = new char[valueStr.length() + 1]; - for(int i = 0; i < valueStr.length(); i++) - { - data[i] = valueStr.at(i).toLatin1(); - } - data[valueStr.length()] = '\0'; - - int result = setenv(env, data, 1); - delete[] data; + std::string str(value); + Mere::Utils::EnvUtils::expandEnvVar(str); + int result = setenv(env, value, 1); if (result != 0) return err; - QDir valueDir = QDir(valueStr); - if (!valueDir.exists()) - createPath(valueDir.absolutePath()); + if (!std::ifstream(str).good()) + QDir().mkpath(str.c_str()); return 0; } @@ -79,11 +69,11 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupDataDirsEnv() int result = setenv(XDG::DATA_DIRS, XDG::BaseDirectory::DATA_DIRS, XDG::ErrorMask::DATA_DIRS); if (result != 0) return 4; - QString dataDirs(getenv(XDG::DATA_DIRS)); + std::string dataDirs(getenv(XDG::DATA_DIRS)); -// QDir cacheHomeDir = QDir(dataDirs); -// if (!cacheHomeDir.exists()) -// createPath(cacheHomeDir.absolutePath()); + // FIXME?? CHECK THIS + if (!std::ifstream(dataDirs).good()) + QDir().mkpath(dataDirs.c_str()); return 0; } @@ -108,106 +98,91 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupRuntimeDirEnv() return BaseDirectorySpec::setupEnvVar(XDG::RUNTIME_DIR, XDG::BaseDirectory::RUNTIME_DIR, XDG::ErrorMask::RUNTIME_DIR); } -QString Mere::XDG::BaseDirectorySpec::userDataDirectory() +std::string Mere::XDG::BaseDirectorySpec::userDataDirectory() { - QString dataHome = QString(getenv(XDG::DATA_HOME)); + std::string dataHome(getenv(XDG::DATA_HOME)); if(Mere::Utils::StringUtils::isBlank(dataHome)) - dataHome = QString(XDG::BaseDirectory::DATA_HOME); + dataHome = XDG::BaseDirectory::DATA_HOME; Mere::Utils::EnvUtils::expandEnvVar(dataHome); - QDir dataHomeDir = QDir(dataHome); - if (!dataHomeDir.exists()) - createPath(dataHomeDir.absolutePath()); + if (!std::ifstream(dataHome).good()) + QDir().mkpath(dataHome.c_str()); return dataHome; } -QString Mere::XDG::BaseDirectorySpec::userConfigDirectory() +std::string Mere::XDG::BaseDirectorySpec::userConfigDirectory() { - QString configHome = QString(getenv(XDG::CONFIG_HOME)); + std::string configHome(getenv(XDG::CONFIG_HOME)); if(Mere::Utils::StringUtils::isBlank(configHome)) - configHome = QString(XDG::BaseDirectory::CONFIG_HOME); + configHome = XDG::BaseDirectory::CONFIG_HOME; Mere::Utils::EnvUtils::expandEnvVar(configHome); - QDir configHomeDir = QDir(configHome); - if (!configHomeDir.exists()) - createPath(configHomeDir.absolutePath()); + if (!std::ifstream(configHome).good()) + QDir().mkpath(configHome.c_str()); return configHome; } -QString Mere::XDG::BaseDirectorySpec::userCacheDirectory() +std::string Mere::XDG::BaseDirectorySpec::userCacheDirectory() { - QString cacheHome = QString(getenv(XDG::CACHE_HOME)); + std::string cacheHome(getenv(XDG::CACHE_HOME)); if(Mere::Utils::StringUtils::isBlank(cacheHome)) - cacheHome = QString(XDG::BaseDirectory::CACHE_HOME); + cacheHome = XDG::BaseDirectory::CACHE_HOME; Mere::Utils::EnvUtils::expandEnvVar(cacheHome); - QDir cacheHomeDir = QDir(cacheHome); - if (!cacheHomeDir.exists()) - createPath(cacheHomeDir.absolutePath()); + if (!std::ifstream(cacheHome).good()) + QDir().mkpath(cacheHome.c_str()); return cacheHome; } -QStringList Mere::XDG::BaseDirectorySpec::dataSearchDirectories() +std::vector Mere::XDG::BaseDirectorySpec::dataSearchDirectories() { - QString dataDirectories = QString(getenv(XDG::DATA_DIRS)); - if(Mere::Utils::StringUtils::isBlank(dataDirectories)) - dataDirectories = QString(XDG::BaseDirectory::DATA_DIRS); + std::vector dirs; + + std::string dataDirectories(getenv(XDG::DATA_DIRS)); - QStringList dirs = dataDirectories.split(":", QString::SkipEmptyParts); + if(Mere::Utils::StringUtils::isBlank(dataDirectories)) + dataDirectories = XDG::BaseDirectory::DATA_DIRS; - if (!dirs.isEmpty()) + std::string dir; + std::istringstream iss(dataDirectories); + while (std::getline(iss, dir, ':')) { - for (int i = 0; i < dirs.size(); i++) - { - QString dir = dirs.at(i); - Mere::Utils::EnvUtils::expandEnvVar(dir); - - QDir _dir = QDir(dir); - if (!QDir(_dir).exists()) - createPath(_dir.absolutePath()); - } + Mere::Utils::EnvUtils::expandEnvVar(dir); + if (!std::ifstream(dir).good()) + QDir().mkpath(dir.c_str()); + + dirs.push_back(dir); } return dirs; } -QStringList Mere::XDG::BaseDirectorySpec::configSearchDirectories() +std::vector Mere::XDG::BaseDirectorySpec::configSearchDirectories() { - QString configDirectories = QString(getenv(XDG::CONFIG_DIRS)); - if(Mere::Utils::StringUtils::isBlank(configDirectories)) - configDirectories = QString(XDG::BaseDirectory::CONFIG_DIRS); + std::vector dirs; + + std::string configDirectories(getenv(XDG::CONFIG_DIRS)); - QStringList dirs = configDirectories.split(":", QString::SkipEmptyParts); + if(Mere::Utils::StringUtils::isBlank(configDirectories)) + configDirectories = XDG::BaseDirectory::CONFIG_DIRS; - if (!dirs.isEmpty()) + std::string dir; + std::istringstream iss(configDirectories); + while (std::getline(iss, dir, ':')) { - for (int i = 0; i < dirs.size(); i++) - { - QString dir = dirs.at(i); - Mere::Utils::EnvUtils::expandEnvVar(dir); - - QDir _dir = QDir(dir); - if (!QDir(_dir).exists()) - createPath(_dir.absolutePath()); - } + Mere::Utils::EnvUtils::expandEnvVar(dir); + if (!std::ifstream(dir).good()) + QDir().mkpath(dir.c_str()); + + dirs.push_back(dir); } return dirs; } - -bool Mere::XDG::BaseDirectorySpec::createPath(const QString path) -{ - qInfo() << "Going to create folder " << path; - bool created = QDir().mkpath(path); - if (!created) - qWarning() << "Unabled to create " << path; - - return created; -} diff --git a/src/basedirectoryspec.h b/src/basedirectoryspec.h index 15737d0..0021570 100644 --- a/src/basedirectoryspec.h +++ b/src/basedirectoryspec.h @@ -84,7 +84,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static QString userDataDirectory(); + static std::string userDataDirectory(); /** * @brief userConfigDirectory @@ -96,7 +96,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static QString userConfigDirectory(); + static std::string userConfigDirectory(); /** * @brief userCacheDirectory @@ -108,7 +108,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static QString userCacheDirectory(); + static std::string userCacheDirectory(); /** * @brief dataSearchDirectories @@ -123,7 +123,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static QStringList dataSearchDirectories(); + static std::vector dataSearchDirectories(); /** * @brief configSearchDirectories @@ -137,7 +137,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * If $XDG_CONFIG_DIRS is either not set or empty, a value equal to /etc/xdg should be used. * @return */ - static QStringList configSearchDirectories(); + static std::vector configSearchDirectories(); private: static unsigned int setupDesktopEnv(); @@ -161,7 +161,6 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec static unsigned int setupRuntimeDirEnv(); static unsigned int setupEnvVar(const char *env, const char *value, unsigned int err); - static bool createPath(const QString path); }; } diff --git a/src/desktopentrydirectoryspec.cpp b/src/desktopentrydirectoryspec.cpp index cb580a6..af2effd 100644 --- a/src/desktopentrydirectoryspec.cpp +++ b/src/desktopentrydirectoryspec.cpp @@ -1,62 +1,38 @@ #include "desktopentrydirectoryspec.h" #include "basedirectoryspec.h" +#include "mere/utils/envutils.h" #include "mere/utils/stringutils.h" -#include -#include - -Mere::XDG::DesktopEntryDirectorySpec::DesktopEntryDirectorySpec() -{ - -} - //static -QStringList Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() +std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() { - QStringList applicationDirectories; + std::vector applicationDirectories; + + std::string userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); - QString userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); - expandEnvVars(userDatHome); + Mere::Utils::EnvUtils::expandEnvVar(userDatHome); if (Mere::Utils::StringUtils::isNotBlank(userDatHome)) - applicationDirectories << applicationDirectory(userDatHome); + applicationDirectories.push_back(applicationDirectory(userDatHome)); - const QStringList dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); - foreach (QString dataSearchDirectory, dataSearchDirectories) + const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + for(std::string dataSearchDirectory : dataSearchDirectories) { - expandEnvVars(dataSearchDirectory); + Mere::Utils::EnvUtils::expandEnvVar(dataSearchDirectory); if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) - applicationDirectories << applicationDirectory(dataSearchDirectory); + applicationDirectories.push_back(applicationDirectory(dataSearchDirectory)); } return applicationDirectories; } //static -QString Mere::XDG::DesktopEntryDirectorySpec::applicationDirectory(const QString &path) +std::string Mere::XDG::DesktopEntryDirectorySpec::applicationDirectory(const std::string &path) { - QString applicationDirectory(path); + std::string applicationDirectory(path); - if (applicationDirectory.endsWith(QDir::separator())) - applicationDirectory = applicationDirectory.append(QString(Mere::XDG::APPLICATION_DIRECTORY)); - else - applicationDirectory = applicationDirectory.append(QString(QDir::separator()).append(QString(XDG::APPLICATION_DIRECTORY))); - - return applicationDirectory; -} + if (applicationDirectory[applicationDirectory.length() - 1] != '/') + applicationDirectory.append("/"); -//static -void Mere::XDG::DesktopEntryDirectorySpec::expandEnvVars(QString &path) -{ - if (path.contains("$HOME")) - { - const QString home(getenv("HOME")); - path = path.replace("$HOME", home); - } - - if (path.contains("$USER")) - { - const QString user(getenv("USER")); - path = path.replace("$USER", user); - } + return applicationDirectory.append(Mere::XDG::APPLICATION_DIRECTORY); } diff --git a/src/desktopentrydirectoryspec.h b/src/desktopentrydirectoryspec.h index 083eed2..fb4d662 100644 --- a/src/desktopentrydirectoryspec.h +++ b/src/desktopentrydirectoryspec.h @@ -12,9 +12,7 @@ static const char* APPLICATION_DIRECTORY = "applications"; class MERE_XDG_LIB_SPEC DesktopEntryDirectorySpec { -public: - DesktopEntryDirectorySpec(); - + DesktopEntryDirectorySpec() = default; public: /** * @brief applicationDirectories @@ -23,11 +21,8 @@ class MERE_XDG_LIB_SPEC DesktopEntryDirectorySpec * * @return */ - static QStringList applicationDirectories(); - static QString applicationDirectory(const QString &path); - - // move it to a common place - static void expandEnvVars(QString &path); + static std::vector applicationDirectories(); + static std::string applicationDirectory(const std::string &path); }; } } diff --git a/src/icontheme.cpp b/src/icontheme.cpp index e170824..f9212da 100644 --- a/src/icontheme.cpp +++ b/src/icontheme.cpp @@ -1,6 +1,6 @@ #include "icontheme.h" -Mere::XDG::IconTheme::IconTheme(const QString &themePath, QObject *parent) : QObject(parent) +Mere::XDG::IconTheme::IconTheme(const std::string &themePath, QObject *parent) : QObject(parent) { } diff --git a/src/icontheme.h b/src/icontheme.h index 31e9259..3a25ccb 100644 --- a/src/icontheme.h +++ b/src/icontheme.h @@ -13,7 +13,7 @@ class MERE_XDG_LIB_SPEC IconTheme : public QObject { Q_OBJECT public: - explicit IconTheme(const QString &themePath, QObject *parent = nullptr); + explicit IconTheme(const std::string &themePath, QObject *parent = nullptr); }; } } diff --git a/src/iconthemedirectoryspec.cpp b/src/iconthemedirectoryspec.cpp index 23084bc..0bcc26c 100644 --- a/src/iconthemedirectoryspec.cpp +++ b/src/iconthemedirectoryspec.cpp @@ -4,120 +4,87 @@ #include "mere/utils/envutils.h" #include "mere/utils/stringutils.h" +#include +#include #include -Mere::XDG::IconThemeDirectorySpec::IconThemeDirectorySpec() -{ - -} - //static -QStringList Mere::XDG::IconThemeDirectorySpec::baseDirectories() +std::vector Mere::XDG::IconThemeDirectorySpec::baseDirectories() { - QStringList iconDirectories; + std::vector iconDirectories; + + std::string userIconHome = IconThemeDirectorySpec::userIconDirectory(); + Mere::Utils::EnvUtils::expandEnvVar(userIconHome); - QString userIconHome = IconThemeDirectorySpec::userIconDirectory(); - expandEnvVars(userIconHome); if (Mere::Utils::StringUtils::isNotBlank(userIconHome)) - iconDirectories << userIconHome; + iconDirectories.push_back(userIconHome); // Not in specification - QString userDataDirectory = BaseDirectorySpec::userDataDirectory(); - expandEnvVars(userDataDirectory); + std::string userDataDirectory = BaseDirectorySpec::userDataDirectory(); + Mere::Utils::EnvUtils::expandEnvVar(userDataDirectory); + if (Mere::Utils::StringUtils::isNotBlank(userDataDirectory)) - iconDirectories << iconDirectory(userDataDirectory); + iconDirectories.push_back(iconDirectory(userDataDirectory)); - const QStringList dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); - foreach (QString dataSearchDirectory, dataSearchDirectories) + const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + for(std::string dataSearchDirectory : dataSearchDirectories) { - expandEnvVars(dataSearchDirectory); + Mere::Utils::EnvUtils::expandEnvVar(dataSearchDirectory); if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) - iconDirectories << iconDirectory(dataSearchDirectory); + iconDirectories.push_back(iconDirectory(dataSearchDirectory)); } // Not in specification - iconDirectories << "/usr/local/share/pixmaps"; - - iconDirectories << "/usr/share/pixmaps"; + iconDirectories.push_back("/usr/local/share/pixmaps"); + iconDirectories.push_back("/usr/share/pixmaps"); return iconDirectories; } //static -QStringList Mere::XDG::IconThemeDirectorySpec::themeDirectories(const QString &theme) +std::vector Mere::XDG::IconThemeDirectorySpec::themeDirectories(const std::string &theme) { - QStringList themeDirectories; + std::vector themeDirectories; - QStringList baseDirectories = IconThemeDirectorySpec::baseDirectories(); - for ( const QString &baseDirectory : baseDirectories ) + std::vector baseDirectories = IconThemeDirectorySpec::baseDirectories(); + for ( const std::string &baseDirectory : baseDirectories ) { - QString themeDirectory = baseDirectory; - themeDirectory.append(QDir::separator()).append(theme); + std::string themeDirectory = baseDirectory; + themeDirectory.append("/").append(theme); - QString indexThemeFilePath = themeDirectory; - indexThemeFilePath.append(QDir::separator()).append("index.theme"); + std::string indexThemeFilePath = themeDirectory; + indexThemeFilePath.append("/").append("index.theme"); - QFileInfo indexThemeFile(indexThemeFilePath); - if (indexThemeFile.exists()) - themeDirectories << themeDirectory; + if(std::ifstream(indexThemeFilePath).good()) + themeDirectories.push_back(themeDirectory); } return themeDirectories; } //static -QString Mere::XDG::IconThemeDirectorySpec::iconDirectory(const QString &path) +std::string Mere::XDG::IconThemeDirectorySpec::iconDirectory(const std::string &path) { - QString iconDirectory(path); + std::string iconPath(path); - if (iconDirectory.endsWith(QDir::separator())) - iconDirectory = iconDirectory.append(QString(XDG::ICON_DIRECTORY)); - else - iconDirectory = iconDirectory.append(QString(QDir::separator()).append(QString(XDG::ICON_DIRECTORY))); + if (path[path.length() - 1] != '/') + iconPath = iconPath.append("/"); - return iconDirectory; + return iconPath.append(XDG::ICON_DIRECTORY); } //static -void Mere::XDG::IconThemeDirectorySpec::expandEnvVars(QString &path) +std::string Mere::XDG::IconThemeDirectorySpec::userIconDirectory() { - if (path.contains("$HOME")) - { - const QString home(getenv("HOME")); - path = path.replace("$HOME", home); - } - - if (path.contains("$USER")) - { - const QString user(getenv("USER")); - path = path.replace("$USER", user); - } -} - -//static -QString Mere::XDG::IconThemeDirectorySpec::userIconDirectory() -{ - QString iconHome = QString(getenv(XDG::ICON_HOME)); + std::string iconHome = getenv(XDG::ICON_HOME); if(Mere::Utils::StringUtils::isBlank(iconHome)) - iconHome = QString(XDG::BaseDirectory::ICON_HOME); + iconHome = XDG::BaseDirectory::ICON_HOME; Mere::Utils::EnvUtils::expandEnvVar(iconHome); - QDir iconHomeDir = QDir(iconHome); - if (!iconHomeDir.exists()) - createPath(iconHomeDir.absolutePath()); + if(!std::fstream(iconHome).good()) + QDir().mkpath(iconHome.c_str()); return iconHome; } - -//static -bool Mere::XDG::IconThemeDirectorySpec::createPath(const QString &path) -{ - qInfo() << "Going to create folder " << path; - bool created = QDir().mkpath(path); - if (!created) - qWarning() << "Unabled to create " << path; - - return created; -} diff --git a/src/iconthemedirectoryspec.h b/src/iconthemedirectoryspec.h index aa6ddd8..5da589e 100644 --- a/src/iconthemedirectoryspec.h +++ b/src/iconthemedirectoryspec.h @@ -11,10 +11,10 @@ static const char* ICON_DIRECTORY = "icons"; class MERE_XDG_LIB_SPEC IconThemeDirectorySpec { + IconThemeDirectorySpec() = default; public: - IconThemeDirectorySpec(); - static QString userIconDirectory(); + static std::string userIconDirectory(); /** * @brief iconDirectories @@ -23,17 +23,10 @@ class MERE_XDG_LIB_SPEC IconThemeDirectorySpec * * @return */ - static QStringList baseDirectories(); - static QString iconDirectory(const QString &path); + static std::vector baseDirectories(); + static std::string iconDirectory(const std::string &path); - static QStringList themeDirectories(const QString &theme); - - // move to a commoon place - static void expandEnvVars(QString &path); - -private: - // move to a commoon place - static bool createPath(const QString &path); + static std::vector themeDirectories(const std::string &theme); }; } } diff --git a/src/iconthemespec.cpp b/src/iconthemespec.cpp index 84c46aa..3f27191 100644 --- a/src/iconthemespec.cpp +++ b/src/iconthemespec.cpp @@ -20,52 +20,52 @@ Mere::XDG::IconThemeSpec::IconThemeSpec() } //static -QString Mere::XDG::IconThemeSpec::path(const QString &icon) +std::string Mere::XDG::IconThemeSpec::path(const std::string &icon) { return path(icon, 0); } //static -QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size) +std::string Mere::XDG::IconThemeSpec::path(const std::string &icon, unsigned int size) { return path(icon, size, 0); } //static -QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size, unsigned int scale) +std::string Mere::XDG::IconThemeSpec::path(const std::string &icon, unsigned int size, unsigned int scale) { return FindIcon(icon, size, scale); } //static -QString Mere::XDG::IconThemeSpec::path(const QString &icon, unsigned int size, unsigned int scale, const QString &context) +std::string Mere::XDG::IconThemeSpec::path(const std::string &icon, unsigned int size, unsigned int scale, const std::string &context) { return FindIcon(icon, size, scale); } //static -QString Mere::XDG::IconThemeSpec::path(const DesktopEntry &entry) +std::string Mere::XDG::IconThemeSpec::path(const DesktopEntry &entry) { } -QString Mere::XDG::IconThemeSpec::FindIcon(const QString &icon, unsigned int size, unsigned int scale) +std::string Mere::XDG::IconThemeSpec::FindIcon(const std::string &icon, unsigned int size, unsigned int scale) { - qDebug() << "Looking for icon : " << icon; + qDebug() << "Looking for icon : " << icon.c_str(); // filename = FindIconHelper(icon, size, scale, user selected theme); // if filename != none // return filename - QString filepath = FindIconHelper(icon, size, scale, "hicolor"); + std::string filepath = FindIconHelper(icon, size, scale, "hicolor"); if( Mere::Utils::StringUtils::isNotBlank(filepath)) return filepath; - return LookupFallbackIcon (icon); + return LookupFallbackIcon(icon); } -QString Mere::XDG::IconThemeSpec::FindIconHelper(const QString &icon, unsigned int size, unsigned int scale, const QString &theme) +std::string Mere::XDG::IconThemeSpec::FindIconHelper(const std::string &icon, unsigned int size, unsigned int scale, const std::string &theme) { - QString filename = LookupIcon(icon, size, scale, theme); + std::string filename = LookupIcon(icon, size, scale, theme); if( Mere::Utils::StringUtils::isNotBlank(filename)) return filename; @@ -78,27 +78,34 @@ QString Mere::XDG::IconThemeSpec::FindIconHelper(const QString &icon, unsigned i // return filename // } - return LookupFallbackIcon (icon); + return LookupFallbackIcon(icon); } -QString Mere::XDG::IconThemeSpec::LookupIcon(const QString &icon, unsigned int size, unsigned int scale, const QString &theme) +std::string Mere::XDG::IconThemeSpec::LookupIcon(const std::string &icon, unsigned int size, unsigned int scale, const std::string &theme) { int minsize = INT_MAX; - QString iconPath; + std::string iconPath; - QStringList themeDirectories = IconThemeDirectorySpec::themeDirectories(theme); - for ( const QString &themeDirectory : themeDirectories) + std::vector themeDirectories = IconThemeDirectorySpec::themeDirectories(theme); + for ( const std::string &themeDirectory : themeDirectories) { - qDebug() << "Theme directory:" << themeDirectory; +// qDebug() << "Theme directory:" << themeDirectory; // Lookup into only the desire theme directory // it contains all icon size and scale direcoties; - QString themeIndex = themeDirectory; - QSettings iconTheme(themeIndex.append(QDir::separator()).append("index.theme"), QSettings::IniFormat); - QStringList directories; + std::string themeIndex = themeDirectory; + + QSettings iconTheme(themeIndex.append("/").append("index.theme").c_str(), QSettings::IniFormat); + std::vector directories; iconTheme.beginGroup("Icon Theme"); - directories = iconTheme.value("Directories").toStringList(); + //directories = iconTheme.value("Directories").toStringList(); + + for( QString str : iconTheme.value("Directories").toStringList()) + { + directories.push_back(str.toStdString()); + } + iconTheme.endGroup(); // QStringList filters; @@ -106,13 +113,19 @@ QString Mere::XDG::IconThemeSpec::LookupIcon(const QString &icon, unsigned int s // for (const QString &extension : extensions) // filters << icon + "." + extension; - for (const QString &directory : directories) + for (const std::string &directory : directories) { - QDir dir(themeDirectory + QDir::separator() + directory); - QFileInfoList list = dir.entryInfoList(QStringList() << icon + ".*", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot); +// QDir dir(themeDirectory + QDir::separator() + directory); + + std::string dirpath(themeDirectory); + dirpath.append("/").append(directory); + + QDir dir(dirpath.c_str()); + + QFileInfoList list = dir.entryInfoList(QStringList() << QString::fromStdString(icon) + ".*", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot); if (list.size() == 0) continue; - iconTheme.beginGroup(directory); + iconTheme.beginGroup(directory.c_str()); IconDirectoryDefinition d; d.type = iconTheme.value("Type").toString(); @@ -140,14 +153,14 @@ QString Mere::XDG::IconThemeSpec::LookupIcon(const QString &icon, unsigned int s if (DirectoryMatchesSize(d, size, scale)) { - return list.at(0).absoluteFilePath(); + return list.at(0).absoluteFilePath().toStdString(); } else { int distance = DirectorySizeDistance(d, size, scale); if( distance < minsize) { - iconPath = list.at(0).absoluteFilePath(); + iconPath = list.at(0).absoluteFilePath().toStdString(); minsize = distance; } } @@ -157,29 +170,31 @@ QString Mere::XDG::IconThemeSpec::LookupIcon(const QString &icon, unsigned int s return iconPath; } -QString Mere::XDG::IconThemeSpec::LookupFallbackIcon (const QString &icon) +std::string Mere::XDG::IconThemeSpec::LookupFallbackIcon (const std::string &icon) { - QStringList baseDirectories = IconThemeDirectorySpec::baseDirectories(); + std::vector baseDirectories = IconThemeDirectorySpec::baseDirectories(); - const QStringList extensions = {"png", "svg", "xpm"}; - for (const QString &directory : baseDirectories) + const std::vector extensions = {"png", "svg", "xpm"}; + for (const std::string &directory : baseDirectories) { - QString filePath = directory; - filePath.append(QDir::separator()).append(icon).append("."); + std::string filePath = directory; + filePath.append("/").append(icon).append("."); - for (const QString &extension : extensions) + for (const std::string &extension : extensions) { + // add extension filePath.append(extension); - QFileInfo file(filePath); + + QFileInfo file(filePath.c_str()); if (file.exists() && file.isReadable()) return filePath; - filePath.chop(extension.size()); + // remove extension + filePath.erase(filePath.length() - extension.length()); } - } - return QString(); + return ""; } //static diff --git a/src/iconthemespec.h b/src/iconthemespec.h index b49afbe..f05b6cb 100644 --- a/src/iconthemespec.h +++ b/src/iconthemespec.h @@ -25,17 +25,17 @@ class MERE_XDG_LIB_SPEC IconThemeSpec public: ~IconThemeSpec(); explicit IconThemeSpec(); - static QString path(const QString &icon); - static QString path(const QString &icon, unsigned int size); - static QString path(const QString &icon, unsigned int size, unsigned int scale); - static QString path(const QString &icon, unsigned int size, unsigned int scale, const QString &context); - static QString path(const DesktopEntry &entry); + static std::string path(const std::string &icon); + static std::string path(const std::string &icon, unsigned int size); + static std::string path(const std::string &icon, unsigned int size, unsigned int scale); + static std::string path(const std::string &icon, unsigned int size, unsigned int scale, const std::string &context); + static std::string path(const DesktopEntry &entry); private: - static QString FindIcon(const QString &icon, unsigned int size, unsigned int scale); - static QString FindIconHelper(const QString &icon, unsigned int size, unsigned int scale, const QString &theme); - static QString LookupIcon (const QString &icon, unsigned int size, unsigned int scale, const QString &theme); - static QString LookupFallbackIcon (const QString &icon); + static std::string FindIcon(const std::string &icon, unsigned int size, unsigned int scale); + static std::string FindIconHelper(const std::string &icon, unsigned int size, unsigned int scale, const std::string &theme); + static std::string LookupIcon(const std::string &icon, unsigned int size, unsigned int scale, const std::string &theme); + static std::string LookupFallbackIcon(const std::string &icon); static bool DirectoryMatchesSize(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale); static int DirectorySizeDistance(const IconDirectoryDefinition &def, unsigned int size, unsigned int scale); }; From 55014df9b40427e57f3f27712de31177a0830581 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 15:18:31 +0600 Subject: [PATCH 05/11] Fix string init with nullptr --- src/basedirectoryspec.cpp | 27 ++++++++++++--------------- src/desktopentrydirectoryspec.cpp | 5 +++++ 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp index 4df4e7e..476ac6f 100644 --- a/src/basedirectoryspec.cpp +++ b/src/basedirectoryspec.cpp @@ -100,10 +100,9 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupRuntimeDirEnv() std::string Mere::XDG::BaseDirectorySpec::userDataDirectory() { - std::string dataHome(getenv(XDG::DATA_HOME)); + const char *home = getenv(XDG::DATA_HOME); - if(Mere::Utils::StringUtils::isBlank(dataHome)) - dataHome = XDG::BaseDirectory::DATA_HOME; + std::string dataHome(home ? home : XDG::BaseDirectory::DATA_HOME); Mere::Utils::EnvUtils::expandEnvVar(dataHome); @@ -115,9 +114,9 @@ std::string Mere::XDG::BaseDirectorySpec::userDataDirectory() std::string Mere::XDG::BaseDirectorySpec::userConfigDirectory() { - std::string configHome(getenv(XDG::CONFIG_HOME)); - if(Mere::Utils::StringUtils::isBlank(configHome)) - configHome = XDG::BaseDirectory::CONFIG_HOME; + const char *home = getenv(XDG::CONFIG_HOME); + + std::string configHome(home ? home : XDG::BaseDirectory::CONFIG_HOME); Mere::Utils::EnvUtils::expandEnvVar(configHome); @@ -129,9 +128,9 @@ std::string Mere::XDG::BaseDirectorySpec::userConfigDirectory() std::string Mere::XDG::BaseDirectorySpec::userCacheDirectory() { - std::string cacheHome(getenv(XDG::CACHE_HOME)); - if(Mere::Utils::StringUtils::isBlank(cacheHome)) - cacheHome = XDG::BaseDirectory::CACHE_HOME; + const char *home = getenv(XDG::CACHE_HOME); + + std::string cacheHome( home ? home : XDG::BaseDirectory::CACHE_HOME); Mere::Utils::EnvUtils::expandEnvVar(cacheHome); @@ -145,10 +144,9 @@ std::vector Mere::XDG::BaseDirectorySpec::dataSearchDirectories() { std::vector dirs; - std::string dataDirectories(getenv(XDG::DATA_DIRS)); + const char *datadirs = getenv(XDG::DATA_DIRS); - if(Mere::Utils::StringUtils::isBlank(dataDirectories)) - dataDirectories = XDG::BaseDirectory::DATA_DIRS; + std::string dataDirectories(datadirs ? datadirs : XDG::BaseDirectory::DATA_DIRS); std::string dir; std::istringstream iss(dataDirectories); @@ -168,10 +166,9 @@ std::vector Mere::XDG::BaseDirectorySpec::configSearchDirectories() { std::vector dirs; - std::string configDirectories(getenv(XDG::CONFIG_DIRS)); + const char *configdirs = getenv(XDG::CONFIG_DIRS); - if(Mere::Utils::StringUtils::isBlank(configDirectories)) - configDirectories = XDG::BaseDirectory::CONFIG_DIRS; + std::string configDirectories(configdirs ? configdirs : XDG::BaseDirectory::CONFIG_DIRS); std::string dir; std::istringstream iss(configDirectories); diff --git a/src/desktopentrydirectoryspec.cpp b/src/desktopentrydirectoryspec.cpp index af2effd..25445d2 100644 --- a/src/desktopentrydirectoryspec.cpp +++ b/src/desktopentrydirectoryspec.cpp @@ -7,13 +7,16 @@ //static std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() { + qDebug() << "1...."; std::vector applicationDirectories; std::string userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); + qDebug() << "1...."; Mere::Utils::EnvUtils::expandEnvVar(userDatHome); if (Mere::Utils::StringUtils::isNotBlank(userDatHome)) applicationDirectories.push_back(applicationDirectory(userDatHome)); + qDebug() << "1...."; const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); for(std::string dataSearchDirectory : dataSearchDirectories) @@ -22,7 +25,9 @@ std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirect if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) applicationDirectories.push_back(applicationDirectory(dataSearchDirectory)); } + qDebug() << "1...."; + qDebug() << "N...."; return applicationDirectories; } From e44e6d3d9bb164aebb57e9a66950e4fdb801f355 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 15:19:42 +0600 Subject: [PATCH 06/11] remove rebug message --- src/desktopentrydirectoryspec.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/desktopentrydirectoryspec.cpp b/src/desktopentrydirectoryspec.cpp index 25445d2..af2effd 100644 --- a/src/desktopentrydirectoryspec.cpp +++ b/src/desktopentrydirectoryspec.cpp @@ -7,16 +7,13 @@ //static std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() { - qDebug() << "1...."; std::vector applicationDirectories; std::string userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); - qDebug() << "1...."; Mere::Utils::EnvUtils::expandEnvVar(userDatHome); if (Mere::Utils::StringUtils::isNotBlank(userDatHome)) applicationDirectories.push_back(applicationDirectory(userDatHome)); - qDebug() << "1...."; const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); for(std::string dataSearchDirectory : dataSearchDirectories) @@ -25,9 +22,7 @@ std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirect if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) applicationDirectories.push_back(applicationDirectory(dataSearchDirectory)); } - qDebug() << "1...."; - qDebug() << "N...."; return applicationDirectories; } From c3edd826cd2998cd6058a0880e938f2596964112 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 15:56:51 +0600 Subject: [PATCH 07/11] DesktopEntry parse now accept string --- src/desktopentryspec.cpp | 12 ++++++++++++ src/desktopentryspec.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/desktopentryspec.cpp b/src/desktopentryspec.cpp index 4ae9307..4d6581e 100644 --- a/src/desktopentryspec.cpp +++ b/src/desktopentryspec.cpp @@ -19,6 +19,18 @@ Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QString &path) return parse(QFileInfo(path)); } +//static +Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const std::string &path) +{ + if(Mere::Utils::StringUtils::isBlank(path)) + { + std::cout << "path can't be blank. please check the path." << std::endl; + return DesktopEntry(); + } + + return parse(QFileInfo(path.c_str())); +} + Mere::XDG::DesktopEntry Mere::XDG::DesktopEntrySpec::parse(const QFileInfo &fileInfo) { if (!fileInfo.exists()) diff --git a/src/desktopentryspec.h b/src/desktopentryspec.h index d7b7cda..9fe9092 100644 --- a/src/desktopentryspec.h +++ b/src/desktopentryspec.h @@ -16,6 +16,7 @@ class MERE_XDG_LIB_SPEC DesktopEntrySpec DesktopEntrySpec() = default; public: static DesktopEntry parse(const QString &path); + static DesktopEntry parse(const std::string &path); static DesktopEntry parse(const QFileInfo &fileInfo); static bool valid(DesktopEntry &entry); }; From 1c6294a9119d58dfadf73fee377b293fbb3b2708 Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Wed, 17 Feb 2021 17:19:25 +0600 Subject: [PATCH 08/11] clean up --- src/basedirectoryspec.cpp | 1 - src/basedirectoryspec.h | 1 - src/desktopentry.cpp | 15 --------------- src/desktopentry.h | 5 +---- src/iconthemespec.cpp | 10 ---------- src/iconthemespec.h | 3 +-- 6 files changed, 2 insertions(+), 33 deletions(-) diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp index 476ac6f..0a15391 100644 --- a/src/basedirectoryspec.cpp +++ b/src/basedirectoryspec.cpp @@ -71,7 +71,6 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupDataDirsEnv() std::string dataDirs(getenv(XDG::DATA_DIRS)); - // FIXME?? CHECK THIS if (!std::ifstream(dataDirs).good()) QDir().mkpath(dataDirs.c_str()); diff --git a/src/basedirectoryspec.h b/src/basedirectoryspec.h index 0021570..2d2d071 100644 --- a/src/basedirectoryspec.h +++ b/src/basedirectoryspec.h @@ -166,5 +166,4 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec } } - #endif // MERE_XDG_DIRECTORYSPEC_H diff --git a/src/desktopentry.cpp b/src/desktopentry.cpp index 3b20e94..b17640e 100644 --- a/src/desktopentry.cpp +++ b/src/desktopentry.cpp @@ -1,20 +1,5 @@ #include "desktopentry.h" -Mere::XDG::DesktopEntry::~DesktopEntry() -{ - -} - -Mere::XDG::DesktopEntry::DesktopEntry() -{ - -} - -Mere::XDG::DesktopEntry::DesktopEntry(const std::string &path) -{ - Q_UNUSED(path); -} - QVariant Mere::XDG::DesktopEntry::get(const Attribute &attribute) { auto find = m_attributes.find(attribute); diff --git a/src/desktopentry.h b/src/desktopentry.h index 48bbddf..84861a8 100644 --- a/src/desktopentry.h +++ b/src/desktopentry.h @@ -14,10 +14,7 @@ namespace XDG class MERE_XDG_LIB_SPEC DesktopEntry { public: - ~DesktopEntry(); - DesktopEntry(); - - explicit DesktopEntry(const std::string &path); + DesktopEntry() = default; enum Attribute { diff --git a/src/iconthemespec.cpp b/src/iconthemespec.cpp index 3f27191..f71abc4 100644 --- a/src/iconthemespec.cpp +++ b/src/iconthemespec.cpp @@ -9,16 +9,6 @@ #include #include -Mere::XDG::IconThemeSpec::~IconThemeSpec() -{ - -} - -Mere::XDG::IconThemeSpec::IconThemeSpec() -{ - -} - //static std::string Mere::XDG::IconThemeSpec::path(const std::string &icon) { diff --git a/src/iconthemespec.h b/src/iconthemespec.h index f05b6cb..611a4e1 100644 --- a/src/iconthemespec.h +++ b/src/iconthemespec.h @@ -22,9 +22,8 @@ typedef struct class MERE_XDG_LIB_SPEC IconThemeSpec { + IconThemeSpec() = default; public: - ~IconThemeSpec(); - explicit IconThemeSpec(); static std::string path(const std::string &icon); static std::string path(const std::string &icon, unsigned int size); static std::string path(const std::string &icon, unsigned int size, unsigned int scale); From bf6cfb9503c8308b0d9380979be76309e80ab2ea Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Fri, 19 Feb 2021 12:31:47 +0600 Subject: [PATCH 09/11] Fix env exapnasion --- src/basedirectoryspec.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp index 0a15391..c7ff43b 100644 --- a/src/basedirectoryspec.cpp +++ b/src/basedirectoryspec.cpp @@ -19,6 +19,7 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupEnv() { int result = 0; + result += setupDesktopEnv(); result += setupDataHomeEnv(); result += setupConfigHomeEnv(); result += setupDataDirsEnv(); @@ -34,7 +35,7 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupEnvVar(const char* env, const ch std::string str(value); Mere::Utils::EnvUtils::expandEnvVar(str); - int result = setenv(env, value, 1); + int result = setenv(env, str.c_str(), 1); if (result != 0) return err; if (!std::ifstream(str).good()) @@ -56,12 +57,12 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupDesktopEnv() unsigned int Mere::XDG::BaseDirectorySpec::setupDataHomeEnv() { - return BaseDirectorySpec::setupEnvVar(XDG::DATA_HOME, XDG::BaseDirectory::DATA_HOME, XDG::ErrorMask::DATA_HOME); + return setupEnvVar(XDG::DATA_HOME, XDG::BaseDirectory::DATA_HOME, XDG::ErrorMask::DATA_HOME); } unsigned int Mere::XDG::BaseDirectorySpec::setupConfigHomeEnv() { - return BaseDirectorySpec::setupEnvVar(XDG::CONFIG_HOME, XDG::BaseDirectory::CONFIG_HOME, XDG::ErrorMask::CONFIG_HOME); + return setupEnvVar(XDG::CONFIG_HOME, XDG::BaseDirectory::CONFIG_HOME, XDG::ErrorMask::CONFIG_HOME); } unsigned int Mere::XDG::BaseDirectorySpec::setupDataDirsEnv() From e6251c76ec099a5e479f35e5a4dcbd0c94edd24e Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Fri, 19 Feb 2021 12:33:42 +0600 Subject: [PATCH 10/11] .pro file add --- mere-xdg-lib.pro | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 mere-xdg-lib.pro diff --git a/mere-xdg-lib.pro b/mere-xdg-lib.pro new file mode 100644 index 0000000..9120ad5 --- /dev/null +++ b/mere-xdg-lib.pro @@ -0,0 +1,61 @@ +QT = core + +CONFIG += c++11 +CONFIG += shared + +TARGET = mere-xdg +VERSION= 0.0.1 +TEMPLATE = lib + +DEFINES += LIB_CODE=\\\"xdg\\\" +DEFINES += LIB_NAME=\\\"$$TARGET\\\" +DEFINES += LIB_VERSION=\\\"$$VERSION\\\" +DEFINES += MERE_XDG_LIB + +SOURCES += \ + src/autostartdirectoryspec.cpp \ + src/basedirectoryspec.cpp \ + src/desktopentry.cpp \ + src/desktopentrydirectoryspec.cpp \ + src/desktopentryspec.cpp \ + src/icontheme.cpp \ + src/iconthemedirectoryspec.cpp \ + src/iconthemespec.cpp + +HEADERS += \ + src/autostartdirectoryspec.h \ + src/basedirectoryspec.h \ + src/desktopentry.h \ + src/desktopentrydirectoryspec.h \ + src/desktopentryspec.h \ + src/global.h \ + src/global.h \ + src/icontheme.h \ + src/iconthemedirectoryspec.h \ + src/iconthemespec.h + +INCLUDEPATH += /usr/local/include + +LIBS += -L/usr/local/lib + +LIBS += -lmere-utils + +# +# Install +# +unix { + target.path = /usr/local/lib + INSTALLS += target + + INSTALL_PREFIX = /usr/local/include/mere/xdg + for(header, HEADERS) { + sdir = $${dirname(header)} + sdir = $$replace(sdir, "src", "") + path = $${INSTALL_PREFIX}$${sdir} + + eval(headers_$${path}.files += $$header) + eval(headers_$${path}.path = $$path) + eval(INSTALLS *= headers_$${path}) + } +} + From cce4121712527155fc48b33cacf648470b6b763e Mon Sep 17 00:00:00 2001 From: Bhuiyan Mohammad Iklash Date: Sat, 20 Feb 2021 01:22:19 +0600 Subject: [PATCH 11/11] rename methods --- src/autostartdirectoryspec.cpp | 28 ++++++++++++++-------------- src/autostartdirectoryspec.h | 10 +++++----- src/basedirectoryspec.cpp | 30 +++++++++++++++++++++++++----- src/basedirectoryspec.h | 31 +++++++++++++++++++++---------- src/desktopentrydirectoryspec.cpp | 12 ++++++------ src/desktopentrydirectoryspec.h | 4 ++-- src/iconthemedirectoryspec.cpp | 4 ++-- 7 files changed, 75 insertions(+), 44 deletions(-) diff --git a/src/autostartdirectoryspec.cpp b/src/autostartdirectoryspec.cpp index 6f209de..228b863 100644 --- a/src/autostartdirectoryspec.cpp +++ b/src/autostartdirectoryspec.cpp @@ -8,39 +8,39 @@ #include #include -std::vector Mere::XDG::AutostartDirectorySpec::autostartDirectories() +std::vector Mere::XDG::AutostartDirectorySpec::directories() { std::vector autostartDirectories; - std::string userConfigHome = BaseDirectorySpec::userConfigDirectory(); + std::string userConfigHome = BaseDirectorySpec::configHome(); Mere::Utils::EnvUtils::expandEnvVar(userConfigHome); if (Mere::Utils::StringUtils::isNotBlank(userConfigHome)) - autostartDirectories.push_back( autostarDirectory(userConfigHome) ); + autostartDirectories.push_back( Mere::XDG::AutostartDirectorySpec::directory(userConfigHome) ); - const std::vector configSearchDirectories = BaseDirectorySpec::configSearchDirectories(); - for (std::string configSearchDirectory : configSearchDirectories) + const std::vector directories = BaseDirectorySpec::configDirectories(); + for (std::string directory : directories) { - Mere::Utils::EnvUtils::expandEnvVar(configSearchDirectory); + Mere::Utils::EnvUtils::expandEnvVar(directory); - if (Mere::Utils::StringUtils::isNotBlank(configSearchDirectory)) - autostartDirectories.push_back( autostarDirectory(configSearchDirectory) ); + if (Mere::Utils::StringUtils::isNotBlank(directory)) + autostartDirectories.push_back( Mere::XDG::AutostartDirectorySpec::directory(directory) ); } return autostartDirectories; } -std::vector Mere::XDG::AutostartDirectorySpec::autostartApplications() +std::vector Mere::XDG::AutostartDirectorySpec::applications() { std::vector desktopEntries ; - std::vector autostartDirectories = AutostartDirectorySpec::autostartDirectories(); + std::vector directories = AutostartDirectorySpec::directories(); - for(const std::string &autostartDirectory : autostartDirectories) + for(const std::string &directory : directories) { - QDir autostartDir(autostartDirectory.c_str()); + QDir dir(directory.c_str()); - QFileInfoList fileInfoList = autostartDir.entryInfoList(QDir::AllEntries); + QFileInfoList fileInfoList = dir.entryInfoList(QDir::AllEntries); QListIterator i(fileInfoList); while (i.hasNext()) { @@ -59,7 +59,7 @@ std::vector Mere::XDG::AutostartDirectorySpec::autostar return desktopEntries; } -std::string Mere::XDG::AutostartDirectorySpec::autostarDirectory(const std::string &path) +std::string Mere::XDG::AutostartDirectorySpec::directory(const std::string &path) { std::string autostartDirectory(path); diff --git a/src/autostartdirectoryspec.h b/src/autostartdirectoryspec.h index ae0ead6..996edc3 100644 --- a/src/autostartdirectoryspec.h +++ b/src/autostartdirectoryspec.h @@ -16,18 +16,18 @@ class MERE_XDG_LIB_SPEC AutostartDirectorySpec AutostartDirectorySpec() = default; public: /** - * @brief autostartDirectories + * @brief directories * - * Directories when system will search for 'Desktop Entry' files, and will be + * Directories where system will search for 'Desktop Entry' files, and will be * automatically launched during startup of the user's desktop environment after the user has logged in. * * @return */ - static std::vector autostartDirectories(); - static std::vector autostartApplications(); + static std::vector directories(); + static std::vector applications(); private: - static std::string autostarDirectory(const std::string &path); + static std::string directory(const std::string &path); }; } diff --git a/src/basedirectoryspec.cpp b/src/basedirectoryspec.cpp index c7ff43b..f6e7703 100644 --- a/src/basedirectoryspec.cpp +++ b/src/basedirectoryspec.cpp @@ -22,6 +22,7 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupEnv() result += setupDesktopEnv(); result += setupDataHomeEnv(); result += setupConfigHomeEnv(); + result += setupIconHomeEnv(); result += setupDataDirsEnv(); result += setupConfigDirsEnv(); result += setupCacheHomeEnv(); @@ -65,6 +66,11 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupConfigHomeEnv() return setupEnvVar(XDG::CONFIG_HOME, XDG::BaseDirectory::CONFIG_HOME, XDG::ErrorMask::CONFIG_HOME); } +unsigned int Mere::XDG::BaseDirectorySpec::setupIconHomeEnv() +{ + return setupEnvVar(XDG::ICON_HOME, XDG::BaseDirectory::ICON_HOME, XDG::ErrorMask::ICON_HOME); +} + unsigned int Mere::XDG::BaseDirectorySpec::setupDataDirsEnv() { int result = setenv(XDG::DATA_DIRS, XDG::BaseDirectory::DATA_DIRS, XDG::ErrorMask::DATA_DIRS); @@ -98,7 +104,7 @@ unsigned int Mere::XDG::BaseDirectorySpec::setupRuntimeDirEnv() return BaseDirectorySpec::setupEnvVar(XDG::RUNTIME_DIR, XDG::BaseDirectory::RUNTIME_DIR, XDG::ErrorMask::RUNTIME_DIR); } -std::string Mere::XDG::BaseDirectorySpec::userDataDirectory() +std::string Mere::XDG::BaseDirectorySpec::dataHome() { const char *home = getenv(XDG::DATA_HOME); @@ -112,7 +118,7 @@ std::string Mere::XDG::BaseDirectorySpec::userDataDirectory() return dataHome; } -std::string Mere::XDG::BaseDirectorySpec::userConfigDirectory() +std::string Mere::XDG::BaseDirectorySpec::configHome() { const char *home = getenv(XDG::CONFIG_HOME); @@ -126,7 +132,7 @@ std::string Mere::XDG::BaseDirectorySpec::userConfigDirectory() return configHome; } -std::string Mere::XDG::BaseDirectorySpec::userCacheDirectory() +std::string Mere::XDG::BaseDirectorySpec::cacheHome() { const char *home = getenv(XDG::CACHE_HOME); @@ -140,7 +146,21 @@ std::string Mere::XDG::BaseDirectorySpec::userCacheDirectory() return cacheHome; } -std::vector Mere::XDG::BaseDirectorySpec::dataSearchDirectories() +std::string Mere::XDG::BaseDirectorySpec::iconHome() +{ + const char *home = getenv(XDG::ICON_HOME); + + std::string iconHome( home ? home : XDG::BaseDirectory::ICON_HOME); + + Mere::Utils::EnvUtils::expandEnvVar(iconHome); + + if (!std::ifstream(iconHome).good()) + QDir().mkpath(iconHome.c_str()); + + return iconHome; +} + +std::vector Mere::XDG::BaseDirectorySpec::dataDirectories() { std::vector dirs; @@ -162,7 +182,7 @@ std::vector Mere::XDG::BaseDirectorySpec::dataSearchDirectories() return dirs; } -std::vector Mere::XDG::BaseDirectorySpec::configSearchDirectories() +std::vector Mere::XDG::BaseDirectorySpec::configDirectories() { std::vector dirs; diff --git a/src/basedirectoryspec.h b/src/basedirectoryspec.h index 2d2d071..98d844e 100644 --- a/src/basedirectoryspec.h +++ b/src/basedirectoryspec.h @@ -10,7 +10,6 @@ namespace Mere { namespace XDG { - static const char* SESSION_DESKTOP = "XDG_SESSION_DESKTOP"; static const char* CURRENT_DESKTOP = "XDG_CURRENT_DESKTOP"; @@ -26,8 +25,8 @@ namespace XDG namespace BaseDirectory { - static const char* SESSION_DESKTOP = "Mere"; - static const char* CURRENT_DESKTOP = "Mere"; + static const char* SESSION_DESKTOP = "mere"; + static const char* CURRENT_DESKTOP = "mere"; static const char* DATA_HOME = "$HOME/.local/share"; static const char* CONFIG_HOME = "$HOME/.config"; @@ -35,8 +34,11 @@ namespace XDG static const char* ICON_HOME = "$HOME/.icons"; static const char* DATA_DIRS = "/usr/local/share/:/usr/share/"; - static const char* CONFIG_DIRS = "/etc/xdg"; + // we made a bit change here; added /usr/local/etc/xdg + static const char* CONFIG_DIRS = "/usr/local/etc/xdg/:/etc/xdg/"; + + // where did we find this one, in which spec? static const char* RUNTIME_DIR = "/tmp/mere-$USER"; } @@ -66,9 +68,13 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * Setup environments variables specified in XDG base directory specification. * - XDG_DATA_HOME * - XDG_CONFIG_HOME + * - XDG_CACHE_HOME * - XDG_DATA_DIRS * - XDG_CONFIG_DIRS - * - XDG_CONFIG_DIRS + * + * - XDG_ICON_HOME + * - XDG_SESSION_DESKTOP + * - XDG_CURRENT_DESKTOP * - XDG_RUNTIME_DIR * @return */ @@ -84,7 +90,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static std::string userDataDirectory(); + static std::string dataHome(); /** * @brief userConfigDirectory @@ -96,7 +102,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static std::string userConfigDirectory(); + static std::string configHome(); /** * @brief userCacheDirectory @@ -108,7 +114,11 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static std::string userCacheDirectory(); + static std::string cacheHome(); + + + // we did we get it? + static std::string iconHome(); /** * @brief dataSearchDirectories @@ -123,7 +133,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * * @return */ - static std::vector dataSearchDirectories(); + static std::vector dataDirectories(); /** * @brief configSearchDirectories @@ -137,7 +147,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec * If $XDG_CONFIG_DIRS is either not set or empty, a value equal to /etc/xdg should be used. * @return */ - static std::vector configSearchDirectories(); + static std::vector configDirectories(); private: static unsigned int setupDesktopEnv(); @@ -158,6 +168,7 @@ class MERE_XDG_LIB_SPEC BaseDirectorySpec static unsigned int setupDataDirsEnv(); static unsigned int setupConfigDirsEnv(); static unsigned int setupCacheHomeEnv(); + static unsigned int setupIconHomeEnv(); static unsigned int setupRuntimeDirEnv(); static unsigned int setupEnvVar(const char *env, const char *value, unsigned int err); diff --git a/src/desktopentrydirectoryspec.cpp b/src/desktopentrydirectoryspec.cpp index af2effd..3671669 100644 --- a/src/desktopentrydirectoryspec.cpp +++ b/src/desktopentrydirectoryspec.cpp @@ -5,29 +5,29 @@ #include "mere/utils/stringutils.h" //static -std::vector Mere::XDG::DesktopEntryDirectorySpec::applicationDirectories() +std::vector Mere::XDG::DesktopEntryDirectorySpec::directories() { std::vector applicationDirectories; - std::string userDatHome = Mere::XDG::BaseDirectorySpec::userDataDirectory(); + std::string userDatHome = Mere::XDG::BaseDirectorySpec::dataHome(); Mere::Utils::EnvUtils::expandEnvVar(userDatHome); if (Mere::Utils::StringUtils::isNotBlank(userDatHome)) - applicationDirectories.push_back(applicationDirectory(userDatHome)); + applicationDirectories.push_back(directory(userDatHome)); - const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + const std::vector dataSearchDirectories = BaseDirectorySpec::dataDirectories(); for(std::string dataSearchDirectory : dataSearchDirectories) { Mere::Utils::EnvUtils::expandEnvVar(dataSearchDirectory); if (Mere::Utils::StringUtils::isNotBlank(dataSearchDirectory)) - applicationDirectories.push_back(applicationDirectory(dataSearchDirectory)); + applicationDirectories.push_back(directory(dataSearchDirectory)); } return applicationDirectories; } //static -std::string Mere::XDG::DesktopEntryDirectorySpec::applicationDirectory(const std::string &path) +std::string Mere::XDG::DesktopEntryDirectorySpec::directory(const std::string &path) { std::string applicationDirectory(path); diff --git a/src/desktopentrydirectoryspec.h b/src/desktopentrydirectoryspec.h index fb4d662..46334f2 100644 --- a/src/desktopentrydirectoryspec.h +++ b/src/desktopentrydirectoryspec.h @@ -21,8 +21,8 @@ class MERE_XDG_LIB_SPEC DesktopEntryDirectorySpec * * @return */ - static std::vector applicationDirectories(); - static std::string applicationDirectory(const std::string &path); + static std::vector directories(); + static std::string directory(const std::string &path); }; } } diff --git a/src/iconthemedirectoryspec.cpp b/src/iconthemedirectoryspec.cpp index 0bcc26c..3679434 100644 --- a/src/iconthemedirectoryspec.cpp +++ b/src/iconthemedirectoryspec.cpp @@ -20,13 +20,13 @@ std::vector Mere::XDG::IconThemeDirectorySpec::baseDirectories() iconDirectories.push_back(userIconHome); // Not in specification - std::string userDataDirectory = BaseDirectorySpec::userDataDirectory(); + std::string userDataDirectory = BaseDirectorySpec::dataHome(); Mere::Utils::EnvUtils::expandEnvVar(userDataDirectory); if (Mere::Utils::StringUtils::isNotBlank(userDataDirectory)) iconDirectories.push_back(iconDirectory(userDataDirectory)); - const std::vector dataSearchDirectories = BaseDirectorySpec::dataSearchDirectories(); + const std::vector dataSearchDirectories = BaseDirectorySpec::dataDirectories(); for(std::string dataSearchDirectory : dataSearchDirectories) { Mere::Utils::EnvUtils::expandEnvVar(dataSearchDirectory);