Skip to content

Commit 7b87ce2

Browse files
Merge pull request #99 from logos-co/fix/useMainToDeterminePluginPaths
fix: use main field in manifest/metadata json files to determine available plugins
2 parents a5ad9f4 + 1185200 commit 7b87ce2

File tree

2 files changed

+83
-25
lines changed

2 files changed

+83
-25
lines changed

flake.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/MainUIBackend.cpp

Lines changed: 80 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,79 @@ bool MainUIBackend::isQmlPlugin(const QString& name) const
723723
return getPluginType(name) == "ui_qml";
724724
}
725725

726+
// Returns the primary platform variant key for the current build target
727+
// (e.g. "darwin-arm64", "linux-x86_64"). Used as the base for platformVariantsToTry().
728+
static QString currentPlatformVariant()
729+
{
730+
#if defined(Q_OS_MAC)
731+
#if defined(Q_PROCESSOR_ARM)
732+
return QStringLiteral("darwin-arm64");
733+
#else
734+
return QStringLiteral("darwin-x86_64");
735+
#endif
736+
#elif defined(Q_OS_WIN)
737+
return QStringLiteral("windows-x86_64");
738+
#elif defined(Q_OS_LINUX)
739+
#if defined(Q_PROCESSOR_X86_64)
740+
return QStringLiteral("linux-x86_64");
741+
#elif defined(Q_PROCESSOR_ARM_64)
742+
return QStringLiteral("linux-arm64");
743+
#else
744+
return QStringLiteral("linux-x86");
745+
#endif
746+
#else
747+
// Fallback for other OSes: preserve existing default behavior.
748+
return QStringLiteral("linux-x86");
749+
#endif
750+
}
751+
752+
// Returns the ordered list of platform variant keys to try when resolving the
753+
// "main" object in an LGX manifest.json. Mirrors plugin_manager.cpp::platformVariantsToTry().
754+
static QStringList platformVariantsToTry()
755+
{
756+
QString primary = currentPlatformVariant();
757+
QStringList variants;
758+
variants << primary;
759+
760+
// Linux architecture aliases
761+
if (primary == QLatin1String("linux-x86_64"))
762+
variants << QStringLiteral("linux-amd64");
763+
else if (primary == QLatin1String("linux-amd64"))
764+
variants << QStringLiteral("linux-x86_64");
765+
else if (primary == QLatin1String("linux-arm64"))
766+
variants << QStringLiteral("linux-aarch64");
767+
else if (primary == QLatin1String("linux-aarch64"))
768+
variants << QStringLiteral("linux-arm64");
769+
770+
#ifndef LOGOS_PORTABLE_BUILD
771+
QStringList devVariants;
772+
for (const QString& variant : variants)
773+
devVariants << (variant + QStringLiteral("-dev"));
774+
variants = devVariants;
775+
#endif
776+
777+
return variants;
778+
}
779+
780+
// Resolves the "main" field from a plugin manifest/metadata object
781+
static QString resolveMainField(const QJsonObject& info, const QString& fallback)
782+
{
783+
QJsonValue mainVal = info.value("main");
784+
if (mainVal.isString()) {
785+
QString s = mainVal.toString();
786+
return s.isEmpty() ? fallback : s;
787+
}
788+
if (mainVal.isObject()) {
789+
QJsonObject mainObj = mainVal.toObject();
790+
for (const QString& variant : platformVariantsToTry()) {
791+
QString v = mainObj.value(variant).toString();
792+
if (!v.isEmpty())
793+
return v;
794+
}
795+
}
796+
return fallback;
797+
}
798+
726799
QStringList MainUIBackend::findAvailableUiPlugins() const
727800
{
728801
QStringList plugins;
@@ -740,23 +813,16 @@ QStringList MainUIBackend::findAvailableUiPlugins() const
740813
}
741814
};
742815

743-
QString libExtension;
744-
#if defined(Q_OS_MAC)
745-
libExtension = ".dylib";
746-
#elif defined(Q_OS_WIN)
747-
libExtension = ".dll";
748-
#else
749-
libExtension = ".so";
750-
#endif
751-
752816
// Scan subdirectories for plugins (both QML and C++ plugins are in subdirectories)
753817
QStringList dirEntries = pluginsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
754818
for (const QString& entry : dirEntries) {
755819
if (isQmlPlugin(entry)) {
756820
addPlugin(entry);
757821
} else {
758-
// Check if it's a C++ plugin (has <dirname>.<ext> inside the subdirectory)
759-
QString pluginLibPath = dirPath + "/" + entry + "/" + entry + libExtension;
822+
// "main" in manifest.json is the full filename including extension.
823+
QJsonObject info = readPluginManifest(entry);
824+
QString mainFile = resolveMainField(info, entry);
825+
QString pluginLibPath = dirPath + "/" + entry + "/" + mainFile;
760826
if (QFile::exists(pluginLibPath)) {
761827
addPlugin(entry);
762828
}
@@ -776,17 +842,9 @@ QString MainUIBackend::getPluginPath(const QString& name) const
776842
return pluginsDirectory() + "/" + name;
777843
}
778844

779-
// C++ plugins: return path to dylib inside subdirectory
780-
QString libExtension;
781-
#if defined(Q_OS_MAC)
782-
libExtension = ".dylib";
783-
#elif defined(Q_OS_WIN)
784-
libExtension = ".dll";
785-
#else
786-
libExtension = ".so";
787-
#endif
788-
789-
return pluginsDirectory() + "/" + name + "/" + name + libExtension;
845+
// C++ plugins: "main" in manifest.json is the full filename including extension.
846+
QString mainFile = resolveMainField(readPluginManifest(name), name);
847+
return pluginsDirectory() + "/" + name + "/" + mainFile;
790848
}
791849

792850
QString MainUIBackend::getPluginIconPath(const QString& pluginName, bool forWidgetIcon) const

0 commit comments

Comments
 (0)