From a55e76398219a2188691ca718216b9faca7abe18 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 14 Sep 2017 17:33:12 +0200 Subject: democompositor: Allow arbitrary extensions inside the app map Allow extensions and let them begin with X-. Briefly document it, add some extensions as an example and briefly test that the right values are parsed. Change-Id: I7a9ae6b2f365802fcce6dce56fa7795f76d83421 Reviewed-by: Paul Olav Tvete --- wayland/democompositor/apps/README | 1 + wayland/democompositor/apps/appentry.cpp | 2 +- wayland/democompositor/apps/appentry.h | 3 +++ wayland/democompositor/apps/appparser.cpp | 15 ++++++++++++++- wayland/democompositor/resources/apps/clock.app | 5 ++++- wayland/democompositor/tests/apps/tst_appparser.cpp | 8 ++++++++ 6 files changed, 31 insertions(+), 3 deletions(-) (limited to 'wayland') diff --git a/wayland/democompositor/apps/README b/wayland/democompositor/apps/README index 361b2c1..b804917 100644 --- a/wayland/democompositor/apps/README +++ b/wayland/democompositor/apps/README @@ -18,3 +18,4 @@ Icon The icon to use for display Yes String Name A user displayable name Yes String Exec Application to execute to launch Yes String Path The directory to search for the app No String +X-* Extensions to the specification No Any diff --git a/wayland/democompositor/apps/appentry.cpp b/wayland/democompositor/apps/appentry.cpp index aaae167..cdb9ba8 100644 --- a/wayland/democompositor/apps/appentry.cpp +++ b/wayland/democompositor/apps/appentry.cpp @@ -53,5 +53,5 @@ AppEntry AppEntry::empty() { QString empty; - return AppEntry{empty, empty, empty, empty, empty}; + return AppEntry{empty, empty, empty, empty, empty, QVariantMap()}; } diff --git a/wayland/democompositor/apps/appentry.h b/wayland/democompositor/apps/appentry.h index 317b748..4514331 100644 --- a/wayland/democompositor/apps/appentry.h +++ b/wayland/democompositor/apps/appentry.h @@ -52,6 +52,7 @@ #include #include +#include /** * A const representatation of an application entry. Members include @@ -63,6 +64,7 @@ class AppEntry { Q_PROPERTY(QString appName MEMBER appName CONSTANT) Q_PROPERTY(QString executableName MEMBER executableName CONSTANT) Q_PROPERTY(QString executablePath MEMBER executablePath CONSTANT) + Q_PROPERTY(QVariantMap extensions MEMBER extensions CONSTANT) public: QString iconName; @@ -70,6 +72,7 @@ public: QString executableName; QString executablePath; QString sourceFileName; + QVariantMap extensions; static AppEntry empty(); }; diff --git a/wayland/democompositor/apps/appparser.cpp b/wayland/democompositor/apps/appparser.cpp index 2c373cc..38cc0b2 100644 --- a/wayland/democompositor/apps/appparser.cpp +++ b/wayland/democompositor/apps/appparser.cpp @@ -94,6 +94,18 @@ static int readInt(const QJsonObject& object, const QString& key, bool *ok) return doReadInt(object.value(key), ok); } +static QVariantMap readExtensions(const QJsonObject& object, const QString& prefixKey) +{ + QVariantMap map; + + for (auto it = object.constBegin(); it != object.constEnd(); ++it) { + if (!it.key().startsWith(prefixKey)) + continue; + map[it.key()] = it.value().toVariant(); + } + return map; +} + AppEntry AppParser::parseData(const QByteArray& content, const QString& fileName, bool *ok) { *ok = true; @@ -129,10 +141,11 @@ AppEntry AppParser::parseData(const QByteArray& content, const QString& fileName QString appName = readString(root, QStringLiteral("Name"), ok); QString executableName = readString(root, QStringLiteral("Exec"), ok); QString executablePath = readStringOptional(root, QStringLiteral("Path"), ok); + QVariantMap extensions = readExtensions(root, QStringLiteral("X-")); if (!*ok) return AppEntry::empty(); - return AppEntry{iconName, appName, executableName, executablePath, fileName}; + return AppEntry{iconName, appName, executableName, executablePath, fileName, extensions}; } AppEntry AppParser::parseFile(const QString& fileName, bool *ok) diff --git a/wayland/democompositor/resources/apps/clock.app b/wayland/democompositor/resources/apps/clock.app index d6f5f56..f28d9b7 100644 --- a/wayland/democompositor/resources/apps/clock.app +++ b/wayland/democompositor/resources/apps/clock.app @@ -4,5 +4,8 @@ "Icon": "qrc:/images/Icon_Clocks.png", "Name": "Clocks", "Exec": "clocks", - "Path": "./" + "Path": "./", + "X-Fullscreen": true, + "X-Priority": 100, + "X-Screen": "left" } diff --git a/wayland/democompositor/tests/apps/tst_appparser.cpp b/wayland/democompositor/tests/apps/tst_appparser.cpp index 6d63fd9..a71c123 100644 --- a/wayland/democompositor/tests/apps/tst_appparser.cpp +++ b/wayland/democompositor/tests/apps/tst_appparser.cpp @@ -127,6 +127,14 @@ void tst_AppParser::testFileOpen() QCOMPARE(entry.appName, QStringLiteral("Clocks")); QCOMPARE(entry.executableName, QStringLiteral("clocks")); QCOMPARE(entry.executablePath, QStringLiteral("./")); + + // Look at extensions + QVERIFY(entry.extensions["X-Fullscreen"].canConvert(QMetaType::Bool)); + QCOMPARE(entry.extensions["X-Fullscreen"].toBool(), true); + QVERIFY(entry.extensions["X-Priority"].canConvert(QMetaType::Double)); + QCOMPARE(entry.extensions["X-Priority"].toInt(), 100); + QVERIFY(entry.extensions["X-Screen"].canConvert(QMetaType::QString)); + QCOMPARE(entry.extensions["X-Screen"].toString(), QStringLiteral("left")); } QTEST_MAIN(tst_AppParser) -- cgit v1.2.3