diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 713139a..eefd0f3 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -203,19 +203,19 @@ std::vector CConfigManager::getSettings() { auto resolvedPaths = RESOLVE_PATH.value(); if (resolvedPaths.size() > 1) { - if (order != "default" && order != "random") { + if (order != "default" && order != "random" && order != "random-shuffle") { g_logger->log(LOG_WARN, "Invalid order value '{}', falling back to default", order); order = "default"; } - if (order == "random") { + if (order == "random" || order == "random-shuffle") { std::random_device rd; std::mt19937 g(rd()); std::shuffle(resolvedPaths.begin(), resolvedPaths.end(), g); } } - result.emplace_back(SSetting{.monitor = std::move(monitor), .fitMode = std::move(fitMode), .paths = std::move(resolvedPaths), .timeout = timeout}); + result.emplace_back(SSetting{.monitor = std::move(monitor), .fitMode = std::move(fitMode), .paths = std::move(resolvedPaths), .order = std::move(order), .timeout = timeout}); } return result; diff --git a/src/config/ConfigManager.hpp b/src/config/ConfigManager.hpp index 0cb102f..6fd336e 100644 --- a/src/config/ConfigManager.hpp +++ b/src/config/ConfigManager.hpp @@ -16,6 +16,7 @@ class CConfigManager { struct SSetting { std::string monitor, fitMode; std::vector paths; + std::string order = "default"; int timeout = 0; uint32_t id = 0; }; diff --git a/src/ui/UI.cpp b/src/ui/UI.cpp index 87538e3..71308af 100644 --- a/src/ui/UI.cpp +++ b/src/ui/UI.cpp @@ -6,6 +6,8 @@ #include "../ipc/IPC.hpp" #include "../config/WallpaperMatcher.hpp" +#include +#include #include #include @@ -24,14 +26,23 @@ static std::string_view pruneDesc(const std::string_view& sv) { class CWallpaperTarget::CImagesData { public: - CImagesData(Hyprtoolkit::eImageFitMode fitMode, const std::vector& images, const int timeout = 0) : - fitMode(fitMode), images(images), timeout(timeout > 0 ? timeout : 30) {} + CImagesData(Hyprtoolkit::eImageFitMode fitMode, std::vector images, const int timeout = 0, std::string order = "default") : + fitMode(fitMode), images(std::move(images)), order(std::move(order)), timeout(timeout > 0 ? timeout : 30) {} const Hyprtoolkit::eImageFitMode fitMode; - const std::vector images; + std::vector images; + const std::string order; const int timeout; std::string nextImage() { + if (order == "random-shuffle" && current + 1 >= images.size()) { + std::random_device rd; + std::mt19937 g(rd()); + std::shuffle(images.begin(), images.end(), g); + current = 0; + return images[current]; + } + current = (current + 1) % images.size(); return images[current]; } @@ -41,7 +52,7 @@ class CWallpaperTarget::CImagesData { }; CWallpaperTarget::CWallpaperTarget(SP backend, SP output, const std::vector& path, Hyprtoolkit::eImageFitMode fitMode, - const int timeout) : m_monitorName(output->port()), m_backend(backend) { + const int timeout, const std::string& order) : m_monitorName(output->port()), m_backend(backend) { static const auto SPLASH_REPLY = HyprlandSocket::getFromSocket("/splash"); static const auto PENABLESPLASH = Hyprlang::CSimpleConfigValue(g_config->hyprlang(), "splash"); @@ -79,7 +90,7 @@ CWallpaperTarget::CWallpaperTarget(SP backend, SPsetPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_CENTER, true); if (path.size() > 1) { - m_imagesData = makeUnique(fitMode, path, timeout); + m_imagesData = makeUnique(fitMode, std::vector(path), timeout, order); m_timer = m_backend->addTimer(std::chrono::milliseconds(std::chrono::seconds(m_imagesData->timeout)), [this](ASP self, void*) { onRepeatTimer(); }, nullptr); } @@ -228,7 +239,7 @@ void CUI::targetChanged(const SP& mon) { std::erase_if(m_targets, [&mon](const auto& e) { return e->m_monitorName == mon->port(); }); - m_targets.emplace_back(makeShared(m_backend, mon, TARGET->get().paths, toFitMode(TARGET->get().fitMode), TARGET->get().timeout)); + m_targets.emplace_back(makeShared(m_backend, mon, TARGET->get().paths, toFitMode(TARGET->get().fitMode), TARGET->get().timeout, TARGET->get().order)); } const std::vector>& CUI::targets() { diff --git a/src/ui/UI.hpp b/src/ui/UI.hpp index 774dc84..6ae4bc4 100644 --- a/src/ui/UI.hpp +++ b/src/ui/UI.hpp @@ -17,7 +17,7 @@ class CWallpaperTarget { public: CWallpaperTarget(SP backend, SP output, const std::vector& path, - Hyprtoolkit::eImageFitMode fitMode = Hyprtoolkit::IMAGE_FIT_MODE_COVER, const int timeout = 0); + Hyprtoolkit::eImageFitMode fitMode = Hyprtoolkit::IMAGE_FIT_MODE_COVER, const int timeout = 0, const std::string& order = "default"); ~CWallpaperTarget(); CWallpaperTarget(const CWallpaperTarget&) = delete;