diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
index 472d903..45eeddb 100644
--- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
+++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml
@@ -5,6 +5,8 @@
name="org.freedesktop.DBus.Description"
value="This interface is designed to provide a dbus interface of desktop file. Missing fields will be added later."
/>
+
+
value(DesktopFileEntryKey, "Actions");
- if (!actions) {
- return {};
- }
-
- bool ok{false};
- const auto &str = actions->toString(ok);
- if (!ok) {
- qWarning() << "Actions convert to String failed.";
- return {};
- }
-
- auto actionList = str.split(";", Qt::SkipEmptyParts);
+ auto actionList = val.toString().split(";", Qt::SkipEmptyParts);
return actionList;
}
+QStringList ApplicationService::categories() const noexcept
+{
+ auto val = findEntryValue(DesktopFileEntryKey, "Categories", EntryValueType::String);
+
+ if (val.isNull()) {
+ return {};
+ }
+
+ return val.toString().split(';', Qt::SkipEmptyParts);
+}
+
PropMap ApplicationService::actionName() const noexcept
{
PropMap ret;
@@ -477,3 +477,47 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, const QStringLis
return task;
}
+
+QVariant ApplicationService::findEntryValue(const QString &group,
+ const QString &valueKey,
+ EntryValueType type,
+ const QLocale &locale) const noexcept
+{
+ QVariant ret;
+ auto tmp = m_entry->value(group, valueKey);
+ if (!tmp.has_value()) {
+ return ret;
+ }
+
+ auto val = std::move(tmp).value();
+ bool ok{false};
+
+ switch (type) {
+ case EntryValueType::String: {
+ auto valStr = val.toString(ok);
+ if (ok) {
+ ret = QVariant::fromValue(valStr);
+ }
+ } break;
+ case EntryValueType::LocaleString: {
+ auto valStr = val.toLocaleString(locale, ok);
+ if (ok) {
+ ret = QVariant::fromValue(valStr);
+ }
+ } break;
+ case EntryValueType::Boolean: {
+ auto valBool = val.toBoolean(ok);
+ if (ok) {
+ ret = QVariant::fromValue(valBool);
+ }
+ } break;
+ case EntryValueType::IconString: {
+ auto valStr = val.toIconString(ok);
+ if (ok) {
+ ret = QVariant::fromValue(valStr);
+ }
+ } break;
+ }
+
+ return ret;
+}
diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h
index 0b24212..3ce4a06 100644
--- a/src/dbus/applicationservice.h
+++ b/src/dbus/applicationservice.h
@@ -32,6 +32,9 @@ public:
ApplicationService &operator=(const ApplicationService &) = delete;
ApplicationService &operator=(ApplicationService &&) = delete;
+ Q_PROPERTY(QStringList Categories READ categories)
+ [[nodiscard]] QStringList categories() const noexcept;
+
Q_PROPERTY(QStringList Actions READ actions)
[[nodiscard]] QStringList actions() const noexcept;
@@ -96,6 +99,10 @@ private:
QMap> m_Instances;
static QString userNameLookup(uid_t uid);
[[nodiscard]] LaunchTask unescapeExec(const QString &str, const QStringList &fields);
+ [[nodiscard]] QVariant findEntryValue(const QString &group,
+ const QString &valueKey,
+ EntryValueType type,
+ const QLocale &locale = getUserLocale()) const noexcept;
};
#endif
diff --git a/src/desktopentry.h b/src/desktopentry.h
index 52b9e31..b7ca1d3 100644
--- a/src/desktopentry.h
+++ b/src/desktopentry.h
@@ -29,6 +29,8 @@ enum class DesktopErrorCode {
enum class EntryContext { Unknown, EntryOuter, Entry, Done };
+enum class EntryValueType { String, LocaleString, Boolean, IconString };
+
struct DesktopFileGuard;
struct DesktopFile