diff --git a/changelog/next.md b/changelog/next.md index 7e4f81b..db46e8e 100644 --- a/changelog/next.md +++ b/changelog/next.md @@ -44,6 +44,7 @@ set shell id. - Added `QS_CRASHREPORT_URL` environment variable to allow overriding the crash reporter link. - Added `AppId` pragma and `QS_APP_ID` environment variable to allow overriding the desktop application ID. - Added `DropExpensiveFonts` pragma and `QS_DROP_EXPENSIVE_FONTS` environment variable which avoids loading fonts which may cause lag and excessive memory usage if many variants are used. +- Added `DefaultEnv` pragma which sets an environment variable if not already set. - Unrecognized pragmas are no longer a hard error for future backward compatibility. ## Bug Fixes diff --git a/src/launch/launch.cpp b/src/launch/launch.cpp index dcdefa7..71d9983 100644 --- a/src/launch/launch.cpp +++ b/src/launch/launch.cpp @@ -76,6 +76,7 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio bool useSystemStyle = false; QString iconTheme = qEnvironmentVariable("QS_ICON_THEME"); QHash envOverrides; + QHash defaultEnv; QString appId = qEnvironmentVariable("QS_APP_ID"); bool dropExpensiveFonts = false; QString dataDir; @@ -89,25 +90,30 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio if (line.startsWith("//@ pragma ")) { auto pragma = line.sliced(11).trimmed(); - if (pragma == "UseQApplication") pragmas.useQApplication = true; - else if (pragma == "NativeTextRendering") pragmas.nativeTextRendering = true; - else if (pragma == "IgnoreSystemSettings") pragmas.desktopSettingsAware = false; - else if (pragma == "RespectSystemStyle") pragmas.useSystemStyle = true; - else if (pragma == "DropExpensiveFonts") pragmas.dropExpensiveFonts = true; - else if (pragma.startsWith("IconTheme ")) pragmas.iconTheme = pragma.sliced(10); - else if (pragma.startsWith("Env ")) { - auto envPragma = pragma.sliced(4); - auto splitIdx = envPragma.indexOf('='); + auto isEnv = pragma.startsWith("Env "); + auto isDefaultEnv = pragma.startsWith("DefaultEnv "); + + if (isEnv || isDefaultEnv) { + auto content = pragma.sliced(isDefaultEnv ? 11 : 4); + auto splitIdx = content.indexOf('='); if (splitIdx == -1) { qCritical() << "Env pragma" << pragma << "not in the form 'VAR = VALUE'"; return -1; } - auto var = envPragma.sliced(0, splitIdx).trimmed(); - auto val = envPragma.sliced(splitIdx + 1).trimmed(); - pragmas.envOverrides.insert(var, val); - } else if (pragma.startsWith("AppId ")) { + auto var = content.sliced(0, splitIdx).trimmed(); + auto val = content.sliced(splitIdx + 1).trimmed(); + + if (isDefaultEnv) pragmas.defaultEnv.insert(var, val); + else pragmas.envOverrides.insert(var, val); + } else if (pragma == "UseQApplication") pragmas.useQApplication = true; + else if (pragma == "NativeTextRendering") pragmas.nativeTextRendering = true; + else if (pragma == "IgnoreSystemSettings") pragmas.desktopSettingsAware = false; + else if (pragma == "RespectSystemStyle") pragmas.useSystemStyle = true; + else if (pragma == "DropExpensiveFonts") pragmas.dropExpensiveFonts = true; + else if (pragma.startsWith("IconTheme ")) pragmas.iconTheme = pragma.sliced(10); + else if (pragma.startsWith("AppId ")) { pragmas.appId = pragma.sliced(6).trimmed(); } else if (pragma.startsWith("ShellId ")) { shellId = pragma.sliced(8).trimmed(); @@ -174,6 +180,10 @@ int launch(const LaunchArgs& args, char** argv, QCoreApplication* coreApplicatio qputenv("QT_QUICK_CONTROLS_STYLE", "Fusion"); } + for (auto [var, val]: pragmas.defaultEnv.asKeyValueRange()) { + if (!qEnvironmentVariableIsSet(var.toUtf8())) qputenv(var.toUtf8(), val.toUtf8()); + } + for (auto [var, val]: pragmas.envOverrides.asKeyValueRange()) { qputenv(var.toUtf8(), val.toUtf8()); }