@@ -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+
726799QStringList 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
792850QString MainUIBackend::getPluginIconPath (const QString& pluginName, bool forWidgetIcon) const
0 commit comments