Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hyprpaper for openSUSE:Factory checked in at 2026-02-17 18:44:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hyprpaper (Old) and /work/SRC/openSUSE:Factory/.hyprpaper.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hyprpaper" Tue Feb 17 18:44:39 2026 rev:9 rq:1333594 version:0.8.3 Changes: -------- --- /work/SRC/openSUSE:Factory/hyprpaper/hyprpaper.changes 2026-01-12 10:31:25.170443161 +0100 +++ /work/SRC/openSUSE:Factory/.hyprpaper.new.1977/hyprpaper.changes 2026-02-17 18:45:53.220315229 +0100 @@ -1,0 +2,13 @@ +Mon Feb 16 22:25:24 UTC 2026 - Avindra Goolcharan <[email protected]> + +- Update to version 0.8.3: + * matcher: fix matching in getSetting + * matcher: fix empty desc + * desc typo and keep state stable +- Changes from version 0.8.2: + * config: bring back desc: for description matching + * core: add version argument + * fix(config): support * as wildcard monitor for default + wallpapers + +------------------------------------------------------------------- Old: ---- hyprpaper-0.8.1.tar.gz New: ---- hyprpaper-0.8.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hyprpaper.spec ++++++ --- /var/tmp/diff_new_pack.5wWfoL/_old 2026-02-17 18:45:53.832340780 +0100 +++ /var/tmp/diff_new_pack.5wWfoL/_new 2026-02-17 18:45:53.836340947 +0100 @@ -17,7 +17,7 @@ Name: hyprpaper -Version: 0.8.1 +Version: 0.8.3 Release: 0 Summary: Wayland wallpaper utility with IPC controls License: BSD-3-Clause @@ -64,6 +64,6 @@ %files %license LICENSE -%{_bindir}/hyprpaper -%{_userunitdir}/hyprpaper.service +%{_bindir}/%{name} +%{_userunitdir}/%{name}.service ++++++ hyprpaper-0.8.1.tar.gz -> hyprpaper-0.8.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprpaper-0.8.1/VERSION new/hyprpaper-0.8.3/VERSION --- old/hyprpaper-0.8.1/VERSION 2026-01-02 22:17:20.000000000 +0100 +++ new/hyprpaper-0.8.3/VERSION 2026-01-29 16:50:46.000000000 +0100 @@ -1 +1 @@ -0.8.1 +0.8.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprpaper-0.8.1/src/config/WallpaperMatcher.cpp new/hyprpaper-0.8.3/src/config/WallpaperMatcher.cpp --- old/hyprpaper-0.8.1/src/config/WallpaperMatcher.cpp 2026-01-02 22:17:20.000000000 +0100 +++ new/hyprpaper-0.8.3/src/config/WallpaperMatcher.cpp 2026-01-29 16:50:46.000000000 +0100 @@ -2,6 +2,16 @@ #include <algorithm> +using namespace std::string_literals; + +// Check if a monitor string represents a wildcard (matches all monitors) +// Empty string or "*" are both treated as wildcards. +// "*" is preferred since hyprlang's special category system doesn't properly +// return entries with empty string keys from listKeysForSpecialCategory(). +static bool isWildcard(const std::string& monitor) { + return monitor.empty() || monitor == "*"; +} + void CWallpaperMatcher::addState(CConfigManager::SSetting&& s) { s.id = ++m_maxId; @@ -20,22 +30,22 @@ recalcStates(); } -void CWallpaperMatcher::registerOutput(const std::string_view& s) { - m_monitorNames.emplace_back(s); +void CWallpaperMatcher::registerOutput(const std::string_view& s, const std::string_view& desc) { + m_monitorNames.emplace_back(std::make_pair<>(s, desc)); recalcStates(); } void CWallpaperMatcher::unregisterOutput(const std::string_view& s) { - std::erase(m_monitorNames, s); + std::erase_if(m_monitorNames, [&s](const auto& e) { return e.first == s; }); std::erase_if(m_monitorStates, [&s](const auto& e) { return e.name == s; }); recalcStates(); } bool CWallpaperMatcher::outputExists(const std::string_view& s) { - return std::ranges::contains(m_monitorNames, s); + return std::ranges::any_of(m_monitorNames, [&s](const auto& e) { return e.first == s || "desc:" + e.second == s; }); } -std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> CWallpaperMatcher::getSetting(const std::string_view& monName) { +std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> CWallpaperMatcher::getSetting(const std::string_view& monName, const std::string_view& monDesc) { for (const auto& m : m_monitorStates) { if (m.name != monName) continue; @@ -52,18 +62,17 @@ return std::nullopt; } -std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> CWallpaperMatcher::matchSetting(const std::string_view& monName) { +std::optional<CWallpaperMatcher::rw<const CConfigManager::SSetting>> CWallpaperMatcher::matchSetting(const std::string_view& monName, const std::string_view& monDesc) { // match explicit for (const auto& s : m_settings) { - if (s.monitor != monName) + if (s.monitor != monName && !("desc:"s + std::string{monDesc}).starts_with(s.monitor)) continue; - return s; } - // match wildcard + // match wildcard (empty string or "*") for (const auto& s : m_settings) { - if (s.monitor.empty()) + if (isWildcard(s.monitor)) return s; } @@ -82,14 +91,15 @@ void CWallpaperMatcher::recalcStates() { std::vector<std::string_view> namesChanged; - for (const auto& name : m_monitorNames) { - const auto STATE = matchSetting(name); + for (const auto& [name, desc] : m_monitorNames) { + const auto STATE = matchSetting(name, desc); auto& activeState = getState(name); if (!STATE) - activeState = {.name = name}; + activeState = {.name = name, .desc = desc}; else { activeState.name = name; + activeState.desc = desc; if (activeState.currentID != STATE->get().id) { activeState.currentID = STATE->get().id; namesChanged.emplace_back(name); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprpaper-0.8.1/src/config/WallpaperMatcher.hpp new/hyprpaper-0.8.3/src/config/WallpaperMatcher.hpp --- old/hyprpaper-0.8.1/src/config/WallpaperMatcher.hpp 2026-01-02 22:17:20.000000000 +0100 +++ new/hyprpaper-0.8.3/src/config/WallpaperMatcher.hpp 2026-01-29 16:50:46.000000000 +0100 @@ -1,6 +1,7 @@ #pragma once #include <optional> +#include <tuple> #include "ConfigManager.hpp" @@ -21,11 +22,11 @@ void addState(CConfigManager::SSetting&&); void addStates(std::vector<CConfigManager::SSetting>&&); - void registerOutput(const std::string_view&); + void registerOutput(const std::string_view&, const std::string_view&); void unregisterOutput(const std::string_view&); bool outputExists(const std::string_view&); - std::optional<rw<const CConfigManager::SSetting>> getSetting(const std::string_view& monName); + std::optional<rw<const CConfigManager::SSetting>> getSetting(const std::string_view& monName, const std::string_view& monDesc); struct { Hyprutils::Signal::CSignalT<const std::string_view&> monitorConfigChanged; @@ -33,21 +34,21 @@ private: void recalcStates(); - std::optional<rw<const CConfigManager::SSetting>> matchSetting(const std::string_view& monName); + std::optional<rw<const CConfigManager::SSetting>> matchSetting(const std::string_view& monName, const std::string_view& monDesc); std::vector<CConfigManager::SSetting> m_settings; struct SMonitorState { - std::string name; + std::string name, desc; uint32_t currentID = CConfigManager::SETTING_INVALID; }; - std::vector<std::string> m_monitorNames; - std::vector<SMonitorState> m_monitorStates; + std::vector<std::pair<std::string, std::string>> m_monitorNames; + std::vector<SMonitorState> m_monitorStates; - uint32_t m_maxId = 0; + uint32_t m_maxId = 0; - SMonitorState& getState(const std::string_view& monName); + SMonitorState& getState(const std::string_view& monName); }; inline UP<CWallpaperMatcher> g_matcher = makeUnique<CWallpaperMatcher>(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprpaper-0.8.1/src/main.cpp new/hyprpaper-0.8.3/src/main.cpp --- old/hyprpaper-0.8.1/src/main.cpp 2026-01-02 22:17:20.000000000 +0100 +++ new/hyprpaper-0.8.3/src/main.cpp 2026-01-29 16:50:46.000000000 +0100 @@ -14,6 +14,7 @@ ASSERT(parser.registerStringOption("config", "c", "Set a custom config path")); ASSERT(parser.registerBoolOption("verbose", "", "Enable more logging")); + ASSERT(parser.registerBoolOption("version", "v", "Show hyprpaper's version")); ASSERT(parser.registerBoolOption("help", "h", "Show the help menu")); if (const auto ret = parser.parse(); !ret) { @@ -26,6 +27,11 @@ return 0; } + if (parser.getBool("version").value_or(false)) { + std::println("hyprpaper v{}", HYPRPAPER_VERSION); + return 0; + } + if (parser.getBool("verbose").value_or(false)) { g_logger->setLogLevel(LOG_TRACE); g_state->verbose = true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprpaper-0.8.1/src/ui/UI.cpp new/hyprpaper-0.8.3/src/ui/UI.cpp --- old/hyprpaper-0.8.1/src/ui/UI.cpp 2026-01-02 22:17:20.000000000 +0100 +++ new/hyprpaper-0.8.3/src/ui/UI.cpp 2026-01-29 16:50:46.000000000 +0100 @@ -8,12 +8,20 @@ #include <hyprtoolkit/core/Output.hpp> +#include <hyprutils/string/String.hpp> + CUI::CUI() = default; CUI::~CUI() { m_targets.clear(); } +static std::string_view pruneDesc(const std::string_view& sv) { + if (sv.contains('(')) + return Hyprutils::String::trim(sv.substr(0, sv.find_last_of('('))); + return sv; +} + class CWallpaperTarget::CImagesData { public: CImagesData(Hyprtoolkit::eImageFitMode fitMode, const std::vector<std::string>& images, const int timeout = 0) : @@ -119,7 +127,7 @@ } void CUI::registerOutput(const SP<Hyprtoolkit::IOutput>& mon) { - g_matcher->registerOutput(mon->port()); + g_matcher->registerOutput(mon->port(), pruneDesc(mon->desc())); if (IPC::g_IPCSocket) IPC::g_IPCSocket->onNewDisplay(mon->port()); mon->m_events.removed.listenStatic([this, m = WP<Hyprtoolkit::IOutput>{mon}] { @@ -205,7 +213,7 @@ } void CUI::targetChanged(const SP<Hyprtoolkit::IOutput>& mon) { - const auto TARGET = g_matcher->getSetting(mon->port()); + const auto TARGET = g_matcher->getSetting(mon->port(), pruneDesc(mon->desc())); if (!TARGET) { g_logger->log(LOG_DEBUG, "Monitor {} has no target: no wp will be created", mon->port());
