diff --git a/scwx-qt/source/scwx/qt/main/main.cpp b/scwx-qt/source/scwx/qt/main/main.cpp index 7a1993f7..2aa3df31 100644 --- a/scwx-qt/source/scwx/qt/main/main.cpp +++ b/scwx-qt/source/scwx/qt/main/main.cpp @@ -19,6 +19,8 @@ #include #include +#include +#include #include #include @@ -42,6 +44,7 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_); static void ConfigureTheme(const std::vector& args); static void OverrideDefaultStyle(const std::vector& args); +static void OverridePlatform(); int main(int argc, char* argv[]) { @@ -52,6 +55,8 @@ int main(int argc, char* argv[]) args.push_back(argv[i]); } + OverridePlatform(); + // Initialize logger auto& logManager = scwx::qt::manager::LogManager::Instance(); logManager.Initialize(); @@ -252,3 +257,32 @@ OverrideDefaultStyle([[maybe_unused]] const std::vector& args) } #endif } + +constexpr std::string NVIDIA_ID = "0x10de"; +static void OverridePlatform() +{ +#if defined(__linux__) + namespace fs = std::filesystem; + for (const auto& entry : fs::directory_iterator("/sys/class/drm")) + { + if (!entry.is_directory() || + !entry.path().filename().string().starts_with("card")) + { + continue; + } + + auto vendorPath = entry.path() / "device" / "vendor"; + std::ifstream vendorFile(vendorPath); + std::string vendor; + if (vendorFile && std::getline(vendorFile, vendor)) + { + if (vendor == NVIDIA_ID) + { + // Force xcb on NVIDIA + setenv("QT_QPA_PLATFORM", "xcb", 1); + return; + } + } + } +#endif +}